|
|
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2002 Microsoft Corporation
//
// Module Name:
// TaskAnalyzeClusterMinConfig.cpp
//
// Description:
// CTaskAnalyzeClusterMinConfig implementation.
//
// Maintained By:
// Galen Barbee (GalenB) 01-APR-2002
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Include Files
//////////////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include "TaskAnalyzeClusterMinConfig.h"
//////////////////////////////////////////////////////////////////////////////
// Constant Definitions
//////////////////////////////////////////////////////////////////////////////
DEFINE_THISCLASS( "CTaskAnalyzeClusterMinConfig" )
//*************************************************************************//
/////////////////////////////////////////////////////////////////////////////
// CTaskAnalyzeClusterMinConfig class
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::S_HrCreateInstance
//
// Description:
// Create a CTaskAnalyzeClusterMinConfig instance.
//
// Arguments:
// ppunkOut
//
// Return Values:
// S_OK
// Success.
//
// Other HRESULT as failure.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT CTaskAnalyzeClusterMinConfig::S_HrCreateInstance( IUnknown ** ppunkOut ) { TraceFunc( "" ); Assert( ppunkOut != NULL );
HRESULT hr = S_OK; CTaskAnalyzeClusterMinConfig * ptac = NULL;
if ( ppunkOut == NULL ) { hr = THR( E_POINTER ); goto Cleanup; } // if:
ptac = new CTaskAnalyzeClusterMinConfig; if ( ptac == NULL ) { hr = THR( E_OUTOFMEMORY ); goto Cleanup; } // if:
hr = THR( ptac->HrInit() ); if ( FAILED( hr ) ) { goto Cleanup; } // if:
hr = THR( ptac->TypeSafeQI( IUnknown, ppunkOut ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if:
Cleanup:
if ( ptac != NULL ) { ptac->Release(); } // if:
HRETURN( hr );
} //*** CTaskAnalyzeClusterMinConfig::S_HrCreateInstance
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::CTaskAnalyzeClusterMinConfig
//
// Description:
// Constructor
//
// Arguments:
// None.
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
CTaskAnalyzeClusterMinConfig::CTaskAnalyzeClusterMinConfig( void ) { TraceFunc( "" );
TraceFuncExit();
} //*** CTaskAnalyzeClusterMinConfig::CTaskAnalyzeClusterMinConfig
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::CTaskAnalyzeClusterMinConfig
//
// Description:
// Destructor
//
// Arguments:
// None.
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
CTaskAnalyzeClusterMinConfig::~CTaskAnalyzeClusterMinConfig( void ) { TraceFunc( "" );
TraceFuncExit();
} //*** CTaskAnalyzeClusterMinConfig::~CTaskAnalyzeClusterMinConfig
//*************************************************************************//
/////////////////////////////////////////////////////////////////////////////
// CTaskAnalyzeClusterMinConfig - IUknkown interface.
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::QueryInterface
//
// Description:
// Query this object for the passed in interface.
//
// Arguments:
// riidIn
// Id of interface requested.
//
// ppvOut
// Pointer to the requested interface.
//
// Return Value:
// S_OK
// If the interface is available on this object.
//
// E_NOINTERFACE
// If the interface is not available.
//
// E_POINTER
// ppvOut was NULL.
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CTaskAnalyzeClusterMinConfig::QueryInterface( REFIID riidIn , LPVOID * ppvOut ) { TraceQIFunc( riidIn, ppvOut );
HRESULT hr = S_OK;
//
// Validate arguments.
//
Assert( ppvOut != NULL ); if ( ppvOut == NULL ) { hr = THR( E_POINTER ); goto Cleanup; } // if:
//
// Handle known interfaces.
//
if ( IsEqualIID( riidIn, IID_IUnknown ) ) { *ppvOut = static_cast< ITaskAnalyzeCluster * >( this ); } // if: IUnknown
else if ( IsEqualIID( riidIn, IID_ITaskAnalyzeCluster ) ) { *ppvOut = TraceInterface( __THISCLASS__, ITaskAnalyzeCluster, this, 0 ); } // else if: ITaskAnalyzeClusterMinConfig
else if ( IsEqualIID( riidIn, IID_IDoTask ) ) { *ppvOut = TraceInterface( __THISCLASS__, IDoTask, this, 0 ); } // else if: IDoTask
else if ( IsEqualIID( riidIn, IID_IClusCfgCallback ) ) { *ppvOut = TraceInterface( __THISCLASS__, IClusCfgCallback, this, 0 ); } // else if: IClusCfgCallback
else if ( IsEqualIID( riidIn, IID_INotifyUI ) ) { *ppvOut = TraceInterface( __THISCLASS__, INotifyUI, this, 0 ); } // else if: INotifyUI
else { *ppvOut = NULL; hr = E_NOINTERFACE; } // else:
//
// Add a reference to the interface if successful.
//
if ( SUCCEEDED( hr ) ) { ((IUnknown *) *ppvOut)->AddRef(); } // if: success
Cleanup:
QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
} //*** CTaskAnalyzeClusterMinConfig::QueryInterface
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::AddRef
//
// Description:
// Increment the reference count of this object by one.
//
// Arguments:
// None.
//
// Return Value:
// The new reference count.
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG ) CTaskAnalyzeClusterMinConfig::AddRef( void ) { TraceFunc( "[IUnknown]" );
ULONG c = UlAddRef();
CRETURN( c );
} //*** CTaskAnalyzeClusterMinConfig::AddRef
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::Release
//
// Description:
// Decrement the reference count of this object by one.
//
// Arguments:
// None.
//
// Return Value:
// The new reference count.
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG ) CTaskAnalyzeClusterMinConfig::Release( void ) { TraceFunc( "[IUnknown]" );
ULONG c = UlRelease();
CRETURN( c );
} //*** CTaskAnalyzeClusterMinConfig::Release
//*************************************************************************//
/////////////////////////////////////////////////////////////////////////////
// CTaskAnalyzeClusterMinConfig - IDoTask/ITaskAnalyzeCluster interface.
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::BeginTask
//
// Description:
// Task entry point.
//
// Arguments:
// None.
//
// Return Value:
// S_OK
// Success
//
// HRESULT failure.
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CTaskAnalyzeClusterMinConfig::BeginTask( void ) { TraceFunc( "[IDoTask]" );
HRESULT hr = THR( HrBeginTask() );
HRETURN( hr );
} //*** CTaskAnalyzeClusterMinConfig::BeginTask
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::StopTask
//
// Description:
// Stop task entry point.
//
// Arguments:
// None.
//
// Return Value:
// S_OK
// Success
//
// HRESULT failure.
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CTaskAnalyzeClusterMinConfig::StopTask( void ) { TraceFunc( "[IDoTask]" );
HRESULT hr = THR( HrStopTask() );
HRETURN( hr );
} //*** CTaskAnalyzeClusterMinConfig::StopTask
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::SetJoiningMode
//
// Description:
// Tell this task whether we are joining nodes to the cluster?
//
// Arguments:
// None.
//
// Return Value:
// S_OK
// Success
//
// HRESULT failure.
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CTaskAnalyzeClusterMinConfig::SetJoiningMode( void ) { TraceFunc( "[ITaskAnalyzeClusterMinConfig]" );
HRESULT hr = THR( HrSetJoiningMode() );
HRETURN( hr );
} //*** CTaskAnalyzeClusterMinConfig::SetJoiningMode
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::SetCookie
//
// Description:
// Receive the completion cookier from the task creator.
//
// Arguments:
// cookieIn
// The completion cookie to send back to the creator when this
// task is complete.
//
// Return Value:
// S_OK
// Success
//
// HRESULT failure.
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CTaskAnalyzeClusterMinConfig::SetCookie( OBJECTCOOKIE cookieIn ) { TraceFunc( "[ITaskAnalyzeClusterMinConfig]" );
HRESULT hr = THR( HrSetCookie( cookieIn ) );
HRETURN( hr );
} //*** CTaskAnalyzeClusterMinConfig::SetCookie
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::SetClusterCookie
//
// Description:
// Receive the object manager cookie of the cluster that we are going
// to analyze.
//
// Arguments:
// cookieClusterIn
// The cookie for the cluster to work on.
//
// Return Value:
// S_OK
// Success
//
// HRESULT failure.
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CTaskAnalyzeClusterMinConfig::SetClusterCookie( OBJECTCOOKIE cookieClusterIn ) { TraceFunc( "[ITaskAnalyzeClusterMinConfig]" );
HRESULT hr = THR( HrSetClusterCookie( cookieClusterIn ) );
HRETURN( hr );
} //*** CTaskAnalyzeClusterMinConfig::SetClusterCookie
//*************************************************************************//
/////////////////////////////////////////////////////////////////////////////
// CTaskAnalyzeClusterMinConfig - Protected methods.
/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster
//
// Description:
// Create a new resource in the cluster configuration since there was
// not a match to the resource already in the cluster.
//
// Arguments:
// pccmriIn
//
// Return Value:
// S_OK
// Success.
//
// Other HRESULT error.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster( IClusCfgManagedResourceInfo * pccmriIn , BSTR bstrNodeResNameIn , BSTR * pbstrNodeResUIDInout , BSTR bstrNodeNameIn ) { TraceFunc( "" ); Assert( pccmriIn != NULL ); Assert( pbstrNodeResUIDInout != NULL );
HRESULT hr = S_OK;
LogMsg( L"[MT] Not creating an object for resource '%ws' ('%ws') from node '%ws' in the cluster configuration because minimal analysis and configuration was selected." , bstrNodeResNameIn , *pbstrNodeResUIDInout , bstrNodeNameIn );
HRETURN( hr );
} //*** CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster
//
// Description:
// Create a new resource in the cluster configuration since there was
// not a match to the resource already in the cluster. This method
// is called when creating a new cluster and we need to get the
// resources in the cluster. They are just not managed when doing
// a min config.
//
// Arguments:
// The source object.
//
// ppccmriOut
// The new object that was created.
//
// Return Value:
// S_OK
// Success.
//
// Other HRESULT error.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster( IClusCfgManagedResourceInfo * pccmriIn , IClusCfgManagedResourceInfo ** ppccmriOut ) { TraceFunc( "" ); Assert( pccmriIn != NULL ); Assert( ppccmriOut != NULL );
HRESULT hr = S_OK;
//
// Need to create a new object.
//
hr = THR( HrCreateNewManagedResourceInClusterConfiguration( pccmriIn, ppccmriOut ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if:
Cleanup:
HRETURN( hr );
} //*** CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::HrCompareDriveLetterMappings
//
// Description:
// Convert the passed in error HRESULT into a success code HRESULT that
// has the same error code in the LOWORD. This task does not want to
// stop on all errors.
//
// Arguments:
// None.
//
// Return Value:
// S_OK
// Success
//
// Other HRESULT error.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT CTaskAnalyzeClusterMinConfig::HrCompareDriveLetterMappings( void ) { TraceFunc( "" );
HRESULT hr = S_OK;
hr = THR( HrSendStatusReport( CTaskAnalyzeClusterBase::m_bstrClusterName , TASKID_Major_Check_Cluster_Feasibility , TASKID_Minor_Check_DriveLetter_Mappings , 0 , 1 , 1 , S_FALSE , IDS_TASKID_MINOR_CHECK_DRIVELETTER_MAPPINGS_MIN_CONFIG ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if:
Cleanup:
HRETURN( hr );
} //*** CTaskAnalyzeClusterMinConfig::SetClusterCookie
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::HrFixupErrorCode
//
// Description:
// Convert the passed in error HRESULT into a success code HRESULT that
// has the same error code in the LOWORD. This task does not want to
// stop on all errors.
//
// Arguments:
// hrIn
// The error code to fix up.
//
// Return Value:
// The passed in error code.
//
// Notes:
// hr = MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_WIN32, ERROR_QUORUM_DISK_NOT_FOUND );
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT CTaskAnalyzeClusterMinConfig::HrFixupErrorCode( HRESULT hrIn ) { TraceFunc( "" );
HRESULT hr = S_OK;
hr = MAKE_HRESULT( SEVERITY_SUCCESS, SCODE_FACILITY( hrIn ), SCODE_CODE( hrIn ) );
HRETURN( hr );
} //*** CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::GetNodeCannotVerifyQuorumStringRefId
//
// Description:
// Return the correct string ids for the message that is displayed
// to the user when there isn't a quorum resource.
//
// Arguments:
// pdwRefIdOut
// The reference text to show the user.
//
// Return Value:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
void CTaskAnalyzeClusterMinConfig::GetNodeCannotVerifyQuorumStringRefId( DWORD * pdwRefIdOut ) { TraceFunc( "" ); Assert( pdwRefIdOut != NULL );
*pdwRefIdOut = IDS_TASKID_MINOR_NODE_CANNOT_ACCESS_QUORUM_MIN_CONFIG_REF;
TraceFuncExit();
} //*** CTaskAnalyzeClusterMinConfig::GetNodeCannotVerifyQuorumStringRefId
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::GetNoCommonQuorumToAllNodesStringIds
//
// Description:
// Return the correct string ids for the message that is displayed
// to the user when there isn't a common to all nodes quorum resource.
//
// Arguments:
// pdwMessageIdOut
// The message to show the user.
//
// pdwRefIdOut
// The reference text to show the user.
//
// Return Value:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
void CTaskAnalyzeClusterMinConfig::GetNoCommonQuorumToAllNodesStringIds( DWORD * pdwMessageIdOut , DWORD * pdwRefIdOut ) { TraceFunc( "" ); Assert( pdwMessageIdOut != NULL ); Assert( pdwRefIdOut != NULL );
*pdwMessageIdOut = IDS_TASKID_MINOR_MISSING_COMMON_QUORUM_RESOURCE_WARN; *pdwRefIdOut = IDS_TASKID_MINOR_MISSING_COMMON_QUORUM_RESOURCE_WARN_REF;
TraceFuncExit();
} //*** CTaskAnalyzeClusterMinConfig::GetNoCommonQuorumToAllNodesStringIds
//////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskAnalyzeClusterMinConfig::HrShowLocalQuorumWarning
//
// Description:
// Send the warning about forcing local quorum to the UI. For min config
// we don't want to send any message...
//
// Arguments:
// None.
//
// Return Value:
// S_OK
// The SSR was done properly.
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT CTaskAnalyzeClusterMinConfig::HrShowLocalQuorumWarning( void ) { TraceFunc( "" );
HRETURN( S_OK );
} //*** CTaskAnalyzeClusterMinConfig::HrShowLocalQuorumWarning
|