AbstractOperations
- це абстрактний базовий клас для всіх класів операцій кластера Docker. Він забезпечує основну функціональність для виконання операцій на декількох вузлах Docker одночасно, з підтримкою послідовного та паралельного виконання, повторних спроб при невдачі та різних рівнів деталізації помилок.
Sangezar\DockerClient\Cluster\Operations
public const EXECUTION_SEQUENTIAL = 'sequential';
public const EXECUTION_PARALLEL = 'parallel';
public const ERROR_LEVEL_BASIC = 'basic'; // Тільки повідомлення
public const ERROR_LEVEL_STANDARD = 'standard'; // Повідомлення + тип винятку + код
public const ERROR_LEVEL_DETAILED = 'detailed'; // Всі деталі, включаючи стек викликів
/** @var array<string, DockerClient> */
protected array $nodes;
/** @var string Стратегія виконання */
protected string $executionStrategy = self::EXECUTION_SEQUENTIAL;
/** @var string Рівень деталізації помилок */
protected string $errorDetailLevel = self::ERROR_LEVEL_STANDARD;
/** @var bool Дозволити автоматичні повторні спроби при невдачі */
protected bool $retryOnFailure = false;
/** @var int Максимальна кількість повторних спроб */
protected int $maxRetries = 3;
public function __construct(array $nodes, ?ClusterConfig $config = null)
Конструктор.
$nodes
- Масив клієнтів Docker API з іменами вузлів як ключами$config
- Конфігурація кластера (необов’язково)MissingRequiredParameterException
- якщо масив вузлів порожнійInvalidParameterValueException
- якщо параметри неприпустиміpublic function applyConfig(ClusterConfig $config): self
Застосовує конфігурацію кластера.
$config
- Конфігурація для застосуванняpublic function setExecutionStrategy(string $strategy): self
Встановлює стратегію виконання.
$strategy
- Стратегія виконання (EXECUTION_SEQUENTIAL або EXECUTION_PARALLEL)InvalidParameterValueException
- якщо вказана невідома стратегіяpublic function setErrorDetailLevel(string $level): self
Встановлює рівень деталізації помилок.
$level
- Рівень деталізації (ERROR_LEVEL_BASIC, ERROR_LEVEL_STANDARD або ERROR_LEVEL_DETAILED)InvalidParameterValueException
- якщо вказаний невідомий рівеньpublic function setRetryOnFailure(bool $enable, ?int $maxRetries = null): self
Встановлює налаштування повторних спроб при невдачі.
$enable
- Чи дозволені повторні спроби$maxRetries
- Максимальна кількість повторних спроб (за замовчуванням 3)InvalidParameterValueException
- якщо кількість повторних спроб менше 1protected function executeOnAll(callable $operation): array
Виконує операцію на всіх вузлах кластера.
$operation
- Функція, яка буде виконана на кожному вузліInvalidParameterValueException
- якщо операція не є викликаємоюpublic function getNodes(): array
Отримує всі вузли.
DockerClient
public function isEmpty(): bool
Перевіряє, чи колекція вузлів порожня.
true
, якщо колекція не містить вузлів, false
- якщо міститьpublic function count(): int
Підраховує кількість вузлів.
public function addNode(string $name, DockerClient $client): self
Додає новий вузол до колекції.
$name
- Ім’я вузла$client
- Клієнт Docker APIInvalidParameterValueException
- якщо ім’я вузла порожнє або вузол з таким іменем вже існуєpublic function removeNode(string $name): self
Видаляє вузол з колекції.
$name
- Ім’я вузлаpublic function hasNode(string $name): bool
Перевіряє, чи існує вузол з вказаним іменем.
$name
- Ім’я вузлаtrue
, якщо вузол існує, false
- якщо ніprivate function executeSequential(callable $operation): array
Виконує операцію послідовно на всіх вузлах кластера.
$operation
- Функція, яка буде виконана на кожному вузліprivate function executeParallel(callable $operation): array
Виконує операцію паралельно на всіх вузлах кластера.
$operation
- Функція, яка буде виконана на кожному вузліprivate function formatError(\Throwable $e): array
Форматує помилку відповідно до встановленого рівня деталізації.
$e
- Об’єкт виняткуclass MyOperations extends AbstractOperations
{
public function perform(): array
{
return $this->executeOnAll(function (DockerClient $client) {
// Виконати операцію з клієнтом
return $client->container()->list();
});
}
}
// Створення екземпляру
$nodes = [
'node1' => DockerClient::createTcp('tcp://192.168.1.10:2375'),
'node2' => DockerClient::createTcp('tcp://192.168.1.11:2375'),
];
$operations = new MyOperations($nodes);
// Виконання операції на всіх вузлах
$results = $operations->perform();
use Sangezar\DockerClient\Config\ClusterConfig;
use Sangezar\DockerClient\Cluster\Operations\AbstractOperations;
// Створення конфігурації кластера
$config = ClusterConfig::create()
->setExecutionStrategy(AbstractOperations::EXECUTION_PARALLEL)
->setErrorDetailLevel(AbstractOperations::ERROR_LEVEL_DETAILED)
->setRetryOnFailure(true, 5);
// Застосування конфігурації до операцій
$operations->applyConfig($config);
// Або індивідуальне налаштування
$operations->setExecutionStrategy(AbstractOperations::EXECUTION_PARALLEL)
->setErrorDetailLevel(AbstractOperations::ERROR_LEVEL_DETAILED)
->setRetryOnFailure(true, 5);
// Додавання нового вузла
$operations->addNode('node3', DockerClient::createTcp('tcp://192.168.1.12:2375'));
// Перевірка наявності вузла
if ($operations->hasNode('node1')) {
echo "Вузол 'node1' існує\n";
}
// Видалення вузла
$operations->removeNode('node2');
// Отримання списку всіх вузлів
$allNodes = $operations->getNodes();
// Перевірка кількості вузлів
echo "Кількість вузлів: " . $operations->count() . "\n";