Skip to content

Commit

Permalink
feat(cloud): added cloud environment check
Browse files Browse the repository at this point in the history
  • Loading branch information
buggyzap committed Oct 10, 2023
1 parent 1d435ba commit f1fc747
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 48 deletions.
26 changes: 0 additions & 26 deletions .github/workflows/fix-php-code-style-issues.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .phpunit.cache/test-results
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"version":1,"defects":{"Ector\\Checker\\Tests\\CheckerTest::testCheckReturnsTrue":8},"times":{"Ector\\Checker\\Tests\\ExampleTest::testExample":0.317,"Ector\\Checker\\Tests\\CheckerTest::testCheckReturnsTrue":0.62}}
{"version":1,"defects":{"Ector\\Checker\\Tests\\CheckerTest::testCheckReturnsTrue":8,"Ector\\Checker\\Tests\\CircuitBreakerTest::testUpdateLastTry":7,"Ector\\Checker\\Tests\\CircuitBreakerTest::testHandleFailureIncrementsFailuresAndOpensCircuit":8,"Ector\\Checker\\Tests\\CircuitBreakerTest::testAllowRequestWhenCircuitIsClosed":8,"Ector\\Checker\\Tests\\CircuitBreakerTest::testAllowRequestWhenCircuitIsOpen":7,"Ector\\Checker\\Tests\\CircuitBreakerTest::testResetFailures":8,"Ector\\Checker\\Tests\\CircuitBreakerTest::testHandleSuccessResetsFailuresAndClosesCircuit":8},"times":{"Ector\\Checker\\Tests\\ExampleTest::testExample":0.317,"Ector\\Checker\\Tests\\CheckerTest::testCheckReturnsTrue":0,"Ector\\Checker\\Tests\\CircuitBreakerTest::testUpdateLastTry":1.029,"Ector\\Checker\\Tests\\CircuitBreakerTest::testHandleFailureIncrementsFailuresAndOpensCircuit":0.036,"Ector\\Checker\\Tests\\CircuitBreakerTest::testAllowRequestWhenCircuitIsClosed":0.298,"Ector\\Checker\\Tests\\CircuitBreakerTest::testAllowRequestWhenCircuitIsOpen":0,"Ector\\Checker\\Tests\\CircuitBreakerTest::testResetFailures":0,"Ector\\Checker\\Tests\\CircuitBreakerTest::testHandleSuccessResetsFailuresAndClosesCircuit":0}}
26 changes: 25 additions & 1 deletion src/Checker.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ class Checker

public function __construct()
{
$this->circuitBreaker = new CircuitBreaker();
$this->circuitBreaker = new CircuitBreaker(
(int) \Configuration::get(CircuitBreaker::CACHE_KEY, null, null, null, 0),
(int) \Configuration::get(CircuitBreaker::RETRY_KEY, null, null, null, time())
);
}

public function checkHasToBeRun(LastCheck $lastCheck)
Expand Down Expand Up @@ -54,13 +57,33 @@ public function removeDatabaseError()
\Configuration::deleteByName("_ECTOR_ERROR");
}

public function getParamerersConfiguration()
{
$config = include _PS_CORE_DIR_ . '/app/config/parameters.php';

return $config['parameters'] ?? [];
}

public function isCloudEnvironment()
{
$parameters = $this->getParamerersConfiguration();

return isset($parameters['cloud_enviroment']) && $parameters['cloud_enviroment'] === true;
}

