258 lines
7.5 KiB
C++
258 lines
7.5 KiB
C++
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Copyright (c) 1999-2000 Microsoft Corporation
|
||
|
//
|
||
|
// Module Name:
|
||
|
// CBaseClusterCleanup.cpp
|
||
|
//
|
||
|
// Description:
|
||
|
// Contains the definition of the CBaseClusterCleanup class.
|
||
|
//
|
||
|
// Maintained By:
|
||
|
// Vij Vasu (Vvasu) 30-APR-2000
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
// Include Files
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// The precompiled header.
|
||
|
#include "pch.h"
|
||
|
|
||
|
// For ClRtlGetClusterInstallState()
|
||
|
#include "clusrtl.h"
|
||
|
|
||
|
// The header file of this class.
|
||
|
#include "CBaseClusterCleanup.h"
|
||
|
|
||
|
// For the CBCAInterface class.
|
||
|
#include "CBCAInterface.h"
|
||
|
|
||
|
// For the CClusSvcCleanup action
|
||
|
#include "CClusSvcCleanup.h"
|
||
|
|
||
|
// For the CClusDBCleanup action
|
||
|
#include "CClusDBCleanup.h"
|
||
|
|
||
|
// For the CClusDiskCleanup action
|
||
|
#include "CClusDiskCleanup.h"
|
||
|
|
||
|
// For the CClusNetCleanup action
|
||
|
#include "CClusNetCleanup.h"
|
||
|
|
||
|
// For the CNodeCleanup action
|
||
|
#include "CNodeCleanup.h"
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseClusterCleanup::CBaseClusterCleanup
|
||
|
//
|
||
|
// Description:
|
||
|
// Constructor of the CBaseClusterCleanup class.
|
||
|
//
|
||
|
// This function also stores the parameters that are required for
|
||
|
// cluster cleanup.
|
||
|
//
|
||
|
// This function also checks if the computer is in the correct state
|
||
|
// for cleanup.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pbcaiInterfaceIn
|
||
|
// Pointer to the interface class for this library.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
// Exceptions Thrown:
|
||
|
// CConfigError
|
||
|
// If the OS version is incorrect or if the installation state.
|
||
|
//
|
||
|
// CRuntimeError
|
||
|
// If any of the APIs fail.
|
||
|
//
|
||
|
//--
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
CBaseClusterCleanup::CBaseClusterCleanup(
|
||
|
CBCAInterface * pbcaiInterfaceIn
|
||
|
)
|
||
|
: BaseClass( pbcaiInterfaceIn )
|
||
|
{
|
||
|
BCATraceScope( "" );
|
||
|
LogMsg( "The current cluster configuration task is: Node Cleanup." );
|
||
|
|
||
|
// Check if the installation state of the cluster binaries is correct.
|
||
|
{
|
||
|
eClusterInstallState ecisInstallState;
|
||
|
|
||
|
DWORD dwError = TW32( ClRtlGetClusterInstallState( NULL, &ecisInstallState ) );
|
||
|
|
||
|
if ( dwError != ERROR_SUCCESS )
|
||
|
{
|
||
|
LogMsg( "Error %#x occurred trying to get cluster installation state.", dwError );
|
||
|
BCATraceMsg1( "Error %#x occurred trying to get cluster installation state. Throwing exception.", dwError );
|
||
|
|
||
|
THROW_RUNTIME_ERROR( HRESULT_FROM_WIN32( dwError ), IDS_ERROR_GETTING_INSTALL_STATE );
|
||
|
} // if: there was a problem getting the cluster installation state
|
||
|
|
||
|
BCATraceMsg3(
|
||
|
"Current install state = %d. Required %d or %d."
|
||
|
, ecisInstallState
|
||
|
, eClusterInstallStateConfigured
|
||
|
, eClusterInstallStateUpgraded
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// The installation state for this node to be cleaned up should be that the cluster service
|
||
|
// has been configured or that it has been upgraded.
|
||
|
//
|
||
|
if ( ( ecisInstallState != eClusterInstallStateConfigured ) && ( ecisInstallState != eClusterInstallStateUpgraded ) )
|
||
|
{
|
||
|
LogMsg( "The cluster installation state is set to %d. Expected %d or %d. Cannot proceed.", ecisInstallState, eClusterInstallStateConfigured, eClusterInstallStateUpgraded );
|
||
|
BCATraceMsg1( "Cluster installation state is set to %d, which is incorrect. Throwing exception.", ecisInstallState );
|
||
|
|
||
|
THROW_CONFIG_ERROR( HRESULT_FROM_WIN32( TW32( ERROR_INVALID_STATE ) ), IDS_ERROR_INCORRECT_INSTALL_STATE );
|
||
|
} // if: the installation state is not correct
|
||
|
|
||
|
LogMsg( "The cluster installation state is correct. Configuration can proceed." );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Create a list of actions to be performed.
|
||
|
// The order of appending actions is significant.
|
||
|
//
|
||
|
|
||
|
// Add the action to clean up the ClusNet service.
|
||
|
// The ClusNet service depends on the ClusSvc service and therefore cannot be
|
||
|
// stopped if the ClusSvc service is running. So, the ClusSvc service should not be
|
||
|
// running when the Commit() method of this class is called.
|
||
|
RalGetActionList().AppendAction( new CClusNetCleanup( this ) );
|
||
|
|
||
|
// Add the action to clean up the ClusDisk service.
|
||
|
RalGetActionList().AppendAction( new CClusDiskCleanup( this ) );
|
||
|
|
||
|
// Add the action to clean up the cluster database.
|
||
|
RalGetActionList().AppendAction( new CClusDBCleanup( this ) );
|
||
|
|
||
|
// Add the action to clean up miscellenous actions we performed when this node joined the cluster.
|
||
|
RalGetActionList().AppendAction( new CNodeCleanup( this ) );
|
||
|
|
||
|
// Add the action to clean up the cluster service. Clean this up last for two reasons:
|
||
|
// 1. The install state is changed by this action.
|
||
|
// 2. If cleanup aborted for some reason and the cluster service is not deleted, it will
|
||
|
// reinitiate cleanup the next time it starts.
|
||
|
RalGetActionList().AppendAction( new CClusSvcCleanup( this ) );
|
||
|
|
||
|
|
||
|
// Indicate if this action can be rolled back or not.
|
||
|
SetRollbackPossible( RalGetActionList().FIsRollbackPossible() );
|
||
|
|
||
|
// Indicate that a node should be cleaned up during commit.
|
||
|
SetAction( eCONFIG_ACTION_CLEANUP );
|
||
|
|
||
|
LogMsg( "Initialization for node cleanup complete." );
|
||
|
|
||
|
} //*** CBaseClusterCleanup::CBaseClusterCleanup()
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// CBaseClusterCleanup::~CBaseClusterCleanup
|
||
|
//
|
||
|
// Description:
|
||
|
// Destructor of the CBaseClusterCleanup class
|
||
|
//
|
||
|
// Arguments:
|
||
|
// None.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
// Exceptions Thrown:
|
||
|
// None.
|
||
|
//
|
||
|
//--
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
CBaseClusterCleanup::~CBaseClusterCleanup( void ) throw()
|
||
|
{
|
||
|
BCATraceScope( "" );
|
||
|
|
||
|
} //*** CBaseClusterCleanup::~CBaseClusterCleanup()
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// void
|
||
|
// CBaseClusterCleanup::Commit
|
||
|
//
|
||
|
// Description:
|
||
|
// Clean up this node. This function cannot be called when the cluster
|
||
|
// service is running.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// None.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
// Exceptions Thrown:
|
||
|
// CRuntimeError
|
||
|
// If any of the APIs fail.
|
||
|
//
|
||
|
// Any exceptions thrown by functions called.
|
||
|
//
|
||
|
//--
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
CBaseClusterCleanup::Commit( void )
|
||
|
{
|
||
|
BCATraceScope( "" );
|
||
|
|
||
|
LogMsg( "Initiating cluster node cleanup." );
|
||
|
|
||
|
// Call the base class commit routine. This commits the action list.
|
||
|
BaseClass::Commit();
|
||
|
|
||
|
// If we are here, then everything went well.
|
||
|
SetCommitCompleted( true );
|
||
|
|
||
|
} //*** CBaseClusterCleanup::Commit()
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
//++
|
||
|
//
|
||
|
// void
|
||
|
// CBaseClusterCleanup::Rollback
|
||
|
//
|
||
|
// Description:
|
||
|
// Performs the rolls back of the action committed by this object.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// None.
|
||
|
//
|
||
|
// Return Value:
|
||
|
// None.
|
||
|
//
|
||
|
// Exceptions Thrown:
|
||
|
// Any exceptions thrown by functions called.
|
||
|
//
|
||
|
//--
|
||
|
//////////////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
CBaseClusterCleanup::Rollback( void )
|
||
|
{
|
||
|
BCATraceScope( "" );
|
||
|
|
||
|
// Rollback the actions.
|
||
|
BaseClass::Rollback();
|
||
|
|
||
|
SetCommitCompleted( false );
|
||
|
|
||
|
} //*** CBaseClusterCleanup::Rollback()
|