Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/drydock/management/DrydockManagementReleaseLeaseWorkflow.php
12256 views
1
<?php
2
3
final class DrydockManagementReleaseLeaseWorkflow
4
extends DrydockManagementWorkflow {
5
6
protected function didConstruct() {
7
$this
8
->setName('release-lease')
9
->setSynopsis(pht('Release a lease.'))
10
->setArguments(
11
array(
12
array(
13
'name' => 'id',
14
'param' => 'id',
15
'repeat' => true,
16
'help' => pht('Lease ID to release.'),
17
),
18
array(
19
'name' => 'all',
20
'help' => pht('Release all leases. Dangerous!'),
21
),
22
));
23
}
24
25
public function execute(PhutilArgumentParser $args) {
26
$is_all = $args->getArg('all');
27
$ids = $args->getArg('id');
28
29
if (!$ids && !$is_all) {
30
throw new PhutilArgumentUsageException(
31
pht(
32
'Select which leases you want to release. See "--help" for '.
33
'guidance.'));
34
}
35
36
$viewer = $this->getViewer();
37
38
$statuses = $this->getReleaseableLeaseStatuses();
39
40
$query = id(new DrydockLeaseQuery())
41
->setViewer($viewer)
42
->withStatuses(mpull($statuses, 'getKey'));
43
44
if ($ids) {
45
$query->withIDs($ids);
46
}
47
48
$leases = $query->execute();
49
50
if ($ids) {
51
$id_map = mpull($leases, null, 'getID');
52
53
foreach ($ids as $id) {
54
$lease = idx($id_map, $id);
55
if (!$lease) {
56
throw new PhutilArgumentUsageException(
57
pht('Lease "%s" does not exist.', $id));
58
}
59
}
60
61
$leases = array_select_keys($id_map, $ids);
62
}
63
64
if (!$leases) {
65
echo tsprintf(
66
"%s\n",
67
pht('No leases selected for release.'));
68
69
return 0;
70
}
71
72
$drydock_phid = id(new PhabricatorDrydockApplication())->getPHID();
73
74
PhabricatorWorker::setRunAllTasksInProcess(true);
75
76
foreach ($leases as $lease) {
77
if (!$lease->canRelease()) {
78
echo tsprintf(
79
"%s\n",
80
pht(
81
'Lease "%s" is not releasable.',
82
$lease->getDisplayName()));
83
continue;
84
}
85
86
$command = DrydockCommand::initializeNewCommand($viewer)
87
->setTargetPHID($lease->getPHID())
88
->setAuthorPHID($drydock_phid)
89
->setCommand(DrydockCommand::COMMAND_RELEASE)
90
->save();
91
92
$lease->scheduleUpdate();
93
94
echo tsprintf(
95
"%s\n",
96
pht(
97
'Scheduled release of lease "%s".',
98
$lease->getDisplayName()));
99
}
100
101
}
102
103
private function getReleaseableLeaseStatuses() {
104
$statuses = DrydockLeaseStatus::getAllStatuses();
105
foreach ($statuses as $key => $status) {
106
$statuses[$key] = DrydockLeaseStatus::newStatusObject($status);
107
}
108
109
foreach ($statuses as $key => $status) {
110
if (!$status->canRelease()) {
111
unset($statuses[$key]);
112
}
113
}
114
115
return $statuses;
116
}
117
118
}
119
120