private function releaseLease(DrydockLease $lease)
 {
     $lease->openTransaction();
     $lease->setStatus(DrydockLeaseStatus::STATUS_RELEASED)->save();
     // TODO: Hold slot locks until destruction?
     DrydockSlotLock::releaseLocks($lease->getPHID());
     $lease->saveTransaction();
     PhabricatorWorker::scheduleTask('DrydockLeaseDestroyWorker', array('leasePHID' => $lease->getPHID()), array('objectPHID' => $lease->getPHID()));
     $resource = $lease->getResource();
     $blueprint = $resource->getBlueprint();
     $blueprint->didReleaseLease($resource, $lease);
 }
 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 destroy
  */
 private function destroyLease(DrydockLease $lease)
 {
     $resource = $lease->getResource();
     if ($resource) {
         $blueprint = $resource->getBlueprint();
         $blueprint->destroyLease($resource, $lease);
     }
     DrydockSlotLock::releaseLocks($lease->getPHID());
     $lease->setStatus(DrydockLeaseStatus::STATUS_DESTROYED)->save();
     $lease->logEvent(DrydockLeaseDestroyedLogType::LOGCONST);
     $lease->awakenTasks();
 }
 /**
  * @task destroy
  */
 private function destroyResource(DrydockResource $resource)
 {
     $blueprint = $resource->getBlueprint();
     $blueprint->destroyResource($resource);
     DrydockSlotLock::releaseLocks($resource->getPHID());
     $resource->setStatus(DrydockResourceStatus::STATUS_DESTROYED)->save();
 }
 public function closeResource()
 {
     // TODO: This is super broken and will race other lease writers!
     $this->openTransaction();
     $statuses = array(DrydockLeaseStatus::STATUS_PENDING, DrydockLeaseStatus::STATUS_ACTIVE);
     $leases = id(new DrydockLeaseQuery())->setViewer(PhabricatorUser::getOmnipotentUser())->withResourceIDs(array($this->getID()))->withStatuses($statuses)->execute();
     foreach ($leases as $lease) {
         switch ($lease->getStatus()) {
             case DrydockLeaseStatus::STATUS_PENDING:
                 $message = pht('Breaking pending lease (resource closing).');
                 $lease->setStatus(DrydockLeaseStatus::STATUS_BROKEN);
                 break;
             case DrydockLeaseStatus::STATUS_ACTIVE:
                 $message = pht('Releasing active lease (resource closing).');
                 $lease->setStatus(DrydockLeaseStatus::STATUS_RELEASED);
                 break;
         }
         DrydockBlueprintImplementation::writeLog($this, $lease, $message);
         $lease->save();
     }
     $this->setStatus(DrydockResourceStatus::STATUS_CLOSED);
     $this->save();
     DrydockSlotLock::releaseLocks($this->getPHID());
     $this->saveTransaction();
 }