Scalr\Tests\Service\Aws\ElbTest::testFunctionalLoadBalancerComplex PHP Method

testFunctionalLoadBalancerComplex() public method

    public function testFunctionalLoadBalancerComplex()
    {
        $this->skipIfEc2PlatformDisabled();
        $aws = $this->elb->getAws();
        $aws->ec2->enableEntityManager();
        $aws->getEntityManager()->detachAll();
        $nameTag = new ResourceTagSetData('Name', self::getTestName('elb'));
        $loadBalancerName = self::getTestName(self::LB_NAME_FUNC_TEST);
        $loadBalancer = $this->createLoadBalancerGently($loadBalancerName, array(array('loadBalancerPort' => 80, 'instancePort' => 1024, 'protocol' => 'HTTP', 'sslCertificateId' => null)), $aws->ec2->availabilityZone->describe(AwsTestCase::AVAILABILITY_ZONE_A));
        $this->assertInstanceOf(self::CLASS_LOAD_BALANCER_DESCRIPTION_DATA, $loadBalancer, 'Could not create load balancer');
        //We should clean up the instances that were created by this test before but had not been terminated.
        $reservationsList = $aws->ec2->instance->describe(null, new InstanceFilterData(InstanceFilterNameType::tag('Name'), self::getTestName('elb')));
        $this->assertInstanceOf($this->getEc2ClassName('DataType\\ReservationList'), $reservationsList);
        foreach ($reservationsList as $r) {
            /* @var $i \Scalr\Service\Aws\Ec2\DataType\InstanceData */
            foreach ($r->instancesSet as $i) {
                $ds = $i->describeStatus();
                if ($ds->instanceState->name == InstanceStateData::NAME_RUNNING) {
                    $i->terminate();
                }
            }
        }
        unset($reservationsList);
        try {
            $listener1 = new ListenerData(1025, 1025, 'HTTP');
            $ret = $loadBalancer->createListeners(array($listener1, new ListenerData(1026, 1026, 'HTTP')));
            $this->assertTrue($ret, 'Could not create listeners');
            $this->assertEquals(spl_object_hash($listener1), spl_object_hash($loadBalancer->listenerDescriptions->get(1)->listener));
            $a = array();
            foreach ($loadBalancer->listenerDescriptions as $listenerDescription) {
                if (!isset($a[(string) $listenerDescription->listener])) {
                    $a[(string) $listenerDescription->listener] = '';
                }
                $a[(string) $listenerDescription->listener] .= (string) $listenerDescription->listener;
            }
            $mapping = array();
            $newListenerDescriptions = $this->elb->loadBalancer->describe($loadBalancerName)->get(0)->listenerDescriptions;
            /* @var $listenerDescription ListenerDescriptionData */
            foreach ($newListenerDescriptions as $k => $listenerDescription) {
                $mapping[$listenerDescription->listener->loadBalancerPort] = $k;
                $this->assertArrayHasKey((string) $listenerDescription->listener, $a, 'LoadBalancerDescription->listener object has not been updated properly.');
            }
            $ret = $loadBalancer->createListeners();
            $this->assertTrue($ret, 'Cannot create listeners from loadBalancer instance itself.');
            try {
                $ret = $listener1->setPolicies('policy-of-listener-1');
                $this->assertTrue(false, 'Exception must be thrown here.');
            } catch (ClientException $e) {
                $this->assertEquals(ErrorData::ERR_POLICY_NOT_FOUND, $e->getErrorData()->getCode());
            }
            $ret = $loadBalancer->listenerDescriptions->get($mapping[1026])->delete();
            $this->assertTrue($ret, 'Cannot remove listener');
            foreach ($loadBalancer->listenerDescriptions as $listenerDescription) {
                $this->assertNotEquals(1026, $listenerDescription->listener->loadBalancerPort);
            }
            $ret = $this->elb->loadBalancer->enableAvailabilityZones($loadBalancerName, AwsTestCase::AVAILABILITY_ZONE_D);
            $this->assertContains(AwsTestCase::AVAILABILITY_ZONE_D, $ret);
            $this->assertEquals($ret, $loadBalancer->availabilityZones);
            $ret = $loadBalancer->disableAvailabilityZones(AwsTestCase::AVAILABILITY_ZONE_A);
            $this->assertNotContains(AwsTestCase::AVAILABILITY_ZONE_A, $ret);
            $this->assertEquals($ret, $loadBalancer->availabilityZones);
            //It depends from the instance which should be created before this test.
            //RunInstance test
            $request = new RunInstancesRequestData('ami-82fa58eb', 1, 1);
            $request->instanceType = 'm1.small';
            $placement = new PlacementResponseData();
            $placement->availabilityZone = AwsTestCase::AVAILABILITY_ZONE_A;
            $request->setPlacement($placement);
            $rd = $aws->ec2->instance->run($request);
            $this->assertInstanceOf($this->getEc2ClassName('DataType\\ReservationData'), $rd);
            /* @var $ind \Scalr\Service\Aws\Ec2\DataType\InstanceData */
            $ind = $rd->instancesSet[0];
            unset($request);
            //Sometimes it can't find recently created instance.
            sleep(8);
            //Creates the tag for the instance
            $res = $ind->createTags(array($nameTag, array('key' => 'Extratag', 'value' => 'extravalue')));
            $this->assertTrue($res);
            //Instance state must be in the running state
            $maxTimeout = 300;
            $interval = 2;
            while ($ind->instanceState->name !== InstanceStateData::NAME_RUNNING && $maxTimeout > 0) {
                sleep($interval);
                $maxTimeout -= $interval;
                $interval *= 2;
                $ind = $ind->refresh();
            }
            $this->assertEquals(InstanceStateData::NAME_RUNNING, $ind->instanceState->name);
            $instanceList = $loadBalancer->registerInstances($ind->instanceId);
            $this->assertContains($ind->instanceId, $instanceList->getQueryArray());
            $this->assertEquals($instanceList, $this->elb->loadBalancer->get($loadBalancerName)->instances);
            $this->assertEquals($instanceList, $loadBalancer->instances);
            $instanceStateList = $loadBalancer->describeInstanceHealth();
            $this->assertInstanceOf(self::CLASS_INSTANCE_STATE_LIST, $instanceStateList);
            $this->assertContains($ind->instanceId, $instanceStateList->getQueryArray());
            /* @var $instanceData InstanceData */
            foreach ($loadBalancer->instances as $instanceData) {
                $h = $instanceData->describeHealth();
                $this->assertInstanceOf(self::CLASS_INSTANCE_STATE_LIST, $h);
                $this->assertEquals(1, count($h));
                $this->assertContains($instanceData->instanceId, $h->getQueryArray());
            }
            $dInstanceList = $loadBalancer->deregisterInstances($ind->instanceId);
            $this->assertEmpty($dInstanceList->getQueryArray());
            $this->assertEmpty($loadBalancer->instances->getQueryArray());
            $ind->terminate();
            $loadBalancer->healthCheck->setInterval(29)->setTimeout(4)->setHealthyThreshold(9);
            $ret = $loadBalancer->healthCheck->configure();
            $this->assertEquals(spl_object_hash($ret), spl_object_hash($loadBalancer->healthCheck));
            $this->assertEquals($loadBalancer->healthCheck->interval, 29);
            $this->assertEquals($loadBalancer->healthCheck->timeout, 4);
            $this->assertEquals($loadBalancer->healthCheck->healthyThreshold, 9);
            try {
                foreach ($loadBalancer->listenerDescriptions as $listenerDescription) {
                    if ($listenerDescription->listener->loadBalancerPort == 80) {
                        $listenerDescription->updateSslCertificate('invalid-sertificate-id-test');
                    }
                }
                $this->assertTrue(false, 'ClientException must be thrown here.');
            } catch (ClientException $e) {
                $this->assertEquals(ErrorData::ERR_INVALID_CONFIGURATION_REQUEST, $e->getErrorData()->getCode());
            }
            $ret = $loadBalancer->createAppCookieStickinessPolicy('test-policy-1', 'test_cookie_1');
            $this->assertTrue($ret);
            $this->assertInstanceOf(self::CLASS_APP_COOKIE_STICKINESS_POLICY_LIST, $loadBalancer->policies->appCookieStickinessPolicies);
            $this->assertEquals(1, count($loadBalancer->policies->appCookieStickinessPolicies));
            $this->assertEquals('test-policy-1', $loadBalancer->policies->appCookieStickinessPolicies->get(0)->policyName);
            $this->assertEquals('test_cookie_1', $loadBalancer->policies->appCookieStickinessPolicies->get(0)->cookieName);
            $ret = $loadBalancer->createLbCookieStickinessPolicy('test-lb-policy-1', 1111111111);
            $this->assertTrue($ret);
            $this->assertInstanceOf(self::CLASS_LB_COOKIE_STICKINESS_POLICY_LIST, $loadBalancer->policies->lbCookieStickinessPolicies);
            $this->assertEquals(1, count($loadBalancer->policies->lbCookieStickinessPolicies));
            $this->assertEquals('test-lb-policy-1', $loadBalancer->policies->lbCookieStickinessPolicies->get(0)->policyName);
            $this->assertEquals(1111111111, $loadBalancer->policies->lbCookieStickinessPolicies->get(0)->cookieExpirationPeriod);
            $policy = new AppCookieStickinessPolicyData('app-policy-2');
            $loadBalancer->policies->appCookieStickinessPolicies->append($policy);
            $ret = $policy->create('app_cookie_2');
            $this->assertTrue($ret);
            $this->assertEquals(spl_object_hash($policy), spl_object_hash($loadBalancer->policies->appCookieStickinessPolicies->get(1)));
            unset($policy);
            $ret = $loadBalancer->policies->appCookieStickinessPolicies->get(1)->delete();
            $this->assertTrue($ret);
            $this->assertEquals(1, count($loadBalancer->policies->appCookieStickinessPolicies));
            $this->assertNotContains('app-policy-2', $loadBalancer->policies->appCookieStickinessPolicies->getQueryArray());
            $ret = $loadBalancer->policies->lbCookieStickinessPolicies->get(0)->delete();
            $this->assertTrue($ret);
            $this->assertEquals(0, count($loadBalancer->policies->lbCookieStickinessPolicies));
        } catch (\Exception $e) {
            $loadBalancer->delete();
            throw $e;
        }
        $ret = $loadBalancer->delete();
        $this->assertTrue($ret, 'Could not delete loadbalancer');
        unset($loadBalancer);
    }