diff --git a/bin/drydock b/bin/drydock new file mode 120000 index 0000000000..a98cf0d298 --- /dev/null +++ b/bin/drydock @@ -0,0 +1 @@ +../scripts/drydock/drydock_control.php \ No newline at end of file diff --git a/scripts/drydock/drydock_control.php b/scripts/drydock/drydock_control.php index 4bb361d2b7..e9347a5be4 100755 --- a/scripts/drydock/drydock_control.php +++ b/scripts/drydock/drydock_control.php @@ -21,31 +21,19 @@ $root = dirname(dirname(dirname(__FILE__))); require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); +$args->setTagline('manage drydock software resources'); +$args->setSynopsis(<<parseStandardArguments(); -$args->parse(array()); -$allocator = new DrydockAllocator(); -$allocator->setResourceType('webroot'); -$lease = $allocator->allocate(); +$workflows = array( + new DrydockManagementWaitForLeaseWorkflow(), + new DrydockManagementLeaseWorkflow(), + new PhutilHelpArgumentWorkflow(), +); -$lease->waitUntilActive(); - - -$cmd = $lease->getInterface('webroot'); -echo "URI: ".$cmd->getURI()."\n"; - -$lease->release(); - -die("Done.\n"); - -$i_file = $lease->getInterface('command'); - -list($stdout) = $i_file->execx('ls / ; echo -- ; uptime ; echo -- ; uname -n'); -echo $stdout; - - -$lease->release(); - - -// $i_http = $lease->getInterface('httpd'); -// echo $i_http->getURI('/index.html')."\n"; +$args->parseWorkflows($workflows); diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 24655d85f0..472e3d39db 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -430,6 +430,9 @@ phutil_register_library_map(array( 'DrydockLog' => 'applications/drydock/storage/DrydockLog.php', 'DrydockLogController' => 'applications/drydock/controller/DrydockLogController.php', 'DrydockLogQuery' => 'applications/drydock/query/DrydockLogQuery.php', + 'DrydockManagementLeaseWorkflow' => 'applications/drydock/management/DrydockManagementLeaseWorkflow.php', + 'DrydockManagementWaitForLeaseWorkflow' => 'applications/drydock/management/DrydockManagementWaitForLeaseWorkflow.php', + 'DrydockManagementWorkflow' => 'applications/drydock/management/DrydockManagementWorkflow.php', 'DrydockPhabricatorApplicationBlueprint' => 'applications/drydock/blueprint/application/DrydockPhabricatorApplicationBlueprint.php', 'DrydockRemoteHostBlueprint' => 'applications/drydock/blueprint/DrydockRemoteHostBlueprint.php', 'DrydockResource' => 'applications/drydock/storage/DrydockResource.php', @@ -1659,6 +1662,9 @@ phutil_register_library_map(array( 'DrydockLog' => 'DrydockDAO', 'DrydockLogController' => 'DrydockController', 'DrydockLogQuery' => 'PhabricatorOffsetPagedQuery', + 'DrydockManagementLeaseWorkflow' => 'DrydockManagementWorkflow', + 'DrydockManagementWaitForLeaseWorkflow' => 'DrydockManagementWorkflow', + 'DrydockManagementWorkflow' => 'PhutilArgumentWorkflow', 'DrydockPhabricatorApplicationBlueprint' => 'DrydockBlueprint', 'DrydockRemoteHostBlueprint' => 'DrydockBlueprint', 'DrydockResource' => 'DrydockDAO', diff --git a/src/applications/drydock/management/DrydockManagementLeaseWorkflow.php b/src/applications/drydock/management/DrydockManagementLeaseWorkflow.php new file mode 100644 index 0000000000..60beddae1e --- /dev/null +++ b/src/applications/drydock/management/DrydockManagementLeaseWorkflow.php @@ -0,0 +1,84 @@ +setName('lease') + ->setSynopsis('Lease a resource.') + ->setArguments( + array( + array( + 'name' => 'type', + 'param' => 'resource_type', + 'help' => 'Resource type.', + ), + array( + 'name' => 'spec', + 'param' => 'name=value,...', + 'help' => 'Resource specficiation.', + ), + )); + } + + public function execute(PhutilArgumentParser $args) { + $console = PhutilConsole::getConsole(); + + $resource_type = $args->getArg('type'); + if (!$resource_type) { + throw new PhutilArgumentUsageException( + "Specify a resource type with `--type`."); + } + + $spec = $args->getArg('spec'); + if ($spec) { + $options = new PhutilSimpleOptions(); + $spec = $options->parse($spec); + } + + $allocator = new DrydockAllocator(); + $allocator->setResourceType($resource_type); + if ($spec) { + // TODO: Shove this in there. + } + + $lease = $allocator->allocate(); + + $root = dirname(phutil_get_library_root('phabricator')); + $wait = new ExecFuture( + 'php -f %s wait-for-lease --id %s', + $root.'/scripts/drydock/drydock_control.php', + $lease->getID()); + + foreach (Futures(array($wait))->setUpdateInterval(1) as $key => $future) { + if ($future) { + $future->resolvex(); + break; + } + + // TODO: Pull logs. + $console->writeErr("Working...\n"); + } + + $console->writeOut("Acquired Lease %s\n", $lease->getID()); + return 0; + } + +} diff --git a/src/applications/drydock/management/DrydockManagementWaitForLeaseWorkflow.php b/src/applications/drydock/management/DrydockManagementWaitForLeaseWorkflow.php new file mode 100644 index 0000000000..35a94ac736 --- /dev/null +++ b/src/applications/drydock/management/DrydockManagementWaitForLeaseWorkflow.php @@ -0,0 +1,56 @@ +setName('wait-for-lease') + ->setSynopsis('Wait for a lease to become available.') + ->setArguments( + array( + array( + 'name' => 'id', + 'param' => 'lease_id', + 'help' => 'Lease ID to wait for.', + ), + )); + } + + public function execute(PhutilArgumentParser $args) { + $lease_id = $args->getArg('id'); + if (!$lease_id) { + throw new PhutilArgumentUsageException( + "Specify a lease ID with `--id`."); + } + + $console = PhutilConsole::getConsole(); + + $lease = id(new DrydockLease())->load($lease_id); + if (!$lease) { + $console->writeErr("No such lease.\n"); + return 1; + } else { + $lease->waitUntilActive(); + $console->writeErr("Lease active.\n"); + return 0; + } + } + +} diff --git a/src/applications/drydock/management/DrydockManagementWorkflow.php b/src/applications/drydock/management/DrydockManagementWorkflow.php new file mode 100644 index 0000000000..d278eec960 --- /dev/null +++ b/src/applications/drydock/management/DrydockManagementWorkflow.php @@ -0,0 +1,26 @@ +