public function xListElbAction() { $aws = $this->getEnvironment()->aws($this->getParam('cloudLocation')); $response = $aws->elb->describeLoadBalancers(); $data = array(); /* @var $elb \Scalr\Service\Aws\Elb\DataType\LoadBalancerDescriptionData */ foreach ($response as $elb) { $info = array('name' => $elb->loadBalancerName, 'hostname' => $elb->dnsName); $farmRoleService = CloudResource::findPk($elb->loadBalancerName, CloudResource::TYPE_AWS_ELB, $this->environment->id, \SERVER_PLATFORMS::EC2, $this->getParam('cloudLocation')); if ($farmRoleService) { $dbFarmRole = DBFarmRole::LoadByID($farmRoleService->farmRoleId); $info['used'] = true; $info['farmRoleId'] = $dbFarmRole->ID; $info['farmId'] = $dbFarmRole->FarmID; $info['roleName'] = $dbFarmRole->GetRoleObject()->name; $info['farmName'] = $dbFarmRole->GetFarmObject()->Name; } //OLD notation try { $farmRoleId = $this->db->GetOne("SELECT farm_roleid FROM farm_role_settings WHERE name='lb.name' AND value=? LIMIT 1", array($elb->loadBalancerName)); if ($farmRoleId) { $dbFarmRole = DBFarmRole::LoadByID($farmRoleId); $info['used'] = true; $info['farmRoleId'] = $dbFarmRole->ID; $info['farmId'] = $dbFarmRole->FarmID; $info['roleName'] = $dbFarmRole->GetRoleObject()->name; $info['farmName'] = $dbFarmRole->GetFarmObject()->Name; } } catch (Exception $e) { } $data[] = $info; } $this->response->data(array('data' => $data)); }
/** * Get db instance details * * @param Aws $aws * @param DBInstanceData $dbinstance * @param SecurityGroupList|null $vpcSglist optional * @param DBClusterList|null $clusters optional * @return mixed * @throws Scalr_Exception_Core */ private function getDbInstanceData(Aws $aws, DBInstanceData $dbinstance, $vpcSglist = null, $clusters = null) { $cloudLocation = $aws->getRegion(); $createdTime = $dbinstance->instanceCreateTime; $dbinstance = $dbinstance->toArray(true); foreach ($dbinstance['VpcSecurityGroups'] as &$vpcSg) { $vpcSecurityGroupName = null; if (isset($vpcSglist)) { foreach ($vpcSglist as $vpcSqData) { /* @var $vpcSqData \Scalr\Service\Aws\Ec2\DataType\SecurityGroupData */ if ($vpcSqData->groupId == $vpcSg['VpcSecurityGroupId']) { $vpcSecurityGroupName = $vpcSqData->groupName; $vpcId = $vpcSqData->vpcId; break; } } } $vpcSg = ['vpcSecurityGroupId' => $vpcSg['VpcSecurityGroupId'], 'vpcSecurityGroupName' => $vpcSecurityGroupName]; } $dbinstance['VpcId'] = !empty($vpcId) ? $vpcId : null; $dbinstance['DBSubnetGroupName'] = isset($dbinstance['DBSubnetGroup']['DBSubnetGroupName']) ? $dbinstance['DBSubnetGroup']['DBSubnetGroupName'] : null; foreach ($dbinstance['DBSecurityGroups'] as &$dbSg) { $dbSg = $dbSg['DBSecurityGroupName']; } foreach ($dbinstance['OptionGroupMembership'] as &$member) { $dbinstance['OptionGroupName'] = $member['OptionGroupName']; break; } foreach ($dbinstance['DBParameterGroups'] as &$param) { $dbinstance['DBParameterGroup'] = $param['DBParameterGroupName']; break; } $dbinstance['Address'] = $dbinstance['Endpoint']['Address']; $dbinstance['Port'] = (string) $dbinstance['Endpoint']['Port']; $dbinstance['InstanceCreateTime'] = Scalr_Util_DateTime::convertTz($createdTime); $dbinstance['AllocatedStorage'] = (string) $dbinstance['AllocatedStorage']; if ($dbinstance['StorageEncrypted']) { /* @var $key Aws\Kms\DataType\AliasData */ foreach ($aws->kms->alias->list() as $key) { if (str_replace($key->aliasName, "key/{$key->targetKeyId}", $key->aliasArn) == $dbinstance['KmsKeyId']) { $dbinstance['KmsKeyId'] = $key->aliasName; break; } } } if (!empty($dbinstance['DBClusterIdentifier']) && isset($clusters)) { foreach ($clusters as $cluster) { /* @var $cluster DBClusterData */ if ($cluster->dBClusterIdentifier == $dbinstance['DBClusterIdentifier']) { foreach ($cluster->dBClusterMembers as $member) { /* @var $member ClusterMemberData */ if ($dbinstance['DBInstanceIdentifier'] == $member->dBInstanceIdentifier) { $dbinstance['isReplica'] = !$member->isClusterWriter; break; } } $dbinstance['MultiAZ'] = true; break; } } } else { $dbinstance['isReplica'] = !empty($dbinstance['ReadReplicaSourceDBInstanceIdentifier']) ? true : false; $dbinstance['MultiAZ'] = $dbinstance['MultiAZ']; } /* @var $cloudResource CloudResource */ $cloudResource = CloudResource::findPk($dbinstance['DBInstanceIdentifier'], CloudResource::TYPE_AWS_RDS, $this->getEnvironmentId(), \SERVER_PLATFORMS::EC2, $cloudLocation); if ($cloudResource) { $dbinstance['farmId'] = $cloudResource->farmId; $dbinstance['farmName'] = $this->db->GetOne("SELECT name FROM farms WHERE id=? LIMIT 1", [$cloudResource->farmId]); } return $dbinstance; }
/** * xListInstancesAction * * @param string $cloudLocation DB Instance region * @throws Scalr_Exception_Core */ public function xListInstancesAction($cloudLocation) { $this->request->defineParams(['sort' => ['type' => 'json', 'default' => ['property' => 'id', 'direction' => 'ASC']]]); $aws = $this->getEnvironment()->aws($cloudLocation); $rows = $aws->rds->dbInstance->describe(); $data = []; foreach ($rows as $dbInstance) { /* @var $dbInstance \Scalr\Service\Aws\Rds\DataType\DBInstanceData */ $data[] = array('engine' => (string) $dbInstance->engine, 'status' => (string) $dbInstance->dBInstanceStatus, 'hostname' => isset($dbInstance->endpoint) ? (string) $dbInstance->endpoint->address : '', 'port' => isset($dbInstance->endpoint) ? (string) $dbInstance->endpoint->port : '', 'name' => (string) $dbInstance->dBInstanceIdentifier, 'username' => (string) $dbInstance->masterUsername, 'type' => (string) $dbInstance->dBInstanceClass, 'storage' => (string) $dbInstance->allocatedStorage, 'dtadded' => $dbInstance->instanceCreateTime, 'avail_zone' => (string) $dbInstance->availabilityZone, 'engineVersion' => $dbInstance->engineVersion, 'multiAz' => $dbInstance->multiAZ, 'isReplica' => !empty($dbInstance->readReplicaSourceDBInstanceIdentifier) ? 1 : 0); } $response = $this->buildResponseFromData($data, ['name']); foreach ($response['data'] as &$row) { $row['dtadded'] = $row['dtadded'] ? Scalr_Util_DateTime::convertTz($row['dtadded']) : ''; $cloudResource = CloudResource::findPk($row['name'], $this->getEnvironmentId(), \SERVER_PLATFORMS::EC2, $cloudLocation); if ($cloudResource) { $row['farmId'] = $cloudResource->farmId; $row['farmName'] = $this->db->GetOne("SELECT name FROM farms WHERE id=? LIMIT 1", [$cloudResource->farmId]); } } $this->response->data($response); }
/** * @param string $cloudLocation Ec2 region * @param string $placement optional Placement * @param int $limit optional Limit * @throws Exception * @throws Scalr_Exception_Core */ public function xListElasticLoadBalancersAction($cloudLocation, $placement = null, $limit = null) { // We're using this method in dropdown in farm settings to get list of available ELBs // We need to ignore limit, because otherwise only first 20 ELBs are available in farm $ignoreLimit = !isset($limit) || !$limit ? true : false; $elb = $this->getEnvironment()->aws($cloudLocation)->elb; if ($placement == 'ec2') { $p = PlatformFactory::NewPlatform(SERVER_PLATFORMS::EC2); $defaultVpc = $p->getDefaultVpc($this->environment, $cloudLocation); if ($defaultVpc) { $placement = $defaultVpc; } } $rowz1 = []; /* @var $lb LoadBalancerDescriptionData */ foreach ($elb->loadBalancer->describe() as $lb) { if ($placement) { if ($placement == 'ec2' && $lb->vpcId != null) { continue; } if ($placement != 'ec2' && $lb->vpcId != $placement) { continue; } } $info = ["name" => $lb->loadBalancerName, "dtcreated" => $lb->createdTime->format('c'), "dnsName" => $lb->dnsName, "availZones" => $lb->availabilityZones, "subnets" => $lb->subnets, "vpcId" => $lb->vpcId]; $farmRoleService = CloudResource::findPk($lb->loadBalancerName, CloudResource::TYPE_AWS_ELB, $this->getEnvironmentId(), \SERVER_PLATFORMS::EC2, $cloudLocation); /* @var $farmRoleService CloudResource*/ if ($farmRoleService) { $dbFarmRole = DBFarmRole::LoadByID($farmRoleService->farmRoleId); $info['used'] = true; $info['farmRoleId'] = $dbFarmRole->ID; $info['farmId'] = $dbFarmRole->FarmID; $info['roleName'] = $dbFarmRole->GetRoleObject()->name; $info['farmName'] = $dbFarmRole->GetFarmObject()->Name; } $rowz1[] = $info; } $response = $this->buildResponseFromData($rowz1, ['name', 'dnsname', 'farmName', 'roleName'], $ignoreLimit); foreach ($response['data'] as $k => $row) { $response['data'][$k]['dtcreated'] = Scalr_Util_DateTime::convertTz($row['dtcreated']); } $this->response->data($response); }
/** * xRestoreClusterAction * * @param string $cloudLocation Ec2 region * @param string $DBClusterIdentifier DBClusterIdentifier field * @param string $DBSnapshotIdentifier DBSnapshotIdentifier field * @param string $Engine Aurora engine * @param string $VpcId Vpc id * @param int $Port Port value * @param string $DBInstanceClass Db instance class * @param bool $PublicAccessible True if instance is public accessible * @param RawData $MasterUserPassword DB Password * @param JsonData $SubnetIds optional List of subnet ids * @param string $OptionGroupName optional Option group name * @param JsonData $AvailabilityZones optional List of availability zones * @param string $DBSubnetGroupName optional Subnet group name * @param bool $AutoMinorVersionUpgrade optional Auto minor version upgrade */ public function xRestoreClusterAction($cloudLocation, $DBClusterIdentifier, $DBSnapshotIdentifier, $Engine, $VpcId, $Port, $DBInstanceClass, $PublicAccessible, RawData $MasterUserPassword, JsonData $SubnetIds = null, $OptionGroupName = null, JsonData $AvailabilityZones = null, $DBSubnetGroupName = null, $AutoMinorVersionUpgrade = null) { $this->request->restrictAccess(Acl::RESOURCE_AWS_RDS, Acl::PERM_AWS_RDS_MANAGE); $aws = $this->getAwsClient($cloudLocation); $request = new RestoreDBClusterFromSnapshotRequestData($DBClusterIdentifier, $DBSnapshotIdentifier); //NOTE: Options groups currently not supported for db clusters // $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; // } $request->port = $Port ?: null; $request->availabilityZones = count($AvailabilityZones) > 0 ? (array) $AvailabilityZones : null; $request->dBSubnetGroupName = $DBSubnetGroupName ?: null; $request->engine = $Engine; $result = self::loadController('Aws', 'Scalr_UI_Controller_Tools')->checkVpcPolicy($VpcId, $SubnetIds, $cloudLocation); if ($result === true) { $restoreResponse = $aws->rds->dbCluster->restoreFromSnapshot($request); try { $instance = $aws->rds->dbInstance->describe($DBClusterIdentifier)->get(); } catch (Exception $e) { $instance = false; } if (!$instance) { $dbInstanceIdentifier = $DBClusterIdentifier; } else { $dbInstanceIdentifier = $DBClusterIdentifier . '-restored'; } $createRequest = new CreateDBInstanceRequestData($dbInstanceIdentifier, $DBInstanceClass, $Engine); $createRequest->dBSubnetGroupName = $DBSubnetGroupName; $createRequest->publiclyAccessible = $PublicAccessible; $createRequest->licenseModel = 'general-public-license'; $createRequest->engineVersion = $restoreResponse->engineVersion; $createRequest->storageType = 'aurora'; $createRequest->setTags($this->environment->getAwsTags()); $createRequest->autoMinorVersionUpgrade = $AutoMinorVersionUpgrade; $createRequest->dBClusterIdentifier = $restoreResponse->dBClusterIdentifier; $aws->rds->dbInstance->create($createRequest); CloudResource::deletePk($dbInstanceIdentifier, CloudResource::TYPE_AWS_RDS, $this->getEnvironmentId(), \SERVER_PLATFORMS::EC2, $cloudLocation); $this->response->success("DB Cluster has been successfully restored from Snapshot"); } else { $this->response->failure($result); } }
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()}"); } }
public function xListElasticLoadBalancersAction() { $this->request->defineParams(array('filters' => array('type' => 'json'))); // We're using this method in dropdown in farm settings to get list of available ELBs // We need to ignore limit, because otherwise only first 20 ELBs are available in farm $ignoreLimit = !$this->getParam('limit') ? true : false; $filters = (array) $this->getParam('filters'); $placement = $this->getParam('placement'); $vpcId = $this->getParam('vpcId'); $elb = $this->getEnvironment()->aws($this->getParam('cloudLocation'))->elb; if (empty($filters['vpcId']) && array_key_exists('vpcId', $filters)) { $p = PlatformFactory::NewPlatform(SERVER_PLATFORMS::EC2); $defaultVpc = $p->getDefaultVpc($this->environment, $this->getParam('cloudLocation')); if ($defaultVpc) { $placement = $defaultVpc; } } if (!empty($vpcId)) { $placement = $vpcId; } $rowz1 = array(); /* @var $lb LoadBalancerDescriptionData */ foreach ($elb->loadBalancer->describe() as $lb) { if ($vpcId && $vpcId != $lb->vpcId) { continue; } if ($placement) { if ($placement == 'ec2' && $lb->vpcId != null) { continue; } if ($placement != 'ec2' && $lb->vpcId != $placement) { continue; } } $roleid = $this->db->GetOne("SELECT farm_roleid FROM farm_role_settings WHERE name=? AND value=? LIMIT 1", array(DBFarmRole::SETTING_AWS_ELB_ID, $lb->dnsName)); $farmId = false; $farmRoleId = false; $farmName = false; $roleName = false; if ($roleid) { try { $DBFarmRole = DBFarmRole::LoadByID($roleid); if ($DBFarmRole instanceof \DBFarmRole && !$this->user->getPermissions()->check($DBFarmRole)) { continue; } $farmId = $DBFarmRole->FarmID; $farmRoleId = $roleid; $farmName = $DBFarmRole->GetFarmObject()->Name; $roleName = $DBFarmRole->GetRoleObject()->name; } catch (Exception $e) { } } $info = array("name" => $lb->loadBalancerName, "dtcreated" => $lb->createdTime->format('c'), "dnsName" => $lb->dnsName, "availZones" => $lb->availabilityZones, "subnets" => $lb->subnets, "vpcId" => $lb->vpcId); $farmRoleService = CloudResource::findPk($lb->loadBalancerName, $this->getEnvironmentId(), \SERVER_PLATFORMS::EC2, $this->getParam('cloudLocation')); if ($farmRoleService) { $dbFarmRole = DBFarmRole::LoadByID($farmRoleService->farmRoleId); $info['used'] = true; $info['farmRoleId'] = $dbFarmRole->ID; $info['farmId'] = $dbFarmRole->FarmID; $info['roleName'] = $dbFarmRole->GetRoleObject()->name; $info['farmName'] = $dbFarmRole->GetFarmObject()->Name; } $rowz1[] = $info; } $response = $this->buildResponseFromData($rowz1, array('name', 'dnsname', 'farmName', 'roleName'), $ignoreLimit); foreach ($response['data'] as $k => $row) { $response['data'][$k]['dtcreated'] = Scalr_Util_DateTime::convertTz($row['dtcreated']); } $this->response->data($response); }
/** * @param string $cloudLocation Ec2 region * @param string $placement optional Placement * @param int $limit optional Limit * @throws Exception * @throws Scalr_Exception_Core */ public function getElasticLoadBalancersList($cloudLocation, $placement = null) { $elb = $this->getEnvironment()->aws($cloudLocation)->elb; if ($placement == 'ec2') { $p = PlatformFactory::NewPlatform(SERVER_PLATFORMS::EC2); $defaultVpc = $p->getDefaultVpc($this->environment, $cloudLocation); if ($defaultVpc) { $placement = $defaultVpc; } } $rowz1 = []; /* @var $lb LoadBalancerDescriptionData */ foreach ($elb->loadBalancer->describe() as $lb) { if ($placement) { if ($placement == 'ec2' && $lb->vpcId != null) { continue; } if ($placement != 'ec2' && $lb->vpcId != $placement) { continue; } } $info = ["name" => $lb->loadBalancerName, "dtcreated" => Scalr_Util_DateTime::convertTz($lb->createdTime->format('c')), "dnsName" => $lb->dnsName, "availZones" => $lb->availabilityZones, "subnets" => $lb->subnets, "vpcId" => $lb->vpcId]; $farmRoleService = CloudResource::findPk($lb->loadBalancerName, CloudResource::TYPE_AWS_ELB, $this->getEnvironmentId(), \SERVER_PLATFORMS::EC2, $cloudLocation); /* @var $farmRoleService CloudResource*/ if ($farmRoleService) { $dbFarmRole = DBFarmRole::LoadByID($farmRoleService->farmRoleId); $info['used'] = true; $info['farmRoleId'] = $dbFarmRole->ID; $info['farmId'] = $dbFarmRole->FarmID; $info['roleName'] = $dbFarmRole->GetRoleObject()->name; $info['farmName'] = $dbFarmRole->GetFarmObject()->Name; $info['farmRoleAlias'] = $dbFarmRole->Alias; } $rowz1[] = $info; } return $rowz1; }