3 final class DrydockManagementReleaseLeaseWorkflow
4 extends DrydockManagementWorkflow
{
6 protected function didConstruct() {
8 ->setName('release-lease')
9 ->setSynopsis(pht('Release a lease.'))
16 'help' => pht('Lease ID to release.'),
20 'help' => pht('Release all leases. Dangerous!'),
25 public function execute(PhutilArgumentParser
$args) {
26 $is_all = $args->getArg('all');
27 $ids = $args->getArg('id');
29 if (!$ids && !$is_all) {
30 throw new PhutilArgumentUsageException(
32 'Select which leases you want to release. See "--help" for '.
36 $viewer = $this->getViewer();
38 $statuses = $this->getReleaseableLeaseStatuses();
40 $query = id(new DrydockLeaseQuery())
42 ->withStatuses(mpull($statuses, 'getKey'));
45 $query->withIDs($ids);
48 $leases = $query->execute();
51 $id_map = mpull($leases, null, 'getID');
53 foreach ($ids as $id) {
54 $lease = idx($id_map, $id);
56 throw new PhutilArgumentUsageException(
57 pht('Lease "%s" does not exist.', $id));
61 $leases = array_select_keys($id_map, $ids);
67 pht('No leases selected for release.'));
72 $drydock_phid = id(new PhabricatorDrydockApplication())->getPHID();
74 PhabricatorWorker
::setRunAllTasksInProcess(true);
76 foreach ($leases as $lease) {
77 if (!$lease->canRelease()) {
81 'Lease "%s" is not releasable.',
82 $lease->getDisplayName()));
86 $command = DrydockCommand
::initializeNewCommand($viewer)
87 ->setTargetPHID($lease->getPHID())
88 ->setAuthorPHID($drydock_phid)
89 ->setCommand(DrydockCommand
::COMMAND_RELEASE
)
92 $lease->scheduleUpdate();
97 'Scheduled release of lease "%s".',
98 $lease->getDisplayName()));
103 private function getReleaseableLeaseStatuses() {
104 $statuses = DrydockLeaseStatus
::getAllStatuses();
105 foreach ($statuses as $key => $status) {
106 $statuses[$key] = DrydockLeaseStatus
::newStatusObject($status);
109 foreach ($statuses as $key => $status) {
110 if (!$status->canRelease()) {
111 unset($statuses[$key]);