169 lines
5.4 KiB
C
169 lines
5.4 KiB
C
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
tgroup.c
|
|
|
|
Abstract:
|
|
|
|
Test for cluster group API
|
|
|
|
Author:
|
|
|
|
John Vert (jvert) 15-Mar-1996
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#include "windows.h"
|
|
#include "cluster.h"
|
|
#include "stdio.h"
|
|
#include "stdlib.h"
|
|
|
|
int
|
|
_cdecl
|
|
main (argc, argv)
|
|
int argc;
|
|
char *argv[];
|
|
{
|
|
HCLUSTER Cluster;
|
|
HRESOURCE Resource;
|
|
HGROUP Group;
|
|
HNODE Node;
|
|
HKEY ClusterRoot;
|
|
HCLUSENUM ResEnum;
|
|
DWORD ClusterCountBefore, ClusterCountAfter;
|
|
HGROUPENUM hGroupEnum;
|
|
DWORD GroupCountBefore, GroupCountAfter;
|
|
DWORD i,j;
|
|
DWORD Status;
|
|
WCHAR NameBuf[50];
|
|
DWORD NameLen;
|
|
WCHAR NodeBuf[50];
|
|
DWORD Type;
|
|
CLUSTER_GROUP_STATE GroupState;
|
|
|
|
//
|
|
// Dump out group structure for current cluster.
|
|
//
|
|
Cluster = OpenCluster(NULL);
|
|
if (Cluster == NULL) {
|
|
fprintf(stderr, "OpenCluster(NULL) failed %d\n",GetLastError());
|
|
return(0);
|
|
}
|
|
|
|
//
|
|
// Dump groups
|
|
//
|
|
printf("\n\nENUMERATING GROUPS\n");
|
|
ResEnum = ClusterOpenEnum(Cluster, CLUSTER_ENUM_GROUP);
|
|
if (ResEnum == NULL) {
|
|
fprintf(stderr, "ClusterOpenEnum failed %d\n",GetLastError());
|
|
return(0);
|
|
}
|
|
|
|
ClusterCountBefore = ClusterGetEnumCount(ResEnum);
|
|
for(i=0; ; i++) {
|
|
NameLen = sizeof(NameBuf)/sizeof(WCHAR);
|
|
Status = ClusterEnum(ResEnum,
|
|
i,
|
|
&Type,
|
|
NameBuf,
|
|
&NameLen);
|
|
if (Status == ERROR_NO_MORE_ITEMS) {
|
|
break;
|
|
} else if (Status != ERROR_SUCCESS) {
|
|
fprintf(stderr, "ClusterEnum %d returned error %d\n",i,Status);
|
|
return(0);
|
|
}
|
|
if (Type != CLUSTER_ENUM_GROUP) {
|
|
printf("Invalid Type %d returned from ClusterEnum\n", Type);
|
|
return(0);
|
|
}
|
|
|
|
Group = OpenClusterGroup(Cluster, NameBuf);
|
|
if (Group == NULL) {
|
|
fprintf(stderr, "OpenClusterGroup %ws failed %d\n",NameBuf, GetLastError());
|
|
return(0);
|
|
}
|
|
|
|
NameLen = sizeof(NodeBuf)/sizeof(WCHAR);
|
|
GroupState = GetClusterGroupState(Group, NodeBuf, &NameLen);
|
|
if (GroupState == -1) {
|
|
fprintf(stderr, "GetClusterGroupState failed %d\n",GetLastError());
|
|
return(0);
|
|
}
|
|
if (GroupState == ClusterGroupOnline) {
|
|
printf("Group %ws is ONLINE at node %ws\n",NameBuf, NodeBuf);
|
|
} else if (GroupState == ClusterGroupOffline) {
|
|
printf("Group %ws is OFFLINE at node %ws\n",NameBuf, NodeBuf);
|
|
} else if (GroupState == ClusterGroupFailed) {
|
|
printf("Group %ws is FAILED at node %ws\n",NameBuf, NodeBuf);
|
|
} else {
|
|
fprintf(stderr, "Group %ws is in unknown state %d on node %ws\n",NameBuf, GroupState, NodeBuf);
|
|
}
|
|
|
|
hGroupEnum = ClusterGroupOpenEnum(Group,
|
|
CLUSTER_GROUP_ENUM_CONTAINS | CLUSTER_GROUP_ENUM_NODES);
|
|
if (hGroupEnum == NULL) {
|
|
fprintf(stderr, "Group %ws failed to open enum %d\n",NameBuf, GetLastError());
|
|
} else {
|
|
GroupCountBefore = ClusterGroupGetEnumCount(hGroupEnum);
|
|
for (j=0; ; j++) {
|
|
NameLen = sizeof(NameBuf)/sizeof(WCHAR);
|
|
Status = ClusterGroupEnum(hGroupEnum,
|
|
j,
|
|
&Type,
|
|
NameBuf,
|
|
&NameLen);
|
|
if (Status == ERROR_NO_MORE_ITEMS) {
|
|
break;
|
|
} else if (Status != ERROR_SUCCESS) {
|
|
fprintf(stderr, "Failed to enum group item %d, error %d\n",j,Status);
|
|
} else {
|
|
switch (Type) {
|
|
case CLUSTER_GROUP_ENUM_NODES:
|
|
printf("\tpreferred node %ws\n",NameBuf);
|
|
break;
|
|
|
|
case CLUSTER_GROUP_ENUM_CONTAINS:
|
|
printf("\tcontains resource %ws\n",NameBuf);
|
|
break;
|
|
|
|
default:
|
|
fprintf(stderr, "\tUnknown enum type %d\n",Type);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (Status == ERROR_NO_MORE_ITEMS) {
|
|
printf("\nGroup count: %d\n", j);
|
|
GroupCountAfter = ClusterGroupGetEnumCount(hGroupEnum);
|
|
if (GroupCountBefore != GroupCountAfter)
|
|
fprintf(stderr, "\nReported group count was %d before enumeration, and %d afterward\n", GroupCountBefore, GroupCountAfter);
|
|
else if (j != GroupCountBefore)
|
|
fprintf(stderr, "\nReported group count: %d\n", GroupCountBefore);
|
|
}
|
|
ClusterGroupCloseEnum(hGroupEnum);
|
|
}
|
|
|
|
CloseClusterGroup(Group);
|
|
|
|
}
|
|
if (Status == ERROR_NO_MORE_ITEMS) {
|
|
printf("\nCluster count: %d\n", i);
|
|
ClusterCountAfter = ClusterGetEnumCount(ResEnum);
|
|
if (ClusterCountBefore != ClusterCountAfter)
|
|
fprintf(stderr, "\nReported cluster count was %d before enumeration, and %d afterward\n", ClusterCountBefore, ClusterCountAfter);
|
|
else if (i != ClusterCountBefore)
|
|
fprintf(stderr, "\nReported cluster count: %d\n", ClusterCountBefore);
|
|
}
|
|
ClusterCloseEnum(ResEnum);
|
|
|
|
|
|
CloseCluster(Cluster);
|
|
}
|
|
|