|
|
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999-2000 Microsoft Corporation
//
// Module Name:
// ClusterGroup.cpp
//
// Description:
// Implementation of CClusterGroup class
//
// Author:
// Henry Wang (HenryWa) 24-AUG-1999
//
//////////////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include "ClusterGroup.h"
#include "ClusterGroup.tmh"
//****************************************************************************
//
// CClusterGroup
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// CClusterGroup::CClusterGroup(
// LPCWSTR pwszNameIn,
// CWbemServices * pNamespaceIn
// )
//
// Description:
// Constructor.
//
// Arguments:
// pwszNameIn -- Class name
// pNamespaceIn -- Namespace
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
CClusterGroup::CClusterGroup( LPCWSTR pwszNameIn, CWbemServices * pNamespaceIn ) : CProvBase( pwszNameIn, pNamespaceIn ) { } //*** CClusterGroup::CClusterGroup()
//////////////////////////////////////////////////////////////////////////////
//++
//
// static
// CProvBase *
// CClusterGroup::S_CreateThis(
// LPCWSTR pwszNameIn,
// CWbemServices * pNamespaceIn,
// DWORD // dwEnumTypeIn
// )
//
// Description:
// Create a CClusterGroup object.
//
// Arguments:
// pwszNameIn -- Class name
// pNamespaceIn -- Namespace
// dwEnumTypeIn -- Type id
//
// Return Values:
// pointer to the CProvBase
//
//--
//////////////////////////////////////////////////////////////////////////////
CProvBase * CClusterGroup::S_CreateThis( LPCWSTR pwszNameIn, CWbemServices * pNamespaceIn, DWORD dwEnumTypeIn ) { TracePrint(("CClusterGroup::S_CreatThis for Name = %ws, EnumType %u\n", pwszNameIn, dwEnumTypeIn )); return new CClusterGroup( pwszNameIn, pNamespaceIn );
} //*** CClusterGroup::S_CreateThis()
//////////////////////////////////////////////////////////////////////////////
//++
//
// const SPropMapEntryArray *
// CClusterGroup::GetPropMap( void )
//
// Description:
// Retrieve the property maping table of the cluster group.
//
// Arguments:
// None.
//
// Return Values:
// Reference to the array of property maping table.
//
//--
//////////////////////////////////////////////////////////////////////////////
const SPropMapEntryArray * CClusterGroup::RgGetPropMap( void ) {
static SPropMapEntry s_rgpm[] = { { NULL, CLUSREG_NAME_GRP_LOADBAL_STATE, DWORD_TYPE, READWRITE } };
static SPropMapEntryArray s_pamea( sizeof( s_rgpm ) / sizeof( SPropMapEntry ), s_rgpm );
return &s_pamea;
} //*** CClusterGroup::GetPropMap()
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CClusterGroup::EnumInstance(
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemObjectSink * pHandlerIn
// )
//
// Description:
// Enum cluster instance.
//
// Arguments:
// lFlagsIn -- WMI flag
// pCtxIn -- WMI context
// pHandlerIn -- WMI sink pointer
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE CClusterGroup::EnumInstance( long lFlagsIn, IWbemContext * pCtxIn, IWbemObjectSink * pHandlerIn ) { SAFECLUSTER shCluster; SAFEGROUP shGroup; LPCWSTR pwszGroup;
TracePrint(( "CClusterGroup::EnumInstance, pHandlerIn = %p\n", pHandlerIn )); shCluster = OpenCluster( NULL ); CClusterEnum cluEnum( shCluster, CLUSTER_ENUM_GROUP );
while ( ( pwszGroup = cluEnum.GetNext() ) != NULL ) { shGroup = OpenClusterGroup( shCluster, pwszGroup );
ClusterToWMI( shGroup, pHandlerIn );
} // while: more groups
return WBEM_S_NO_ERROR;
} //*** CClusterGroup::EnumInstance()
//////////////////////////////////////////////////////////////////////////////
//++
//
// void
// CClusterGroup::ClusterToWMI(
// HGROUP hGroupIn,
// IWbemObjectSink * pHandlerIn
// )
//
// Description:
// Translate a cluster group object to WMI object.
//
// Arguments:
// hGroupIn -- Handle to group
// pHandlerIn -- Handler
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
void CClusterGroup::ClusterToWMI( HGROUP hGroupIn, IWbemObjectSink * pHandlerIn ) { static SGetControl s_rgControl[] = { { CLUSCTL_GROUP_GET_RO_COMMON_PROPERTIES, FALSE }, { CLUSCTL_GROUP_GET_COMMON_PROPERTIES, FALSE }, { CLUSCTL_GROUP_GET_RO_PRIVATE_PROPERTIES, TRUE }, { CLUSCTL_GROUP_GET_PRIVATE_PROPERTIES, TRUE } }; static UINT s_cControl = sizeof( s_rgControl ) / sizeof( SGetControl );
CError er; UINT idx; CWbemClassObject wco;
m_pClass->SpawnInstance( 0, &wco ); for ( idx = 0 ; idx < s_cControl ; idx++ ) { CClusPropList pl; er = pl.ScGetGroupProperties( hGroupIn, s_rgControl[ idx ].dwControl, NULL, 0 );
CClusterApi::GetObjectProperties( RgGetPropMap(), pl, wco, s_rgControl[ idx ].fPrivate );
} // for: each common property type
//
// set prefered nodelist
//
{ SAFEGROUPENUM shGroupEnum; DWORD dwIndex = 0; DWORD dwType; DWORD cchName = MAX_PATH ; CWstrBuf wsbName; DWORD dwError; BSTR rgbstrNode[MAX_PATH]; DWORD cbstrNode = 0;
wsbName.SetSize( cchName ); shGroupEnum = ClusterGroupOpenEnum( hGroupIn, CLUSTER_GROUP_ENUM_NODES ); for( ; ; ) { DWORD cch = cchName; dwError = ClusterGroupEnum( shGroupEnum, dwIndex, &dwType, wsbName, &cch ); if ( dwError == ERROR_MORE_DATA ) { cchName = ++cch; wsbName.SetSize( cch ); dwError = ClusterGroupEnum( shGroupEnum, dwIndex, &dwType, wsbName, &cch ); } // if: more data
if ( dwError == ERROR_SUCCESS ) { rgbstrNode[ dwIndex ] = SysAllocString ( wsbName ); if ( rgbstrNode[ dwIndex ] == NULL ) { for( dwIndex = 0 ; dwIndex < cbstrNode ; dwIndex++ ) { SysFreeString( rgbstrNode[ dwIndex ] ); } CProvException( static_cast< HRESULT >( WBEM_E_OUT_OF_MEMORY ) ); } dwIndex++; cbstrNode = dwIndex; } // if: success
else { break; } // else
} // for: cluster group
if( cbstrNode > 0 ) { wco.SetProperty( cbstrNode, rgbstrNode, PVD_PROP_NODELIST ); // bugbug, how to clean up when exception occured
for ( dwIndex = 0 ; dwIndex < cbstrNode ; dwIndex++ ) { SysFreeString( rgbstrNode[ dwIndex ] ); }
} // if: has valid group
} //
// flags and characteristics
//
{ DWORD cbReturned; DWORD dwOut; er = ClusterGroupControl( hGroupIn, NULL, CLUSCTL_GROUP_GET_CHARACTERISTICS, NULL, 0, &dwOut, sizeof( DWORD ), &cbReturned ); wco.SetProperty( dwOut, PVD_PROP_CHARACTERISTIC ); }
pHandlerIn->Indicate( 1, &wco ); return;
} //*** CClusterGroup::ClusterToWMI()
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CClusterGroup::GetObject(
// CObjPath & rObjPathIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemObjectSink * pHandlerIn
// )
//
// Description:
// Retrieve cluster group object based given object path.
//
// Arguments:
// rObjPathIn -- Object path to cluster object
// lFlagsIn -- WMI flag
// pCtxIn -- WMI context
// pHandlerIn -- WMI sink pointer
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE CClusterGroup::GetObject( CObjPath & rObjPathIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemObjectSink * pHandlerIn ) { SAFECLUSTER shCluster; SAFEGROUP shGroup; shCluster = OpenCluster( NULL ); shGroup = OpenClusterGroup( shCluster, rObjPathIn.GetStringValueForProperty( PVD_PROP_NAME ) );
ClusterToWMI( shGroup, pHandlerIn );
return WBEM_S_NO_ERROR; } //*** CClusterGroup::GetObject()
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CClusterGroup::ExecuteMethod(
// CObjPath & rObjPathIn,
// WCHAR * pwszMethodNameIn,
// long lFlagIn,
// IWbemClassObject * pParamsIn,
// IWbemObjectSink * pHandlerIn
// )
//
// Description:
// Execute methods defined in the mof for cluster node.
//
// Arguments:
// rObjPathIn -- Object path to cluster object
// pwszMethodNameIn -- Name of the method to be invoked
// lFlagIn -- WMI flag
// pParamsIn -- Input parameters for the method
// pHandlerIn -- WMI sink pointer
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE CClusterGroup::ExecuteMethod( CObjPath & rObjPathIn, WCHAR * pwszMethodNameIn, long lFlagIn, IWbemClassObject * pParamsIn, IWbemObjectSink * pHandlerIn ) { SAFECLUSTER shCluster; SAFEGROUP shGroup; CWbemClassObject InArgs( pParamsIn ); CError er; shCluster = OpenCluster( NULL ); //
// static method
//
if ( _wcsicmp( pwszMethodNameIn, PVD_MTH_GROUP_CREATEGROUP ) == 0 ) { _bstr_t bstrNewGroup; InArgs.GetProperty( bstrNewGroup, PVD_MTH_GROUP_PARM_GROUPNAME ); shGroup = CreateClusterGroup( shCluster, bstrNewGroup );
er = OnlineClusterGroup( shGroup, NULL ); } // if: CREATEGROUP
else { shGroup = OpenClusterGroup( shCluster, rObjPathIn.GetStringValueForProperty( PVD_PROP_GROUP_NAME ) ); if ( _wcsicmp( pwszMethodNameIn, PVD_MTH_GROUP_TAKEOFFLINE ) == 0 ) { er = OfflineClusterGroup( shGroup ); } // if: TAKEOFFLINE
else if ( _wcsicmp( pwszMethodNameIn, PVD_MTH_GROUP_BRINGONLINE ) == 0 ) { er = OnlineClusterGroup( shGroup, NULL ); } // else if: BRINGONLINE
else if ( _wcsicmp( pwszMethodNameIn, PVD_MTH_GROUP_MOVETONEWNODE ) == 0 ) { _bstr_t bstrNewNode; SAFENODE shNode; InArgs.GetProperty( bstrNewNode, PVD_MTH_GROUP_PARM_NODENAME ); shNode = OpenClusterNode( shCluster, bstrNewNode ); er = MoveClusterGroup( shGroup, shNode ); } // else if: MOVETONEWNODE
else if ( _wcsicmp( pwszMethodNameIn, PVD_MTH_GROUP_RENAME ) == 0 ) { _bstr_t bstrNewName; InArgs.GetProperty( bstrNewName, PVD_MTH_GROUP_PARM_NEWNAME ); er = SetClusterGroupName( shGroup, bstrNewName ); } // else if: RENAME
else { er = static_cast< HRESULT >( WBEM_E_INVALID_PARAMETER ); } } // else: not create new group
return WBEM_S_NO_ERROR;
} //*** CClusterGroup::ExecuteMethod()
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CClusterGroup::PutInstance(
// CWbemClassObject & rInstToPutIn,
// long lFlagIn,
// IWbemContext * pCtxIn,
// IWbemObjectSink * pHandlerIn
// )
//
// Description:
// Save this instance.
//
// Arguments:
// rInstToPutIn -- WMI object to be saved
// lFlagIn -- WMI flag
// pCtxIn -- WMI context
// pHandlerIn -- WMI sink pointer
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE CClusterGroup::PutInstance( CWbemClassObject & rInstToPutIn, long lFlagIn, IWbemContext * pCtxIn, IWbemObjectSink * pHandlerIn ) { static SGetSetControl s_rgControl[] = { { CLUSCTL_GROUP_GET_COMMON_PROPERTIES, CLUSCTL_GROUP_SET_COMMON_PROPERTIES, FALSE }, { CLUSCTL_GROUP_GET_PRIVATE_PROPERTIES, CLUSCTL_GROUP_SET_PRIVATE_PROPERTIES, TRUE } }; static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetSetControl );
_bstr_t bstrName; SAFECLUSTER shCluster; SAFEGROUP shGroup; CError er; UINT idx;
rInstToPutIn.GetProperty( bstrName, PVD_PROP_NAME );
shCluster = OpenCluster( NULL ); shGroup = OpenClusterGroup( shCluster, bstrName );
for ( idx = 0 ; idx < s_cControl ; idx++ ) { CClusPropList plOld; CClusPropList plNew; er = plOld.ScGetGroupProperties( shGroup, s_rgControl[ idx ].dwGetControl, NULL, NULL, 0 );
CClusterApi::SetObjectProperties( NULL, plNew, plOld, rInstToPutIn, s_rgControl[ idx ].fPrivate );
if ( plNew.Cprops() > 0 ) { er = ClusterGroupControl( shGroup, NULL, s_rgControl[ idx ].dwSetControl, plNew.PbPropList(), plNew.CbPropList(), NULL, 0, NULL ); }
} // for: each control code
return WBEM_S_NO_ERROR;
} //*** CClusterGroup::PutInstance()
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CClusterGroup::DeleteInstance(
// CObjPath & rObjPathIn,
// long lFlagIn,
// IWbemContext * pCtxIn,
// IWbemObjectSink * pHandlerIn
// )
//
// Description:
// Delete the object specified in rObjPathIn.
//
// Arguments:
// rObjPathIn -- ObjPath for the instance to be deleted
// lFlagIn -- WMI flag
// pCtxIn -- WMI context
// pHandlerIn -- WMI sink pointer
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE CClusterGroup::DeleteInstance( CObjPath & rObjPathIn, long lFlagIn, IWbemContext * pCtxIn, IWbemObjectSink * pHandlerIn ) { SAFECLUSTER shCluster; SAFEGROUP shGroup; CError er;
shCluster = OpenCluster( NULL ); shGroup = OpenClusterGroup( shCluster, rObjPathIn.GetStringValueForProperty( PVD_PROP_NAME ) );
er = DeleteClusterGroup( shGroup );
return WBEM_S_NO_ERROR;
} //*** CClusterGroup::DeleteInstance()
//****************************************************************************
//
// CClusterGroupRes
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// CClusterGroupRes::CClusterGroupRes(
// LPCWSTR pwszNameIn,
// CWbemServices * pNamespaceIn,
// DWORD dwEnumTypeIn
// )
//
// Description:
// Constructor.
//
// Arguments:
// pwszNameIn -- Class name
// pNamespaceIn -- Namespace
// dwEnumTypeIn -- Type id
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
CClusterGroupRes::CClusterGroupRes( LPCWSTR pwszNameIn, CWbemServices * pNamespaceIn, DWORD dwEnumTypeIn ) : CClusterObjAssoc( pwszNameIn, pNamespaceIn, dwEnumTypeIn ) {
} //*** CClusterGroupRes::CClusterGroupRes()
//////////////////////////////////////////////////////////////////////////////
//++
//
// static
// CProvBase *
// CClusterGroupRes::S_CreateThis(
// LPCWSTR pwszNameIn,
// CWbemServices * pNamespaceIn,
// DWORD dwEnumTypeIn
// )
//
// Description:
// Create a cluster node object
//
// Arguments:
// pwszNameIn -- Class name
// pNamespaceIn -- Namespace
// dwEnumTypeIn -- Type id
//
// Return Values:
// pointer to the CProvBase
//
//--
//////////////////////////////////////////////////////////////////////////////
CProvBase * CClusterGroupRes::S_CreateThis( LPCWSTR pwszNameIn, CWbemServices * pNamespaceIn, DWORD dwEnumTypeIn ) { return new CClusterGroupRes( pwszNameIn, pNamespaceIn, dwEnumTypeIn );
} //*** CClusterGroupRes::S_CreateThis()
//////////////////////////////////////////////////////////////////////////////
//++
//
// SCODE
// CClusterGroupRes::EnumInstance(
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemObjectSink * pHandlerIn
// )
//
// Description:
// Retrieve the property maping table of the cluster node active resource.
//
// Arguments:
// lFlagsIn --
// pCtxIn --
// pHandlerIn --
//
// Return Values:
// SCODE
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE CClusterGroupRes::EnumInstance( long lFlagsIn, IWbemContext * pCtxIn, IWbemObjectSink * pHandlerIn ) { SAFECLUSTER shCluster; SAFEGROUP shGroup; SAFERESOURCE shResource; LPCWSTR pwszName = NULL; DWORD cchGroupName = MAX_PATH; CWstrBuf wsbGroupName; DWORD cch; CError er; DWORD dwError; CWbemClassObject wcoGroup; CWbemClassObject wcoPart; _bstr_t bstrGroup; _bstr_t bstrPart; wsbGroupName.SetSize( cchGroupName ); shCluster = OpenCluster( NULL ); CClusterEnum clusEnum( shCluster, m_dwEnumType );
m_wcoGroup.SpawnInstance( 0, &wcoGroup ); m_wcoPart.SpawnInstance( 0, &wcoPart );
while ( ( pwszName = clusEnum.GetNext() ) != NULL ) { CWbemClassObject wco; DWORD dwState;
cch = cchGroupName; wcoPart.SetProperty( pwszName, PVD_PROP_RES_NAME ); wcoPart.GetProperty( bstrPart, PVD_WBEM_RELPATH );
shResource = OpenClusterResource( shCluster, pwszName );
dwState = GetClusterResourceState( shResource, NULL, 0, wsbGroupName, &cch ); if ( dwState == ClusterResourceStateUnknown ) { dwError = GetLastError(); if ( dwError == ERROR_MORE_DATA ) { cchGroupName = ++cch; wsbGroupName.SetSize( cch ); dwState = GetClusterResourceState( shResource, NULL, 0, wsbGroupName, &cch ); } // if: more data
else { er = dwError; } } // if: state unknown
wcoGroup.SetProperty( wsbGroupName, CLUSREG_NAME_GRP_NAME ); wcoGroup.GetProperty( bstrGroup, PVD_WBEM_RELPATH );
m_pClass->SpawnInstance( 0, &wco ); wco.SetProperty( (LPWSTR) bstrGroup, PVD_PROP_GROUPCOMPONENT ); wco.SetProperty( (LPWSTR) bstrPart, PVD_PROP_PARTCOMPONENT ); pHandlerIn->Indicate( 1, &wco );
} // while: more resources
return WBEM_S_NO_ERROR;
} //*** CClusterGroupRes::EnumInstance()
|