diff --git a/src/Command/Service/RedisCliCommand.php b/src/Command/Service/RedisCliCommand.php index 3fc09dbaa..fe27d9f96 100644 --- a/src/Command/Service/RedisCliCommand.php +++ b/src/Command/Service/RedisCliCommand.php @@ -4,79 +4,12 @@ namespace Platformsh\Cli\Command\Service; -use Platformsh\Cli\Selector\SelectorConfig; -use Platformsh\Cli\Service\Io; -use Platformsh\Cli\Selector\Selector; -use Platformsh\Cli\Command\CommandBase; -use Platformsh\Cli\Model\Host\RemoteHost; -use Platformsh\Cli\Service\Relationships; -use Platformsh\Cli\Service\Ssh; -use Platformsh\Cli\Util\OsUtil; use Symfony\Component\Console\Attribute\AsCommand; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; #[AsCommand(name: 'service:redis-cli', description: 'Access the Redis CLI', aliases: ['redis'])] -class RedisCliCommand extends CommandBase +class RedisCliCommand extends ValkeyCliCommandBase { - public function __construct(private readonly Io $io, private readonly Relationships $relationships, private readonly Selector $selector) - { - parent::__construct(); - } - protected function configure(): void - { - $this->addArgument('args', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Arguments to add to the Redis command'); - Relationships::configureInput($this->getDefinition()); - Ssh::configureInput($this->getDefinition()); - $this->selector->addProjectOption($this->getDefinition()); - $this->selector->addEnvironmentOption($this->getDefinition()); - $this->selector->addAppOption($this->getDefinition()); - $this->addCompleter($this->selector); - $this->addExample('Open the redis-cli shell'); - $this->addExample('Ping the Redis server', 'ping'); - $this->addExample('Show Redis status information', 'info'); - $this->addExample('Scan keys', "-- --scan"); - $this->addExample('Scan keys matching a pattern', '-- "--scan --pattern \'*-11*\'"'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - if ($this->runningViaMulti && !$input->getArgument('args')) { - throw new \RuntimeException('The redis-cli command cannot run as a shell via multi'); - } - - $selection = $this->selector->getSelection($input, new SelectorConfig( - allowLocalHost: $this->relationships->hasLocalEnvVar(), - chooseEnvFilter: SelectorConfig::filterEnvsMaybeActive(), - )); - $host = $this->selector->getHostFromSelection($input, $selection); - - $service = $this->relationships->chooseService($host, $input, $output, ['redis']); - if (!$service) { - return 1; - } - - $redisCommand = sprintf( - 'redis-cli -h %s -p %d', - OsUtil::escapePosixShellArg($service['host']), - $service['port'], - ); - if ($args = $input->getArgument('args')) { - if (count($args) === 1) { - $redisCommand .= ' ' . $args[0]; - } else { - $redisCommand .= ' ' . implode(' ', array_map(OsUtil::escapePosixShellArg(...), $args)); - } - } elseif ($this->io->isTerminal(STDIN) && $host instanceof RemoteHost) { - // Force TTY output when the input is a terminal. - $host->setExtraSshOptions(['RequestTTY yes']); - } - - $this->stdErr->writeln( - sprintf('Connecting to Redis service via relationship %s on %s', $service['_relationship_name'], $host->getLabel()), - ); - - return $host->runCommandDirect($redisCommand); - } + protected string $dbName = 'redis'; + protected string $dbTitle = 'Redis'; + protected string $dbCommand = 'redis-cli'; } diff --git a/src/Command/Service/ValkeyCliCommand.php b/src/Command/Service/ValkeyCliCommand.php new file mode 100644 index 000000000..834b98b16 --- /dev/null +++ b/src/Command/Service/ValkeyCliCommand.php @@ -0,0 +1,10 @@ +addArgument('args', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, sprintf('Arguments to add to the %s command', $this->dbCommand)); + Relationships::configureInput($this->getDefinition()); + Ssh::configureInput($this->getDefinition()); + $this->selector->addProjectOption($this->getDefinition()); + $this->selector->addEnvironmentOption($this->getDefinition()); + $this->selector->addAppOption($this->getDefinition()); + $this->addCompleter($this->selector); + $this->addExample(sprintf('Open the %s shell', $this->dbCommand)); + $this->addExample(sprintf('Ping the %s server', $this->dbTitle), 'ping'); + $this->addExample(sprintf('Show %s status information', $this->dbTitle), 'info'); + $this->addExample('Scan keys', "-- --scan"); + $this->addExample('Scan keys matching a pattern', '-- "--scan --pattern \'*-11*\'"'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + if ($this->runningViaMulti && !$input->getArgument('args')) { + throw new \RuntimeException(sprintf('The %s command cannot run as a shell via multi', $this->dbCommand)); + } + + $selection = $this->selector->getSelection($input, new SelectorConfig( + allowLocalHost: $this->relationships->hasLocalEnvVar(), + chooseEnvFilter: SelectorConfig::filterEnvsMaybeActive(), + )); + $host = $this->selector->getHostFromSelection($input, $selection); + + $service = $this->relationships->chooseService($host, $input, $output, [$this->dbName]); + if (!$service) { + return 1; + } + + $command = sprintf( + '%s -h %s -p %d', + $this->dbCommand, + OsUtil::escapePosixShellArg($service['host']), + $service['port'], + ); + if ($args = $input->getArgument('args')) { + if (count($args) === 1) { + $command .= ' ' . $args[0]; + } else { + $command .= ' ' . implode(' ', array_map(OsUtil::escapePosixShellArg(...), $args)); + } + } elseif ($this->io->isTerminal(STDIN) && $host instanceof RemoteHost) { + // Force TTY output when the input is a terminal. + $host->setExtraSshOptions(['RequestTTY yes']); + } + + $this->stdErr->writeln( + sprintf('Connecting to %s service via relationship %s on %s', $this->dbTitle, $service['_relationship_name'], $host->getLabel()), + ); + + return $host->runCommandDirect($command); + } +}