Scalr\Tests\Functional\Api\Service\User\V1beta0\Controller\FarmRolesTest::testComplex PHP Method

testComplex() public method

public testComplex ( )
    public function testComplex()
    {
        $user = $this->getUser();
        $environment = $this->getEnvironment();
        $fictionController = new ApiController();
        /* @var $farm Farm */
        $farm = static::createEntity(new Farm(), ['changedById' => $user->getId(), 'name' => "{$this->uuid}-farm", 'comments' => "{$this->uuid}-description", 'envId' => $environment->id, 'accountId' => $user->getAccountId(), 'ownerId' => $user->getId()]);
        /* @var $roles EntityIterator */
        /* @var $role Role */
        $roles = Role::findByName('base-ubuntu1404');
        if (empty($roles) || !count($roles)) {
            $this->markTestSkipped("Not found suitable role, required role - 'base-ubuntu1404'");
        } else {
            $role = $roles->current();
        }
        //test Governance
        $this->getGovernance();
        /* @var $vpcList VpcList */
        $vpcList = \Scalr::getContainer()->aws(self::TEST_REGION, $this->getEnvironment())->ec2->vpc->describe(self::TEST_VPC_ID);
        /* @var  $vpc VpcData */
        $vpc = $vpcList->current();
        /* @var  $subnetList SubnetList */
        $subnetList = \Scalr::getContainer()->aws(self::TEST_REGION, $this->getEnvironment())->ec2->subnet->describe(null, [['name' => SubnetFilterNameType::vpcId(), 'value' => $vpc->vpcId]]);
        /* @var  $subnet SubnetData */
        $subnet = $subnetList->current();
        //setup test governance
        $vpcId = $vpc->vpcId;
        $subnetId = $subnet->subnetId;
        $governanceConfiguration = [SERVER_PLATFORMS::EC2 => [Scalr_Governance::INSTANCE_TYPE => ['enabled' => true, 'limits' => ['value' => ['t1.micro', 't2.small', 't2.medium', 't2.large'], 'default' => ['t2.small']]], Scalr_Governance::AWS_VPC => ['enabled' => true, 'limits' => ['regions' => [self::TEST_REGION => ['default' => true, 'ids' => [$vpcId]]], 'ids' => [$vpcId => [$subnetId]]]]]];
        $this->setupGovernanceConfiguration($governanceConfiguration);
        //farm role data
        $data = ['role' => ['id' => $role->id], 'alias' => 't-ps', 'platform' => SERVER_PLATFORMS::EC2, 'placement' => ['placementConfigurationType' => FarmRoles::AWS_CLASSIC_PLACEMENT_CONFIGURATION, 'region' => static::TEST_REGION], 'scaling' => ['enabled' => true, 'minInstances' => 2, 'maxInstances' => 3], 'instance' => ['instanceConfigurationType' => FarmRoles::AWS_INSTANCE_CONFIGURATION, 'instanceType' => ['id' => 't1.micro']]];
        //create farmRole with wrong instance type
        $data['instance']['instanceType']['id'] = 'm1.small';
        $response = $this->postFarmRole($farm->id, $data);
        $this->assertErrorMessageContains($response, 400, ErrorMessage::ERR_INVALID_VALUE);
        //Add AWS VPC settings
        $farm->settings[FarmSetting::EC2_VPC_ID] = $vpc->vpcId;
        $farm->settings[FarmSetting::EC2_VPC_REGION] = self::TEST_REGION;
        $farm->save();
        //create farm role with AwsClassicPlacementConfiguration
        $data['instance']['instanceType']['id'] = 't2.small';
        $response = $this->postFarmRole($farm->id, $data);
        $this->assertErrorMessageContains($response, 400, ErrorMessage::ERR_INVALID_STRUCTURE);
        //create farm role with incorrect subnet
        $subnetList->next();
        /* @var  $incorrectSubnet SubnetData */
        $incorrectSubnet = $subnetList->current();
        $data['placement'] = ['region' => self::TEST_REGION, 'placementConfigurationType' => 'AwsVpcPlacementConfiguration', 'subnets' => [['id' => $incorrectSubnet->subnetId]]];
        $response = $this->postFarmRole($farm->id, $data);
        $this->assertErrorMessageContains($response, 400, ErrorMessage::ERR_INVALID_VALUE);
        //create farm role with incorrect region
        $data['placement'] = ['region' => Aws::REGION_US_WEST_1, 'placementConfigurationType' => 'AwsVpcPlacementConfiguration', 'subnets' => [['id' => $subnetId]]];
        $response = $this->postFarmRole($farm->id, $data);
        $this->assertErrorMessageContains($response, 400, ErrorMessage::ERR_INVALID_VALUE);
        //post farm role correct data
        $data['placement']['region'] = self::TEST_REGION;
        $data['alias'] = 't-ps-1';
        $response = $this->postFarmRole($farm->id, $data);
        $this->assertEquals(201, $response->status, $this->printResponseError($response));
        $farmRoleId = $response->getBody()->data->id;
        /* @var $farmRole FarmRole */
        $farmRole = FarmRole::findPk($farmRoleId);
        $this->assertNotEmpty($farmRole);
        $this->farmRoleToDelete($farmRoleId);
        $data['scaling']['rules'] = [];
        $this->assertObjectEqualsEntity($data, $farmRole);
        //Reset AWS VPC settings
        $farm->settings[FarmSetting::EC2_VPC_ID] = null;
        $farm->settings[FarmSetting::EC2_VPC_REGION] = null;
        $farm->save();
        //set default governance settings
        $this->restoreGovernanceConfiguration();
        //test farm roles post
        $data = ['role' => ['id' => $role->id], 'alias' => 't-ps-2', 'platform' => SERVER_PLATFORMS::EC2, 'placement' => ['placementConfigurationType' => FarmRoles::AWS_CLASSIC_PLACEMENT_CONFIGURATION, 'region' => static::TEST_REGION], 'scaling' => ['enabled' => true, 'minInstances' => 2, 'maxInstances' => 3], 'instance' => ['instanceConfigurationType' => FarmRoles::AWS_INSTANCE_CONFIGURATION, 'instanceType' => ['id' => 't1.micro']]];
        $response = $this->postFarmRole($farm->id, $data);
        $this->assertEquals(201, $response->status, $this->printResponseError($response));
        $farmRoleId = $response->getBody()->data->id;
        /* @var $farmRole FarmRole */
        $farmRole = FarmRole::findPk($farmRoleId);
        $this->assertNotEmpty($farmRole);
        $this->farmRoleToDelete($farmRoleId);
        $data['placement']['availabilityZones'] = '';
        $data['scaling']['rules'] = [];
        $this->assertObjectEqualsEntity($data, $farmRole);
        //test farm role modify scaling
        $data = ['scaling' => ['enabled' => false]];
        $response = $this->modifyFarmRole($farmRole->id, $data);
        $this->assertEquals(200, $response->status, $this->printResponseError($response));
        $farmRoleData = $response->getBody()->data;
        $this->assertObjectHasAttribute('scaling', $farmRoleData);
        $scalingConfiguration = $farmRoleData->scaling;
        $this->assertObjectNotHasAttribute('enabled', $scalingConfiguration);
        //test modify instance
        $data = ['instance' => ['instanceConfigurationType' => FarmRoles::AWS_INSTANCE_CONFIGURATION, 'instanceType' => 'm3.medium']];
        $response = $this->modifyFarmRole($farmRole->id, $data);
        $this->assertEquals(200, $response->status, $this->printResponseError($response));
        $farmRoleData = $response->getBody()->data;
        $this->assertObjectHasAttribute('instance', $farmRoleData);
        $instanceConfiguration = $farmRoleData->instance;
        $this->assertObjectHasAttribute('instanceType', $instanceConfiguration);
        $instanceType = $instanceConfiguration->instanceType;
        $this->assertObjectHasAttribute('id', $instanceType);
        $this->assertEquals('m3.medium', $instanceType->id);
        //test list farm roles filters
        $farmRoles = $this->listFarmRoles($farm->id);
        $farmRoleAdapter = $this->getAdapter('farmRole');
        $filterable = $farmRoleAdapter->getRules()[ApiEntityAdapter::RULE_TYPE_FILTERABLE];
        /* @var $farmRole FarmRole */
        foreach ($farmRoles as $farmRole) {
            foreach ($filterable as $property) {
                $filterValue = $farmRole->{$property};
                $listResult = $this->listFarmRoles($farm->id, [$property => $filterValue]);
                if (!static::isRecursivelyEmpty($filterValue)) {
                    foreach ($listResult as $filtered) {
                        $this->assertEquals($filterValue, $filtered->{$property}, "Property '{$property}' mismatch");
                    }
                }
            }
            $response = $this->getFarmRole($farmRole->id);
            $this->assertEquals(200, $response->status, $this->printResponseError($response));
            $dbFarmRole = FarmRole::findPk($farmRole->id);
            $this->assertObjectEqualsEntity($response->getBody()->data, $dbFarmRole, $farmRoleAdapter);
        }
    }