Skip to content

Commit cdcce54

Browse files
IDE-4864: acli pull db db connector changes (#1985)
* acli pull db db connector changes * php unit fix * code cov fix * code cov , code review accomodated * code cov fix * code cov fix * test depreciation fix * co pilot reviews addressed
1 parent c864c3f commit cdcce54

8 files changed

Lines changed: 133 additions & 35 deletions

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
"symfony/yaml": "^6.3",
5454
"thecodingmachine/safe": "3.0.2",
5555
"typhonius/acquia-logstream": "^0.0.15",
56-
"typhonius/acquia-php-sdk-v2": "^3.7.3",
56+
"typhonius/acquia-php-sdk-v2": "^3.8.0",
5757
"vlucas/phpdotenv": "^5.5",
5858
"zumba/amplitude-php": "^1.0.9"
5959
},

composer.lock

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Command/CommandBase.php

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
use AcquiaCloudApi\Response\EnvironmentResponse;
4747
use AcquiaCloudApi\Response\EnvironmentsResponse;
4848
use AcquiaCloudApi\Response\NotificationResponse;
49+
use AcquiaCloudApi\Response\SiteInstanceDatabaseConnectionResponse;
4950
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;
5051
use AcquiaCloudApi\Response\SiteInstanceResponse;
5152
use AcquiaCloudApi\Response\SiteResponse;
@@ -589,9 +590,13 @@ protected function determineCloudDatabases(Client $acquiaCloudClient, Environmen
589590
{
590591
$codebaseUuid = self::getCodebaseUuid();
591592
if ($codebaseUuid && $this->siteId) {
592-
$database = EnvironmentTransformer::transformSiteInstanceDatabase($this->getSiteInstanceDatabase($this->siteId, $chosenEnvironment->uuid));
593-
if ($database) {
594-
return [$database];
593+
$siteInstanceDb = $this->getSiteInstanceDatabase($this->siteId, $chosenEnvironment->uuid);
594+
if ($siteInstanceDb) {
595+
$siteInstanceDbConnection = $this->getSiteInstanceDatabaseConnection($this->siteId, $chosenEnvironment->uuid);
596+
if ($siteInstanceDbConnection) {
597+
$siteInstanceDatabaseResponse = EnvironmentTransformer::transformSiteInstanceDatabase($siteInstanceDb, $siteInstanceDbConnection);
598+
return [$siteInstanceDatabaseResponse];
599+
}
595600
}
596601
}
597602
$databasesRequest = new Databases($acquiaCloudClient);
@@ -1480,9 +1485,6 @@ protected function getSiteInstance(string $siteId, string $environmentId): ?Site
14801485
}
14811486
/**
14821487
* Get the database for a site instance in a given environment.
1483-
*
1484-
* @param object|null $site (site object from getSitesByCodebase)
1485-
* @return DatabaseResponse|null
14861488
*/
14871489
private function getSiteInstanceDatabase(string $siteUuid, string $environmentUuid): ?SiteInstanceDatabaseResponse
14881490
{
@@ -1497,6 +1499,21 @@ private function getSiteInstanceDatabase(string $siteUuid, string $environmentUu
14971499
return null;
14981500
}
14991501

1502+
/**
1503+
* Get the database connection details for a site instance in a given environment.
1504+
*/
1505+
private function getSiteInstanceDatabaseConnection(string $siteUuid, string $environmentUuid): ?SiteInstanceDatabaseConnectionResponse
1506+
{
1507+
try {
1508+
$acquiaCloudClient = $this->cloudApiClientService->getClient();
1509+
$siteInstancesResource = new SiteInstances($acquiaCloudClient);
1510+
return $siteInstancesResource->getDatabaseConnection($siteUuid, $environmentUuid);
1511+
} catch (\Exception $e) {
1512+
$this->logger->debug('Could not get site instance database connection: ' . $e->getMessage());
1513+
}
1514+
return null;
1515+
}
1516+
15001517
public static function validateEnvironmentAlias(string $alias): string
15011518
{
15021519
$violations = Validation::createValidator()->validate($alias, [

src/Transformer/EnvironmentTransformer.php

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
use AcquiaCloudApi\Response\BackupResponse;
88
use AcquiaCloudApi\Response\DatabaseResponse;
99
use AcquiaCloudApi\Response\EnvironmentResponse;
10+
use AcquiaCloudApi\Response\SiteInstanceDatabaseConnectionResponse;
11+
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;
1012
use stdClass;
1113

1214
class EnvironmentTransformer
@@ -72,18 +74,19 @@ public static function transform(mixed $codebaseEnv): EnvironmentResponse
7274
}
7375

7476
/**
75-
* Transform a SiteInstanceDatabaseResponse object to a DatabaseResponse object.
77+
* Transform SiteInstanceDatabaseResponse and SiteInstanceDatabaseConnectionResponse
78+
* objects to a DatabaseResponse object.
7679
*/
77-
public static function transformSiteInstanceDatabase(mixed $siteInstanceDb): DatabaseResponse
80+
public static function transformSiteInstanceDatabase(SiteInstanceDatabaseResponse $siteInstanceDb, SiteInstanceDatabaseConnectionResponse $siteInstanceDbConnection): DatabaseResponse
7881
{
7982
$db = new \stdClass();
8083
$db->id = $siteInstanceDb->databaseName;
8184
$db->name = $siteInstanceDb->databaseName;
82-
$db->user_name = $siteInstanceDb->databaseUserName;
83-
$db->password = $siteInstanceDb->databasePassword;
85+
$db->user_name = $siteInstanceDbConnection->databaseUserName;
86+
$db->password = $siteInstanceDbConnection->databasePassword;
8487
$db->url = null;
85-
$db->db_host = $siteInstanceDb->databaseHost;
86-
$db->ssh_host = null;
88+
$db->db_host = $siteInstanceDbConnection->databaseHost;
89+
$db->ssh_host = $siteInstanceDbConnection->sshHost;
8790
$db->flags = (object) ['role' => $siteInstanceDb->databaseRole, 'default' => false];
8891
$db->environment = new stdClass();
8992
return new DatabaseResponse($db);

tests/phpunit/src/Commands/Pull/PullCommandTestBase.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public function setUp(): void
4141
'ACLI_DB_USER',
4242
'ACLI_DB_PASSWORD',
4343
'ACLI_DB_NAME',
44+
'AH_CODEBASE_UUID',
4445
]);
4546
parent::setUp();
4647
}

tests/phpunit/src/Commands/Pull/PullDatabaseCommandTest.php

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Acquia\Cli\Helpers\SshHelper;
1212
use Acquia\Cli\Transformer\EnvironmentTransformer;
1313
use AcquiaCloudApi\Response\SiteInstanceDatabaseBackupResponse;
14+
use AcquiaCloudApi\Response\SiteInstanceDatabaseConnectionResponse;
1415
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;
1516
use GuzzleHttp\Client;
1617
use Prophecy\Argument;
@@ -463,6 +464,10 @@ public function testPullDatabasesWithCodebaseUuid(): void
463464
$this->clientProphecy->request('get', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database')
464465
->willReturn($siteInstanceDatabase)
465466
->shouldBeCalled();
467+
$siteInstanceDatabaseConnection = $this->getMockSiteInstanceDatabaseConnectionResponse();
468+
$this->clientProphecy->request('get', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database/connection')
469+
->willReturn($siteInstanceDatabaseConnection)
470+
->shouldBeCalled();
466471
$createSiteInstanceDatabaseBackup = $this->getMockSiteInstanceDatabaseBackupsResponse('post', '201');
467472
$this->clientProphecy->request('post', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database/backups')
468473
->willReturn($createSiteInstanceDatabaseBackup);
@@ -472,7 +477,7 @@ public function testPullDatabasesWithCodebaseUuid(): void
472477
->shouldBeCalled();
473478

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

477482
$localMachineHelper = $this->mockLocalMachineHelper();
478483
$this->mockExecuteMySqlConnect($localMachineHelper, true);
@@ -587,6 +592,10 @@ public function testPullDatabasesWithCodebaseUuidOnDemand(): void
587592
$this->clientProphecy->request('get', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database')
588593
->willReturn($siteInstanceDatabase)
589594
->shouldBeCalled();
595+
$siteInstanceDatabaseConnection = $this->getMockSiteInstanceDatabaseConnectionResponse();
596+
$this->clientProphecy->request('get', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database/connection')
597+
->willReturn($siteInstanceDatabaseConnection)
598+
->shouldBeCalled();
590599
$createSiteInstanceDatabaseBackup = $this->getMockSiteInstanceDatabaseBackupsResponse('post', '201');
591600
$this->clientProphecy->request('post', '/site-instances/8979a8ac-80dc-4df8-b2f0-6be36554a370.3e8ecbec-ea7c-4260-8414-ef2938c859bc/database/backups')
592601
->willReturn($createSiteInstanceDatabaseBackup)
@@ -598,7 +607,7 @@ public function testPullDatabasesWithCodebaseUuidOnDemand(): void
598607
->shouldBeCalled();
599608

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

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

638647
self::unsetEnvVars(['AH_CODEBASE_UUID']);
639648
}
649+
650+
/**
651+
* Test catch block in getSiteInstanceDatabaseConnection method.
652+
* Covers the logger->debug() line when an exception is caught.
653+
*/
654+
public function testGetSiteInstanceDatabaseConnectionCatchBlock(): void
655+
{
656+
// Mock the client to throw an exception.
657+
$this->clientProphecy->request('get', Argument::containingString('/site-instances/'))
658+
->willThrow(new \Exception('API Connection Error'))
659+
->shouldBeCalled();
660+
661+
// Use reflection to call the private method (PHP 8.1+ doesn't need setAccessible).
662+
$reflection = new \ReflectionClass($this->command);
663+
$method = $reflection->getMethod('getSiteInstanceDatabaseConnection');
664+
665+
// Call the method - it should catch the exception and return null.
666+
$result = $method->invoke($this->command, 'test-site-uuid', 'test-env-uuid');
667+
668+
// Assert null is returned when exception is caught.
669+
$this->assertNull($result);
670+
}
671+
672+
/**
673+
* Test catch block in getSiteInstanceDatabase method.
674+
* Covers the logger->debug() line when an exception is caught.
675+
*/
676+
public function testGetSiteInstanceDatabaseCatchBlock(): void
677+
{
678+
// Mock the client to throw an exception.
679+
$this->clientProphecy->request('get', Argument::containingString('/site-instances/'))
680+
->willThrow(new \Exception('API Error'))
681+
->shouldBeCalled();
682+
683+
// Use reflection to call the private method (PHP 8.1+ doesn't need setAccessible).
684+
$reflection = new \ReflectionClass($this->command);
685+
$method = $reflection->getMethod('getSiteInstanceDatabase');
686+
687+
// Call the method - it should catch the exception and return null.
688+
$result = $method->invoke($this->command, 'test-site-uuid', 'test-env-uuid');
689+
690+
// Assert null is returned when exception is caught.
691+
$this->assertNull($result);
692+
}
640693
}

tests/phpunit/src/TestBase.php

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -661,12 +661,8 @@ protected function getMockSiteInstanceResponse(string $method = 'get', string $h
661661
protected function getMockSiteInstanceDatabaseResponse(string $method = 'get', string $httpCode = '200'): object
662662
{
663663
return (object) array(
664-
'database_host' => 'localhost',
665664
'database_name' => 'example',
666-
'database_password' => 'example@123',
667-
'database_port' => 3306,
668665
'database_role' => 'example',
669-
'database_user_name' => 'example',
670666
'_links' =>
671667
(object) array(
672668
'self' =>
@@ -676,6 +672,25 @@ protected function getMockSiteInstanceDatabaseResponse(string $method = 'get', s
676672
),
677673
);
678674
}
675+
676+
protected function getMockSiteInstanceDatabaseConnectionResponse(): object
677+
{
678+
return (object) array(
679+
'db_host' => 'localhost',
680+
'name' => 'example',
681+
'password' => 'example@123',
682+
'ssh_host' => '',
683+
'user_name' => 'example',
684+
'_links' =>
685+
(object) array(
686+
'self' =>
687+
(object) array(
688+
'href' => 'https://environment-service-php.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/database/connection',
689+
),
690+
),
691+
);
692+
}
693+
679694
protected function getMockSiteInstanceDatabaseBackupsResponse(string $method = 'get', string $httpCode = '200'): object
680695
{
681696
if ($method === 'post') {

tests/phpunit/src/Transformer/EnvironmentTransformerTest.php

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
use AcquiaCloudApi\Response\BackupResponse;
99
use AcquiaCloudApi\Response\DatabaseResponse;
1010
use AcquiaCloudApi\Response\EnvironmentResponse;
11+
use AcquiaCloudApi\Response\SiteInstanceDatabaseConnectionResponse;
12+
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;
1113
use PHPUnit\Framework\TestCase;
1214

1315
class EnvironmentTransformerTest extends TestCase
@@ -184,15 +186,22 @@ public function testSshUrlPrefersPropertiesOverVcsUrl(): void
184186

185187
public function testTransformSiteInstanceDatabase(): void
186188
{
187-
$siteInstanceDb = (object)[
188-
'databaseHost' => 'test.example.com',
189-
'databaseName' => 'test_db',
190-
'databasePassword' => 'test_password',
191-
'databaseRole' => 'primary',
192-
'databaseUserName' => 'test_user',
193-
];
189+
$siteInstanceDb = new SiteInstanceDatabaseResponse((object)[
190+
'database_name' => 'test_db',
191+
'database_role' => 'primary',
192+
'_links' => (object)[],
193+
]);
194+
195+
$siteInstanceDbConnection = new SiteInstanceDatabaseConnectionResponse((object)[
196+
'db_host' => 'test.example.com',
197+
'name' => 'test_db',
198+
'password' => 'test_password',
199+
'ssh_host' => '',
200+
'user_name' => 'test_user',
201+
'_links' => (object)[],
202+
]);
194203

195-
$databaseResponse = EnvironmentTransformer::transformSiteInstanceDatabase($siteInstanceDb);
204+
$databaseResponse = EnvironmentTransformer::transformSiteInstanceDatabase($siteInstanceDb, $siteInstanceDbConnection);
196205

197206
$this->assertInstanceOf(DatabaseResponse::class, $databaseResponse);
198207
$this->assertEquals('test_db', $databaseResponse->id);
@@ -201,7 +210,7 @@ public function testTransformSiteInstanceDatabase(): void
201210
$this->assertEquals('test_password', $databaseResponse->password);
202211
$this->assertNull($databaseResponse->url);
203212
$this->assertEquals('test.example.com', $databaseResponse->db_host);
204-
$this->assertNull($databaseResponse->ssh_host);
213+
$this->assertEquals('', $databaseResponse->ssh_host);
205214
$this->assertIsObject($databaseResponse->flags);
206215
$this->assertEquals('primary', $databaseResponse->flags->role);
207216
$this->assertFalse($databaseResponse->flags->default);

0 commit comments

Comments
 (0)