Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

777 lines
19 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2002 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // TaskAnalyzeClusterMinConfig.cpp
  7. //
  8. // Description:
  9. // CTaskAnalyzeClusterMinConfig implementation.
  10. //
  11. // Maintained By:
  12. // Galen Barbee (GalenB) 01-APR-2002
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. //////////////////////////////////////////////////////////////////////////////
  16. // Include Files
  17. //////////////////////////////////////////////////////////////////////////////
  18. #include "Pch.h"
  19. #include "TaskAnalyzeClusterMinConfig.h"
  20. //////////////////////////////////////////////////////////////////////////////
  21. // Constant Definitions
  22. //////////////////////////////////////////////////////////////////////////////
  23. DEFINE_THISCLASS( "CTaskAnalyzeClusterMinConfig" )
  24. //*************************************************************************//
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CTaskAnalyzeClusterMinConfig class
  27. /////////////////////////////////////////////////////////////////////////////
  28. //////////////////////////////////////////////////////////////////////////////
  29. //++
  30. //
  31. // CTaskAnalyzeClusterMinConfig::S_HrCreateInstance
  32. //
  33. // Description:
  34. // Create a CTaskAnalyzeClusterMinConfig instance.
  35. //
  36. // Arguments:
  37. // ppunkOut
  38. //
  39. // Return Values:
  40. // S_OK
  41. // Success.
  42. //
  43. // Other HRESULT as failure.
  44. //
  45. //--
  46. //////////////////////////////////////////////////////////////////////////////
  47. HRESULT
  48. CTaskAnalyzeClusterMinConfig::S_HrCreateInstance(
  49. IUnknown ** ppunkOut
  50. )
  51. {
  52. TraceFunc( "" );
  53. Assert( ppunkOut != NULL );
  54. HRESULT hr = S_OK;
  55. CTaskAnalyzeClusterMinConfig * ptac = NULL;
  56. if ( ppunkOut == NULL )
  57. {
  58. hr = THR( E_POINTER );
  59. goto Cleanup;
  60. } // if:
  61. ptac = new CTaskAnalyzeClusterMinConfig;
  62. if ( ptac == NULL )
  63. {
  64. hr = THR( E_OUTOFMEMORY );
  65. goto Cleanup;
  66. } // if:
  67. hr = THR( ptac->HrInit() );
  68. if ( FAILED( hr ) )
  69. {
  70. goto Cleanup;
  71. } // if:
  72. hr = THR( ptac->TypeSafeQI( IUnknown, ppunkOut ) );
  73. if ( FAILED( hr ) )
  74. {
  75. goto Cleanup;
  76. } // if:
  77. Cleanup:
  78. if ( ptac != NULL )
  79. {
  80. ptac->Release();
  81. } // if:
  82. HRETURN( hr );
  83. } //*** CTaskAnalyzeClusterMinConfig::S_HrCreateInstance
  84. //////////////////////////////////////////////////////////////////////////////
  85. //++
  86. //
  87. // CTaskAnalyzeClusterMinConfig::CTaskAnalyzeClusterMinConfig
  88. //
  89. // Description:
  90. // Constructor
  91. //
  92. // Arguments:
  93. // None.
  94. //
  95. // Return Values:
  96. // None.
  97. //
  98. //--
  99. //////////////////////////////////////////////////////////////////////////////
  100. CTaskAnalyzeClusterMinConfig::CTaskAnalyzeClusterMinConfig( void )
  101. {
  102. TraceFunc( "" );
  103. TraceFuncExit();
  104. } //*** CTaskAnalyzeClusterMinConfig::CTaskAnalyzeClusterMinConfig
  105. //////////////////////////////////////////////////////////////////////////////
  106. //++
  107. //
  108. // CTaskAnalyzeClusterMinConfig::CTaskAnalyzeClusterMinConfig
  109. //
  110. // Description:
  111. // Destructor
  112. //
  113. // Arguments:
  114. // None.
  115. //
  116. // Return Values:
  117. // None.
  118. //
  119. //--
  120. //////////////////////////////////////////////////////////////////////////////
  121. CTaskAnalyzeClusterMinConfig::~CTaskAnalyzeClusterMinConfig( void )
  122. {
  123. TraceFunc( "" );
  124. TraceFuncExit();
  125. } //*** CTaskAnalyzeClusterMinConfig::~CTaskAnalyzeClusterMinConfig
  126. //*************************************************************************//
  127. /////////////////////////////////////////////////////////////////////////////
  128. // CTaskAnalyzeClusterMinConfig - IUknkown interface.
  129. /////////////////////////////////////////////////////////////////////////////
  130. //////////////////////////////////////////////////////////////////////////////
  131. //++
  132. //
  133. // CTaskAnalyzeClusterMinConfig::QueryInterface
  134. //
  135. // Description:
  136. // Query this object for the passed in interface.
  137. //
  138. // Arguments:
  139. // riidIn
  140. // Id of interface requested.
  141. //
  142. // ppvOut
  143. // Pointer to the requested interface.
  144. //
  145. // Return Value:
  146. // S_OK
  147. // If the interface is available on this object.
  148. //
  149. // E_NOINTERFACE
  150. // If the interface is not available.
  151. //
  152. // E_POINTER
  153. // ppvOut was NULL.
  154. //
  155. //--
  156. //////////////////////////////////////////////////////////////////////////////
  157. STDMETHODIMP
  158. CTaskAnalyzeClusterMinConfig::QueryInterface(
  159. REFIID riidIn
  160. , LPVOID * ppvOut
  161. )
  162. {
  163. TraceQIFunc( riidIn, ppvOut );
  164. HRESULT hr = S_OK;
  165. //
  166. // Validate arguments.
  167. //
  168. Assert( ppvOut != NULL );
  169. if ( ppvOut == NULL )
  170. {
  171. hr = THR( E_POINTER );
  172. goto Cleanup;
  173. } // if:
  174. //
  175. // Handle known interfaces.
  176. //
  177. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  178. {
  179. *ppvOut = static_cast< ITaskAnalyzeCluster * >( this );
  180. } // if: IUnknown
  181. else if ( IsEqualIID( riidIn, IID_ITaskAnalyzeCluster ) )
  182. {
  183. *ppvOut = TraceInterface( __THISCLASS__, ITaskAnalyzeCluster, this, 0 );
  184. } // else if: ITaskAnalyzeClusterMinConfig
  185. else if ( IsEqualIID( riidIn, IID_IDoTask ) )
  186. {
  187. *ppvOut = TraceInterface( __THISCLASS__, IDoTask, this, 0 );
  188. } // else if: IDoTask
  189. else if ( IsEqualIID( riidIn, IID_IClusCfgCallback ) )
  190. {
  191. *ppvOut = TraceInterface( __THISCLASS__, IClusCfgCallback, this, 0 );
  192. } // else if: IClusCfgCallback
  193. else if ( IsEqualIID( riidIn, IID_INotifyUI ) )
  194. {
  195. *ppvOut = TraceInterface( __THISCLASS__, INotifyUI, this, 0 );
  196. } // else if: INotifyUI
  197. else
  198. {
  199. *ppvOut = NULL;
  200. hr = E_NOINTERFACE;
  201. } // else:
  202. //
  203. // Add a reference to the interface if successful.
  204. //
  205. if ( SUCCEEDED( hr ) )
  206. {
  207. ((IUnknown *) *ppvOut)->AddRef();
  208. } // if: success
  209. Cleanup:
  210. QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
  211. } //*** CTaskAnalyzeClusterMinConfig::QueryInterface
  212. //////////////////////////////////////////////////////////////////////////////
  213. //++
  214. //
  215. // CTaskAnalyzeClusterMinConfig::AddRef
  216. //
  217. // Description:
  218. // Increment the reference count of this object by one.
  219. //
  220. // Arguments:
  221. // None.
  222. //
  223. // Return Value:
  224. // The new reference count.
  225. //
  226. //--
  227. //////////////////////////////////////////////////////////////////////////////
  228. STDMETHODIMP_( ULONG )
  229. CTaskAnalyzeClusterMinConfig::AddRef( void )
  230. {
  231. TraceFunc( "[IUnknown]" );
  232. ULONG c = UlAddRef();
  233. CRETURN( c );
  234. } //*** CTaskAnalyzeClusterMinConfig::AddRef
  235. //////////////////////////////////////////////////////////////////////////////
  236. //++
  237. //
  238. // CTaskAnalyzeClusterMinConfig::Release
  239. //
  240. // Description:
  241. // Decrement the reference count of this object by one.
  242. //
  243. // Arguments:
  244. // None.
  245. //
  246. // Return Value:
  247. // The new reference count.
  248. //
  249. //--
  250. //////////////////////////////////////////////////////////////////////////////
  251. STDMETHODIMP_( ULONG )
  252. CTaskAnalyzeClusterMinConfig::Release( void )
  253. {
  254. TraceFunc( "[IUnknown]" );
  255. ULONG c = UlRelease();
  256. CRETURN( c );
  257. } //*** CTaskAnalyzeClusterMinConfig::Release
  258. //*************************************************************************//
  259. /////////////////////////////////////////////////////////////////////////////
  260. // CTaskAnalyzeClusterMinConfig - IDoTask/ITaskAnalyzeCluster interface.
  261. /////////////////////////////////////////////////////////////////////////////
  262. //////////////////////////////////////////////////////////////////////////////
  263. //++
  264. //
  265. // CTaskAnalyzeClusterMinConfig::BeginTask
  266. //
  267. // Description:
  268. // Task entry point.
  269. //
  270. // Arguments:
  271. // None.
  272. //
  273. // Return Value:
  274. // S_OK
  275. // Success
  276. //
  277. // HRESULT failure.
  278. //
  279. //--
  280. //////////////////////////////////////////////////////////////////////////////
  281. STDMETHODIMP
  282. CTaskAnalyzeClusterMinConfig::BeginTask( void )
  283. {
  284. TraceFunc( "[IDoTask]" );
  285. HRESULT hr = THR( HrBeginTask() );
  286. HRETURN( hr );
  287. } //*** CTaskAnalyzeClusterMinConfig::BeginTask
  288. //////////////////////////////////////////////////////////////////////////////
  289. //++
  290. //
  291. // CTaskAnalyzeClusterMinConfig::StopTask
  292. //
  293. // Description:
  294. // Stop task entry point.
  295. //
  296. // Arguments:
  297. // None.
  298. //
  299. // Return Value:
  300. // S_OK
  301. // Success
  302. //
  303. // HRESULT failure.
  304. //
  305. //--
  306. //////////////////////////////////////////////////////////////////////////////
  307. STDMETHODIMP
  308. CTaskAnalyzeClusterMinConfig::StopTask( void )
  309. {
  310. TraceFunc( "[IDoTask]" );
  311. HRESULT hr = THR( HrStopTask() );
  312. HRETURN( hr );
  313. } //*** CTaskAnalyzeClusterMinConfig::StopTask
  314. //////////////////////////////////////////////////////////////////////////////
  315. //++
  316. //
  317. // CTaskAnalyzeClusterMinConfig::SetJoiningMode
  318. //
  319. // Description:
  320. // Tell this task whether we are joining nodes to the cluster?
  321. //
  322. // Arguments:
  323. // None.
  324. //
  325. // Return Value:
  326. // S_OK
  327. // Success
  328. //
  329. // HRESULT failure.
  330. //
  331. //--
  332. //////////////////////////////////////////////////////////////////////////////
  333. STDMETHODIMP
  334. CTaskAnalyzeClusterMinConfig::SetJoiningMode( void )
  335. {
  336. TraceFunc( "[ITaskAnalyzeClusterMinConfig]" );
  337. HRESULT hr = THR( HrSetJoiningMode() );
  338. HRETURN( hr );
  339. } //*** CTaskAnalyzeClusterMinConfig::SetJoiningMode
  340. //////////////////////////////////////////////////////////////////////////////
  341. //++
  342. //
  343. // CTaskAnalyzeClusterMinConfig::SetCookie
  344. //
  345. // Description:
  346. // Receive the completion cookier from the task creator.
  347. //
  348. // Arguments:
  349. // cookieIn
  350. // The completion cookie to send back to the creator when this
  351. // task is complete.
  352. //
  353. // Return Value:
  354. // S_OK
  355. // Success
  356. //
  357. // HRESULT failure.
  358. //
  359. //--
  360. //////////////////////////////////////////////////////////////////////////////
  361. STDMETHODIMP
  362. CTaskAnalyzeClusterMinConfig::SetCookie(
  363. OBJECTCOOKIE cookieIn
  364. )
  365. {
  366. TraceFunc( "[ITaskAnalyzeClusterMinConfig]" );
  367. HRESULT hr = THR( HrSetCookie( cookieIn ) );
  368. HRETURN( hr );
  369. } //*** CTaskAnalyzeClusterMinConfig::SetCookie
  370. //////////////////////////////////////////////////////////////////////////////
  371. //++
  372. //
  373. // CTaskAnalyzeClusterMinConfig::SetClusterCookie
  374. //
  375. // Description:
  376. // Receive the object manager cookie of the cluster that we are going
  377. // to analyze.
  378. //
  379. // Arguments:
  380. // cookieClusterIn
  381. // The cookie for the cluster to work on.
  382. //
  383. // Return Value:
  384. // S_OK
  385. // Success
  386. //
  387. // HRESULT failure.
  388. //
  389. //--
  390. //////////////////////////////////////////////////////////////////////////////
  391. STDMETHODIMP
  392. CTaskAnalyzeClusterMinConfig::SetClusterCookie(
  393. OBJECTCOOKIE cookieClusterIn
  394. )
  395. {
  396. TraceFunc( "[ITaskAnalyzeClusterMinConfig]" );
  397. HRESULT hr = THR( HrSetClusterCookie( cookieClusterIn ) );
  398. HRETURN( hr );
  399. } //*** CTaskAnalyzeClusterMinConfig::SetClusterCookie
  400. //*************************************************************************//
  401. /////////////////////////////////////////////////////////////////////////////
  402. // CTaskAnalyzeClusterMinConfig - Protected methods.
  403. /////////////////////////////////////////////////////////////////////////////
  404. //////////////////////////////////////////////////////////////////////////////
  405. //++
  406. //
  407. // CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster
  408. //
  409. // Description:
  410. // Create a new resource in the cluster configuration since there was
  411. // not a match to the resource already in the cluster.
  412. //
  413. // Arguments:
  414. // pccmriIn
  415. //
  416. // Return Value:
  417. // S_OK
  418. // Success.
  419. //
  420. // Other HRESULT error.
  421. //
  422. //--
  423. //////////////////////////////////////////////////////////////////////////////
  424. HRESULT
  425. CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster(
  426. IClusCfgManagedResourceInfo * pccmriIn
  427. , BSTR bstrNodeResNameIn
  428. , BSTR * pbstrNodeResUIDInout
  429. , BSTR bstrNodeNameIn
  430. )
  431. {
  432. TraceFunc( "" );
  433. Assert( pccmriIn != NULL );
  434. Assert( pbstrNodeResUIDInout != NULL );
  435. HRESULT hr = S_OK;
  436. LogMsg(
  437. L"[MT] Not creating an object for resource '%ws' ('%ws') from node '%ws' in the cluster configuration because minimal analysis and configuration was selected."
  438. , bstrNodeResNameIn
  439. , *pbstrNodeResUIDInout
  440. , bstrNodeNameIn
  441. );
  442. HRETURN( hr );
  443. } //*** CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster
  444. //////////////////////////////////////////////////////////////////////////////
  445. //++
  446. //
  447. // CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster
  448. //
  449. // Description:
  450. // Create a new resource in the cluster configuration since there was
  451. // not a match to the resource already in the cluster. This method
  452. // is called when creating a new cluster and we need to get the
  453. // resources in the cluster. They are just not managed when doing
  454. // a min config.
  455. //
  456. // Arguments:
  457. // The source object.
  458. //
  459. // ppccmriOut
  460. // The new object that was created.
  461. //
  462. // Return Value:
  463. // S_OK
  464. // Success.
  465. //
  466. // Other HRESULT error.
  467. //
  468. //--
  469. //////////////////////////////////////////////////////////////////////////////
  470. HRESULT
  471. CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster(
  472. IClusCfgManagedResourceInfo * pccmriIn
  473. , IClusCfgManagedResourceInfo ** ppccmriOut
  474. )
  475. {
  476. TraceFunc( "" );
  477. Assert( pccmriIn != NULL );
  478. Assert( ppccmriOut != NULL );
  479. HRESULT hr = S_OK;
  480. //
  481. // Need to create a new object.
  482. //
  483. hr = THR( HrCreateNewManagedResourceInClusterConfiguration( pccmriIn, ppccmriOut ) );
  484. if ( FAILED( hr ) )
  485. {
  486. goto Cleanup;
  487. } // if:
  488. Cleanup:
  489. HRETURN( hr );
  490. } //*** CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster
  491. //////////////////////////////////////////////////////////////////////////////
  492. //++
  493. //
  494. // CTaskAnalyzeClusterMinConfig::HrCompareDriveLetterMappings
  495. //
  496. // Description:
  497. // Convert the passed in error HRESULT into a success code HRESULT that
  498. // has the same error code in the LOWORD. This task does not want to
  499. // stop on all errors.
  500. //
  501. // Arguments:
  502. // None.
  503. //
  504. // Return Value:
  505. // S_OK
  506. // Success
  507. //
  508. // Other HRESULT error.
  509. //
  510. //--
  511. //////////////////////////////////////////////////////////////////////////////
  512. HRESULT
  513. CTaskAnalyzeClusterMinConfig::HrCompareDriveLetterMappings( void )
  514. {
  515. TraceFunc( "" );
  516. HRESULT hr = S_OK;
  517. hr = THR( HrSendStatusReport(
  518. CTaskAnalyzeClusterBase::m_bstrClusterName
  519. , TASKID_Major_Check_Cluster_Feasibility
  520. , TASKID_Minor_Check_DriveLetter_Mappings
  521. , 0
  522. , 1
  523. , 1
  524. , S_FALSE
  525. , IDS_TASKID_MINOR_CHECK_DRIVELETTER_MAPPINGS_MIN_CONFIG
  526. ) );
  527. if ( FAILED( hr ) )
  528. {
  529. goto Cleanup;
  530. } // if:
  531. Cleanup:
  532. HRETURN( hr );
  533. } //*** CTaskAnalyzeClusterMinConfig::SetClusterCookie
  534. //////////////////////////////////////////////////////////////////////////////
  535. //++
  536. //
  537. // CTaskAnalyzeClusterMinConfig::HrFixupErrorCode
  538. //
  539. // Description:
  540. // Convert the passed in error HRESULT into a success code HRESULT that
  541. // has the same error code in the LOWORD. This task does not want to
  542. // stop on all errors.
  543. //
  544. // Arguments:
  545. // hrIn
  546. // The error code to fix up.
  547. //
  548. // Return Value:
  549. // The passed in error code.
  550. //
  551. // Notes:
  552. // hr = MAKE_HRESULT( SEVERITY_SUCCESS, FACILITY_WIN32, ERROR_QUORUM_DISK_NOT_FOUND );
  553. //
  554. //--
  555. //////////////////////////////////////////////////////////////////////////////
  556. HRESULT
  557. CTaskAnalyzeClusterMinConfig::HrFixupErrorCode(
  558. HRESULT hrIn
  559. )
  560. {
  561. TraceFunc( "" );
  562. HRESULT hr = S_OK;
  563. hr = MAKE_HRESULT( SEVERITY_SUCCESS, SCODE_FACILITY( hrIn ), SCODE_CODE( hrIn ) );
  564. HRETURN( hr );
  565. } //*** CTaskAnalyzeClusterMinConfig::HrCreateNewResourceInCluster
  566. //////////////////////////////////////////////////////////////////////////////
  567. //++
  568. //
  569. // CTaskAnalyzeClusterMinConfig::GetNodeCannotVerifyQuorumStringRefId
  570. //
  571. // Description:
  572. // Return the correct string ids for the message that is displayed
  573. // to the user when there isn't a quorum resource.
  574. //
  575. // Arguments:
  576. // pdwRefIdOut
  577. // The reference text to show the user.
  578. //
  579. // Return Value:
  580. // None.
  581. //
  582. //--
  583. //////////////////////////////////////////////////////////////////////////////
  584. void
  585. CTaskAnalyzeClusterMinConfig::GetNodeCannotVerifyQuorumStringRefId(
  586. DWORD * pdwRefIdOut
  587. )
  588. {
  589. TraceFunc( "" );
  590. Assert( pdwRefIdOut != NULL );
  591. *pdwRefIdOut = IDS_TASKID_MINOR_NODE_CANNOT_ACCESS_QUORUM_MIN_CONFIG_REF;
  592. TraceFuncExit();
  593. } //*** CTaskAnalyzeClusterMinConfig::GetNodeCannotVerifyQuorumStringRefId
  594. //////////////////////////////////////////////////////////////////////////////
  595. //++
  596. //
  597. // CTaskAnalyzeClusterMinConfig::GetNoCommonQuorumToAllNodesStringIds
  598. //
  599. // Description:
  600. // Return the correct string ids for the message that is displayed
  601. // to the user when there isn't a common to all nodes quorum resource.
  602. //
  603. // Arguments:
  604. // pdwMessageIdOut
  605. // The message to show the user.
  606. //
  607. // pdwRefIdOut
  608. // The reference text to show the user.
  609. //
  610. // Return Value:
  611. // None.
  612. //
  613. //--
  614. //////////////////////////////////////////////////////////////////////////////
  615. void
  616. CTaskAnalyzeClusterMinConfig::GetNoCommonQuorumToAllNodesStringIds(
  617. DWORD * pdwMessageIdOut
  618. , DWORD * pdwRefIdOut
  619. )
  620. {
  621. TraceFunc( "" );
  622. Assert( pdwMessageIdOut != NULL );
  623. Assert( pdwRefIdOut != NULL );
  624. *pdwMessageIdOut = IDS_TASKID_MINOR_MISSING_COMMON_QUORUM_RESOURCE_WARN;
  625. *pdwRefIdOut = IDS_TASKID_MINOR_MISSING_COMMON_QUORUM_RESOURCE_WARN_REF;
  626. TraceFuncExit();
  627. } //*** CTaskAnalyzeClusterMinConfig::GetNoCommonQuorumToAllNodesStringIds
  628. //////////////////////////////////////////////////////////////////////////////
  629. //++
  630. //
  631. // CTaskAnalyzeClusterMinConfig::HrShowLocalQuorumWarning
  632. //
  633. // Description:
  634. // Send the warning about forcing local quorum to the UI. For min config
  635. // we don't want to send any message...
  636. //
  637. // Arguments:
  638. // None.
  639. //
  640. // Return Value:
  641. // S_OK
  642. // The SSR was done properly.
  643. //
  644. //--
  645. //////////////////////////////////////////////////////////////////////////////
  646. HRESULT
  647. CTaskAnalyzeClusterMinConfig::HrShowLocalQuorumWarning( void )
  648. {
  649. TraceFunc( "" );
  650. HRETURN( S_OK );
  651. } //*** CTaskAnalyzeClusterMinConfig::HrShowLocalQuorumWarning