diff --git a/php/src/Container/Container.php b/php/src/Container/Container.php index 9d598b4aa74..e9f7e603971 100644 --- a/php/src/Container/Container.php +++ b/php/src/Container/Container.php @@ -2,7 +2,6 @@ namespace AIO\Container; -use AIO\Container\State\IContainerState; use AIO\Data\ConfigurationManager; use AIO\Docker\DockerActionManager; use AIO\ContainerDefinitionFetcher; @@ -162,19 +161,19 @@ public function GetVolumes() : ContainerVolumes { return $this->volumes; } - public function GetRunningState() : IContainerState { + public function GetRunningState() : WorkingState { return $this->dockerActionManager->GetContainerRunningState($this); } - public function GetRestartingState() : IContainerState { + public function GetRestartingState() : WorkingState { return $this->dockerActionManager->GetContainerRestartingState($this); } - public function GetUpdateState() : IContainerState { + public function GetUpdateState() : VersionState { return $this->dockerActionManager->GetContainerUpdateState($this); } - public function GetStartingState() : IContainerState { + public function GetStartingState() : WorkingState { return $this->dockerActionManager->GetContainerStartingState($this); } diff --git a/php/src/Container/State/IContainerState.php b/php/src/Container/State/IContainerState.php deleted file mode 100644 index d93dab65cba..00000000000 --- a/php/src/Container/State/IContainerState.php +++ /dev/null @@ -1,5 +0,0 @@ -GetRunningState() instanceof RunningState) { + if ($container->GetRunningState() === WorkingState::Running) { error_log('Not starting ' . $id . ' because it was already started.'); return; } @@ -261,10 +261,10 @@ public function StartDomaincheckContainer() : void $domaincheckContainer = $this->containerDefinitionFetcher->GetContainerById($id); $apacheContainer = $this->containerDefinitionFetcher->GetContainerById(self::TOP_CONTAINER); // Don't start if apache is already running - if ($apacheContainer->GetRunningState() instanceof RunningState) { + if ($apacheContainer->GetRunningState() === WorkingState::Running) { return; // Don't start if domaincheck is already running - } elseif ($domaincheckContainer->GetRunningState() instanceof RunningState) { + } elseif ($domaincheckContainer->GetRunningState() === WorkingState::Running) { $domaincheckWasStarted = apcu_fetch($cacheKey); // Start domaincheck again when 10 minutes are over by not returning here if($domaincheckWasStarted !== false && is_string($domaincheckWasStarted)) { diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php index 6bb7f70ee75..b9bc50dcee0 100644 --- a/php/src/Docker/DockerActionManager.php +++ b/php/src/Docker/DockerActionManager.php @@ -3,15 +3,8 @@ namespace AIO\Docker; use AIO\Container\Container; -use AIO\Container\State\IContainerState; -use AIO\Container\State\ImageDoesNotExistState; -use AIO\Container\State\StartingState; -use AIO\Container\State\RunningState; -use AIO\Container\State\RestartingState; -use AIO\Container\State\NotRestartingState; -use AIO\Container\State\VersionDifferentState; -use AIO\Container\State\StoppedState; -use AIO\Container\State\VersionEqualState; +use AIO\Container\VersionState; +use AIO\Container\WorkingState; use AIO\Data\ConfigurationManager; use GuzzleHttp\Exception\RequestException; use AIO\ContainerDefinitionFetcher; @@ -55,35 +48,37 @@ private function BuildImageName(Container $container) : string { return $container->GetContainerName() . ':' . $tag; } - public function GetContainerRunningState(Container $container) : IContainerState + public function GetContainerRunningState(Container $container) : WorkingState { $url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->GetIdentifier()))); try { $response = $this->guzzleClient->get($url); } catch (RequestException $e) { if ($e->getCode() === 404) { - return new ImageDoesNotExistState(); + return WorkingState::ImageDoesNotExist; } throw $e; } $responseBody = json_decode((string)$response->getBody(), true); - if ($responseBody['State']['Running'] === true) { - return new RunningState(); + if ($responseBody['State']['Running'] !== true) { + return WorkingState::Stopped; + } elseif(array_key_exists('Health', $responseBody['State']) && $responseBody['State']['Health']['Status'] !== 'healthy') { + return WorkingState::Unhealthy; } else { - return new StoppedState(); + return WorkingState::Running; } } - public function GetContainerRestartingState(Container $container) : IContainerState + public function GetContainerRestartingState(Container $container) : WorkingState { $url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->GetIdentifier()))); try { $response = $this->guzzleClient->get($url); } catch (RequestException $e) { if ($e->getCode() === 404) { - return new ImageDoesNotExistState(); + return WorkingState::ImageDoesNotExist; } throw $e; } @@ -91,13 +86,13 @@ public function GetContainerRestartingState(Container $container) : IContainerSt $responseBody = json_decode((string)$response->getBody(), true); if ($responseBody['State']['Restarting'] === true) { - return new RestartingState(); + return WorkingState::Restarting; } else { - return new NotRestartingState(); + return WorkingState::NotRestarting; } } - public function GetContainerUpdateState(Container $container) : IContainerState + public function GetContainerUpdateState(Container $container) : VersionState { $tag = $container->GetImageTag(); if ($tag === '%AIO_CHANNEL%') { @@ -106,28 +101,26 @@ public function GetContainerUpdateState(Container $container) : IContainerState $runningDigests = $this->GetRepoDigestsOfContainer($container->GetIdentifier()); if ($runningDigests === null) { - return new VersionDifferentState(); + return VersionState::Different; } $remoteDigest = $this->dockerHubManager->GetLatestDigestOfTag($container->GetContainerName(), $tag); if ($remoteDigest === null) { - return new VersionEqualstate(); + return VersionState::Equal; } foreach($runningDigests as $runningDigest) { if ($runningDigest === $remoteDigest) { - return new VersionEqualState(); + return VersionState::Equal; } } - return new VersionDifferentState(); + return VersionState::Different; } - public function GetContainerStartingState(Container $container) : IContainerState + public function GetContainerStartingState(Container $container) : WorkingState { $runningState = $this->GetContainerRunningState($container); - if ($runningState instanceof StoppedState) { - return new StoppedState(); - } elseif ($runningState instanceof ImageDoesNotExistState) { - return new ImageDoesNotExistState(); + if ($runningState === WorkingState::Stopped || $runningState === WorkingState::ImageDoesNotExist) { + return $runningState; } $containerName = $container->GetIdentifier(); @@ -142,12 +135,12 @@ public function GetContainerStartingState(Container $container) : IContainerStat $connection = @fsockopen($containerName, (int)$internalPort, $errno, $errstr, 0.2); if ($connection) { fclose($connection); - return new RunningState(); + return $runningState; } else { - return new StartingState(); + return WorkingState::Starting; } } else { - return new RunningState(); + return $runningState; } } @@ -641,7 +634,7 @@ private function isContainerUpdateAvailable(string $id) : string $container = $this->containerDefinitionFetcher->GetContainerById($id); $updateAvailable = ""; - if ($container->GetUpdateState() instanceof VersionDifferentState) { + if ($container->GetUpdateState() === VersionState::Different) { $updateAvailable = '1'; } foreach ($container->GetDependsOn() as $dependency) { @@ -802,7 +795,7 @@ public function IsMastercontainerUpdateAvailable() : bool public function sendNotification(Container $container, string $subject, string $message, string $file = '/notify.sh') : void { - if ($this->GetContainerStartingState($container) instanceof RunningState) { + if ($this->GetContainerStartingState($container) === WorkingState::Running) { $containerName = $container->GetIdentifier(); @@ -986,7 +979,7 @@ public function GetDatabasecontainerExitCode() : int public function isLoginAllowed() : bool { $id = 'nextcloud-aio-apache'; $apacheContainer = $this->containerDefinitionFetcher->GetContainerById($id); - if ($this->GetContainerStartingState($apacheContainer) instanceof RunningState) { + if ($this->GetContainerStartingState($apacheContainer) === WorkingState::Running) { return false; } return true; @@ -995,7 +988,7 @@ public function isLoginAllowed() : bool { public function isBackupContainerRunning() : bool { $id = 'nextcloud-aio-borgbackup'; $backupContainer = $this->containerDefinitionFetcher->GetContainerById($id); - if ($this->GetContainerRunningState($backupContainer) instanceof RunningState) { + if ($this->GetContainerRunningState($backupContainer) === WorkingState::Running) { return true; } return false; diff --git a/php/templates/containers.twig b/php/templates/containers.twig index 8a7012be8f9..fd1a27f0642 100644 --- a/php/templates/containers.twig +++ b/php/templates/containers.twig @@ -40,19 +40,19 @@ {% endif %} {% for container in containers %} - {% if container.GetDisplayName() != '' and class(container.GetRunningState()) == 'AIO\\Container\\State\\RunningState' %} + {% if container.GetDisplayName() != '' and container.GetRunningState().value == 'running' %} {% set isAnyRunning = true %} {% endif %} - {% if container.GetDisplayName() != '' and class(container.GetRestartingState()) == 'AIO\\Container\\State\\RestartingState' %} + {% if container.GetDisplayName() != '' and container.GetRestartingState().value == 'restarting' %} {% set isAnyRestarting = true %} {% endif %} - {% if container.GetIdentifier() == 'nextcloud-aio-watchtower' and class(container.GetRunningState()) == 'AIO\\Container\\State\\RunningState' %} + {% if container.GetIdentifier() == 'nextcloud-aio-watchtower' and container.GetRunningState().value == 'running' %} {% set isWatchtowerRunning = true %} {% endif %} - {% if container.GetIdentifier() == 'nextcloud-aio-domaincheck' and class(container.GetRunningState()) == 'AIO\\Container\\State\\RunningState' %} + {% if container.GetIdentifier() == 'nextcloud-aio-domaincheck' and container.GetRunningState().value == 'running' %} {% set isDomaincheckRunning = true %} {% endif %} - {% if container.GetIdentifier() == 'nextcloud-aio-apache' and class(container.GetStartingState()) == 'AIO\\Container\\State\\StartingState' %} + {% if container.GetIdentifier() == 'nextcloud-aio-apache' and container.GetStartingState().value == 'starting' %} {% set isApacheStarting = true %} {% endif %} {% endfor %} @@ -261,14 +261,21 @@ {% for container in containers %} {% if container.GetDisplayName() != '' %}
  • - {% if class(container.GetStartingState()) == 'AIO\\Container\\State\\StartingState' %} + {% if container.GetStartingState().value == 'starting' %} {{ container.GetDisplayName() }} (Starting) {% if container.GetDocumentation() != '' %} (docs) {% endif %} - {% elseif class(container.GetRunningState()) == 'AIO\\Container\\State\\RunningState' %} + {% elseif container.GetRunningState().value == 'unhealthy' %} + + {{ container.GetDisplayName() }} (Unhealthy) + {% if container.GetDocumentation() != '' %} + (docs) + {% endif %} + + {% elseif container.GetRunningState().value == 'running' %} {{ container.GetDisplayName() }} (Running) {% if container.GetDocumentation() != '' %}