Skip to content

Commit

Permalink
Add Valkey support (4.x)
Browse files Browse the repository at this point in the history
  • Loading branch information
pjcdawkins committed Jan 7, 2025
1 parent a1cead4 commit 10e4c4c
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 65 deletions.
1 change: 1 addition & 0 deletions src/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@ protected function getCommands()
$commands[] = new Command\Service\MongoDB\MongoShellCommand();
$commands[] = new Command\Service\RedisCliCommand();
$commands[] = new Command\Service\ServiceListCommand();
$commands[] = new Command\Service\ValkeyCliCommand();
$commands[] = new Command\Session\SessionSwitchCommand();
$commands[] = new Command\Backup\BackupCreateCommand();
$commands[] = new Command\Backup\BackupDeleteCommand();
Expand Down
69 changes: 4 additions & 65 deletions src/Command/Service/RedisCliCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,70 +2,9 @@

namespace Platformsh\Cli\Command\Service;

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\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class RedisCliCommand extends CommandBase
class RedisCliCommand extends ValkeyCliCommand
{
protected function configure()
{
$this->setName('service:redis-cli');
$this->setAliases(['redis']);
$this->setDescription('Access the Redis CLI');
$this->addArgument('args', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Arguments to add to the Redis command');
Relationships::configureInput($this->getDefinition());
Ssh::configureInput($this->getDefinition());
$this->addProjectOption()
->addEnvironmentOption()
->addAppOption();
$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)
{
if ($this->runningViaMulti && !$input->getArgument('args')) {
throw new \RuntimeException('The redis-cli command cannot run as a shell via multi');
}

/** @var \Platformsh\Cli\Service\Relationships $relationshipsService */
$relationshipsService = $this->getService('relationships');
$host = $this->selectHost($input, $relationshipsService->hasLocalEnvVar());

$service = $relationshipsService->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::class, 'escapePosixShellArg'], $args));
}
} elseif ($this->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 <info>%s</info> on <info>%s</info>', $service['_relationship_name'], $host->getLabel())
);

return $host->runCommandDirect($redisCommand);
}
protected $dbName = 'redis';
protected $dbTitle = 'Redis';
protected $dbCommand = 'redis-cli';
}
76 changes: 76 additions & 0 deletions src/Command/Service/ValkeyCliCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?php

namespace Platformsh\Cli\Command\Service;

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\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class ValkeyCliCommand extends CommandBase
{
protected $dbName = 'valkey';
protected $dbTitle = 'Valkey';
protected $dbCommand = 'valkey-cli';

protected function configure()
{
$this->setName('service:' . $this->dbCommand);
$this->setAliases([$this->dbName]);
$this->setDescription('Access the ' . $this->dbTitle . ' CLI');
$this->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->addProjectOption()
->addEnvironmentOption()
->addAppOption();
$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)
{
if ($this->runningViaMulti && !$input->getArgument('args')) {
throw new \RuntimeException(sprintf('The %s command cannot run as a shell via multi', $this->dbCommand));
}

/** @var \Platformsh\Cli\Service\Relationships $relationshipsService */
$relationshipsService = $this->getService('relationships');
$host = $this->selectHost($input, $relationshipsService->hasLocalEnvVar());

$service = $relationshipsService->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::class, 'escapePosixShellArg'], $args));
}
} elseif ($this->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 <info>%s</info> on <info>%s</info>', $this->dbTitle, $service['_relationship_name'], $host->getLabel())
);

return $host->runCommandDirect($command);
}
}

0 comments on commit 10e4c4c

Please sign in to comment.