Path: blob/master/src/applications/drydock/management/DrydockManagementReleaseResourceWorkflow.php
12256 views
<?php12final class DrydockManagementReleaseResourceWorkflow3extends DrydockManagementWorkflow {45protected function didConstruct() {6$this7->setName('release-resource')8->setSynopsis(pht('Release a resource.'))9->setArguments(10array(11array(12'name' => 'id',13'param' => 'id',14'repeat' => true,15'help' => pht('Resource ID to release.'),16),17array(18'name' => 'all',19'help' => pht('Release all resources. Dangerous!'),20),21));22}2324public function execute(PhutilArgumentParser $args) {25$is_all = $args->getArg('all');26$ids = $args->getArg('id');27if (!$ids && !$is_all) {28throw new PhutilArgumentUsageException(29pht(30'Specify which resources you want to release. See "--help" for '.31'guidance.'));32}3334$viewer = $this->getViewer();35$statuses = $this->getReleaseableResourceStatuses();3637$query = id(new DrydockResourceQuery())38->setViewer($viewer)39->withStatuses(mpull($statuses, 'getKey'));4041if ($ids) {42$query->withIDs($ids);43}4445$resources = $query->execute();4647if ($ids) {48$id_map = mpull($resources, null, 'getID');4950foreach ($ids as $id) {51$resource = idx($resources, $id);5253if (!$resource) {54throw new PhutilArgumentUsageException(55pht('Resource "%s" does not exist.', $id));56}57}5859$resources = array_select_keys($id_map, $ids);60}6162if (!$resources) {63echo tsprintf(64"%s\n",65pht('No resources selected for release.'));6667return 0;68}6970$drydock_phid = id(new PhabricatorDrydockApplication())->getPHID();7172PhabricatorWorker::setRunAllTasksInProcess(true);7374foreach ($resources as $resource) {75if (!$resource->canRelease()) {76echo tsprintf(77"%s\n",78pht(79'Resource "%s" is not releasable.',80$resource->getDisplayName()));81continue;82}8384$command = DrydockCommand::initializeNewCommand($viewer)85->setTargetPHID($resource->getPHID())86->setAuthorPHID($drydock_phid)87->setCommand(DrydockCommand::COMMAND_RELEASE)88->save();8990$resource->scheduleUpdate();9192echo tsprintf(93"%s\n",94pht(95'Scheduled release of resource "%s".',96$resource->getDisplayName()));97}9899return 0;100}101102private function getReleaseableResourceStatuses() {103$statuses = DrydockResourceStatus::getAllStatuses();104foreach ($statuses as $key => $status) {105$statuses[$key] = DrydockResourceStatus::newStatusObject($status);106}107108foreach ($statuses as $key => $status) {109if (!$status->canRelease()) {110unset($statuses[$key]);111}112}113114return $statuses;115}116}117118119