Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
"symfony/yaml": "^6.3",
"thecodingmachine/safe": "3.0.2",
"typhonius/acquia-logstream": "^0.0.15",
"typhonius/acquia-php-sdk-v2": "^3.7.3",
"typhonius/acquia-php-sdk-v2": "^3.8.0",
Comment thread
kalindi-adhiya marked this conversation as resolved.
"vlucas/phpdotenv": "^5.5",
"zumba/amplitude-php": "^1.0.9"
},
Expand Down
14 changes: 7 additions & 7 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 23 additions & 6 deletions src/Command/CommandBase.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
use AcquiaCloudApi\Response\EnvironmentResponse;
use AcquiaCloudApi\Response\EnvironmentsResponse;
use AcquiaCloudApi\Response\NotificationResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseConnectionResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;
use AcquiaCloudApi\Response\SiteInstanceResponse;
use AcquiaCloudApi\Response\SiteResponse;
Expand Down Expand Up @@ -589,9 +590,13 @@ protected function determineCloudDatabases(Client $acquiaCloudClient, Environmen
{
$codebaseUuid = self::getCodebaseUuid();
if ($codebaseUuid && $this->siteId) {
$database = EnvironmentTransformer::transformSiteInstanceDatabase($this->getSiteInstanceDatabase($this->siteId, $chosenEnvironment->uuid));
if ($database) {
return [$database];
$siteInstanceDb = $this->getSiteInstanceDatabase($this->siteId, $chosenEnvironment->uuid);
if ($siteInstanceDb) {
$siteInstanceDbConnection = $this->getSiteInstanceDatabaseConnection($this->siteId, $chosenEnvironment->uuid);
if ($siteInstanceDbConnection) {
$siteInstanceDatabaseResponse = EnvironmentTransformer::transformSiteInstanceDatabase($siteInstanceDb, $siteInstanceDbConnection);
return [$siteInstanceDatabaseResponse];
}
}
}
$databasesRequest = new Databases($acquiaCloudClient);
Expand Down Expand Up @@ -1480,9 +1485,6 @@ protected function getSiteInstance(string $siteId, string $environmentId): ?Site
}
/**
* Get the database for a site instance in a given environment.
*
* @param object|null $site (site object from getSitesByCodebase)
* @return DatabaseResponse|null
*/
private function getSiteInstanceDatabase(string $siteUuid, string $environmentUuid): ?SiteInstanceDatabaseResponse
{
Expand All @@ -1497,6 +1499,21 @@ private function getSiteInstanceDatabase(string $siteUuid, string $environmentUu
return null;
}

/**
* Get the database connection details for a site instance in a given environment.
*/
private function getSiteInstanceDatabaseConnection(string $siteUuid, string $environmentUuid): ?SiteInstanceDatabaseConnectionResponse
{
try {
$acquiaCloudClient = $this->cloudApiClientService->getClient();
$siteInstancesResource = new SiteInstances($acquiaCloudClient);
return $siteInstancesResource->getDatabaseConnection($siteUuid, $environmentUuid);
} catch (\Exception $e) {
$this->logger->debug('Could not get site instance database connection: ' . $e->getMessage());
}
return null;
}

public static function validateEnvironmentAlias(string $alias): string
{
$violations = Validation::createValidator()->validate($alias, [
Expand Down
15 changes: 9 additions & 6 deletions src/Transformer/EnvironmentTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
use AcquiaCloudApi\Response\BackupResponse;
use AcquiaCloudApi\Response\DatabaseResponse;
use AcquiaCloudApi\Response\EnvironmentResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseConnectionResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;
use stdClass;

class EnvironmentTransformer
Expand Down Expand Up @@ -72,18 +74,19 @@ public static function transform(mixed $codebaseEnv): EnvironmentResponse
}

/**
* Transform a SiteInstanceDatabaseResponse object to a DatabaseResponse object.
* Transform SiteInstanceDatabaseResponse and SiteInstanceDatabaseConnectionResponse
* objects to a DatabaseResponse object.
*/
public static function transformSiteInstanceDatabase(mixed $siteInstanceDb): DatabaseResponse
public static function transformSiteInstanceDatabase(SiteInstanceDatabaseResponse $siteInstanceDb, SiteInstanceDatabaseConnectionResponse $siteInstanceDbConnection): DatabaseResponse
{
Comment thread
kalindi-adhiya marked this conversation as resolved.
$db = new \stdClass();
$db->id = $siteInstanceDb->databaseName;
$db->name = $siteInstanceDb->databaseName;
$db->user_name = $siteInstanceDb->databaseUserName;
$db->password = $siteInstanceDb->databasePassword;
$db->user_name = $siteInstanceDbConnection->databaseUserName;
$db->password = $siteInstanceDbConnection->databasePassword;
$db->url = null;
$db->db_host = $siteInstanceDb->databaseHost;
$db->ssh_host = null;
$db->db_host = $siteInstanceDbConnection->databaseHost;
$db->ssh_host = $siteInstanceDbConnection->sshHost;
$db->flags = (object) ['role' => $siteInstanceDb->databaseRole, 'default' => false];
$db->environment = new stdClass();
return new DatabaseResponse($db);
Expand Down
1 change: 1 addition & 0 deletions tests/phpunit/src/Commands/Pull/PullCommandTestBase.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public function setUp(): void
'ACLI_DB_USER',
'ACLI_DB_PASSWORD',
'ACLI_DB_NAME',
'AH_CODEBASE_UUID',
]);
parent::setUp();
}
Expand Down
57 changes: 55 additions & 2 deletions tests/phpunit/src/Commands/Pull/PullDatabaseCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Acquia\Cli\Helpers\SshHelper;
use Acquia\Cli\Transformer\EnvironmentTransformer;
use AcquiaCloudApi\Response\SiteInstanceDatabaseBackupResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseConnectionResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;
use GuzzleHttp\Client;
use Prophecy\Argument;
Expand Down Expand Up @@ -463,6 +464,10 @@ public function testPullDatabasesWithCodebaseUuid(): void
$this->clientProphecy->request('get', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database')
->willReturn($siteInstanceDatabase)
->shouldBeCalled();
$siteInstanceDatabaseConnection = $this->getMockSiteInstanceDatabaseConnectionResponse();
$this->clientProphecy->request('get', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database/connection')
->willReturn($siteInstanceDatabaseConnection)
->shouldBeCalled();
$createSiteInstanceDatabaseBackup = $this->getMockSiteInstanceDatabaseBackupsResponse('post', '201');
$this->clientProphecy->request('post', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database/backups')
->willReturn($createSiteInstanceDatabaseBackup);
Expand All @@ -472,7 +477,7 @@ public function testPullDatabasesWithCodebaseUuid(): void
->shouldBeCalled();

$url = "https://environment-service-php.acquia.com/api/environments/d3f7270e-c45f-4801-9308-5e8afe84a323/";
$this->mockDownloadCodebaseBackup(EnvironmentTransformer::transformSiteInstanceDatabase(new SiteInstanceDatabaseResponse($siteInstanceDatabase)), $url, EnvironmentTransformer::transformSiteInstanceDatabaseBackup(new SiteInstanceDatabaseBackupResponse($siteInstanceDatabaseBackups->_embedded->items[0])));
$this->mockDownloadCodebaseBackup(EnvironmentTransformer::transformSiteInstanceDatabase(new SiteInstanceDatabaseResponse($siteInstanceDatabase), new SiteInstanceDatabaseConnectionResponse($siteInstanceDatabaseConnection)), $url, EnvironmentTransformer::transformSiteInstanceDatabaseBackup(new SiteInstanceDatabaseBackupResponse($siteInstanceDatabaseBackups->_embedded->items[0])));

$localMachineHelper = $this->mockLocalMachineHelper();
$this->mockExecuteMySqlConnect($localMachineHelper, true);
Expand Down Expand Up @@ -587,6 +592,10 @@ public function testPullDatabasesWithCodebaseUuidOnDemand(): void
$this->clientProphecy->request('get', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database')
->willReturn($siteInstanceDatabase)
->shouldBeCalled();
$siteInstanceDatabaseConnection = $this->getMockSiteInstanceDatabaseConnectionResponse();
$this->clientProphecy->request('get', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database/connection')
->willReturn($siteInstanceDatabaseConnection)
->shouldBeCalled();
$createSiteInstanceDatabaseBackup = $this->getMockSiteInstanceDatabaseBackupsResponse('post', '201');
$this->clientProphecy->request('post', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database/backups')
->willReturn($createSiteInstanceDatabaseBackup)
Expand All @@ -598,7 +607,7 @@ public function testPullDatabasesWithCodebaseUuidOnDemand(): void
->shouldBeCalled();

$url = "https://environment-service-php.acquia.com/api/environments/d3f7270e-c45f-4801-9308-5e8afe84a323/";
$this->mockDownloadCodebaseBackup(EnvironmentTransformer::transformSiteInstanceDatabase(new SiteInstanceDatabaseResponse($siteInstanceDatabase)), $url, EnvironmentTransformer::transformSiteInstanceDatabaseBackup(new SiteInstanceDatabaseBackupResponse($siteInstanceDatabaseBackups->_embedded->items[0])));
$this->mockDownloadCodebaseBackup(EnvironmentTransformer::transformSiteInstanceDatabase(new SiteInstanceDatabaseResponse($siteInstanceDatabase), new SiteInstanceDatabaseConnectionResponse($siteInstanceDatabaseConnection)), $url, EnvironmentTransformer::transformSiteInstanceDatabaseBackup(new SiteInstanceDatabaseBackupResponse($siteInstanceDatabaseBackups->_embedded->items[0])));

$localMachineHelper = $this->mockLocalMachineHelper();
$this->mockExecuteMySqlConnect($localMachineHelper, true);
Expand Down Expand Up @@ -637,4 +646,48 @@ public function testPullDatabasesWithCodebaseUuidOnDemand(): void

self::unsetEnvVars(['AH_CODEBASE_UUID']);
}

/**
* Test catch block in getSiteInstanceDatabaseConnection method.
* Covers the logger->debug() line when an exception is caught.
*/
public function testGetSiteInstanceDatabaseConnectionCatchBlock(): void
{
// Mock the client to throw an exception.
$this->clientProphecy->request('get', Argument::containingString('/site-instances/'))
->willThrow(new \Exception('API Connection Error'))
->shouldBeCalled();

Comment thread
kalindi-adhiya marked this conversation as resolved.
// Use reflection to call the private method (PHP 8.1+ doesn't need setAccessible).
$reflection = new \ReflectionClass($this->command);
$method = $reflection->getMethod('getSiteInstanceDatabaseConnection');

// Call the method - it should catch the exception and return null.
$result = $method->invoke($this->command, 'test-site-uuid', 'test-env-uuid');

// Assert null is returned when exception is caught.
$this->assertNull($result);
}

/**
* Test catch block in getSiteInstanceDatabase method.
* Covers the logger->debug() line when an exception is caught.
*/
public function testGetSiteInstanceDatabaseCatchBlock(): void
{
// Mock the client to throw an exception.
$this->clientProphecy->request('get', Argument::containingString('/site-instances/'))
Comment thread
kalindi-adhiya marked this conversation as resolved.
->willThrow(new \Exception('API Error'))
->shouldBeCalled();

// Use reflection to call the private method (PHP 8.1+ doesn't need setAccessible).
$reflection = new \ReflectionClass($this->command);
$method = $reflection->getMethod('getSiteInstanceDatabase');

// Call the method - it should catch the exception and return null.
$result = $method->invoke($this->command, 'test-site-uuid', 'test-env-uuid');

// Assert null is returned when exception is caught.
$this->assertNull($result);
}
}
23 changes: 19 additions & 4 deletions tests/phpunit/src/TestBase.php
Original file line number Diff line number Diff line change
Expand Up @@ -661,12 +661,8 @@ protected function getMockSiteInstanceResponse(string $method = 'get', string $h
protected function getMockSiteInstanceDatabaseResponse(string $method = 'get', string $httpCode = '200'): object
{
return (object) array(
'database_host' => 'localhost',
'database_name' => 'example',
'database_password' => 'example@123',
'database_port' => 3306,
'database_role' => 'example',
'database_user_name' => 'example',
'_links' =>
(object) array(
'self' =>
Expand All @@ -676,6 +672,25 @@ protected function getMockSiteInstanceDatabaseResponse(string $method = 'get', s
),
);
}

protected function getMockSiteInstanceDatabaseConnectionResponse(): object
{
return (object) array(
'db_host' => 'localhost',
'name' => 'example',
'password' => 'example@123',
'ssh_host' => '',
'user_name' => 'example',
'_links' =>
(object) array(
'self' =>
(object) array(
'href' => 'https://environment-service-php.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/database/connection',
),
),
);
}

protected function getMockSiteInstanceDatabaseBackupsResponse(string $method = 'get', string $httpCode = '200'): object
{
if ($method === 'post') {
Expand Down
27 changes: 18 additions & 9 deletions tests/phpunit/src/Transformer/EnvironmentTransformerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
use AcquiaCloudApi\Response\BackupResponse;
use AcquiaCloudApi\Response\DatabaseResponse;
use AcquiaCloudApi\Response\EnvironmentResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseConnectionResponse;
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;
use PHPUnit\Framework\TestCase;

class EnvironmentTransformerTest extends TestCase
Expand Down Expand Up @@ -184,15 +186,22 @@ public function testSshUrlPrefersPropertiesOverVcsUrl(): void

public function testTransformSiteInstanceDatabase(): void
{
$siteInstanceDb = (object)[
'databaseHost' => 'test.example.com',
'databaseName' => 'test_db',
'databasePassword' => 'test_password',
'databaseRole' => 'primary',
'databaseUserName' => 'test_user',
];
$siteInstanceDb = new SiteInstanceDatabaseResponse((object)[
'database_name' => 'test_db',
'database_role' => 'primary',
'_links' => (object)[],
]);

$siteInstanceDbConnection = new SiteInstanceDatabaseConnectionResponse((object)[
'db_host' => 'test.example.com',
'name' => 'test_db',
'password' => 'test_password',
'ssh_host' => '',
'user_name' => 'test_user',
'_links' => (object)[],
]);

$databaseResponse = EnvironmentTransformer::transformSiteInstanceDatabase($siteInstanceDb);
$databaseResponse = EnvironmentTransformer::transformSiteInstanceDatabase($siteInstanceDb, $siteInstanceDbConnection);

$this->assertInstanceOf(DatabaseResponse::class, $databaseResponse);
$this->assertEquals('test_db', $databaseResponse->id);
Expand All @@ -201,7 +210,7 @@ public function testTransformSiteInstanceDatabase(): void
$this->assertEquals('test_password', $databaseResponse->password);
$this->assertNull($databaseResponse->url);
$this->assertEquals('test.example.com', $databaseResponse->db_host);
$this->assertNull($databaseResponse->ssh_host);
$this->assertEquals('', $databaseResponse->ssh_host);
$this->assertIsObject($databaseResponse->flags);
$this->assertEquals('primary', $databaseResponse->flags->role);
$this->assertFalse($databaseResponse->flags->default);
Expand Down