/** * @test * @functional */ 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); } }
public function createTestFarmRole($farm) { /* @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(); } /* @var $farmRole FarmRole */ $farmRole = static::createEntity(new FarmRole(), ['farmId' => $farm->id, 'roleId' => $role->id, 'alias' => 'test-launch-farm-role', 'platform' => SERVER_PLATFORMS::EC2, 'cloudLocation' => static::TEST_REGION]); /* @var $settings SettingsCollection */ $settings = $farmRole->settings; $settings->saveSettings([FarmRoleSetting::AWS_INSTANCE_TYPE => 't1.micro', FarmRoleSetting::AWS_AVAIL_ZONE => '', FarmRoleSetting::SCALING_ENABLED => true, FarmRoleSetting::SCALING_MIN_INSTANCES => 1, FarmRoleSetting::SCALING_MAX_INSTANCES => 2]); $farmRole->save(); return $farmRole; }