mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-22 14:52:41 +01:00
Allow "bin/drydock lease" to acquire many identical leases with "--count N"
Summary: Ref T13676. This makes it easier to create resource pressure without juggling a big pile of terminals. Test Plan: Used `bin/drydock lease --count 5 ...` to acquire 5 leases. Subscribers: PHID-OPKG-gm6ozazyms6q6i22gyam Maniphest Tasks: T13676 Differential Revision: https://secure.phabricator.com/D21800
This commit is contained in:
parent
9ec6677c02
commit
30c3d1e929
1 changed files with 90 additions and 48 deletions
|
@ -26,6 +26,12 @@ final class DrydockManagementLeaseWorkflow
|
|||
'JSON file with lease attributes. Use "-" to read attributes '.
|
||||
'from stdin.'),
|
||||
),
|
||||
array(
|
||||
'name' => 'count',
|
||||
'param' => 'N',
|
||||
'default' => 1,
|
||||
'help' => pht('Lease a given number of identical resources.'),
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
|
@ -33,11 +39,10 @@ final class DrydockManagementLeaseWorkflow
|
|||
$viewer = $this->getViewer();
|
||||
|
||||
$resource_type = $args->getArg('type');
|
||||
if (!$resource_type) {
|
||||
if (!phutil_nonempty_string($resource_type)) {
|
||||
throw new PhutilArgumentUsageException(
|
||||
pht(
|
||||
'Specify a resource type with `%s`.',
|
||||
'--type'));
|
||||
'Specify a resource type with "--type".'));
|
||||
}
|
||||
|
||||
$until = $args->getArg('until');
|
||||
|
@ -46,17 +51,24 @@ final class DrydockManagementLeaseWorkflow
|
|||
if ($until <= 0) {
|
||||
throw new PhutilArgumentUsageException(
|
||||
pht(
|
||||
'Unable to parse argument to "%s".',
|
||||
'--until'));
|
||||
'Unable to parse argument to "--until".'));
|
||||
}
|
||||
}
|
||||
|
||||
$count = $args->getArgAsInteger('count');
|
||||
if ($count < 1) {
|
||||
throw new PhutilArgumentUsageException(
|
||||
pht(
|
||||
'Value provided to "--count" must be a nonzero, positive '.
|
||||
'number.'));
|
||||
}
|
||||
|
||||
$attributes_file = $args->getArg('attributes');
|
||||
if (phutil_nonempty_string($attributes_file)) {
|
||||
if ($attributes_file == '-') {
|
||||
echo tsprintf(
|
||||
"%s\n",
|
||||
'Reading JSON attributes from stdin...');
|
||||
pht('Reading JSON attributes from stdin...'));
|
||||
$data = file_get_contents('php://stdin');
|
||||
} else {
|
||||
$data = Filesystem::readFile($attributes_file);
|
||||
|
@ -67,39 +79,45 @@ final class DrydockManagementLeaseWorkflow
|
|||
$attributes = array();
|
||||
}
|
||||
|
||||
$lease = id(new DrydockLease())
|
||||
->setResourceType($resource_type);
|
||||
$leases = array();
|
||||
for ($idx = 0; $idx < $count; $idx++) {
|
||||
$lease = id(new DrydockLease())
|
||||
->setResourceType($resource_type);
|
||||
|
||||
$drydock_phid = id(new PhabricatorDrydockApplication())->getPHID();
|
||||
$lease->setAuthorizingPHID($drydock_phid);
|
||||
$drydock_phid = id(new PhabricatorDrydockApplication())->getPHID();
|
||||
$lease->setAuthorizingPHID($drydock_phid);
|
||||
|
||||
if ($attributes) {
|
||||
$lease->setAttributes($attributes);
|
||||
if ($attributes) {
|
||||
$lease->setAttributes($attributes);
|
||||
}
|
||||
|
||||
// TODO: This is not hugely scalable, although this is a debugging
|
||||
// workflow so maybe it's fine. Do we even need `bin/drydock lease` in
|
||||
// the long run?
|
||||
$all_blueprints = id(new DrydockBlueprintQuery())
|
||||
->setViewer($viewer)
|
||||
->execute();
|
||||
$allowed_phids = mpull($all_blueprints, 'getPHID');
|
||||
if (!$allowed_phids) {
|
||||
throw new Exception(
|
||||
pht(
|
||||
'No blueprints exist which can plausibly allocate resources to '.
|
||||
'satisfy the requested lease.'));
|
||||
}
|
||||
$lease->setAllowedBlueprintPHIDs($allowed_phids);
|
||||
|
||||
if ($until) {
|
||||
$lease->setUntil($until);
|
||||
}
|
||||
|
||||
// If something fatals or the user interrupts the process (for example,
|
||||
// with "^C"), release the lease. We'll cancel this below, if the lease
|
||||
// actually activates.
|
||||
$lease->setReleaseOnDestruction(true);
|
||||
|
||||
$leases[] = $lease;
|
||||
}
|
||||
|
||||
// TODO: This is not hugely scalable, although this is a debugging workflow
|
||||
// so maybe it's fine. Do we even need `bin/drydock lease` in the long run?
|
||||
$all_blueprints = id(new DrydockBlueprintQuery())
|
||||
->setViewer($viewer)
|
||||
->execute();
|
||||
$allowed_phids = mpull($all_blueprints, 'getPHID');
|
||||
if (!$allowed_phids) {
|
||||
throw new Exception(
|
||||
pht(
|
||||
'No blueprints exist which can plausibly allocate resources to '.
|
||||
'satisfy the requested lease.'));
|
||||
}
|
||||
$lease->setAllowedBlueprintPHIDs($allowed_phids);
|
||||
|
||||
if ($until) {
|
||||
$lease->setUntil($until);
|
||||
}
|
||||
|
||||
// If something fatals or the user interrupts the process (for example,
|
||||
// with "^C"), release the lease. We'll cancel this below, if the lease
|
||||
// actually activates.
|
||||
$lease->setReleaseOnDestruction(true);
|
||||
|
||||
// TODO: This would probably be better handled with PhutilSignalRouter,
|
||||
// but it currently doesn't route SIGINT. We're initializing it to setup
|
||||
// SIGTERM handling and make eventual migration easier.
|
||||
|
@ -107,29 +125,52 @@ final class DrydockManagementLeaseWorkflow
|
|||
pcntl_signal(SIGINT, array($this, 'didReceiveInterrupt'));
|
||||
|
||||
$t_start = microtime(true);
|
||||
$lease->queueForActivation();
|
||||
|
||||
|
||||
echo tsprintf(
|
||||
"%s\n\n __%s__\n\n%s\n",
|
||||
pht('Queued lease for activation:'),
|
||||
PhabricatorEnv::getProductionURI($lease->getURI()),
|
||||
pht('Waiting for daemons to activate lease...'));
|
||||
"%s\n\n",
|
||||
pht('Leases queued for activation:'));
|
||||
|
||||
$this->waitUntilActive($lease);
|
||||
foreach ($leases as $lease) {
|
||||
$lease->queueForActivation();
|
||||
|
||||
echo tsprintf(
|
||||
" __%s__\n",
|
||||
PhabricatorEnv::getProductionURI($lease->getURI()));
|
||||
}
|
||||
|
||||
echo tsprintf(
|
||||
"\n%s\n\n",
|
||||
pht('Waiting for daemons to activate leases...'));
|
||||
|
||||
foreach ($leases as $lease) {
|
||||
$this->waitUntilActive($lease);
|
||||
}
|
||||
|
||||
// Now that we've survived activation and the lease is good, make it
|
||||
// durable.
|
||||
$lease->setReleaseOnDestruction(false);
|
||||
foreach ($leases as $lease) {
|
||||
$lease->setReleaseOnDestruction(false);
|
||||
}
|
||||
|
||||
$t_end = microtime(true);
|
||||
|
||||
echo tsprintf(
|
||||
"%s\n\n %s\n\n%s\n",
|
||||
"\n%s\n\n",
|
||||
pht(
|
||||
'Activation complete. This lease is permanent until manually '.
|
||||
'released with:'),
|
||||
pht('$ ./bin/drydock release-lease --id %d', $lease->getID()),
|
||||
'Activation complete. Leases are permanent until manually '.
|
||||
'released with:'));
|
||||
|
||||
foreach ($leases as $lease) {
|
||||
echo tsprintf(
|
||||
" %s\n",
|
||||
pht('$ ./bin/drydock release-lease --id %d', $lease->getID()));
|
||||
}
|
||||
|
||||
echo tsprintf(
|
||||
"\n%s\n",
|
||||
pht(
|
||||
'Lease activated in %sms.',
|
||||
'Leases activated in %sms.',
|
||||
new PhutilNumber((int)(($t_end - $t_start) * 1000))));
|
||||
|
||||
return 0;
|
||||
|
@ -183,7 +224,8 @@ final class DrydockManagementLeaseWorkflow
|
|||
}
|
||||
|
||||
echo tsprintf(
|
||||
"<%s> %B\n",
|
||||
"(Lease #%d) <%s> %B\n",
|
||||
$lease->getID(),
|
||||
$type,
|
||||
$data);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue