Page MenuHomePhabricator

D14201.id34300.diff
No OneTemporary

D14201.id34300.diff

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 @@
-<?php
-
-final class DrydockResourceDestroyWorker extends DrydockWorker {
-
- protected function doWork() {
- $resource_phid = $this->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 @@
<?php
+/**
+ * @task command Processing Commands
+ * @task activate Activating Resources
+ * @task release Releasing Resources
+ * @task destroy Destroying Resources
+ */
final class DrydockResourceUpdateWorker extends DrydockWorker {
protected function doWork() {
@@ -23,7 +29,37 @@
}
private function updateResource(DrydockResource $resource) {
- if (!$resource->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 @@
-<?php
-
-final class DrydockResourceWorker extends DrydockWorker {
-
- protected function doWork() {
- $resource_phid = $this->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;
}

File Metadata

Mime Type
text/plain
Expires
Wed, Apr 23, 2:02 PM (15 h, 8 m ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7226011
Default Alt Text
D14201.id34300.diff (11 KB)

Event Timeline