/** * xLaunchInstanceAction * * @param string $cloudLocation * @param string $Engine * @param string $DBInstanceIdentifier * @param string $DBInstanceClass * @param string $MasterUsername * @param RawData $MasterUserPassword * @param string $DBParameterGroup * @param string $LicenseModel optional * @param string $OptionGroupName optional * @param string $AllocatedStorage optional * @param string $StorageType optional * @param int $farmId optional * @param string $DBName optional * @param int $Port optional * @param string $VpcId optional * @param JsonData $VpcSecurityGroups optional * @param JsonData $DBSecurityGroups optional * @param JsonData $SubnetIds optional * @param bool $StorageEncrypted optional * @param string $KmsKeyId optional * @param string $PreferredBackupWindow optional * @param string $CharacterSetName optional * @param bool $MultiAZ optional * @param bool $AutoMinorVersionUpgrade optional * @param string $AvailabilityZone optional * @param int $Iops optional * @param string $BackupRetentionPeriod optional * @param string $PreferredMaintenanceWindow optional * @param string $DBSubnetGroupName optional * @param string $EngineVersion optional * @param bool $PubliclyAccessible optional * @throws Exception * @throws ScalrException */ public function xLaunchInstanceAction($cloudLocation, $Engine, $DBInstanceIdentifier, $DBInstanceClass, $MasterUsername, RawData $MasterUserPassword, $DBParameterGroup, $LicenseModel = null, $OptionGroupName = null, $AllocatedStorage = null, $StorageType = null, $farmId = null, $DBName = null, $Port = null, $VpcId = null, JsonData $VpcSecurityGroups = null, JsonData $DBSecurityGroups = null, JsonData $SubnetIds = null, $StorageEncrypted = false, $KmsKeyId = null, $PreferredBackupWindow = null, $CharacterSetName = null, $MultiAZ = null, $AutoMinorVersionUpgrade = false, $AvailabilityZone = null, $Iops = null, $BackupRetentionPeriod = null, $PreferredMaintenanceWindow = null, $DBSubnetGroupName = null, $EngineVersion = null, $PubliclyAccessible = false) { $this->request->restrictAccess(Acl::RESOURCE_AWS_RDS, Acl::PERM_AWS_RDS_MANAGE); $aws = $this->getAwsClient($cloudLocation); if ($Engine == 'mysql') { $Engine = 'MySQL'; } $request = new CreateDBInstanceRequestData($DBInstanceIdentifier, $DBInstanceClass, $Engine); if ($Engine == 'aurora') { $StorageType = 'aurora'; $request->dBClusterIdentifier = strtolower($DBInstanceIdentifier); } if ($StorageEncrypted) { $request->storageEncrypted = $Engine != 'aurora' ? true : null; if ($KmsKeyId) { $kmsKey = $aws->kms->key->describe($KmsKeyId); if (!$kmsKey->enabled) { throw new Exception("This KMS Key is disabled, please choose another one."); } $allowed = true; $governance = new Scalr_Governance($this->getEnvironmentId()); $allowedKeys = $governance->getValue(SERVER_PLATFORMS::EC2, Scalr_Governance::AWS_KMS_KEYS, $cloudLocation); if (!empty($allowedKeys)) { $allowed = false; foreach ($allowedKeys['keys'] as $key) { if ($key['id'] == $kmsKey->keyId) { $allowed = true; break; } } } if (!$allowed) { throw new ScalrException("A KMS Policy is active in this Environment, access to '{$kmsKey->keyId}' has been restricted by account owner."); } $request->kmsKeyId = $Engine != 'aurora' ? $KmsKeyId : null; } } if (empty($request->dBClusterIdentifier)) { $request->allocatedStorage = $AllocatedStorage; $request->masterUsername = $MasterUsername; $request->masterUserPassword = (string) $MasterUserPassword; $request->dBName = $DBName ?: null; $request->port = $Port ?: null; $request->preferredBackupWindow = $PreferredBackupWindow ?: null; $vpcSgIds = []; foreach ($VpcSecurityGroups as $VpcSecurityGroup) { $vpcSgIds[] = $VpcSecurityGroup['id']; } $request->vpcSecurityGroupIds = empty($vpcSgIds) ? null : $vpcSgIds; } $request->characterSetName = $CharacterSetName ?: null; if (!empty($DBParameterGroup)) { $paramGroups = $aws->rds->dbParameterGroup->describe(); foreach ($paramGroups as $param) { /* @var $param DBParameterGroupData */ if ($param->dBParameterGroupName == $DBParameterGroup) { $paramGroup = $param; break; } } } if (!empty($paramGroup)) { $request->dBParameterGroupName = $paramGroup->dBParameterGroupName; } $isMirror = $MultiAZ && in_array($Engine, [DBInstanceData::ENGINE_SQL_SERVER_SE, DBInstanceData::ENGINE_SQL_SERVER_EE]); $optionList = $aws->rds->optionGroup->describe($Engine); foreach ($optionList as $option) { /* @var $option OptionGroupData */ if ($option->optionGroupName == $OptionGroupName) { $optionGroup = $option; break; } } if (isset($optionGroup)) { $request->optionGroupName = $optionGroup->optionGroupName; } else { if ($isMirror) { $request->optionGroupName = $OptionGroupName; } } $dbSgIds = []; foreach ($DBSecurityGroups as $DBSecurityGroup) { $dbSgIds[] = $DBSecurityGroup; } $request->dBSecurityGroups = empty($dbSgIds) ? null : $dbSgIds; $request->autoMinorVersionUpgrade = $AutoMinorVersionUpgrade; $request->availabilityZone = $AvailabilityZone ?: null; $request->backupRetentionPeriod = $BackupRetentionPeriod ?: null; $request->preferredMaintenanceWindow = $PreferredMaintenanceWindow ?: null; $request->multiAZ = $isMirror ? false : $MultiAZ; $request->storageType = $StorageType; $request->dBSubnetGroupName = $DBSubnetGroupName ?: null; $request->licenseModel = $LicenseModel; $request->engineVersion = $EngineVersion ?: null; $request->iops = $Iops ?: null; if ($VpcId) { $request->publiclyAccessible = $PubliclyAccessible; } $tagsObject = $farmId ? DBFarm::LoadByID($farmId) : $this->environment; $request->tags = new TagsList($tagsObject->getAwsTags()); $result = self::loadController('Aws', 'Scalr_UI_Controller_Tools')->checkSecurityGroupsPolicy($VpcSecurityGroups, Aws::SERVICE_INTERFACE_RDS); if ($result === true) { $result = self::loadController('Aws', 'Scalr_UI_Controller_Tools')->checkVpcPolicy($VpcId, $SubnetIds, $cloudLocation); } if ($result === true) { if (!empty($request->dBClusterIdentifier)) { try { $checkInstance = $aws->rds->dbInstance->describe($request->dBInstanceIdentifier); } catch (Exception $e) { $checkInstance = []; } if (count($checkInstance) > 0) { throw new Exception(sprintf("AWS Error. DB Instance with identifier %s already exists.", $request->dBInstanceIdentifier)); } self::loadController('Clusters', 'Scalr_UI_Controller_Tools_Aws_Rds')->xSaveAction($cloudLocation, $request->dBClusterIdentifier, $Engine, $MasterUsername, $MasterUserPassword, $VpcId, $Port, $DBName, $request->characterSetName, $request->dBParameterGroupName, $request->optionGroupName, new JsonData([$request->availabilityZone]), $request->backupRetentionPeriod, $PreferredBackupWindow, $request->preferredMaintenanceWindow, $request->dBSubnetGroupName, $request->engineVersion, $farmId, $VpcSecurityGroups, $SubnetIds, $StorageEncrypted, $KmsKeyId); } $instance = $aws->rds->dbInstance->create($request); CloudResource::deletePk($request->dBInstanceIdentifier, CloudResource::TYPE_AWS_RDS, $this->getEnvironmentId(), \SERVER_PLATFORMS::EC2, $cloudLocation); if ($farmId) { $cloudResource = new CloudResource(); $cloudResource->id = $request->dBInstanceIdentifier; $cloudResource->type = CloudResource::TYPE_AWS_RDS; $cloudResource->platform = \SERVER_PLATFORMS::EC2; $cloudResource->cloudLocation = $cloudLocation; $cloudResource->envId = $this->getEnvironmentId(); $cloudResource->farmId = $farmId; $cloudResource->save(); } $vpcSglist = null; if (!empty($VpcId)) { $filter[] = ['name' => SecurityGroupFilterNameType::vpcId(), 'value' => $VpcId]; $vpcSglist = $aws->ec2->securityGroup->describe(null, null, $filter); } $clusters = null; if (!empty($instance->dBClusterIdentifier)) { /* @var $cluster DBClusterData */ $clusters = $aws->rds->dbCluster->describe($instance->dBClusterIdentifier); } $data = $this->getDbInstanceData($aws, $instance, $vpcSglist, $clusters); $data['isReplica'] = false; if ($isMirror) { $data['MultiAZ'] = true; } $this->response->success("DB Instance successfully created"); $this->response->data(['instance' => $data, 'cloudLocation' => $cloudLocation]); } else { $this->response->failure($result); } }
/** * @param JsonData $VpcSecurityGroups * @param JsonData $DBSecurityGroups * @param JsonData $SubnetIds */ public function xLaunchInstanceAction(JsonData $VpcSecurityGroups = null, JsonData $DBSecurityGroups = null, JsonData $SubnetIds = null) { $cloudLocation = $this->getParam('cloudLocation'); $aws = $this->getEnvironment()->aws($cloudLocation); $engine = $this->getParam('Engine'); if ($engine == 'mysql') { $engine = 'MySQL'; } $request = new CreateDBInstanceRequestData($this->getParam('DBInstanceIdentifier'), $this->getParam('AllocatedStorage'), $this->getParam('DBInstanceClass'), $engine, $this->getParam('MasterUsername'), $this->getParam('MasterUserPassword')); $request->port = $this->getParam('Port') ?: null; $request->dBName = $this->getParam('DBName') ?: null; $request->characterSetName = $this->getParam('CharacterSetName') ?: null; $paramName = $this->getParam('DBParameterGroup'); if (!empty($paramName)) { $paramGroups = $aws->rds->dbParameterGroup->describe(); foreach ($paramGroups as $param) { /* @var $param DBParameterGroupData */ if ($param->dBParameterGroupName == $paramName) { $paramGroup = $param; break; } } } if (!empty($paramGroup)) { $request->dBParameterGroupName = $paramGroup->dBParameterGroupName; } $optionList = $aws->rds->optionGroup->describe($engine); foreach ($optionList as $option) { /* @var $option OptionGroupData */ if ($option->optionGroupName == $this->getParam('OptionGroupName')) { $optionGroup = $option; break; } } if (!empty($optionGroup)) { $request->optionGroupName = $optionGroup->optionGroupName; } $dbSgIds = null; foreach ($DBSecurityGroups as $DBSecurityGroup) { $dbSgIds[] = $DBSecurityGroup; } $request->dBSecurityGroups = $dbSgIds; $request->autoMinorVersionUpgrade = $this->getParam('AutoMinorVersionUpgrade') == 'false' ? false : true; $request->availabilityZone = $this->getParam('AvailabilityZone') ?: null; $request->backupRetentionPeriod = $this->getParam('BackupRetentionPeriod') ?: null; $request->preferredBackupWindow = $this->getParam('PreferredBackupWindow') ?: null; $request->preferredMaintenanceWindow = $this->getParam('PreferredMaintenanceWindow') ?: null; $multiAz = $this->getParam('MultiAZ'); if (!empty($multiAz)) { $request->multiAZ = $this->getParam('MultiAZ') == 'false' ? false : true; } $request->storageType = $this->getParam('StorageType'); $request->dBSubnetGroupName = $this->getParam('DBSubnetGroupName') ?: null; $request->licenseModel = $this->getParam('LicenseModel'); $vpcSgIds = null; foreach ($VpcSecurityGroups as $VpcSecurityGroup) { $vpcSgIds[] = $VpcSecurityGroup['id']; } $request->vpcSecurityGroupIds = $vpcSgIds; $request->engineVersion = $this->getParam('EngineVersion') ?: null; $request->iops = $this->getParam('Iops') ?: null; $vpcId = $this->getParam('VpcId'); $tagsObject = $this->getParam('farmId') ? DBFarm::LoadByID($this->getParam('farmId')) : $this->environment; $tags = [['key' => \Scalr_Governance::SCALR_META_TAG_NAME, 'value' => $tagsObject->applyGlobalVarsToValue(\Scalr_Governance::SCALR_META_TAG_VALUE)]]; $governance = new \Scalr_Governance($this->environment->id); $gTags = (array) $governance->getValue(SERVER_PLATFORMS::EC2, \Scalr_Governance::AWS_TAGS); if (count($gTags) > 0) { foreach ($gTags as $tKey => $tValue) { $tags[] = array('key' => $tKey, 'value' => $tagsObject->applyGlobalVarsToValue($tValue)); } } $request->tags = new TagsList($tags); $errorMessage = $this->checkPolicy($VpcSecurityGroups, $vpcId, $SubnetIds, $cloudLocation); if (empty($errorMessage)) { $aws->rds->dbInstance->create($request); if ($this->getParam('farmId')) { $cloudResource = new CloudResource(); $cloudResource->id = $request->dBInstanceIdentifier; $cloudResource->type = CloudResource::TYPE_AWS_RDS; $cloudResource->platform = \SERVER_PLATFORMS::EC2; $cloudResource->cloudLocation = $cloudLocation; $cloudResource->envId = $this->getEnvironmentId(); $cloudResource->farmId = $this->getParam('farmId'); $cloudResource->save(); } $this->response->success("DB Instance successfully created"); } else { $this->response->failure($errorMessage); } }
public static function farmUpdateRoleSettings(DBFarmRole $DBFarmRole, $oldSettings, $newSettings) { //Conver OLD ELB settings into NEW ELB SETTINGS if ($newSettings[DBFarmRole::SETTING_BALANCING_USE_ELB] == 1 && !$newSettings[DBFarmRole::SETTING_AWS_ELB_ENABLED]) { $newSettings[DBFarmRole::SETTING_AWS_ELB_ENABLED] = 1; $newSettings[DBFarmRole::SETTING_AWS_ELB_ID] = $newSettings[DBFarmRole::SETTING_BALANCING_NAME]; $DBFarmRole->SetSetting(DBFarmRole::SETTING_AWS_ELB_ENABLED, 1, DBFarmRole::TYPE_CFG); $DBFarmRole->SetSetting(DBFarmRole::SETTING_AWS_ELB_ID, $newSettings[DBFarmRole::SETTING_BALANCING_NAME], DBFarmRole::TYPE_LCL); } //NEW ELB: try { $DBFarm = $DBFarmRole->GetFarmObject(); $elb = $DBFarm->GetEnvironmentObject()->aws($DBFarmRole)->elb; /* * aws.elb.enabled * aws.elb.id":"scalr-97f8a108ce4100-775", * aws.elb.remove */ if ($newSettings[DBFarmRole::SETTING_AWS_ELB_ENABLED] && $newSettings[DBFarmRole::SETTING_AWS_ELB_ID]) { if ($oldSettings[DBFarmRole::SETTING_AWS_ELB_ID] == $newSettings[DBFarmRole::SETTING_AWS_ELB_ID]) { return true; } $service = CloudResource::findPk($newSettings[DBFarmRole::SETTING_AWS_ELB_ID], $DBFarm->EnvID, \SERVER_PLATFORMS::EC2, $DBFarmRole->CloudLocation); if (!$service) { // Setup new service // ADD ELB to role_cloud_services $service = new CloudResource(); $service->id = $newSettings[DBFarmRole::SETTING_AWS_ELB_ID]; $service->type = CloudResource::TYPE_AWS_ELB; $service->platform = \SERVER_PLATFORMS::EC2; $service->cloudLocation = $DBFarmRole->CloudLocation; $service->envId = $DBFarm->EnvID; $service->farmId = $DBFarmRole->FarmID; $service->farmRoleId = $DBFarmRole->ID; } else { if ($service->envId == $DBFarmRole->GetFarmObject()->EnvID) { $service->farmRoleId = $DBFarmRole->ID; $service->farmId = $DBFarmRole->FarmID; } else { $DBFarmRole->SetSetting(DBFarmRole::SETTING_AWS_ELB_ID, $oldSettings[DBFarmRole::SETTING_AWS_ELB_ID]); throw new \Exception("ELB already used on another scalr account/environment"); } } $service->save(); // Add running instances to ELB $servers = $DBFarmRole->GetServersByFilter(array('status' => \SERVER_STATUS::RUNNING)); $newInstances = array(); foreach ($servers as $DBServer) { $newInstances[] = $DBServer->GetProperty(\EC2_SERVER_PROPERTIES::INSTANCE_ID); } try { if (count($newInstances) > 0) { $elb->loadBalancer->registerInstances($newSettings[DBFarmRole::SETTING_AWS_ELB_ID], $newInstances); } } catch (\Exception $e) { } try { //Check and deregister old instances instances $list = $elb->loadBalancer->describeInstanceHealth($newSettings[DBFarmRole::SETTING_AWS_ELB_ID], array()); /* @var $instance \Scalr\Service\Aws\Elb\DataType\InstanceStateData */ $instances = array(); foreach ($list as $instance) { if (!in_array($instance->instanceId, $newInstances)) { array_push($instances, $instance->instanceId); } } if (count($instances) > 0) { $elb->loadBalancer->deregisterInstances($newSettings[DBFarmRole::SETTING_AWS_ELB_ID], $instances); } } catch (\Exception $e) { } } else { $clearSettings = true; } // Remove OLD ELB if ($oldSettings[DBFarmRole::SETTING_AWS_ELB_ID]) { $oldService = CloudResource::findPk($oldSettings[DBFarmRole::SETTING_AWS_ELB_ID], $DBFarm->EnvID, \SERVER_PLATFORMS::EC2, $DBFarmRole->CloudLocation); if ($oldService && $oldService->farmRoleId == $DBFarmRole->ID) { $oldService->delete(); } if ($newSettings['aws.elb.remove']) { $elb->loadBalancer->delete($oldSettings[DBFarmRole::SETTING_AWS_ELB_ID]); } } if ($clearSettings) { $DBFarmRole->ClearSettings("aws.elb."); } // Check and remove OLD ELB settings if ($newSettings['aws.elb.enabled'] && $DBFarmRole->GetSetting(DBFarmRole::SETTING_BALANCING_HOSTNAME)) { $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_NAME, null, DBFarmRole::TYPE_LCL); $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_HOSTNAME, null, DBFarmRole::TYPE_LCL); $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_USE_ELB, null, DBFarmRole::TYPE_LCL); $DBFarmRole->SetSetting(DBFarmRole::SETTING_BALANCING_HC_HASH, null, DBFarmRole::TYPE_LCL); $DBFarmRole->ClearSettings("lb.avail_zone"); $DBFarmRole->ClearSettings("lb.healthcheck"); $DBFarmRole->ClearSettings("lb.role.listener"); } } catch (\Exception $e) { throw new \Exception("Error with ELB on Role '{$DBFarmRole->GetRoleObject()->name}': {$e->getMessage()}"); } }