|
|
/*++
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); }
|