|
|
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-1999 Microsoft Corporation
//
// Module Name:
// ClusObj.h
//
// Implementation File:
// ClusObj.h (this file) and ClusObj.cpp
//
// Description:
// Definition of the CClusterObject classes.
//
// Author:
// David Potter (davidp) April 7, 1998
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#ifndef __CLUSOBJ_H_
#define __CLUSOBJ_H_
/////////////////////////////////////////////////////////////////////////////
// Forward Class Declarations
/////////////////////////////////////////////////////////////////////////////
class CClusterObject; class CClusterInfo; class CClusNodeInfo; class CClusGroupInfo; class CClusResInfo; class CClusResTypeInfo; class CClusNetworkInfo; class CClusNetIFInfo;
/////////////////////////////////////////////////////////////////////////////
// External Class Declarations
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Include Files
/////////////////////////////////////////////////////////////////////////////
#ifndef _LIST_
#include <list> // for std::list
#endif
#ifndef _CLUSTER_API_
#include <ClusApi.h> // for cluster types
#endif
#ifndef __cluadmex_h__
#include "CluAdmEx.h" // for CLUADMEX_OBJECT_TYPE
#endif
#ifndef _CLUSUDEF_H_
#include "ClusUDef.h" // for default values
#endif
/////////////////////////////////////////////////////////////////////////////
// Type Definitions
/////////////////////////////////////////////////////////////////////////////
typedef std::list< CClusterObject * > CClusObjPtrList; typedef std::list< CClusterInfo * > CClusterPtrList; typedef std::list< CClusNodeInfo * > CClusNodePtrList; typedef std::list< CClusGroupInfo * > CClusGroupPtrList; typedef std::list< CClusResInfo * > CClusResPtrList; typedef std::list< CClusResTypeInfo * > CClusResTypePtrList; typedef std::list< CClusNetworkInfo * > CClusNetworkPtrList; typedef std::list< CClusNetIFInfo * > CClusNetIFPtrList;
union CLUSTER_REQUIRED_DEPENDENCY { CLUSTER_RESOURCE_CLASS rc; LPWSTR pszTypeName; };
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CClusterObject
//
// Description:
// Base class for all cluster object classes. Provides base
// functionality.
//
// Inheritance:
// CClusterObject
//
//--
/////////////////////////////////////////////////////////////////////////////
class CClusterObject { friend class CWizardThread;
public: //
// Construction.
//
// Default constructor
CClusterObject( IN CLUADMEX_OBJECT_TYPE cot ) { ATLASSERT( cot > CLUADMEX_OT_NONE );
m_nReferenceCount = 0; Reset( NULL, NULL, cot );
} //*** CClusterObject()
// Constructor taking group name
CClusterObject( IN CLUADMEX_OBJECT_TYPE cot, IN CClusterInfo * pci, IN LPCTSTR pszName ) { ATLASSERT( cot > CLUADMEX_OT_NONE );
m_nReferenceCount = 0; Reset( pci, pszName, cot );
} //*** CClusterObject(pszName)
virtual ~CClusterObject( void ) { } //*** ~CClusterObject()
// Copy another object into this one.
void Copy( IN const CClusterObject & rco ) { m_pci = rco.m_pci; m_bQueried = rco.m_bQueried; m_bCreated = rco.m_bCreated; m_cot = rco.m_cot; m_strName = rco.m_strName; m_strDescription = rco.m_strDescription;
} //*** Copy()
// Reset the data back to default values
void Reset( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL, IN CLUADMEX_OBJECT_TYPE cot = CLUADMEX_OT_NONE ) { m_pci = pci;
m_bQueried = FALSE; m_bCreated = FALSE;
if ( cot != CLUADMEX_OT_NONE ) { m_cot = cot; } // if: valid object type specified
if ( pszName == NULL ) { m_strName.Empty(); } // if: no name specified
else { m_strName = pszName; } // else: name specified
m_strDescription.Empty();
} //*** Reset()
protected: //
// Reference counting properties.
//
ULONG m_nReferenceCount;
public: //
// Reference counting methods.
//
// Get the current count of references
ULONG NReferenceCount( void ) const { return m_nReferenceCount; }
// Add a reference to this object
ULONG AddRef( void ) { ATLASSERT( m_nReferenceCount != (ULONG) -1 ); return ++m_nReferenceCount;
} //*** AddRef()
// Release a reference to this object
ULONG Release( void ) { ULONG nReferenceCount;
ATLASSERT( m_nReferenceCount != 0 );
nReferenceCount = --m_nReferenceCount; if ( m_nReferenceCount == 0 ) { delete this; } // if: no more references
return nReferenceCount;
} //*** Release()
protected: //
// Properties of a cluster object.
//
CClusterInfo * m_pci;
BOOL m_bQueried; BOOL m_bCreated;
CLUADMEX_OBJECT_TYPE m_cot;
CString m_strName; CString m_strDescription;
// Set query state
BOOL BSetQueried( BOOL bQueried = TRUE ) { BOOL bPreviousValue = m_bQueried; m_bQueried = bQueried; return bPreviousValue;
} //*** BSetQueried()
// Set created state
BOOL BSetCreated( BOOL bCreated = TRUE ) { BOOL bPreviousValue = m_bCreated; m_bCreated = bCreated; return bPreviousValue;
} //*** BSetCreated()
public: //
// Accessor functions for cluster object properties.
//
CClusterInfo * Pci( void ) const { ATLASSERT( m_pci != NULL ); return m_pci; }
BOOL BQueried( void ) const { return m_bQueried; } BOOL BCreated( void ) const { return m_bCreated; }
CLUADMEX_OBJECT_TYPE Cot( void ) const { return m_cot; }
const CString & RstrName( void ) const { return m_strName; } const CString & RstrDescription( void ) const { return m_strDescription; }
// Set the cluster info pointer
void SetClusterInfo( IN CClusterInfo * pci ) { ATLASSERT( pci != NULL ); ATLASSERT( m_pci == NULL ); m_pci = pci;
} //*** SetClusterInfo()
// Set the name of the cluster object.
void SetName( IN LPCTSTR pszName ) { ATLASSERT( pszName != NULL ); m_strName = pszName;
} //*** SetName()
// Set the description of the cluster object
void SetDescription( IN LPCTSTR pszDescription ) { ATLASSERT( pszDescription != NULL ); m_strDescription = pszDescription;
} //*** SetDescription()
// Return the list of extensions for this object
virtual const std::list< CString > * PlstrAdminExtensions( void ) const { return NULL; }
}; //*** class CClusterObject
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CClusterInfo
//
// Description:
// Class for the information about the cluster object itself. Treats
// the cluster as an object like other objects.
//
// Inheritance:
// CClusterInfo
// CClusterObject
//
// Notes:
// 1) m_hCluster is not owned by this class.
//
//--
/////////////////////////////////////////////////////////////////////////////
class CClusterInfo : public CClusterObject { friend class CWizardThread;
public: //
// Construction.
//
// Default constructor
CClusterInfo( void ) : CClusterObject( CLUADMEX_OT_CLUSTER ) { Reset();
} //*** CClusterInfo()
// Constructor taking cluster name
CClusterInfo( IN LPCTSTR pszName ) : CClusterObject( CLUADMEX_OT_CLUSTER, NULL, pszName ) { Reset( pszName );
} //*** CClusterInfo( pszName )
// Copy another object into this one.
void Copy( IN const CClusterInfo & rci ) { CClusterObject::Copy( rci ); m_hCluster = rci.m_hCluster;
} //*** Copy()
// Reset the data back to default values
void Reset( IN LPCTSTR pszName = NULL ) { CClusterObject::Reset( NULL, pszName, CLUADMEX_OT_CLUSTER ); m_hCluster = NULL;
} //*** Reset()
protected: //
// Properties of a cluster.
//
HCLUSTER m_hCluster; std::list< CString > m_lstrClusterAdminExtensions; std::list< CString > m_lstrNodesAdminExtensions; std::list< CString > m_lstrGroupsAdminExtensions; std::list< CString > m_lstrResourcesAdminExtensions; std::list< CString > m_lstrResTypesAdminExtensions; std::list< CString > m_lstrNetworksAdminExtensions; std::list< CString > m_lstrNetInterfacesAdminExtensions;
public: //
// Accessor functions for cluster properties.
//
HCLUSTER Hcluster( void ) { ATLASSERT( m_hCluster != NULL ); return m_hCluster;
} //*** Hcluster()
// Set the cluster handle managed by this object
void SetClusterHandle( IN HCLUSTER hCluster ) { ATLASSERT( hCluster != NULL ); m_hCluster = hCluster;
} //*** SetClusterHandle()
const std::list< CString > * PlstrAdminExtensions( void ) const { return &m_lstrClusterAdminExtensions; } const std::list< CString > * PlstrNodesAdminExtensions( void ) const { return &m_lstrNodesAdminExtensions; } const std::list< CString > * PlstrGroupsAdminExtensions( void ) const { return &m_lstrGroupsAdminExtensions; } const std::list< CString > * PlstrResourcesAdminExtensions( void ) const { return &m_lstrResourcesAdminExtensions; } const std::list< CString > * PlstrResTypesAdminExtensions( void ) const { return &m_lstrResTypesAdminExtensions; } const std::list< CString > * PlstrNetworksAdminExtensions( void ) const { return &m_lstrNetworksAdminExtensions; } const std::list< CString > * PlstrNetInterfacesAdminExtensions( void ) const { return &m_lstrNetInterfacesAdminExtensions; }
}; //*** class CClusterInfo
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CClusNodeInfo
//
// Description:
// Cluster node object.
//
// Inheritance:
// CClusNodeInfo
// CClusterObject
//
//--
/////////////////////////////////////////////////////////////////////////////
class CClusNodeInfo : public CClusterObject { friend class CWizardThread;
public: //
// Construction.
//
// Default constructor
CClusNodeInfo( void ) : CClusterObject( CLUADMEX_OT_NODE ) , m_hNode( NULL ) { Reset( NULL );
} //*** CClusNodeInfo()
// Constructor taking cluster info pointer
CClusNodeInfo( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) : CClusterObject( CLUADMEX_OT_NODE, pci, pszName ) , m_hNode( NULL ) { Reset( pci, pszName );
} //*** CClusNodeInfo( pci )
~CClusNodeInfo( void ) { Close();
} //*** ~CClusNodeInfo()
// Operator = is not allowed
CClusNodeInfo & operator=( IN const CClusNodeInfo & rni ) { ATLASSERT( FALSE ); return *this;
} //*** operator=()
// Reset the data back to default values
void Reset( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) { Close(); CClusterObject::Reset( pci, pszName, CLUADMEX_OT_NODE );
} //*** Reset()
protected: //
// Properties of a node.
//
HNODE m_hNode;
public: //
// Accessor functions for node properties.
//
HNODE Hnode( void ) { return m_hNode; }
// Return the list of extensions for nodes
const std::list< CString > * PlstrAdminExtensions( void ) const { ATLASSERT( Pci() != NULL ); return Pci()->PlstrNodesAdminExtensions();
} //*** PlstrAdminExtensions()
public: //
// Operations.
//
// Open the object
DWORD ScOpen( void ) { ATLASSERT( m_pci != NULL ); ATLASSERT( m_pci->Hcluster() != NULL ); ATLASSERT( m_hNode == NULL ); ATLASSERT( m_strName.GetLength() > 0 );
DWORD sc = ERROR_SUCCESS;
//
// Open a handle to the object.
//
m_hNode = OpenClusterNode( m_pci->Hcluster(), m_strName ); if ( m_hNode == NULL ) { sc = GetLastError(); } // if: error opening the object
return sc;
} //*** ScOpen()
// Copy another object into this one.
DWORD ScCopy( IN const CClusNodeInfo & rni ) { ATLASSERT( rni.m_pci != NULL );
DWORD sc = ERROR_SUCCESS;
Close(); CClusterObject::Copy( rni );
//
// Initialize the object.
//
if ( rni.m_hNode != NULL ) { sc = ScOpen(); } // if: source object had the object opened
return sc;
} //*** ScCopy()
// Close the object
void Close( void ) { if ( m_hNode != NULL ) { CloseClusterNode( m_hNode ); } // if: node is open
m_hNode = NULL; m_bQueried = FALSE; m_bCreated = FALSE;
} //*** Close()
}; //*** class CClusNodeInfo
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CClusGroupInfo
//
// Description:
// Cluster group object.
//
// Inheritance:
// CClusGroupInfo
// CClusterObject
//
//--
/////////////////////////////////////////////////////////////////////////////
class CClusGroupInfo : public CClusterObject { friend class CWizardThread;
public: //
// Construction.
//
// Default constructor
CClusGroupInfo( void ) : CClusterObject( CLUADMEX_OT_GROUP ) , m_hGroup( NULL ) { Reset( NULL );
} //*** CClusGroupInfo()
// Constructor taking cluster info pointer
CClusGroupInfo( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) : CClusterObject( CLUADMEX_OT_GROUP, pci, pszName ) , m_hGroup( NULL ) { Reset( pci, pszName );
} //*** CClusGroupInfo( pci )
// Destructor
~CClusGroupInfo( void ) { Close();
} //*** ~CClusGroupInfo()
// Operator = is not allowed
CClusGroupInfo & operator=( IN const CClusGroupInfo & rgi ) { ATLASSERT( FALSE ); return *this;
} //*** operator=()
// Reset the data back to default values
void Reset( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) { Close(); CClusterObject::Reset( pci, pszName, CLUADMEX_OT_GROUP );
m_bCollectedOwners = FALSE; m_bCollectedResources = FALSE;
m_lpniPreferredOwners.erase( m_lpniPreferredOwners.begin(), m_lpniPreferredOwners.end() ); m_lpriResources.erase( m_lpriResources.begin(), m_lpriResources.end() );
m_bHasIPAddress = FALSE; m_bHasNetName = FALSE;
m_nPersistentState = 0; m_nFailoverThreshold = CLUSTER_GROUP_DEFAULT_FAILOVER_THRESHOLD; m_nFailoverPeriod = CLUSTER_GROUP_DEFAULT_FAILOVER_PERIOD; m_cgaftAutoFailbackType = CLUSTER_GROUP_DEFAULT_AUTO_FAILBACK_TYPE; m_nFailbackWindowStart = CLUSTER_GROUP_DEFAULT_FAILBACK_WINDOW_START; m_nFailbackWindowEnd = CLUSTER_GROUP_DEFAULT_FAILBACK_WINDOW_END;
} //*** Reset()
protected: //
// Properties of a group.
//
HGROUP m_hGroup;
BOOL m_bHasIPAddress; BOOL m_bHasNetName;
DWORD m_nPersistentState; DWORD m_nFailoverThreshold; DWORD m_nFailoverPeriod; CGAFT m_cgaftAutoFailbackType; DWORD m_nFailbackWindowStart; DWORD m_nFailbackWindowEnd;
CString m_strNetworkName; CString m_strIPAddress; CString m_strNetwork;
BOOL m_bCollectedOwners; BOOL m_bCollectedResources; CClusNodePtrList m_lpniPreferredOwners; CClusResPtrList m_lpriResources;
// Set virtual server properties
void SetVirtualServerProperties( IN LPCWSTR pszNetworkName, IN LPCWSTR pszIPAddress, IN LPCWSTR pszNetwork ) { if ( pszNetworkName != NULL ) { m_strNetworkName = pszNetworkName; } // if: network name specified
if ( pszIPAddress != NULL ) { m_strIPAddress = pszIPAddress; } // if: IP address specified
if ( pszNetwork != NULL ) { m_strNetwork = pszNetwork; } // if: network specified
} //*** SetVirtualServerProperties()
public: //
// Accessor functions for group properties.
//
HGROUP Hgroup( void ) const { return m_hGroup; }
BOOL BHasIPAddress( void ) const { return m_bHasIPAddress; } BOOL BHasNetName( void ) const { return m_bHasNetName; }
DWORD NPersistentState( void ) const { return m_nPersistentState; } DWORD NFailoverThreshold( void ) const { return m_nFailoverThreshold; } DWORD NFailoverPeriod( void ) const { return m_nFailoverPeriod; } CGAFT CgaftAutoFailbackType( void ) const { return m_cgaftAutoFailbackType; } DWORD NFailbackWindowStart( void ) const { return m_nFailbackWindowStart; } DWORD NFailbackWindowEnd( void ) const { return m_nFailbackWindowEnd; }
const CString & RstrNetworkName( void ) const { return m_strNetworkName; } const CString & RstrIPAddress( void ) const { return m_strIPAddress; } const CString & RstrNetwork( void ) const { return m_strNetwork; }
BOOL BCollectedOwners( void ) const { return m_bCollectedOwners; } CClusNodePtrList * PlpniPreferredOwners( void ) { return &m_lpniPreferredOwners; } CClusResPtrList * PlpriResources( void ) { return &m_lpriResources; }
// Returns whether the group is a virtual server or not
BOOL BIsVirtualServer( void ) const { return m_bQueried && m_bHasIPAddress & m_bHasNetName;
} //*** BIsVirtualServer()
// Set failover properties for the group
BOOL BSetFailoverProperties( IN DWORD nFailoverThreshold, IN DWORD nFailoverPeriod ) { BOOL bChanged = FALSE;
if ( m_nFailoverThreshold != nFailoverThreshold ) { m_nFailoverThreshold = nFailoverThreshold; bChanged = TRUE; } // if: threshold changed
if ( m_nFailoverPeriod != nFailoverPeriod ) { m_nFailoverPeriod = nFailoverPeriod; bChanged = TRUE; } // if: period changed
return bChanged;
} //*** BSetFailoverProperties()
// Set failback properties for the group
BOOL BSetFailbackProperties( IN CGAFT cgaft, IN DWORD nFailbackWindowStart, IN DWORD nFailbackWindowEnd ) { BOOL bChanged = FALSE;
if ( m_cgaftAutoFailbackType != cgaft ) { m_cgaftAutoFailbackType = cgaft; bChanged = TRUE; } // if: autofailback type changed
if ( m_nFailbackWindowStart != nFailbackWindowStart ) { m_nFailbackWindowStart = nFailbackWindowStart; bChanged = TRUE; } // if: failback start window changed
if ( m_nFailbackWindowEnd != nFailbackWindowEnd ) { m_nFailbackWindowEnd = nFailbackWindowEnd; bChanged = TRUE; } // if: failback end window changed
return bChanged;
} //*** BSetFailbackProperties()
// Return the list of extensions for groups
const std::list< CString > * PlstrAdminExtensions( void ) const { ATLASSERT( Pci() != NULL ); return Pci()->PlstrGroupsAdminExtensions();
} //*** PlstrAdminExtensions()
public: //
// Operations.
//
// Open the object
DWORD ScOpen( void ) { ATLASSERT( m_pci != NULL ); ATLASSERT( m_pci->Hcluster() != NULL ); ATLASSERT( m_hGroup == NULL ); ATLASSERT( m_strName.GetLength() > 0 );
DWORD sc = ERROR_SUCCESS;
//
// Open a handle to the object.
//
m_hGroup = OpenClusterGroup( m_pci->Hcluster(), m_strName ); if ( m_hGroup == NULL ) { sc = GetLastError(); } // if: error opening the object
return sc;
} //*** ScOpen()
// Create the object
DWORD ScCreate( void ) { ATLASSERT( m_pci != NULL ); ATLASSERT( m_pci->Hcluster() != NULL ); ATLASSERT( m_hGroup == NULL ); ATLASSERT( m_strName.GetLength() > 0 );
DWORD sc = ERROR_SUCCESS;
//
// Create the object.
//
m_hGroup = CreateClusterGroup( m_pci->Hcluster(), m_strName ); if ( m_hGroup == NULL ) { sc = GetLastError(); } // if: error creating the object
return sc;
} //*** ScCreate()
// Copy another object into this one.
DWORD ScCopy( IN const CClusGroupInfo & rgi ) { ATLASSERT( rgi.m_pci != NULL );
DWORD sc = ERROR_SUCCESS;
Close(); CClusterObject::Copy( rgi );
m_bHasIPAddress = rgi.m_bHasIPAddress; m_bHasNetName = rgi.m_bHasNetName; m_nPersistentState = rgi.m_nPersistentState; m_nFailoverThreshold = rgi.m_nFailoverThreshold; m_nFailoverPeriod = rgi.m_nFailoverPeriod; m_cgaftAutoFailbackType = rgi.m_cgaftAutoFailbackType; m_nFailbackWindowStart = rgi.m_nFailbackWindowStart; m_nFailbackWindowEnd = rgi.m_nFailbackWindowEnd;
//
// Copy the preferred owners and resources lists.
//
m_lpniPreferredOwners = rgi.m_lpniPreferredOwners; m_lpriResources = rgi.m_lpriResources;
//
// Initialize the object.
//
if ( rgi.m_hGroup != NULL ) { sc = ScOpen(); } // if: source object had the object open
return sc;
} //*** ScCopy()
// Delete the object
DWORD ScDelete( void ) { ATLASSERT( m_pci != NULL ); ATLASSERT( m_hGroup != NULL );
DWORD sc = ERROR_SUCCESS;
sc = DeleteClusterGroup( m_hGroup ); if ( sc == ERROR_SUCCESS ) { Close(); m_bCreated = FALSE; } // if: objected deleted successfully
return sc;
} //*** ScDelete()
// Close the object
void Close( void ) { if ( m_hGroup != NULL ) { CloseClusterGroup( m_hGroup ); } // if: group is open
m_hGroup = NULL; m_bQueried = FALSE; m_bCreated = FALSE;
} //*** Close()
}; //*** class CClusGroupInfo
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CClusResTypeInfo
//
// Description:
// Cluster resource type object.
//
// Inheritance:
// CClusResTypeInfo
// CClusterObject
//
//--
/////////////////////////////////////////////////////////////////////////////
class CClusResTypeInfo : public CClusterObject { friend class CWizardThread;
public: //
// Construction.
//
// Default constructor
CClusResTypeInfo( void ) : CClusterObject( CLUADMEX_OT_RESOURCETYPE ) , m_pcrd( NULL ) { Reset( NULL );
} //*** CClusResTypeInfo()
// Constructor taking cluster info pointer
CClusResTypeInfo( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) : CClusterObject( CLUADMEX_OT_RESOURCETYPE, pci, pszName ) , m_pcrd( NULL ) { Reset( pci, pszName );
} //*** CClusResTypeInfo( pci )
// Destructor
~CClusResTypeInfo( void ) { Close();
delete [] m_pcrd; m_pcrd = NULL;
} //*** ~CClusGroupInfo()
// Operator = is not allowed
CClusResTypeInfo & operator=( IN const CClusResTypeInfo & rrti ) { ATLASSERT( FALSE ); return *this;
} //*** operator=()
// Reset the data back to default values
void Reset( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) { Close(); CClusterObject::Reset( pci, pszName, CLUADMEX_OT_RESOURCETYPE );
m_strDisplayName.Empty(); m_strResDLLName.Empty();
m_lstrAdminExtensions.erase( m_lstrAdminExtensions.begin(), m_lstrAdminExtensions.end() ); m_lstrAllAdminExtensions.erase( m_lstrAllAdminExtensions.begin(), m_lstrAllAdminExtensions.end() ); m_lstrResourceAdminExtensions.erase( m_lstrResourceAdminExtensions.begin(), m_lstrResourceAdminExtensions.end() );
m_nLooksAlive = CLUSTER_RESTYPE_DEFAULT_LOOKS_ALIVE; m_nIsAlive = CLUSTER_RESTYPE_DEFAULT_IS_ALIVE; m_rciResClassInfo.rc = CLUS_RESCLASS_UNKNOWN; m_rciResClassInfo.SubClass = 0; m_fCharacteristics = CLUS_CHAR_UNKNOWN; m_fFlags = 0;
delete [] m_pcrd; m_pcrd = NULL;
} //*** Reset()
protected: //
// Properties of a resource type.
//
CString m_strDisplayName; CString m_strResDLLName;
std::list< CString > m_lstrAdminExtensions; std::list< CString > m_lstrAllAdminExtensions; std::list< CString > m_lstrResourceAdminExtensions;
DWORD m_nLooksAlive; DWORD m_nIsAlive; CLUS_RESOURCE_CLASS_INFO m_rciResClassInfo; DWORD m_fCharacteristics; DWORD m_fFlags;
CLUSPROP_REQUIRED_DEPENDENCY * m_pcrd;
public: //
// Accessor functions for resource type properties
//
const CString & RstrDisplayName( void ) const { return m_strDisplayName; } const CString & RstrResDLLName( void ) const { return m_strResDLLName; }
// Return list of extensions for this resource type
const std::list< CString > * PlstrAdminExtensions( void ) { //
// If not done already, construct the complete list of extensions
// from the extensions for this resource type and the extensions
// for all resource types.
//
if ( m_lstrAllAdminExtensions.size() == 0 ) { ATLASSERT( Pci() != NULL ); m_lstrAllAdminExtensions = m_lstrAdminExtensions; m_lstrAllAdminExtensions.insert( m_lstrAllAdminExtensions.end(), Pci()->PlstrResTypesAdminExtensions()->begin(), Pci()->PlstrResTypesAdminExtensions()->end() ); } // if: full list not constructed yet
return &m_lstrAllAdminExtensions;
} //*** PlstrAdminExtensions()
// Return list of extensions for resources of this type
const std::list< CString > * PlstrResourceAdminExtensions( void ) { //
// If not done already, construct the complete list of extensions
// from the extensions for this resource type and the extensions
// for all resources.
//
if ( m_lstrResourceAdminExtensions.size() == 0 ) { ATLASSERT( Pci() != NULL ); m_lstrResourceAdminExtensions = m_lstrAdminExtensions; m_lstrResourceAdminExtensions.insert( m_lstrResourceAdminExtensions.end(), Pci()->PlstrResourcesAdminExtensions()->begin(), Pci()->PlstrResourcesAdminExtensions()->end() ); } // if: full list not constructed yet
return &m_lstrResourceAdminExtensions;
} //*** PlstrAdminExtensions()
DWORD NLooksAlive( void ) const { return m_nLooksAlive; } DWORD NIsAlive( void ) const { return m_nIsAlive; } DWORD FCharacteristics( void ) const { return m_fCharacteristics; } DWORD FFlags( void ) const { return m_fFlags; }
CLUS_RESOURCE_CLASS_INFO * PrciResClassInfo( void ) { return &m_rciResClassInfo; } CLUSTER_RESOURCE_CLASS ResClass( void ) const { return m_rciResClassInfo.rc; }
CLUSPROP_REQUIRED_DEPENDENCY * Pcrd( void ) { return m_pcrd; }
public: //
// Operations.
//
// Open the object
DWORD ScOpen( void ) { ATLASSERT( m_pci != NULL ); ATLASSERT( m_strName.GetLength() > 0 );
DWORD sc = ERROR_SUCCESS;
return sc;
} //*** ScOpen()
// Create the object
DWORD ScCreate( IN HGROUP hGroup, IN DWORD dwFlags ) { ATLASSERT( m_pci != NULL ); ATLASSERT( m_pci->Hcluster() != NULL ); ATLASSERT( m_strName.GetLength() > 0 ); ATLASSERT( m_strDisplayName.GetLength() > 0 ); ATLASSERT( m_strResDLLName.GetLength() > 0 ); ATLASSERT( m_nLooksAlive != 0 ); ATLASSERT( m_nIsAlive != 0 );
DWORD sc;
//
// Create the object.
//
sc = CreateClusterResourceType( Pci()->Hcluster(), m_strName, m_strDisplayName, m_strResDLLName, m_nLooksAlive, m_nIsAlive );
return sc;
} //*** ScCreate()
// Copy another object into this one.
DWORD ScCopy( IN const CClusResTypeInfo & rrti ) { ATLASSERT( rrti.m_pci != NULL );
DWORD sc = ERROR_SUCCESS;
Close(); CClusterObject::Copy( rrti );
m_strDisplayName = rrti.m_strDisplayName; m_strResDLLName = rrti.m_strResDLLName;
m_lstrAdminExtensions = m_lstrAdminExtensions; m_lstrResourceAdminExtensions = rrti.m_lstrResourceAdminExtensions;
m_nLooksAlive = rrti.m_nLooksAlive; m_nIsAlive = rrti.m_nIsAlive; m_rciResClassInfo.rc = rrti.m_rciResClassInfo.rc; m_rciResClassInfo.SubClass = rrti.m_rciResClassInfo.SubClass; m_fCharacteristics = rrti.m_fCharacteristics; m_fFlags = rrti.m_fFlags;
//
// Initialize the object.
//
// sc = ScOpen();
return sc;
} //*** ScCopy()
// Close the object
void Close( void ) { // Dummy function to support similar semantics as other objects.
m_bQueried = FALSE; m_bCreated = FALSE;
} //*** Close();
}; //*** class CClusResTypeInfo
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CClusResInfo
//
// Description:
// Cluster resource object.
//
// Inheritance:
// CClusResInfo
// CClusterObject
//
// Notes:
// 1) Must appear after definition of CClusResTypeInfo because
// CClusResTypeInfo methods are referenced in this class's methods.
//
//--
/////////////////////////////////////////////////////////////////////////////
class CClusResInfo : public CClusterObject { friend class CWizardThread;
public: //
// Construction.
//
// Default constructor
CClusResInfo( void ) : CClusterObject( CLUADMEX_OT_RESOURCE ) , m_hResource( NULL ) { Reset( NULL );
} //*** CClusResInfo()
// Constructor taking cluster info pointer
CClusResInfo( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) : CClusterObject( CLUADMEX_OT_RESOURCE, pci, pszName ) , m_hResource( NULL ) { Reset( pci, pszName );
} //*** CClusResInfo( pci )
~CClusResInfo( void ) { Close();
} //*** ~CClusResInfo()
// Operator = is not allowed
CClusResInfo & operator=( IN const CClusResInfo & rri ) { ATLASSERT( FALSE ); return *this;
} //*** operator=()
// Reset the data back to default values
void Reset( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) { Close(); CClusterObject::Reset( pci, pszName, CLUADMEX_OT_RESOURCE );
m_prti = NULL; m_pgi = NULL; m_pniOwner = NULL;
m_bCollectedOwners = FALSE; m_bCollectedDependencies = FALSE;
m_lpniPossibleOwners.erase( m_lpniPossibleOwners.begin(), m_lpniPossibleOwners.end() ); m_lpriDependencies.erase( m_lpriDependencies.begin(), m_lpriDependencies.end() );
m_bSeparateMonitor = FALSE; m_nPersistentState = 0; m_nLooksAlive = CLUSTER_RESOURCE_DEFAULT_LOOKS_ALIVE; m_nIsAlive = CLUSTER_RESOURCE_DEFAULT_IS_ALIVE; m_crraRestartAction = CLUSTER_RESOURCE_DEFAULT_RESTART_ACTION; m_nRestartThreshold = CLUSTER_RESOURCE_DEFAULT_RESTART_THRESHOLD; m_nRestartPeriod = CLUSTER_RESOURCE_DEFAULT_RESTART_PERIOD; m_nPendingTimeout = CLUSTER_RESOURCE_DEFAULT_PENDING_TIMEOUT;
} //*** Reset()
protected: //
// Properties of a resource.
//
HRESOURCE m_hResource;
CClusResTypeInfo * m_prti; CClusGroupInfo * m_pgi; CClusNodeInfo * m_pniOwner;
BOOL m_bSeparateMonitor; DWORD m_nPersistentState; DWORD m_nLooksAlive; DWORD m_nIsAlive; CRRA m_crraRestartAction; DWORD m_nRestartThreshold; DWORD m_nRestartPeriod; DWORD m_nPendingTimeout;
BOOL m_bCollectedOwners; BOOL m_bCollectedDependencies; CClusNodePtrList m_lpniPossibleOwners; CClusResPtrList m_lpriDependencies;
public: //
// Accessor functions for resource properties
//
HRESOURCE Hresource( void ) const { return m_hResource; }
CClusResTypeInfo * Prti( void ) const { ATLASSERT( m_prti != NULL ); return m_prti; } CClusGroupInfo * Pgi( void ) const { ATLASSERT( m_pgi != NULL ); return m_pgi; } CClusNodeInfo * PniOwner( void ) const { ATLASSERT( m_pniOwner != NULL ); return m_pniOwner; }
BOOL BSeparateMonitor( void ) const { return m_bSeparateMonitor; } DWORD NPersistentState( void ) const { return m_nPersistentState; } DWORD NLooksAlive( void ) const { return m_nLooksAlive; } DWORD NIsAlive( void ) const { return m_nIsAlive; } CRRA CrraRestartAction( void ) const { return m_crraRestartAction; } DWORD NRestartThreshold( void ) const { return m_nRestartThreshold; } DWORD NRestartPeriod( void ) const { return m_nRestartPeriod; } DWORD NPendingTimeout( void ) const { return m_nPendingTimeout; }
BOOL BCollectedOwners( void ) const { return m_bCollectedOwners; } BOOL BCollectedDependencies( void ) const { return m_bCollectedDependencies; } CClusNodePtrList * PlpniPossibleOwners( void ) { return &m_lpniPossibleOwners; } CClusResPtrList * PlpriDependencies( void ) { return &m_lpriDependencies; }
CLUSTER_RESOURCE_CLASS ResClass( void ) const { return Prti()->ResClass(); }
// Set the group
void SetGroup( IN CClusGroupInfo * pgi ) { ATLASSERT( pgi != NULL );
m_pgi = pgi;
} //*** SetGroup()
// Set the resource type of the resource
BOOL BSetResourceType( IN CClusResTypeInfo * prti ) { ATLASSERT( prti != NULL );
BOOL bChanged = FALSE;
//
// If the resource type changed, set it.
//
if ( m_prti != prti ) { m_prti = prti; bChanged = TRUE; } // if: resource type changed
return bChanged;
} //*** BSetResourceType()
// Set the separate monitor property for the resource
BOOL BSetSeparateMonitor( IN BOOL bSeparateMonitor ) { BOOL bChanged = FALSE;
if ( m_bSeparateMonitor != bSeparateMonitor ) { m_bSeparateMonitor = bSeparateMonitor; bChanged = TRUE; } // if: separate monitor changed
return bChanged;
} //*** BSetSeparateMonitor()
// Set advanced properties for the resource
BOOL BSetAdvancedProperties( IN CRRA crra, IN DWORD nRestartThreshold, IN DWORD nRestartPeriod, IN DWORD nLooksAlive, IN DWORD nIsAlive, IN DWORD nPendingTimeout ) { BOOL bChanged = FALSE;
if ( m_crraRestartAction != crra ) { m_crraRestartAction = crra; bChanged = TRUE; } // if: restart action changed
if ( m_nRestartThreshold != nRestartThreshold ) { m_nRestartThreshold = nRestartThreshold; bChanged = TRUE; } // if: restart threshold changed
if ( m_nRestartPeriod != nRestartPeriod ) { m_nRestartPeriod = nRestartPeriod; bChanged = TRUE; } // if: restart period changed
if ( m_nLooksAlive != nLooksAlive ) { m_nLooksAlive = nLooksAlive; bChanged = TRUE; } // if: looks alive period changed
if ( m_nIsAlive != nIsAlive ) { m_nIsAlive = nIsAlive; bChanged = TRUE; } // if: is alive period changed
if ( m_nPendingTimeout != nPendingTimeout ) { m_nPendingTimeout = nPendingTimeout; bChanged = TRUE; } // if: pending timeout changed
return bChanged;
} //*** BSetAdvancedProperties()
// Return the list of extensions for resources
const std::list< CString > * PlstrAdminExtensions( void ) const { ATLASSERT( m_prti != NULL ); return m_prti->PlstrResourceAdminExtensions();
} //*** PlstrAdminExtensions()
public: //
// Operations.
//
// Open the object
DWORD ScOpen( void ) { ATLASSERT( m_pci != NULL ); ATLASSERT( m_pci->Hcluster() != NULL ); ATLASSERT( m_hResource == NULL ); ATLASSERT( m_strName.GetLength() > 0 );
DWORD sc = ERROR_SUCCESS;
//
// Open a handle to the object.
//
m_hResource = OpenClusterResource( m_pci->Hcluster(), m_strName ); if ( m_hResource == NULL ) { sc = GetLastError(); } // if: error opening the object
return sc;
} //*** ScOpen()
// Create the object
DWORD ScCreate( IN HGROUP hGroup, IN DWORD dwFlags ) { ATLASSERT( hGroup != NULL ); ATLASSERT( Prti() != NULL ); ATLASSERT( Prti()->RstrName().GetLength() > 0 ); ATLASSERT( m_hResource == NULL ); ATLASSERT( m_strName.GetLength() > 0 );
DWORD sc = ERROR_SUCCESS;
m_bSeparateMonitor = ( dwFlags & CLUSTER_RESOURCE_SEPARATE_MONITOR ) == CLUSTER_RESOURCE_SEPARATE_MONITOR;
//
// Create the object.
//
m_hResource = CreateClusterResource( hGroup, m_strName, Prti()->RstrName(), dwFlags ); if ( m_hResource == NULL ) { sc = GetLastError(); } // if: error creating the object
return sc;
} //*** ScCreate()
// Copy another object into this one.
DWORD ScCopy( IN const CClusResInfo & rri ) { ATLASSERT( rri.m_pci != NULL );
DWORD sc = ERROR_SUCCESS;
Close(); CClusterObject::Copy( rri );
m_prti = rri.m_prti; m_pgi = rri.m_pgi; m_pniOwner = rri.m_pniOwner;
m_bSeparateMonitor = rri.m_bSeparateMonitor; m_nPersistentState = rri.m_nPersistentState; m_nLooksAlive = rri.m_nLooksAlive; m_nIsAlive = rri.m_nIsAlive; m_crraRestartAction = rri.m_crraRestartAction; m_nRestartThreshold = rri.m_nRestartThreshold; m_nRestartPeriod = rri.m_nRestartPeriod; m_nPendingTimeout = rri.m_nPendingTimeout;
//
// Copy the possible owners and dependencies lists.
//
m_lpniPossibleOwners = rri.m_lpniPossibleOwners; m_lpriDependencies = rri.m_lpriDependencies;
//
// Initialize the object.
//
if ( rri.m_hResource != NULL ) { sc = ScOpen(); } // if: source object had the object open
return sc;
} //*** ScCopy()
// Delete the object
DWORD ScDelete( void ) { ATLASSERT( m_hResource != NULL );
DWORD sc = ERROR_SUCCESS;
sc = DeleteClusterResource( m_hResource ); if ( sc == ERROR_SUCCESS ) { Close(); m_bCreated = FALSE; } // if: objected deleted successfully
return sc;
} //*** ScDelete()
// Close the object
void Close( void ) { if ( m_hResource != NULL ) { CloseClusterResource( m_hResource ); } // if: resource is open
m_hResource = NULL; m_bQueried = FALSE; m_bCreated = FALSE;
} //*** Close()
// Get network name of first Network Name resource we are dependent on
BOOL BGetNetworkName( OUT WCHAR * lpszNetName, IN OUT DWORD * pcchNetName ) { ATLASSERT( m_hResource != NULL ); ATLASSERT( lpszNetName != NULL ); ATLASSERT( pcchNetName != NULL );
return GetClusterResourceNetworkName( m_hResource, lpszNetName, pcchNetName );
} //*** BGetNetworkName()
// Determine whether required dependencies are specified or not
BOOL BRequiredDependenciesPresent( IN CClusResPtrList const * plpri, OUT CString & rstrMissing, OUT BOOL & rbMissingTypeName );
}; //*** class CClusResInfo
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CClusNetworkInfo
//
// Description:
// Cluster network object.
//
// Inheritance:
// CClusNetworkInfo
// CClusterObject
//
//--
/////////////////////////////////////////////////////////////////////////////
class CClusNetworkInfo : public CClusterObject { friend class CWizardThread;
public: //
// Construction.
//
// Default constructor
CClusNetworkInfo( void ) : CClusterObject( CLUADMEX_OT_NETWORK ) , m_hNetwork( NULL ) { Reset( NULL );
} //*** CClusNetworkInfo()
// Constructor taking cluster info pointer
CClusNetworkInfo( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) : CClusterObject( CLUADMEX_OT_NETWORK, pci, pszName ) , m_hNetwork( NULL ) { Reset( pci, pszName );
} //*** CClusNetworkInfo( pci )
~CClusNetworkInfo( void ) { Close();
} //*** ~CClusterNetworkInfo()
// Operator = is not allowed
CClusNetworkInfo & operator=( IN const CClusNetworkInfo & rni ) { ATLASSERT( FALSE ); return *this;
} //*** operator=()
// Reset the data back to default values
void Reset( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) { Close(); CClusterObject::Reset( pci, pszName, CLUADMEX_OT_NETWORK );
m_nRole = ClusterNetworkRoleNone; m_strAddress.Empty(); m_strAddressMask.Empty();
m_nAddress = 0; m_nAddressMask = 0;
} //*** Reset()
protected: //
// Properties of a network.
//
HNETWORK m_hNetwork;
CLUSTER_NETWORK_ROLE m_nRole; CString m_strAddress; CString m_strAddressMask;
DWORD m_nAddress; DWORD m_nAddressMask;
public: //
// Accessor functions for network properties
//
HNETWORK Hnetwork( void ) const { return m_hNetwork; }
CLUSTER_NETWORK_ROLE NRole( void ) const { return m_nRole; } const CString & RstrAddress( void ) const { return m_strAddress; } const CString & RstrAddressMask( void ) const { return m_strAddressMask; }
DWORD NAddress( void ) const { return m_nAddress; } DWORD NAddressMask( void ) const { return m_nAddressMask; }
// Returns whether the network is used for client access
BOOL BIsClientNetwork( void ) const { return m_bQueried && (m_nRole & ClusterNetworkRoleClientAccess);
} //*** BIsClientNetwork()
// Returns whether the network is used for internal cluster use
BOOL BIsInternalNetwork( void ) const { return m_bQueried && (m_nRole & ClusterNetworkRoleInternalUse);
} //*** BIsInternalNetwork()
// Return the list of extensions for networks
const std::list< CString > * PlstrAdminExtensions( void ) const { ATLASSERT( Pci() != NULL ); return Pci()->PlstrNetworksAdminExtensions();
} //*** PlstrAdminExtensions()
public: //
// Operations.
//
// Open the object
DWORD ScOpen( void ) { ATLASSERT( m_pci != NULL ); ATLASSERT( m_pci->Hcluster() != NULL ); ATLASSERT( m_hNetwork == NULL ); ATLASSERT( m_strName.GetLength() > 0 );
DWORD sc = ERROR_SUCCESS;
//
// Open a handle to the object.
//
m_hNetwork = OpenClusterNetwork( m_pci->Hcluster(), m_strName ); if ( m_hNetwork == NULL ) { sc = GetLastError(); } // if: error opening the object
return sc;
} //*** ScOpen()
// Copy another object into this one.
DWORD ScCopy( IN const CClusNetworkInfo & rni ) { ATLASSERT( rni.m_pci != NULL );
DWORD sc = ERROR_SUCCESS;
Close(); CClusterObject::Copy( rni );
m_nRole = rni.m_nRole; m_strAddress = rni.m_strAddress; m_strAddressMask = rni.m_strAddressMask;
m_nAddress = rni.m_nAddress; m_nAddressMask = rni.m_nAddressMask;
//
// Initialize the object.
//
if ( rni.m_hNetwork != NULL ) { sc = ScOpen(); } // if: source object had the object open
return sc;
} //*** ScCopy()
// Close the object
void Close( void ) { if ( m_hNetwork != NULL ) { CloseClusterNetwork( m_hNetwork ); } // if: network is open
m_hNetwork = NULL; m_bQueried = FALSE; m_bCreated = FALSE;
} //*** Close()
}; //*** class CClusNetworkInfo
/////////////////////////////////////////////////////////////////////////////
//++
//
// class CClusNetIFInfo
//
// Description:
// Cluster network interface object.
//
// Inheritance:
// CClusNetIFInfo
// CClusterObject
//
//--
/////////////////////////////////////////////////////////////////////////////
class CClusNetIFInfo : public CClusterObject { friend class CWizardThread;
public: //
// Construction.
//
// Default constructor
CClusNetIFInfo( void ) : CClusterObject( CLUADMEX_OT_NETINTERFACE ) , m_hNetInterface( NULL ) { Reset( NULL );
} //*** CClusNetworkInfo()
// Constructor taking cluster info pointer
CClusNetIFInfo( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) : CClusterObject( CLUADMEX_OT_NETINTERFACE, pci, pszName ) , m_hNetInterface( NULL ) { Reset( pci, pszName );
} //*** CClusNetIFInfo( pci )
~CClusNetIFInfo( void ) { Close();
} //*** ~CClusNetIFInfo()
// Operator = is not allowed
CClusNetIFInfo & operator=( IN const CClusNetIFInfo & rnii ) { ATLASSERT( FALSE ); return *this;
} //*** operator=()
// Reset the data back to default values
void Reset( IN CClusterInfo * pci, IN LPCTSTR pszName = NULL ) { Close(); CClusterObject::Reset( pci, pszName, CLUADMEX_OT_NETINTERFACE );
} //*** Reset()
protected: //
// Properties of a network interface.
//
HNETINTERFACE m_hNetInterface;
public: //
// Accessor functions for network properties
//
HNETINTERFACE Hnetinterface( void ) const { return m_hNetInterface; }
// Return the list of extensions for network interfaces
const std::list< CString > * PlstrAdminExtensions( void ) const { ATLASSERT( Pci() != NULL ); return Pci()->PlstrNetInterfacesAdminExtensions();
} //*** PlstrAdminExtensions()
public: //
// Operations.
//
// Open the object
DWORD ScOpen( void ) { ATLASSERT( m_pci != NULL ); ATLASSERT( m_pci->Hcluster() != NULL ); ATLASSERT( m_hNetInterface == NULL ); ATLASSERT( m_strName.GetLength() > 0 );
DWORD sc = ERROR_SUCCESS;
//
// Open a handle to the object.
//
m_hNetInterface = OpenClusterNetInterface( m_pci->Hcluster(), m_strName ); if ( m_hNetInterface == NULL ) { sc = GetLastError(); } // if: error opening the object
return sc;
} //*** ScOpen()
// Copy another object into this one.
DWORD ScCopy( IN const CClusNetIFInfo & rnii ) { ATLASSERT( rnii.m_pci != NULL );
DWORD sc = ERROR_SUCCESS;
Close(); CClusterObject::Copy( rnii );
//
// Initialize the object.
//
if ( rnii.m_hNetInterface != NULL ) { sc = ScOpen(); } // if: source object had the object open
return sc;
} //*** ScCopy()
// Close the object
void Close( void ) { if ( m_hNetInterface != NULL ) { CloseClusterNetInterface( m_hNetInterface ); } // if: network interface is open
m_hNetInterface = NULL; m_bQueried = FALSE; m_bCreated = FALSE;
} //*** Close()
}; //*** class CClusNetIFInfo
/////////////////////////////////////////////////////////////////////////////
// Global Template Functions
/////////////////////////////////////////////////////////////////////////////
// Delete all list items from a pointer list
template < class ListT, class ObjT > void DeleteListItems( ListT * ppl ) { ListT::iterator it; for ( it = ppl->begin() ; it != ppl->end() ; it++ ) { ObjT * pco = *it; delete pco; } // for: each item in the list
} //*** DeleteListItems< ListT, ObjT >()
// Retrieve an object from a list by its name
template < class ObjT > ObjT PobjFromName( std::list< ObjT > * pList, IN LPCTSTR pszName ) { ATLASSERT( pList != NULL ); ATLASSERT( pszName != NULL );
//
// Get pointers to beginning and end of list.
//
std::list< ObjT >::iterator itCurrent = pList->begin(); std::list< ObjT >::iterator itLast = pList->end();
//
// Loop through the list looking for the object with the specified name.
//
while ( itCurrent != itLast ) { if ( (*itCurrent)->RstrName() == pszName ) { return *itCurrent; } // if: found a match
itCurrent++; } // while: more items in the list
return NULL;
} //*** PobjFromName< ObjT >()
/////////////////////////////////////////////////////////////////////////////
#endif // __CLUSOBJ_H_
|