public function testClustersFunctional()
{
$this->skipIfEc2PlatformDisabled();
$this->deleteClusterObjects();
$aws = $this->getEnvironment()->aws(AwsTestCase::REGION);
$masterUserPassword = substr(uniqid(), 0, 10);
$dbClusterId = self::getTestName(self::NAME_INSTANCE);
$subnets = $aws->ec2->subnet->describe();
$subnetIds = [];
$zones = [];
$vpcId = null;
foreach ($subnets as $subnet) {
/* @var $subnet SubnetData */
if (empty($vpcId)) {
$vpcId = $subnet->vpcId;
}
if (!in_array($subnet->availabilityZone, $zones) && $subnet->vpcId == $vpcId) {
$zones[] = $subnet->availabilityZone;
$subnetIds[] = $subnet->subnetId;
}
if (count($subnetIds) > 1) {
break;
}
}
$groupName = self::getTestName('subnetname');
$requestSubnet = new CreateDBSubnetGroupRequestData('test', $groupName);
$requestSubnet->setSubnetIds($subnetIds);
$subnetGroup = $aws->rds->dbSubnetGroup->create($requestSubnet);
$this->assertEquals($subnetGroup->dBSubnetGroupName, $groupName);
$request = new CreateDBClusterRequestData($dbClusterId, 'aurora', 'phpunituser', (string) $masterUserPassword ?: null);
$request->dBSubnetGroupName = $subnetGroup->dBSubnetGroupName;
$dbClusterData = $aws->rds->dbCluster->create($request);
$this->assertInstanceOf($this->getRdsClassName('DataType\\DBClusterData'), $dbClusterData);
$this->assertEquals($dbClusterData->dBClusterIdentifier, $dbClusterId);
$timeout = 0;
while ($dbClusterData->status != DBClusterData::STATUS_AVAILABLE && ($timeout += static::SLEEP_TIMEOUT) < static::SLEEP_TIME) {
sleep(static::SLEEP_TIMEOUT);
$dbClusterData = $dbClusterData->refresh();
}
$this->assertEquals(DBClusterData::STATUS_AVAILABLE, $dbClusterData->status);
$snapId = self::getTestName(self::NAME_DB_SNAPSHOT);
$clusterSnapshot = $aws->rds->dbClusterSnapshot->create($dbClusterId, $snapId);
$this->assertInstanceOf($this->getRdsClassName('DataType\\DBClusterSnapshotData'), $clusterSnapshot);
$this->assertEquals($clusterSnapshot->dBClusterIdentifier, $dbClusterId);
$this->assertEquals($clusterSnapshot->dBClusterSnapshotIdentifier, $snapId);
$timeout = 0;
while ($clusterSnapshot->status !== DBClusterSnapshotData::STATUS_AVAILABLE && ($timeout += static::SLEEP_TIMEOUT) < static::SLEEP_TIME) {
sleep(static::SLEEP_TIMEOUT);
$clusterSnapshot = $aws->rds->dbClusterSnapshot->describe($dbClusterId, $snapId)->get();
}
$this->assertEquals(DBClusterSnapshotData::STATUS_AVAILABLE, $clusterSnapshot->status);
$this->deleteClusterObjects();
}