diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -867,7 +867,6 @@ 'DrydockResource' => 'applications/drydock/storage/DrydockResource.php', 'DrydockResourceController' => 'applications/drydock/controller/DrydockResourceController.php', 'DrydockResourceDatasource' => 'applications/drydock/typeahead/DrydockResourceDatasource.php', - 'DrydockResourceDestroyWorker' => 'applications/drydock/worker/DrydockResourceDestroyWorker.php', 'DrydockResourceListController' => 'applications/drydock/controller/DrydockResourceListController.php', 'DrydockResourceListView' => 'applications/drydock/view/DrydockResourceListView.php', 'DrydockResourcePHIDType' => 'applications/drydock/phid/DrydockResourcePHIDType.php', @@ -877,7 +876,6 @@ 'DrydockResourceStatus' => 'applications/drydock/constants/DrydockResourceStatus.php', 'DrydockResourceUpdateWorker' => 'applications/drydock/worker/DrydockResourceUpdateWorker.php', 'DrydockResourceViewController' => 'applications/drydock/controller/DrydockResourceViewController.php', - 'DrydockResourceWorker' => 'applications/drydock/worker/DrydockResourceWorker.php', 'DrydockSFTPFilesystemInterface' => 'applications/drydock/interface/filesystem/DrydockSFTPFilesystemInterface.php', 'DrydockSSHCommandInterface' => 'applications/drydock/interface/command/DrydockSSHCommandInterface.php', 'DrydockSlotLock' => 'applications/drydock/storage/DrydockSlotLock.php', @@ -4618,7 +4616,6 @@ ), 'DrydockResourceController' => 'DrydockController', 'DrydockResourceDatasource' => 'PhabricatorTypeaheadDatasource', - 'DrydockResourceDestroyWorker' => 'DrydockWorker', 'DrydockResourceListController' => 'DrydockResourceController', 'DrydockResourceListView' => 'AphrontView', 'DrydockResourcePHIDType' => 'PhabricatorPHIDType', @@ -4628,7 +4625,6 @@ 'DrydockResourceStatus' => 'DrydockConstants', 'DrydockResourceUpdateWorker' => 'DrydockWorker', 'DrydockResourceViewController' => 'DrydockResourceController', - 'DrydockResourceWorker' => 'DrydockWorker', 'DrydockSFTPFilesystemInterface' => 'DrydockFilesystemInterface', 'DrydockSSHCommandInterface' => 'DrydockCommandInterface', 'DrydockSlotLock' => 'DrydockDAO', diff --git a/src/applications/drydock/storage/DrydockResource.php b/src/applications/drydock/storage/DrydockResource.php --- a/src/applications/drydock/storage/DrydockResource.php +++ b/src/applications/drydock/storage/DrydockResource.php @@ -246,12 +246,14 @@ } } - public function canUpdate() { + public function canReceiveCommands() { switch ($this->getStatus()) { - case DrydockResourceStatus::STATUS_ACTIVE: - return true; - default: + case DrydockResourceStatus::STATUS_RELEASED: + case DrydockResourceStatus::STATUS_BROKEN: + case DrydockResourceStatus::STATUS_DESTROYED: return false; + default: + return true; } } diff --git a/src/applications/drydock/worker/DrydockAllocatorWorker.php b/src/applications/drydock/worker/DrydockAllocatorWorker.php --- a/src/applications/drydock/worker/DrydockAllocatorWorker.php +++ b/src/applications/drydock/worker/DrydockAllocatorWorker.php @@ -333,7 +333,7 @@ // activate it. if ($resource->getStatus() == DrydockResourceStatus::STATUS_PENDING) { PhabricatorWorker::scheduleTask( - 'DrydockResourceWorker', + 'DrydockResourceUpdateWorker', array( 'resourcePHID' => $resource->getPHID(), ), diff --git a/src/applications/drydock/worker/DrydockResourceDestroyWorker.php b/src/applications/drydock/worker/DrydockResourceDestroyWorker.php deleted file mode 100644 --- a/src/applications/drydock/worker/DrydockResourceDestroyWorker.php +++ /dev/null @@ -1,35 +0,0 @@ -getTaskDataValue('resourcePHID'); - $resource = $this->loadResource($resource_phid); - $this->destroyResource($resource); - } - - private function destroyResource(DrydockResource $resource) { - $status = $resource->getStatus(); - - switch ($status) { - case DrydockResourceStatus::STATUS_RELEASED: - case DrydockResourceStatus::STATUS_BROKEN: - break; - default: - throw new PhabricatorWorkerPermanentFailureException( - pht( - 'Unable to destroy resource ("%s"), resource has the wrong '. - 'status ("%s").', - $resource->getPHID(), - $status)); - } - - $blueprint = $resource->getBlueprint(); - $blueprint->destroyResource($resource); - - $resource - ->setStatus(DrydockResourceStatus::STATUS_DESTROYED) - ->save(); - } - -} diff --git a/src/applications/drydock/worker/DrydockResourceUpdateWorker.php b/src/applications/drydock/worker/DrydockResourceUpdateWorker.php --- a/src/applications/drydock/worker/DrydockResourceUpdateWorker.php +++ b/src/applications/drydock/worker/DrydockResourceUpdateWorker.php @@ -1,5 +1,11 @@ canUpdate()) { + $this->processResourceCommands($resource); + + $resource_status = $resource->getStatus(); + switch ($resource_status) { + case DrydockResourceStatus::STATUS_PENDING: + $this->activateResource($resource); + break; + case DrydockResourceStatus::STATUS_ACTIVE: + // Nothing to do. + break; + case DrydockResourceStatus::STATUS_RELEASED: + case DrydockResourceStatus::STATUS_BROKEN: + $this->destroyResource($resource); + break; + case DrydockResourceStatus::STATUS_DESTROYED: + // Nothing to do. + break; + } + + $this->yieldIfExpiringResource($resource); + } + + +/* -( Processing Commands )------------------------------------------------ */ + + + /** + * @task command + */ + private function processResourceCommands(DrydockResource $resource) { + if (!$resource->canReceiveCommands()) { return; } @@ -31,21 +67,23 @@ $commands = $this->loadCommands($resource->getPHID()); foreach ($commands as $command) { - if (!$resource->canUpdate()) { + if (!$resource->canReceiveCommands()) { break; } - $this->processCommand($resource, $command); + $this->processResourceCommand($resource, $command); $command ->setIsConsumed(true) ->save(); } - - $this->yieldIfExpiringResource($resource); } - private function processCommand( + + /** + * @task command + */ + private function processResourceCommand( DrydockResource $resource, DrydockCommand $command) { @@ -56,13 +94,47 @@ } } - private function releaseResource(DrydockResource $resource) { - if ($resource->getStatus() != DrydockResourceStatus::STATUS_ACTIVE) { - // If we had multiple release commands - // This command is only meaningful to resources in the "Open" state. - return; + +/* -( Activating Resources )----------------------------------------------- */ + + + /** + * @task activate + */ + private function activateResource(DrydockResource $resource) { + $blueprint = $resource->getBlueprint(); + $blueprint->activateResource($resource); + $this->validateActivatedResource($blueprint, $resource); + } + + + /** + * @task activate + */ + private function validateActivatedResource( + DrydockBlueprint $blueprint, + DrydockResource $resource) { + + if (!$resource->isActivatedResource()) { + throw new Exception( + pht( + 'Blueprint "%s" (of type "%s") is not properly implemented: %s '. + 'must actually allocate the resource it returns.', + $blueprint->getBlueprintName(), + $blueprint->getClassName(), + 'allocateResource()')); } + } + + +/* -( Releasing Resources )------------------------------------------------ */ + + + /** + * @task release + */ + private function releaseResource(DrydockResource $resource) { $viewer = $this->getViewer(); $drydock_phid = id(new PhabricatorDrydockApplication())->getPHID(); @@ -97,14 +169,22 @@ $lease->scheduleUpdate(); } - PhabricatorWorker::scheduleTask( - 'DrydockResourceDestroyWorker', - array( - 'resourcePHID' => $resource->getPHID(), - ), - array( - 'objectPHID' => $resource->getPHID(), - )); + $this->destroyResource($resource); } + +/* -( Destroying Resources )----------------------------------------------- */ + + + /** + * @task destroy + */ + private function destroyResource(DrydockResource $resource) { + $blueprint = $resource->getBlueprint(); + $blueprint->destroyResource($resource); + + $resource + ->setStatus(DrydockResourceStatus::STATUS_DESTROYED) + ->save(); + } } diff --git a/src/applications/drydock/worker/DrydockResourceWorker.php b/src/applications/drydock/worker/DrydockResourceWorker.php deleted file mode 100644 --- a/src/applications/drydock/worker/DrydockResourceWorker.php +++ /dev/null @@ -1,45 +0,0 @@ -getTaskDataValue('resourcePHID'); - $resource = $this->loadResource($resource_phid); - - $this->activateResource($resource); - } - - - private function activateResource(DrydockResource $resource) { - $resource_status = $resource->getStatus(); - - if ($resource_status != DrydockResourceStatus::STATUS_PENDING) { - throw new PhabricatorWorkerPermanentFailureException( - pht( - 'Trying to activate resource from wrong status ("%s").', - $resource_status)); - } - - $blueprint = $resource->getBlueprint(); - $blueprint->activateResource($resource); - $this->validateActivatedResource($blueprint, $resource); - } - - - private function validateActivatedResource( - DrydockBlueprint $blueprint, - DrydockResource $resource) { - - if (!$resource->isActivatedResource()) { - throw new Exception( - pht( - 'Blueprint "%s" (of type "%s") is not properly implemented: %s '. - 'must actually allocate the resource it returns.', - $blueprint->getBlueprintName(), - $blueprint->getClassName(), - 'allocateResource()')); - } - - } - -} diff --git a/src/applications/drydock/worker/DrydockWorker.php b/src/applications/drydock/worker/DrydockWorker.php --- a/src/applications/drydock/worker/DrydockWorker.php +++ b/src/applications/drydock/worker/DrydockWorker.php @@ -94,7 +94,7 @@ } protected function yieldIfExpiringResource(DrydockResource $resource) { - if (!$resource->canUpdate()) { + if (!$resource->canReceiveCommands()) { return; }