public function xCreateAction() { $this->request->defineParams(array('listeners' => array('type' => 'json'), 'healthcheck' => array('type' => 'json'), 'zones' => array('type' => 'array'), 'subnets' => array('type' => 'array'), 'scheme' => array('type' => 'string'))); $healthCheck = $this->getParam('healthcheck'); $elb = $this->environment->aws($this->getParam('cloudLocation'))->elb; //prepare listeners $listenersList = new ListenerList(); $li = 0; foreach ($this->getParam('listeners') as $listener) { $listener_chunks = explode("#", $listener); $listenersList->append(new ListenerData(trim($listener_chunks[1]), trim($listener_chunks[2]), trim($listener_chunks[0]), null, trim($listener_chunks[3]))); } $availZones = $this->getParam('zones'); $subnets = $this->getParam('subnets'); $scheme = $this->getParam('scheme'); $elb_name = sprintf("scalr-%s-%s", Scalr_Util_CryptoTool::sault(10), rand(100, 999)); $healthCheckType = new HealthCheckData(); $healthCheckType->target = $healthCheck['target']; $healthCheckType->healthyThreshold = $healthCheck['healthyThreshold']; $healthCheckType->interval = $healthCheck['interval']; $healthCheckType->timeout = $healthCheck['timeout']; $healthCheckType->unhealthyThreshold = $healthCheck['unhealthyThreshold']; //Creates a new ELB $dnsName = $elb->loadBalancer->create($elb_name, $listenersList, !empty($availZones) ? $availZones : null, !empty($subnets) ? $subnets : null, null, !empty($scheme) ? $scheme : null); try { $elb->loadBalancer->configureHealthCheck($elb_name, $healthCheckType); } catch (Exception $e) { $elb->loadBalancer->delete($elb_name); throw $e; } // return all as in xListElb $this->response->data(array('elb' => array('name' => $elb_name, 'dnsName' => $dnsName))); }
public function xCreateAction() { $this->request->defineParams(array('listeners' => array('type' => 'json'), 'healthcheck' => array('type' => 'json'), 'zones' => array('type' => 'array'), 'subnets' => array('type' => 'array'), 'scheme' => array('type' => 'string'))); $healthCheck = $this->getParam('healthcheck'); $elb = $this->environment->aws($this->getParam('cloudLocation'))->elb; //prepare listeners $listenersList = new ListenerList(); $li = 0; foreach ($this->getParam('listeners') as $listener) { $listener_chunks = explode("#", $listener); $listenersList->append(new ListenerData(trim($listener_chunks[1]), trim($listener_chunks[2]), trim($listener_chunks[0]), null, trim($listener_chunks[3]))); } $availZones = $this->getParam('zones'); $subnets = $this->getParam('subnets'); $scheme = $this->getParam('scheme'); $elb_name = sprintf("scalr-%s-%s", CryptoTool::sault(10), rand(100, 999)); $healthCheckType = new HealthCheckData(); $healthCheckType->target = $healthCheck['target']; $healthCheckType->healthyThreshold = $healthCheck['healthyThreshold']; $healthCheckType->interval = $healthCheck['interval']; $healthCheckType->timeout = $healthCheck['timeout']; $healthCheckType->unhealthyThreshold = $healthCheck['unhealthyThreshold']; //Creates a new ELB $dnsName = $elb->loadBalancer->create($elb_name, $listenersList, !empty($availZones) ? $availZones : null, !empty($subnets) ? $subnets : null, null, !empty($scheme) ? $scheme : null); $tags = [['key' => \Scalr_Governance::SCALR_META_TAG_NAME, 'value' => $this->environment->applyGlobalVarsToValue(\Scalr_Governance::SCALR_META_TAG_VALUE)]]; //Tags governance $governance = new \Scalr_Governance($this->environment->id); $gTags = (array) $governance->getValue('ec2', \Scalr_Governance::AWS_TAGS); if (count($gTags) > 0) { foreach ($gTags as $tKey => $tValue) { $tags[] = array('key' => $tKey, 'value' => $this->environment->applyGlobalVarsToValue($tValue)); } } $elb->loadBalancer->addTags($elb_name, $tags); try { $elb->loadBalancer->configureHealthCheck($elb_name, $healthCheckType); } catch (Exception $e) { $elb->loadBalancer->delete($elb_name); throw $e; } // return all as in xListElb $this->response->data(array('elb' => array('name' => $elb_name, 'dnsName' => $dnsName))); }
/** * CreateLoadBalancerListeners action * * Creates one or more listeners on a LoadBalancer for the specified port. If a listener with the given port * does not already exist, it will be created; otherwise, the properties of the new listener must match the * properties of the existing listener. * * @param string $loadBalancerName A load balancer name. * @param ListenerList $listenersList An ListenerList object that holds list of LoadBalancerPort, * InstancePort, Protocol, Yes and SSLCertificateId items. * @return boolean Returns TRUE if listeners are successfully created. * @throws ClientException */ public function createLoadBalancerListeners($loadBalancerName, ListenerList $listenersList) { $result = false; $options = array('LoadBalancerName' => (string) $loadBalancerName); $options = array_merge($options, $listenersList->getQueryArray()); $response = $this->client->call('CreateLoadBalancerListeners', $options); if ($response->getError() === false) { //Success /* @var $loadBalancer LoadBalancerDescriptionData */ $loadBalancer = $this->elb->loadBalancer->get($options['LoadBalancerName']); if ($loadBalancer !== null) { //Updates listenerDescriptions for the LoadBalancer object. if ($loadBalancer->listenerDescriptions instanceof ListenerDescriptionList || $loadBalancer->listenerDescriptions !== $listenersList) { $old = array(); /* @var $listener ListenerData */ foreach ($loadBalancer->listenerDescriptions->getComputed() as $listener) { //Listeners are removed by loadBalancerPort, so we use it as primary key //to compare. $old[$listener->loadBalancerPort] = $listener; } //Append to existing load balancer new listeners which have just been created. foreach ($listenersList as $listener) { if (!array_key_exists($listener->loadBalancerPort, $old)) { $listenerDescription = new ListenerDescriptionData(); $listenerDescription->setElb($this->elb); $listenerDescription->listener = $listener; $loadBalancer->listenerDescriptions->append($listenerDescription); unset($listenerDescription); } //It's not allowed to change an existing lisntener properties //in this api method. It will cause DuplicateListener error, therefore //it's no sence to update listener's properties which are received from response. } unset($old); } } $result = true; } return $result; }
/** * {@inheritdoc} * @see Scalr\Service\Aws\DataType.ListDataType::getQueryArray() */ public function getQueryArray($uriParameterName = 'Listeners', $member = true) { //Returns listeners parameters $listenerList = new ListenerList($this->getComputed()); return $listenerList->getQueryArray($uriParameterName); }
/** * @param string $cloudLocation Ec2 Region * @param JsonData $listeners Listeners list * @param bool $crossLoadBalancing Enable Cross balancing * @param JsonData $healthcheck Health check data * @param string $scheme optional Scheme * @param JsonData $securityGroups optional Security groups * @param string $vpcId optional Vpc id * @param JsonData $zones optional Availability zones * @param JsonData $subnets optional Subnets * @param string $name optional Name * @throws Exception */ public function xCreateAction($cloudLocation, JsonData $listeners, $crossLoadBalancing, JsonData $healthcheck, $scheme = null, JsonData $securityGroups = null, $vpcId = null, JsonData $zones = null, JsonData $subnets = null, $name = null) { $this->request->restrictAccess(Acl::RESOURCE_AWS_ELB, Acl::PERM_AWS_ELB_MANAGE); $elb = $this->environment->aws($cloudLocation)->elb; //prepare listeners $listenersList = new ListenerList(); foreach ($listeners as $listener) { $listener_chunks = explode("#", $listener); $listenersList->append(new ListenerData(trim($listener_chunks[1]), trim($listener_chunks[2]), trim($listener_chunks[0]), null, trim($listener_chunks[3]))); } $zones = !empty($zones) ? (array) $zones : null; $subnets = !empty($subnets) ? (array) $subnets : null; if (empty($name)) { $name = sprintf("scalr-%s-%s", CryptoTool::sault(10), rand(100, 999)); } else { if (!preg_match('/^[-a-zA-Z0-9]+$/', $name)) { throw new Exception('Load Balancer names must only contain alphanumeric characters or dashes.'); } } $healthCheckType = new HealthCheckData(); $healthCheckType->target = $healthcheck['target']; $healthCheckType->healthyThreshold = $healthcheck['healthyThreshold']; $healthCheckType->interval = $healthcheck['interval']; $healthCheckType->timeout = $healthcheck['timeout']; $healthCheckType->unhealthyThreshold = $healthcheck['unhealthyThreshold']; $securityGroupIds = []; foreach ($securityGroups as $securityGroup) { $securityGroupIds[] = $securityGroup['id']; } $result = self::loadController('Aws', 'Scalr_UI_Controller_Tools')->checkSecurityGroupsPolicy($securityGroups, Aws::SERVICE_INTERFACE_ELB); if ($result === true) { $result = self::loadController('Aws', 'Scalr_UI_Controller_Tools')->checkVpcPolicy($vpcId, $subnets, $cloudLocation); } if ($result !== true) { throw new Exception($result); } //Creates a new ELB $dnsName = $elb->loadBalancer->create($name, $listenersList, $zones, $subnets, !empty($securityGroupIds) ? $securityGroupIds : null, !empty($scheme) ? $scheme : null); if ($crossLoadBalancing) { $attributes = new AttributesData(); $attributes->setCrossZoneLoadBalancing(new CrossZoneLoadBalancingData($crossLoadBalancing)); $requestData = new ModifyLoadBalancerAttributes($name, $attributes); $elb->loadBalancer->modifyAttributes($requestData); } $elb->loadBalancer->addTags($name, $this->getEnvironment()->getAwsTags()); try { $elb->loadBalancer->configureHealthCheck($name, $healthCheckType); } catch (Exception $e) { $elb->loadBalancer->delete($name); throw $e; } $lb = $elb->loadBalancer->describe($name)->get(0); // return all as in xListElb $this->response->data(['elb' => ['name' => $name, 'dnsName' => $dnsName, 'dtcreated' => $lb->createdTime->format('c'), 'subnets' => $lb->subnets]]); }