/**
* Perform a health check on the API
*
* @return bool
*/
public function healthCheck(\AdminController $controller)
{

// never perform check in cloud environment
if ($this->isCloudEnvironment()) {
return true;
}

$key = $this->getKey();
$lastCheck = new LastCheck();

Expand All @@ -85,6 +108,7 @@ public function healthCheck(\AdminController $controller)
$code = $api->getStatusCode();
if ($code !== 200) {
$this->circuitBreaker->handleFailure();

return false;
}

Expand Down
45 changes: 38 additions & 7 deletions src/CircuitBreaker.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,35 @@ class CircuitBreaker
public const CACHE_KEY = "_ECTOR_CIRCUIT_FAIL";
public const RETRY_KEY = "_ECTOR_CIRCUIT_RETRY";

public function __construct()
public function __construct(int $failures, int $lastTry)
{
$this->failures = (int) \Configuration::get(self::CACHE_KEY, null, null, null, 0);
$this->lastTry = (int) \Configuration::get(self::RETRY_KEY, null, null, null, time());
$this->failures = $failures;
$this->lastTry = $lastTry;
$this->isOpen = $this->failures >= self::MAX_FAILURES;
}

public function updateLastTry()
{
\Configuration::updateValue(self::RETRY_KEY, time());
$this->lastTry = time();
if (class_exists("\Configuration")) {
\Configuration::updateValue(self::RETRY_KEY, time());
}
}

public function incrementFailures()
{
$this->failures++;
\Configuration::updateValue(self::CACHE_KEY, $this->failures);
if (class_exists("\Configuration")) {
\Configuration::updateValue(self::CACHE_KEY, $this->failures);
}
}

public function resetFailures()
{
$this->failures = 0;
\Configuration::updateValue(self::CACHE_KEY, $this->failures);
if (class_exists("\Configuration")) {
\Configuration::updateValue(self::CACHE_KEY, $this->failures);
}
}

public function allowRequest(): bool
Expand Down Expand Up @@ -65,4 +72,28 @@ public function handleFailure()
$this->isOpen = true;
}
}
}

/**
* @return int
*/
public function getFailures(): int
{
return $this->failures;
}

/**
* @return bool
*/
public function getIsOpen(): bool
{
return $this->isOpen;
}

/**
* @return int
*/
public function getLastTry(): int
{
return $this->lastTry;
}
}
13 changes: 0 additions & 13 deletions tests/CheckerTest.php

This file was deleted.

64 changes: 64 additions & 0 deletions tests/CircuitBreakerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

namespace Ector\Checker\Tests;

use Ector\Checker\CircuitBreaker;
use PHPUnit\Framework\TestCase;

class CircuitBreakerTest extends TestCase
{
public function testAllowRequestWhenCircuitIsClosed()
{
$circuitBreaker = new CircuitBreaker(0, time());
$this->assertTrue($circuitBreaker->allowRequest());
}

public function testAllowRequestWhenCircuitIsOpen()
{
$circuitBreaker = new CircuitBreaker(0, time());
$circuitBreaker->handleFailure();
$circuitBreaker->handleFailure();
$circuitBreaker->handleFailure();
$this->assertFalse($circuitBreaker->allowRequest());
}

public function testHandleSuccessResetsFailuresAndClosesCircuit()
{
$circuitBreaker = new CircuitBreaker(0, time());
$circuitBreaker->handleFailure();
$circuitBreaker->handleSuccess();
$this->assertEquals(0, $circuitBreaker->getFailures());
$this->assertFalse($circuitBreaker->getIsOpen());
}

public function testHandleFailureIncrementsFailuresAndOpensCircuit()
{
$circuitBreaker = new CircuitBreaker(0, time());
$circuitBreaker->handleFailure();
$this->assertEquals(1, $circuitBreaker->getFailures());
$this->assertFalse($circuitBreaker->getIsOpen());
$circuitBreaker->handleFailure();
$this->assertEquals(2, $circuitBreaker->getFailures());
$this->assertFalse($circuitBreaker->getIsOpen());
$circuitBreaker->handleFailure();
$this->assertEquals(3, $circuitBreaker->getFailures());
$this->assertTrue($circuitBreaker->getIsOpen());
}

public function testUpdateLastTry()
{
$circuitBreaker = new CircuitBreaker(0, time());
$circuitBreaker->updateLastTry();
sleep(1);
$this->assertGreaterThan($circuitBreaker->getLastTry(), time());
}

public function testResetFailures()
{
$circuitBreaker = new CircuitBreaker(0, time());
$circuitBreaker->incrementFailures();
$circuitBreaker->incrementFailures();
$circuitBreaker->resetFailures();
$this->assertEquals(0, $circuitBreaker->getFailures());
}
}

0 comments on commit f1fc747

Please sign in to comment.