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;
     }
     $viewer = $this->getViewer();
     $drydock_phid = id(new PhabricatorDrydockApplication())->getPHID();
     $resource->openTransaction();
     $resource->setStatus(DrydockResourceStatus::STATUS_RELEASED)->save();
     // TODO: Hold slot locks until destruction?
     DrydockSlotLock::releaseLocks($resource->getPHID());
     $resource->saveTransaction();
     $statuses = array(DrydockLeaseStatus::STATUS_PENDING, DrydockLeaseStatus::STATUS_ACQUIRED, DrydockLeaseStatus::STATUS_ACTIVE);
     $leases = id(new DrydockLeaseQuery())->setViewer($viewer)->withResourcePHIDs(array($resource->getPHID()))->withStatuses($statuses)->execute();
     foreach ($leases as $lease) {
         $command = DrydockCommand::initializeNewCommand($viewer)->setTargetPHID($lease->getPHID())->setAuthorPHID($drydock_phid)->setCommand(DrydockCommand::COMMAND_RELEASE)->save();
         $lease->scheduleUpdate();
     }
     PhabricatorWorker::scheduleTask('DrydockResourceDestroyWorker', array('resourcePHID' => $resource->getPHID()), array('objectPHID' => $resource->getPHID()));
 }
 /**
  * @task break
  */
 private function breakResource(DrydockResource $resource, Exception $ex)
 {
     switch ($resource->getStatus()) {
         case DrydockResourceStatus::STATUS_BROKEN:
         case DrydockResourceStatus::STATUS_RELEASED:
         case DrydockResourceStatus::STATUS_DESTROYED:
             // If the resource was already broken, just throw a normal exception.
             // This will retry the task eventually.
             throw new PhutilProxyException(pht('Unexpected failure while destroying resource ("%s").', $resource->getPHID()), $ex);
     }
     $resource->setStatus(DrydockResourceStatus::STATUS_BROKEN)->save();
     $resource->scheduleUpdate();
     $resource->logEvent(DrydockResourceActivationFailureLogType::LOGCONST, array('class' => get_class($ex), 'message' => $ex->getMessage()));
     throw new PhabricatorWorkerPermanentFailureException(pht('Permanent failure while activating resource ("%s"): %s', $resource->getPHID(), $ex->getMessage()));
 }
示例#3
0
 protected function newResourceTemplate($name)
 {
     $resource = new DrydockResource();
     $resource->setBlueprintClass(get_class($this));
     $resource->setType($this->getType());
     $resource->setStatus(DrydockResourceStatus::STATUS_PENDING);
     $resource->setName($name);
     $resource->save();
     $this->activeResource = $resource;
     $this->log('New Template');
     return $resource;
 }