Usage:
In a command's configure() method, add the --format option:
Table::addFormatOption($this->getDefinition());
In a command's execute() method, build and display the table:
$table = new Table($input, $output);
$header = ['Column 1', 'Column 2', 'Column 3'];
$rows = [
['Cell 1', 'Cell 2', 'Cell 3'],
['Cell 4', 'Cell 5', 'Cell 6'],
];
$table->render($rows, $header);
protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $id = $input->getArgument('id'); if ($id) { $integration = $this->getSelectedProject()->getIntegration($id); if (!$integration) { $this->stdErr->writeln("Integration not found: <error>{$id}</error>"); return 1; } $results = [$integration]; } else { $results = $this->getSelectedProject()->getIntegrations(); if (!$results) { $this->stdErr->writeln('No integrations found'); return 1; } } $table = new Table($input, $output); $header = ['ID', 'Type', 'Details']; $rows = []; foreach ($results as $integration) { $data = $this->formatIntegrationData($integration); $rows[] = [$integration->id, $integration->type, $data]; } $table->render($rows, $header); return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $tunnels = $this->getTunnelInfo(); $allTunnelsCount = count($tunnels); if (!$allTunnelsCount) { $this->stdErr->writeln('No tunnels found.'); return 1; } // Filter tunnels according to the current project and environment, if // available. if (!$input->getOption('all')) { $tunnels = $this->filterTunnels($tunnels, $input); if (!count($tunnels)) { $this->stdErr->writeln('No tunnels found. Use --all to view all tunnels.'); return 1; } } $table = new Table($input, $output); $headers = ['Port', 'Project', 'Environment', 'App', 'Relationship']; $rows = []; foreach ($tunnels as $tunnel) { $rows[] = [$tunnel['localPort'], $tunnel['projectId'], $tunnel['environmentId'], $tunnel['appName'] ?: '[default]', $this->formatTunnelRelationship($tunnel)]; } $table->render($rows, $headers); if (!$table->formatIsMachineReadable()) { $this->stdErr->writeln(''); if (!$input->getOption('all') && count($tunnels) < $allTunnelsCount) { $this->stdErr->writeln('List all tunnels with: <info>platform tunnel:list --all</info>'); } $this->stdErr->writeln("View tunnel details with: <info>platform tunnel:info</info>"); $this->stdErr->writeln("Close tunnels with: <info>platform tunnel:close</info>"); } return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $environment = $this->getSelectedEnvironment(); $startsAt = null; if ($input->getOption('start') && !($startsAt = strtotime($input->getOption('start')))) { $this->stdErr->writeln('Invalid date: <error>' . $input->getOption('start') . '</error>'); return 1; } $limit = (int) $input->getOption('limit'); $activities = $environment->getActivities($limit, $input->getOption('type'), $startsAt); if (!$activities) { $this->stdErr->writeln('No activities found'); return 1; } $table = new Table($input, $output); $rows = []; foreach ($activities as $activity) { $description = $activity->getDescription(); if (!$table->formatIsMachineReadable()) { $description = wordwrap($description, 40); } $rows[] = [$activity->id, date('Y-m-d H:i:s', strtotime($activity['created_at'])), $description, $activity->getCompletionPercent(), ActivityUtil::formatState($activity->state)]; } if (!$table->formatIsMachineReadable()) { $this->stdErr->writeln("Activities for the environment <info>" . $environment->id . "</info>"); } $headers = ['ID', 'Created', 'Description', '% Complete', 'State']; $table->render($rows, $headers); return 0; }
/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $project = $this->getSelectedProject(); try { $domains = $project->getDomains(); } catch (ClientException $e) { $this->handleApiException($e, $project); return 1; } if (empty($domains)) { $this->stdErr->writeln('No domains found for ' . $this->api()->getProjectLabel($project) . '.'); $this->stdErr->writeln("\nAdd a domain to the project by running <info>" . self::$config->get('application.executable') . " domain:add [domain-name]</info>"); return 1; } $table = new Table($input, $output); $header = ['Name', 'SSL enabled', 'Creation date']; $rows = $this->buildDomainRows($domains); if ($table->formatIsMachineReadable()) { $table->render($rows, $header); return 0; } $this->stdErr->writeln("Your domains are: "); $table->render($rows, $header); $this->stdErr->writeln(''); $this->stdErr->writeln('To add a new domain, run: <info>' . self::$config->get('application.executable') . ' domain:add [domain-name]</info>'); $this->stdErr->writeln('To view a domain, run: <info>' . self::$config->get('application.executable') . ' domain:get [domain-name]</info>'); $this->stdErr->writeln('To delete a domain, run: <info>' . self::$config->get('application.executable') . ' domain:delete [domain-name]</info>'); return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $environment = $this->getSelectedEnvironment(); $startsAt = null; if ($input->getOption('start') && !($startsAt = strtotime($input->getOption('start')))) { $this->stdErr->writeln('Invalid date: <error>' . $input->getOption('start') . '</error>'); return 1; } $table = new Table($input, $output); if (!$table->formatIsMachineReadable()) { $this->stdErr->writeln("Finding snapshots for the environment <info>{$environment->id}</info>"); } $results = $environment->getActivities($input->getOption('limit'), 'environment.backup', $startsAt); if (!$results) { $this->stdErr->writeln('No snapshots found'); return 1; } $headers = ['Created', '% Complete', 'Snapshot name']; $rows = []; foreach ($results as $result) { $payload = $result->payload; $snapshot_name = !empty($payload['backup_name']) ? $payload['backup_name'] : 'N/A'; $rows[] = [date('Y-m-d H:i:s', strtotime($result->created_at)), $result->getCompletionPercent(), new AdaptiveTableCell($snapshot_name, ['wrap' => false])]; } $table->render($rows, $headers); return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $environment = $this->getSelectedEnvironment(); $routes = $environment->getRoutes(); if (empty($routes)) { $this->stdErr->writeln("No routes found"); return 0; } $table = new Table($input, $output); $header = ['Route', 'Type', 'To', 'Cache', 'SSI']; $rows = []; foreach ($routes as $route) { $row = [$route->id, $route->type, $route->type == 'upstream' ? $route->upstream : $route->to]; if ($table->formatIsMachineReadable()) { $row[] = json_encode($route->cache); $row[] = json_encode($route->ssi); } else { $row[] = wordwrap(json_encode($route->cache), 30, "\n", true); $row[] = wordwrap(json_encode($route->ssi), 30, "\n", true); } $rows[] = $row; } if (!$table->formatIsMachineReadable()) { $this->stdErr->writeln("Routes for the environment <info>{$environment->id}</info>:"); } $table->render($rows, $header); return 0; }
/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $project = $this->getSelectedProject(); try { $domains = $project->getDomains(); } catch (ClientException $e) { $this->handleApiException($e, $project); return 1; } if (empty($domains)) { $this->stdErr->writeln("No domains found for <info>{$project->title}</info>"); $this->stdErr->writeln("\nAdd a domain to the project by running <info>platform domain:add [domain-name]</info>"); return 1; } $table = new Table($input, $output); $header = ['Name', 'SSL enabled', 'Creation date']; $rows = $this->buildDomainRows($domains); if ($table->formatIsMachineReadable()) { $table->render($rows, $header); return 0; } $this->stdErr->writeln("Your domains are: "); $table->render($rows, $header); $this->stdErr->writeln("\nAdd a new domain by running <info>platform domain:add [domain-name]</info>"); $this->stdErr->writeln("Delete a domain by running <info>platform domain:delete [domain-name]</info>"); return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); if ($name = $input->getArgument('name')) { $variable = $this->getSelectedEnvironment()->getVariable($name); if (!$variable) { $this->stdErr->writeln("Variable not found: <error>{$name}</error>"); return 1; } if ($input->getOption('pipe')) { $output->writeln($variable->value); } else { $output->writeln(sprintf('<info>%s</info>: %s', $variable->name, $variable->value)); } return 0; } $results = $this->getSelectedEnvironment()->getVariables(); if (!$results) { $this->stdErr->writeln('No variables found'); return 1; } if ($input->getOption('pipe')) { throw new \InvalidArgumentException('Specify a variable name to use --pipe'); } $table = new Table($input, $output); $header = ['ID', 'Value', 'Inherited', 'JSON']; $rows = []; foreach ($results as $variable) { $rows[] = [new AdaptiveTableCell($variable->id, ['wrap' => false]), $variable->value, $variable->inherited ? 'Yes' : 'No', $variable->is_json ? 'Yes' : 'No']; } $table->render($rows, $header); return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $info = $this->api()->getMyAccount((bool) $input->getOption('refresh')); $formatter = new PropertyFormatter($input); $propertyWhitelist = ['id', 'uuid', 'display_name', 'username', 'mail', 'has_key']; $info = array_intersect_key($info, array_flip($propertyWhitelist)); $property = $input->getArgument('property'); if ($input->getOption('property')) { if ($property) { throw new InvalidArgumentException(sprintf('You cannot use both the <%s> argument and the --%s option', 'property', 'property')); } $property = $input->getOption('property'); } if ($property) { if (!isset($info[$property])) { throw new \InvalidArgumentException('Property not found: ' . $property); } $output->writeln($formatter->format($info[$property], $property)); return 0; } unset($info['uuid']); $values = []; $header = []; foreach ($propertyWhitelist as $property) { if (isset($info[$property])) { $values[] = $formatter->format($info[$property], $property); $header[] = $property; } } $table = new Table($input, $output); $table->renderSimple($values, $header); return 0; }
/** * @param Environment $environment * * @param Table $table * * @return int */ protected function listProperties(Environment $environment, Table $table) { $headings = []; $values = []; foreach ($environment->getProperties() as $key => $value) { $headings[] = new AdaptiveTableCell($key, ['wrap' => false]); $values[] = $this->formatter->format($value, $key); } $table->renderSimple($values, $headings); return 0; }
/** * @param Integration $integration * @param InputInterface $input * @param OutputInterface $output */ protected function displayIntegration(Integration $integration, InputInterface $input, OutputInterface $output) { $table = new Table($input, $output); $info = []; foreach ($integration->getProperties() as $property => $value) { $info[$property] = $this->propertyFormatter->format($value, $property); } if ($integration->hasLink('#hook')) { $info['hook_url'] = $this->propertyFormatter->format($integration->getLink('#hook')); } $table->renderSimple(array_values($info), array_keys($info)); }
/** * @param Subscription $subscription * @param Table $table * * @return int */ protected function listProperties(Subscription $subscription, Table $table) { $headings = []; $values = []; foreach ($subscription->getProperties() as $key => $value) { $value = $this->formatter->format($value, $key); $value = wordwrap($value, 50, "\n", true); $headings[] = $key; $values[] = $value; } $table->renderSimple($values, $headings); return 0; }
/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { if (!($projectRoot = $this->getProjectRoot())) { throw new RootNotFoundException(); } $repository = $projectRoot . '/' . LocalProject::REPOSITORY_DIR; $apps = LocalApplication::getApplications($repository); $rows = []; foreach ($apps as $app) { $rows[] = [$app->getName(), $app->getRoot()]; } $table = new Table($input, $output); $table->render($rows, ['Name', 'Path']); }
/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { if (!($projectRoot = $this->getProjectRoot())) { throw new RootNotFoundException(); } $apps = LocalApplication::getApplications($projectRoot, self::$config); $rows = []; foreach ($apps as $app) { $config = $app->getConfig(); $type = isset($config['type']) ? $config['type'] : null; $rows[] = [$app->getName(), $type, $app->getRoot()]; } $table = new Table($input, $output); $table->render($rows, ['Name', 'Type', 'Path']); }
/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $project = $this->getSelectedProject(); $domainName = $input->getArgument('name'); if (empty($domainName)) { if (!$input->isInteractive()) { $this->stdErr->writeln('The domain name is required.'); return 1; } $domains = $project->getDomains(); $options = []; foreach ($domains as $domain) { $options[$domain->name] = $domain->name; } /** @var QuestionHelper $questionHelper */ $questionHelper = $this->getHelper('question'); $domainName = $questionHelper->choose($options, 'Enter a number to choose a domain:'); } $domain = $project->getDomain($domainName); if (!$domain) { $this->stdErr->writeln('Domain not found: <error>' . $domainName . '</error>'); return 1; } $propertyFormatter = new PropertyFormatter($input); if ($property = $input->getOption('property')) { $value = $this->api()->getNestedProperty($domain, $property); $output->writeln($propertyFormatter->format($value, $property)); return 0; } $values = []; $properties = []; foreach ($domain->getProperties() as $name => $value) { // Hide the deprecated (irrelevant) property 'wildcard'. if ($name === 'wildcard') { continue; } $properties[] = $name; $values[] = $propertyFormatter->format($value, $name); } $table = new Table($input, $output); $table->renderSimple($values, $properties); $this->stdErr->writeln(''); $this->stdErr->writeln('To update a domain, run: <info>' . self::$config->get('application.executable') . ' domain:update [domain-name]</info>'); $this->stdErr->writeln('To delete a domain, run: <info>' . self::$config->get('application.executable') . ' domain:delete [domain-name]</info>'); return 0; }
protected function configure() { $this->setName('tunnel:info')->setDescription("View relationship info for SSH tunnels")->addOption('property', 'P', InputOption::VALUE_REQUIRED, 'The relationship property to view')->addOption('encode', 'c', InputOption::VALUE_NONE, 'Output as base64-encoded JSON'); $this->addProjectOption(); $this->addEnvironmentOption(); $this->addAppOption(); Table::addFormatOption($this->getDefinition()); }
protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input, $input->getOption('all')); $project = $this->getSelectedProject(); $startsAt = null; if ($input->getOption('start') && !($startsAt = strtotime($input->getOption('start')))) { $this->stdErr->writeln('Invalid date: <error>' . $input->getOption('start') . '</error>'); return 1; } $limit = (int) $input->getOption('limit'); if ($this->hasSelectedEnvironment() && !$input->getOption('all')) { $environmentSpecific = true; $environment = $this->getSelectedEnvironment(); $activities = $environment->getActivities($limit, $input->getOption('type'), $startsAt); } else { $environmentSpecific = false; $activities = $project->getActivities($limit, $input->getOption('type'), $startsAt); } if (!$activities) { $this->stdErr->writeln('No activities found'); return 1; } $table = new Table($input, $output); $rows = []; foreach ($activities as $activity) { $row = [new AdaptiveTableCell($activity->id, ['wrap' => false]), date('Y-m-d H:i:s', strtotime($activity['created_at'])), $activity->getDescription(), $activity->getCompletionPercent(), ActivityUtil::formatState($activity->state)]; if (!$environmentSpecific) { $row[] = implode(', ', $activity->environments); } $rows[] = $row; } $headers = ['ID', 'Created', 'Description', '% Complete', 'State']; if (!$environmentSpecific) { $headers[] = 'Environment(s)'; } if (!$table->formatIsMachineReadable()) { if ($environmentSpecific && isset($environment)) { $this->stdErr->writeln("Activities for the environment <info>" . $environment->id . "</info>"); } elseif (!$environmentSpecific) { $this->stdErr->writeln("Activities for the project <info>" . $project->id . "</info>"); } } $table->render($rows, $headers); return 0; }
/** * @param Project $project * @param Table $table * * @return int */ protected function listProperties(Project $project, Table $table) { // Properties not to display, as they are internal, deprecated, or // otherwise confusing. $blacklist = ['name', 'cluster', 'cluster_label', 'license_id', 'plan', '_endpoint', 'repository', 'subscription']; $headings = []; $values = []; foreach ($project->getProperties() as $key => $value) { if (!in_array($key, $blacklist)) { $value = $this->formatter->format($value, $key); $value = wordwrap($value, 50, "\n", true); $headings[] = $key; $values[] = $value; } } $table->renderSimple($values, $headings); return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); if ($name = $input->getArgument('name')) { $variable = $this->getSelectedEnvironment()->getVariable($name); if (!$variable) { $this->stdErr->writeln("Variable not found: <error>{$name}</error>"); return 1; } if ($input->getOption('pipe')) { $output->writeln($variable->value); } else { $output->writeln(sprintf('<info>%s</info>: %s', $variable->name, $variable->value)); } return 0; } $results = $this->getSelectedEnvironment()->getVariables(); if (!$results) { $this->stdErr->writeln('No variables found'); return 1; } if ($input->getOption('pipe')) { throw new \InvalidArgumentException('Specify a variable name to use --pipe'); } $table = new Table($input, $output); $header = ['ID', 'Value', 'Inherited', 'JSON']; $rows = []; foreach ($results as $variable) { $value = $variable->value; if (!$table->formatIsMachineReadable()) { // Truncate long values. if (strlen($value) > 60) { $value = substr($value, 0, 57) . '...'; } // Wrap long values. $value = wordwrap($value, 30, "\n", true); } $rows[] = [$variable->id, $value, $variable->inherited ? 'Yes' : 'No', $variable->is_json ? 'Yes' : 'No']; } $table->render($rows, $header); return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $integrations = $this->getSelectedProject()->getIntegrations(); if (!$integrations) { $this->stdErr->writeln('No integrations found'); return 1; } $table = new Table($input, $output); $header = ['ID', 'Type', 'Summary']; $rows = []; foreach ($integrations as $integration) { $rows[] = [new AdaptiveTableCell($integration->id, ['wrap' => false]), $integration->type, $this->getIntegrationSummary($integration)]; } $table->render($rows, $header); $this->stdErr->writeln(''); $this->stdErr->writeln('View integration details with: <info>' . self::$config->get('application.executable') . ' integration:get [id]</info>'); $this->stdErr->writeln(''); $this->stdErr->writeln('Add a new integration with: <info>' . self::$config->get('application.executable') . ' integration:add</info>'); $this->stdErr->writeln('Delete an integration with: <info>' . self::$config->get('application.executable') . ' integration:delete [id]</info>'); return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $project = $this->getSelectedProject(); $rows = []; $i = 0; $table = new Table($input, $output); foreach ($project->getUsers() as $user) { $account = $this->getAccount($user); $role = $user['role']; $weight = $i++; if ($project->owner === $user->id) { $weight = -1; if (!$table->formatIsMachineReadable()) { $role .= ' (owner)'; } } $rows[$weight] = [$account['email'], $account['display_name'], $role]; } ksort($rows); $table->render(array_values($rows), ['Email address', 'Name', 'Project role']); return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $refresh = $input->hasOption('refresh') && $input->getOption('refresh'); $projects = $this->getProjects($refresh); if ($input->getOption('pipe')) { $output->writeln(array_keys($projects)); return 0; } $table = new Table($input, $output); $rows = []; foreach ($projects as $project) { $rows[] = [$project->id, $project->title, $project->getLink('#ui')]; } $header = ['ID', 'Title', 'URL']; if ($table->formatIsMachineReadable()) { $table->render($rows, $header); return 0; } $this->stdErr->writeln("Your projects are: "); $table->render($rows, $header); $this->stdErr->writeln("\nGet a project by running <info>platform get [id]</info>"); $this->stdErr->writeln("List a project's environments by running <info>platform environments</info>"); return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $keys = $this->getClient()->getSshKeys(); if (empty($keys)) { $this->stdErr->writeln("You do not yet have any SSH public keys in your Platform.sh account"); } else { $table = new Table($input, $output); $headers = ['ID', 'Title', 'Fingerprint']; $rows = []; foreach ($keys as $key) { $rows[] = [$key['key_id'], $key['title'], $key['fingerprint']]; } if ($table->formatIsMachineReadable()) { $table->render($rows, $headers); return 0; } $this->stdErr->writeln("Your SSH keys are:"); $table->render($rows, $headers); } $this->stdErr->writeln(''); $this->stdErr->writeln("Add a new SSH key by running <info>platform ssh-key:add [path]</info>"); $this->stdErr->writeln("Delete an SSH key by running <info>platform ssh-key:delete [id]</info>"); return !empty($keys) ? 0 : 1; }
protected function execute(InputInterface $input, OutputInterface $output) { $keys = $this->api()->getClient()->getSshKeys(); if (empty($keys)) { $this->stdErr->writeln("You do not yet have any SSH public keys in your " . self::$config->get('service.name') . " account"); } else { $table = new Table($input, $output); $headers = ['ID', 'Title', 'Fingerprint']; $rows = []; foreach ($keys as $key) { $rows[] = [$key['key_id'], $key['title'], $key['fingerprint']]; } if ($table->formatIsMachineReadable()) { $table->render($rows, $headers); return 0; } $this->stdErr->writeln("Your SSH keys are:"); $table->render($rows, $headers); } $this->stdErr->writeln(''); $this->stdErr->writeln("Add a new SSH key with: <info>" . self::$config->get('application.executable') . " ssh-key:add</info>"); $this->stdErr->writeln("Delete an SSH key with: <info>" . self::$config->get('application.executable') . " ssh-key:delete [id]</info>"); return !empty($keys) ? 0 : 1; }
/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $refresh = $input->hasOption('refresh') && $input->getOption('refresh'); $environments = $this->api()->getEnvironments($this->getSelectedProject(), $refresh ? true : null); if ($input->getOption('no-inactive')) { $environments = array_filter($environments, function ($environment) { return $environment->status !== 'inactive'; }); } if ($input->getOption('sort')) { $this->api()->sortResources($environments, $input->getOption('sort')); } if ($input->getOption('reverse')) { $environments = array_reverse($environments, true); } if ($input->getOption('pipe')) { $output->writeln(array_keys($environments)); return; } $project = $this->getSelectedProject(); $this->currentEnvironment = $this->getCurrentEnvironment($project); if (($currentProject = $this->getCurrentProject()) && $currentProject == $project) { $projectConfig = $this->localProject->getProjectConfig($this->getProjectRoot()); if (isset($projectConfig['mapping'])) { $this->mapping = $projectConfig['mapping']; } } $tree = $this->buildEnvironmentTree($environments); // Add orphaned environments (those whose parents do not exist) and // their children to the tree. foreach ($environments as $id => $environment) { if (!isset($tree[$id]) && !empty($environment->parent) && !isset($environments[$environment->parent])) { $tree[$id] = $environment; $this->children[$id] = $this->buildEnvironmentTree($environments, $id); } } // To make the display nicer, we move all the children of master // to the top level. if (isset($this->children['master'])) { $tree += $this->children['master']; $this->children['master'] = []; } $headers = ['ID', 'Name', 'Status']; $table = new Table($input, $output); if ($table->formatIsMachineReadable()) { $table->render($this->buildEnvironmentRows($tree, false, false), $headers); return; } $this->stdErr->writeln("Your environments are: "); $table->render($this->buildEnvironmentRows($tree), $headers); if (!$this->currentEnvironment) { return; } $this->stdErr->writeln("<info>*</info> - Indicates the current environment\n"); $currentEnvironment = $this->currentEnvironment; $this->stdErr->writeln("Check out a different environment by running <info>" . self::$config->get('application.executable') . " checkout [id]</info>"); if ($currentEnvironment->operationAvailable('branch')) { $this->stdErr->writeln("Branch a new environment by running <info>" . self::$config->get('application.executable') . " environment:branch [new-name]</info>"); } if ($currentEnvironment->operationAvailable('activate')) { $this->stdErr->writeln("Activate the current environment by running <info>" . self::$config->get('application.executable') . " environment:activate</info>"); } if ($currentEnvironment->operationAvailable('delete')) { $this->stdErr->writeln("Delete the current environment by running <info>" . self::$config->get('application.executable') . " environment:delete</info>"); } if ($currentEnvironment->operationAvailable('backup')) { $this->stdErr->writeln("Make a snapshot of the current environment by running <info>" . self::$config->get('application.executable') . " snapshot:create</info>"); } if ($currentEnvironment->operationAvailable('merge')) { $this->stdErr->writeln("Merge the current environment by running <info>" . self::$config->get('application.executable') . " environment:merge</info>"); } if ($currentEnvironment->operationAvailable('synchronize')) { $this->stdErr->writeln("Sync the current environment by running <info>" . self::$config->get('application.executable') . " environment:synchronize</info>"); } }
protected function execute(InputInterface $input, OutputInterface $output) { $refresh = $input->hasOption('refresh') && $input->getOption('refresh'); // Fetch the list of projects. $projects = $this->api()->getProjects($refresh ? true : null); // Filter the list of projects. $filters = []; if ($host = $input->getOption('host')) { $filters['host'] = $host; } if ($title = $input->getOption('title')) { $filters['title'] = $title; } if ($input->getOption('my')) { $filters['my'] = true; } $this->filterProjects($projects, $filters); // Sort the list of projects. if ($input->getOption('sort')) { $this->api()->sortResources($projects, $input->getOption('sort')); } if ($input->getOption('reverse')) { $projects = array_reverse($projects, true); } // Display a simple list of project IDs, if --pipe is used. if ($input->getOption('pipe')) { $output->writeln(array_keys($projects)); return 0; } $table = new Table($input, $output); $machineReadable = $table->formatIsMachineReadable(); $rows = []; foreach ($projects as $project) { $title = $project->title ?: '[Untitled Project]'; // Add a warning next to the title if the project is suspended. if (!$machineReadable && $project->isSuspended()) { $title = sprintf('<fg=white;bg=black>%s</> <fg=yellow;bg=black>(suspended)</>', $title); } $rows[] = [new AdaptiveTableCell($project->id, ['wrap' => false]), $title, $project->getLink('#ui')]; } $header = ['ID', 'Title', 'URL']; // Display a simple table (and no messages) if the --format is // machine-readable (e.g. csv or tsv). if ($machineReadable) { $table->render($rows, $header); return 0; } // Display a message if no projects are found. if (empty($projects)) { if (!empty($filters)) { $filtersUsed = '<comment>--' . implode('</comment>, <comment>--', array_keys($filters)) . '</comment>'; $this->stdErr->writeln('No projects found (filters in use: ' . $filtersUsed . ').'); } else { $this->stdErr->writeln('You do not have any ' . self::$config->get('service.name') . ' projects yet.'); } return 0; } // Display the projects. if (empty($filters)) { $this->stdErr->writeln('Your projects are: '); } $table->render($rows, $header); $commandName = self::$config->get('application.executable'); $this->stdErr->writeln(['', 'Get a project by running: <info>' . $commandName . ' get [id]</info>', "List a project's environments by running: <info>" . $commandName . ' environments -p [id]</info>']); return 0; }
/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $refresh = $input->hasOption('refresh') && $input->getOption('refresh'); $environments = $this->getEnvironments(null, $refresh); if ($input->getOption('no-inactive')) { $environments = array_filter($environments, function ($environment) { return $environment->status !== 'inactive'; }); } if ($input->getOption('pipe')) { $output->writeln(array_keys($environments)); return; } $project = $this->getSelectedProject(); $this->currentEnvironment = $this->getCurrentEnvironment($project); if (($currentProject = $this->getCurrentProject()) && $currentProject == $project) { $config = $this->getProjectConfig($this->getProjectRoot()); if (isset($config['mapping'])) { $this->mapping = $config['mapping']; } } $tree = $this->buildEnvironmentTree($environments); // To make the display nicer, we move all the children of master // to the top level. if (isset($tree['master'])) { $tree += $this->children['master']; $this->children['master'] = []; } $headers = ['ID', 'Name', 'Status']; $table = new Table($input, $output); if ($table->formatIsMachineReadable()) { $table->render($this->buildEnvironmentRows($tree, false, false), $headers); return; } $this->stdErr->writeln("Your environments are: "); $table->render($this->buildEnvironmentRows($tree), $headers); if (!$this->currentEnvironment) { return; } $this->stdErr->writeln("<info>*</info> - Indicates the current environment\n"); $currentEnvironment = $this->currentEnvironment; $this->stdErr->writeln("Check out a different environment by running <info>platform checkout [id]</info>"); if ($currentEnvironment->operationAvailable('branch')) { $this->stdErr->writeln("Branch a new environment by running <info>platform environment:branch [new-name]</info>"); } if ($currentEnvironment->operationAvailable('activate')) { $this->stdErr->writeln("Activate the current environment by running <info>platform environment:activate</info>"); } if ($currentEnvironment->operationAvailable('delete')) { $this->stdErr->writeln("Delete the current environment by running <info>platform environment:delete</info>"); } if ($currentEnvironment->operationAvailable('backup')) { $this->stdErr->writeln("Make a snapshot of the current environment by running <info>platform snapshot:create</info>"); } if ($currentEnvironment->operationAvailable('merge')) { $this->stdErr->writeln("Merge the current environment by running <info>platform environment:merge</info>"); } if ($currentEnvironment->operationAvailable('synchronize')) { $this->stdErr->writeln("Sync the current environment by running <info>platform environment:synchronize</info>"); } }
protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $projectRoot = $this->getProjectRoot(); if (!$projectRoot) { throw new RootNotFoundException(); } $appName = $this->selectApp($input); $sshUrl = $this->getSelectedEnvironment()->getSshUrl($appName); // Get and parse app config. $app = LocalApplication::getApplication($appName, $projectRoot); $appConfig = $app->getConfig(); if (empty($appConfig['relationships'])) { $this->stdErr->writeln('No application relationships found.'); return 1; } $util = new RelationshipsUtil($this->stdErr); $database = $util->chooseDatabase($sshUrl, $input); if (empty($database)) { $this->stdErr->writeln('No database selected.'); return 1; } // Find the database's service name in the relationships. $dbServiceName = false; foreach ($appConfig['relationships'] as $relationshipName => $relationship) { if ($database['_relationship_name'] === $relationshipName) { list($dbServiceName, ) = explode(':', $relationship, 2); break; } } if (!$dbServiceName) { $this->stdErr->writeln('Service name not found for relationship: ' . $database['_relationship_name']); return 1; } // Load services yaml. $services = Yaml::parse(file_get_contents($projectRoot . '/.platform/services.yaml')); if (!empty($services[$dbServiceName]['disk'])) { $allocatedDisk = $services[$dbServiceName]['disk']; } else { $this->stdErr->writeln('The allocated disk size could not be determined for service: ' . $dbServiceName); return 1; } $this->stdErr->write('Querying database <comment>' . $dbServiceName . '</comment> to estimate disk usage. '); $this->stdErr->writeln('This might take a while.'); /** @var ShellHelper $shellHelper */ $shellHelper = $this->getHelper('shell'); $command = ['ssh']; $command[] = $sshUrl; switch ($database['scheme']) { case 'pgsql': $command[] = $this->psqlQuery($database); $result = $shellHelper->execute($command); $resultArr = explode(PHP_EOL, $result); $estimatedUsage = array_sum($resultArr) / 1048576; break; default: $command[] = $this->mysqlQuery($database); $estimatedUsage = $shellHelper->execute($command); break; } $percentsUsed = $estimatedUsage * 100 / $allocatedDisk; $table = new Table($input, $output); $propertyNames = ['max', 'used', 'percent_used']; $machineReadable = $table->formatIsMachineReadable(); $values = [(int) $allocatedDisk . ($machineReadable ? '' : 'MB'), (int) $estimatedUsage . ($machineReadable ? '' : 'MB'), (int) $percentsUsed . '%']; $table->renderSimple($values, $propertyNames); return 0; }
/** * {@inheritdoc} */ protected function configure() { $this->setName('integration:get')->addArgument('id', InputArgument::OPTIONAL, 'An integration ID. Leave blank to choose from a list.')->addOption('property', 'P', InputOption::VALUE_OPTIONAL, 'The integration property to view')->setDescription('View details of an integration'); Table::addFormatOption($this->getDefinition()); $this->addProjectOption(); }