/** * Performs upgrade literally for the stage ONE. * * Implementation of this method performs update steps needs to be taken * to accomplish upgrade successfully. * * If there are any error during an execution of this scenario it must * throw an exception. * * @param int $stage optional The stage number * @throws \Exception */ protected function run1($stage) { $environments = $this->db->Execute("SELECT id FROM client_environments WHERE status='Active'"); while ($env = $environments->FetchRow()) { $environment = \Scalr_Environment::init()->loadById($env['id']); foreach (PlatformFactory::getOpenstackBasedPlatforms() as $platform) { if ($platform == \SERVER_PLATFORMS::RACKSPACENG_UK || $platform == \SERVER_PLATFORMS::RACKSPACENG_US) { continue; } try { if ($environment->isPlatformEnabled($platform)) { $os = $environment->openstack($platform); //It throws an exception on failure $zones = $os->listZones(); $zone = array_shift($zones); $os = $environment->openstack($platform, $zone->name); // Check SG Extension $pars[$this->getOpenStackOption($platform, 'EXT_SECURITYGROUPS_ENABLED')] = (int) $os->servers->isExtensionSupported(ServersExtension::securityGroups()); // Check Floating Ips Extension $pars[$this->getOpenStackOption($platform, 'EXT_FLOATING_IPS_ENABLED')] = (int) $os->servers->isExtensionSupported(ServersExtension::floatingIps()); // Check Cinder Extension $pars[$this->getOpenStackOption($platform, 'EXT_CINDER_ENABLED')] = (int) $os->hasService('volume'); // Check Swift Extension $pars[$this->getOpenStackOption($platform, 'EXT_SWIFT_ENABLED')] = (int) $os->hasService('object-store'); // Check LBaas Extension $pars[$this->getOpenStackOption($platform, 'EXT_LBAAS_ENABLED')] = $os->hasService('network') ? (int) $os->network->isExtensionSupported('lbaas') : 0; $environment->setPlatformConfig($pars); } } catch (\Exception $e) { $this->console->out("Update settings for env: {$env['id']} failed: " . $e->getMessage()); } } } }
if ($updateEnv) { $env->enablePlatform(SERVER_PLATFORMS::ECS, true); $env->setPlatformConfig($pars); } unset($env); $env = Scalr_Environment::init()->loadById($envId); \Scalr::getContainer()->environment = $env; $configSet = false; foreach ($zones as $zone) { $osClient = $env->openstack(SERVER_PLATFORMS::ECS, $zone->name); // Check SG Extension if (!$configSet) { $pars2 = array(); $pars2[getOpenStackOption('EXT_SECURITYGROUPS_ENABLED')] = (int) $osClient->servers->isExtensionSupported(ServersExtension::securityGroups()); // Check Floating Ips Extension $pars2[getOpenStackOption('EXT_FLOATING_IPS_ENABLED')] = (int) $osClient->servers->isExtensionSupported(ServersExtension::floatingIps()); // Check Cinder Extension $pars2[getOpenStackOption('EXT_CINDER_ENABLED')] = (int) $osClient->hasService('volume'); // Check Swift Extension $pars2[getOpenStackOption('EXT_SWIFT_ENABLED')] = (int) $osClient->hasService('object-store'); // Check LBaas Extension $pars2[getOpenStackOption('EXT_LBAAS_ENABLED')] = $osClient->hasService('network') ? (int) $osClient->network->isExtensionSupported('lbaas') : 0; $env->setPlatformConfig($pars2); $configSet = true; } // Get Public network $nName = $pars[SERVER_PLATFORMS::ECS . "." . OpenstackPlatformModule::TENANT_NAME] . "_net"; $rName = $pars[SERVER_PLATFORMS::ECS . "." . OpenstackPlatformModule::TENANT_NAME] . "_router"; $sName = $pars[SERVER_PLATFORMS::ECS . "." . OpenstackPlatformModule::TENANT_NAME] . "_subnet"; $networks = $osClient->network->listNetworks(); $privateNetworkFound = false;
private function saveOpenstack() { $pars = array(); $enabled = false; $platform = $this->getParam('platform'); $currentCloudCredentials = $this->env->keychain($platform); $bNew = !$currentCloudCredentials->isEnabled(); if (!$bNew) { $oldUrl = $currentCloudCredentials->properties[Entity\CloudCredentialsProperty::OPENSTACK_KEYSTONE_URL]; } if ($this->getParam("{$platform}_is_enabled")) { $enabled = true; $pars[Entity\CloudCredentialsProperty::OPENSTACK_KEYSTONE_URL] = trim($this->checkVar(Entity\CloudCredentialsProperty::OPENSTACK_KEYSTONE_URL, 'string', 'KeyStone URL required', $platform)); $pars[Entity\CloudCredentialsProperty::OPENSTACK_SSL_VERIFYPEER] = trim($this->checkVar(Entity\CloudCredentialsProperty::OPENSTACK_SSL_VERIFYPEER, 'bool', '', $platform)); $pars[Entity\CloudCredentialsProperty::OPENSTACK_USERNAME] = $this->checkVar(Entity\CloudCredentialsProperty::OPENSTACK_USERNAME, 'string', 'Username required', $platform); $pars[Entity\CloudCredentialsProperty::OPENSTACK_PASSWORD] = $this->checkVar(Entity\CloudCredentialsProperty::OPENSTACK_PASSWORD, 'password', '', $platform, false); $pars[Entity\CloudCredentialsProperty::OPENSTACK_API_KEY] = $this->checkVar(Entity\CloudCredentialsProperty::OPENSTACK_API_KEY, 'string', '', $platform); $pars[Entity\CloudCredentialsProperty::OPENSTACK_IDENTITY_VERSION] = OpenStackConfig::parseIdentityVersion($pars[Entity\CloudCredentialsProperty::OPENSTACK_KEYSTONE_URL]); $pars[Entity\CloudCredentialsProperty::OPENSTACK_TENANT_NAME] = $this->checkVar(Entity\CloudCredentialsProperty::OPENSTACK_TENANT_NAME, 'string', '', $platform); $pars[Entity\CloudCredentialsProperty::OPENSTACK_DOMAIN_NAME] = $this->checkVar(Entity\CloudCredentialsProperty::OPENSTACK_DOMAIN_NAME, 'string', '', $platform); if (empty($this->checkVarError) && empty($pars[Entity\CloudCredentialsProperty::OPENSTACK_PASSWORD]) && empty($pars[Entity\CloudCredentialsProperty::OPENSTACK_API_KEY])) { $this->checkVarError['api_key'] = $this->checkVarError['password'] = '******'; } } /* @var $config Yaml */ $config = $this->env->getContainer()->config; if (isset($platform) && $config->defined("scalr.{$platform}.use_proxy") && $config("scalr.{$platform}.use_proxy") && in_array($config('scalr.connections.proxy.use_on'), ['both', 'scalr'])) { $proxySettings = $config('scalr.connections.proxy'); } else { $proxySettings = null; } if (count($this->checkVarError)) { $this->response->failure(); $this->response->data(array('errors' => $this->checkVarError)); } else { if ($this->getParam($platform . "_is_enabled")) { $os = new OpenStack(new OpenStackConfig($pars[Entity\CloudCredentialsProperty::OPENSTACK_USERNAME], $pars[Entity\CloudCredentialsProperty::OPENSTACK_KEYSTONE_URL], 'fake-region', $pars[Entity\CloudCredentialsProperty::OPENSTACK_API_KEY], null, null, $pars[Entity\CloudCredentialsProperty::OPENSTACK_PASSWORD], $pars[Entity\CloudCredentialsProperty::OPENSTACK_TENANT_NAME], $pars[Entity\CloudCredentialsProperty::OPENSTACK_DOMAIN_NAME], $pars[Entity\CloudCredentialsProperty::OPENSTACK_IDENTITY_VERSION], $proxySettings)); //It throws an exception on failure $zones = $os->listZones(); $zone = array_shift($zones); $os = new OpenStack(new OpenStackConfig($pars[Entity\CloudCredentialsProperty::OPENSTACK_USERNAME], $pars[Entity\CloudCredentialsProperty::OPENSTACK_KEYSTONE_URL], $zone->name, $pars[Entity\CloudCredentialsProperty::OPENSTACK_API_KEY], null, null, $pars[Entity\CloudCredentialsProperty::OPENSTACK_PASSWORD], $pars[Entity\CloudCredentialsProperty::OPENSTACK_TENANT_NAME], $pars[Entity\CloudCredentialsProperty::OPENSTACK_DOMAIN_NAME], $pars[Entity\CloudCredentialsProperty::OPENSTACK_IDENTITY_VERSION], $proxySettings)); // Check SG Extension $pars[Entity\CloudCredentialsProperty::OPENSTACK_EXT_SECURITYGROUPS_ENABLED] = (int) $os->servers->isExtensionSupported(ServersExtension::securityGroups()); // Check Floating Ips Extension $pars[Entity\CloudCredentialsProperty::OPENSTACK_EXT_FLOATING_IPS_ENABLED] = (int) $os->servers->isExtensionSupported(ServersExtension::floatingIps()); // Check Cinder Extension $pars[Entity\CloudCredentialsProperty::OPENSTACK_EXT_CINDER_ENABLED] = (int) $os->hasService('volume'); // Check Swift Extension $pars[Entity\CloudCredentialsProperty::OPENSTACK_EXT_SWIFT_ENABLED] = (int) $os->hasService('object-store'); // Check LBaas Extension $pars[Entity\CloudCredentialsProperty::OPENSTACK_EXT_LBAAS_ENABLED] = !in_array($platform, array(SERVER_PLATFORMS::RACKSPACENG_US, SERVER_PLATFORMS::RACKSPACENG_UK)) && $os->hasService('network') ? (int) $os->network->isExtensionSupported('lbaas') : 0; } $this->db->BeginTrans(); try { $this->env->enablePlatform($platform, $enabled); if ($enabled) { $this->makeCloudCredentials($platform, $pars); if ($this->getContainer()->analytics->enabled && ($bNew || $oldUrl !== $pars[Entity\CloudCredentialsProperty::OPENSTACK_KEYSTONE_URL])) { $this->getContainer()->analytics->notifications->onCloudAdd($platform, $this->env, $this->user); } } if (!$this->user->getAccount()->getSetting(Scalr_Account::SETTING_DATE_ENV_CONFIGURED)) { $this->user->getAccount()->setSetting(Scalr_Account::SETTING_DATE_ENV_CONFIGURED, time()); } $this->response->success('Cloud credentials have been ' . ($enabled ? 'saved' : 'removed from Scalr')); $this->response->data(array('enabled' => $enabled)); } catch (Exception $e) { $this->db->RollbackTrans(); throw new Exception(_('Failed to save ' . ucfirst($platform) . ' settings')); } $this->db->CommitTrans(); } }
/** * @test * @dataProvider providerRs * @functional */ public function testFunctionalOpenStack($platform, $region, $imageId) { if ($platform === self::EMPTY_CONFIG) { $this->markTestSkipped(); } /* @var $rs OpenStack */ if ($this->getContainer()->environment->isPlatformEnabled($platform)) { $rs = $this->getContainer()->openstack($platform, $region); //$rs->setDebug(); $this->assertInstanceOf($this->getOpenStackClassName('OpenStack'), $rs); } else { //Environment has not been activated yet. $this->markTestSkipped(sprintf('Environment for the "%s" platform has not been activated.', $platform)); } $os = $this->getContainer()->openstack($platform, 'INVALID-REGION-TEST'); try { $ext = $os->servers->listExtensions(); unset($os); $this->assertTrue(false, 'An exception must be thrown in this test'); } catch (OpenStackException $e) { $this->assertTrue(true); } unset($os); // security groups test $sgTestName = self::getTestName(self::NAME_SECURITY_GROUP); $listSecurityGroups = $rs->listSecurityGroups(); $this->assertTrue($listSecurityGroups instanceof \ArrayIterator); foreach ($listSecurityGroups as $v) { if ($v->name == self::getTestName('security-group')) { $rs->deleteSecurityGroup($v->id); } } unset($listSecurityGroups); //Create security group test $sg = $rs->createSecurityGroup($sgTestName, 'phpunit test security group'); $this->assertNotEmpty($sg); $this->assertInternalType('object', $sg); $this->assertNotEmpty($sg->id); $this->assertEquals($sgTestName, $sg->name); $this->assertNotEmpty($sg->description); $ruleToAdd = ["security_group_id" => $sg->id, "protocol" => 'tcp', "remote_group_id" => $sg->id, "direction" => "ingress", "port_range_max" => null, "port_range_min" => null]; //Add a new rule to security group $rule = $rs->createSecurityGroupRule($ruleToAdd); $this->assertNotEmpty($rule); $this->assertNotEmpty($rule->id); $this->assertInternalType('object', $rule); //Removes rule $ret = $rs->deleteSecurityGroupRule($rule->id); $this->assertTrue($ret); //Delete security group test $ret = $rs->deleteSecurityGroup($sg->id); $this->assertTrue($ret); unset($sg); //Pagination test $list = $rs->servers->listImages(true, array('limit' => 10)); $this->assertInstanceOf(self::ABSTRACT_PAGINATION_CLASS, $list); do { foreach ($list as $image) { $this->assertNotEmpty($image->id); } } while (false !== ($list = $list->getNextPage())); $one = $rs->servers; $this->assertInstanceOf($this->getOpenStackClassName('Services\\ServersService'), $one); $two = $rs->servers; $this->assertInstanceOf($this->getOpenStackClassName('Services\\ServersService'), $two); $this->assertSame($one, $two, 'Service interface is expected to be cached within each separate OpenStack instance.'); $aZones = $rs->listZones(); $this->assertNotEmpty($aZones); unset($aZones); //List tenants test //IMPORTANT: It does not work with API v3 //$tenants = $rs->listTenants(); //$this->assertNotEmpty($tenants); //$this->assertTrue(is_array($tenants)); //unset($tenants); //Get Limits test $limits = $rs->servers->getLimits(); $this->assertTrue(is_object($limits)); unset($limits); $aExtensions = $rs->servers->listExtensions(); $this->assertTrue(is_array($aExtensions)); unset($aExtensions); $aExtensions = $rs->volume->listExtensions(); $this->assertTrue(is_array($aExtensions)); unset($aExtensions); $hasNetwork = $rs->hasService(OpenStack::SERVICE_NETWORK); if ($hasNetwork) { $aExtensions = $rs->network->listExtensions(); $this->assertTrue(is_array($aExtensions)); unset($aExtensions); //Quantum API tests $testNetworkName = self::getTestName(self::NAME_NETWORK); $testSubnetName = self::getTestName(self::NAME_SUBNET); $testPortName = self::getTestName(self::NAME_PORT); $testRouterName = self::getTestName(self::NAME_ROUTER); $testLbPoolName = self::getTestName(self::NAME_LB_POOL); $testLbVipName = self::getTestName(self::NAME_LB_VIP); //ListNetworks test $networks = $rs->network->networks->list(null, array('status' => 'ACTIVE', 'shared' => false)); $this->assertTrue($networks instanceof \ArrayIterator); if (isset($networks[0])) { $this->assertInternalType('object', $networks[0]); $this->assertNotEmpty($networks[0]->id); //Show Network test $network = $rs->network->networks->list($networks[0]->id); $this->assertEquals($networks[0], $network); unset($network); } $publicNetworkId = null; foreach ($networks as $network) { if ($network->{"router:external"} == true) { $publicNetworkId = $network->id; } } unset($networks); if (empty($publicNetworkId)) { $networks = $rs->network->networks->list(); foreach ($networks as $network) { if ($network->shared == true && $network->status == 'ACTIVE') { $publicNetworkId = $network->id; break; } } unset($networks); } $this->assertNotEmpty($publicNetworkId, 'Could not find public network to continue.'); //ListSubnets test $subnets = $rs->network->subnets->list(); $this->assertTrue($subnets instanceof \ArrayIterator); if (isset($subnets[0])) { $this->assertInternalType('object', $subnets[0]); $this->assertNotEmpty($subnets[0]->id); //Show Subnet test $subnet = $rs->network->subnets->list($subnets[0]->id); $this->assertEquals($subnets[0], $subnet); unset($subnet); } unset($subnets); //ListPorts test $ports = $rs->network->ports->list(); $this->assertTrue($ports instanceof \ArrayIterator); if (isset($ports[0])) { $this->assertInternalType('object', $ports[0]); $this->assertNotEmpty($ports[0]->id); //Show Port test $port = $rs->network->ports->list($ports[0]->id); $this->assertEquals($ports[0], $port); unset($port); } unset($ports); if ($rs->network->isExtensionSupported(NetworkExtension::loadbalancingService())) { //Removes previously created LBaaS VIP if it exists $lbVips = $rs->network->lbVips->list(null, array('name' => $testLbVipName)); foreach ($lbVips as $lbVip) { $ret = $rs->network->lbVips->delete($lbVip->id); $this->assertTrue($ret, 'Could not remove previously created Load balancer VIP (id:' . $lbVip->id . ').'); } $this->assertTrue($lbVips instanceof \ArrayIterator); unset($lbVips); //Removes previously created pools if they exist. $lbPools = $rs->network->lbPools->list(null, array('name' => $testLbPoolName)); $this->assertTrue($lbPools instanceof \ArrayIterator); foreach ($lbPools as $lbPool) { if (!empty($lbPool->health_monitors)) { foreach ($lbPool->health_monitors as $healthMonitorId) { //Removes previously associated health monitors with test pools $ret = $rs->network->lbPools->disassociateHealthMonitor($lbPool->id, $healthMonitorId); $this->assertTrue($ret); $ret = $rs->network->lbHealthMonitors->delete($healthMonitorId); $this->assertTrue($ret); } } if (!empty($lbPool->members)) { foreach ($lbPool->members as $memberId) { //Remove previously created members $ret = $rs->network->lbMembers->delete($memberId); $this->assertTrue($ret, 'Could not remove previously created LBaas member (id:' . $memberId . ').'); } } $ret = $rs->network->lbPools->delete($lbPool->id); $this->assertTrue($ret, 'Could not remove previously created LBaaS pool.'); } unset($lbPools); } //Tries to find the ports which have been created recently by this test $ports = $rs->network->ports->list(null, array('name' => array($testPortName, $testPortName . '1'))); foreach ($ports as $port) { //Removes previously created ports $rs->network->ports->delete($port->id); } unset($ports); //Tries to find the networks that have been created recently by this test $networks = $rs->network->networks->list(null, array('name' => $testNetworkName)); foreach ($networks as $network) { //Removes previously created networks $rs->network->networks->update($network->id, null, false); //Trying to remove allocated ports $portsToRemove = $rs->network->ports->list(null, array('networkId' => $network->id)); foreach ($portsToRemove as $p) { if (isset($p->device_owner) && isset($p->device_id) && $p->device_owner == 'network:router_interface') { $rs->network->ports->update($p->id, array('admin_state_up' => false)); $rs->network->routers->removeInterface($p->device_id, null, $p->id); } } $rs->network->networks->delete($network->id); } unset($networks); //Tries to find the subnets that where created by this test but hadn't been removed yet. $subnets = $rs->network->subnets->list(null, array('name' => array($testSubnetName, $testSubnetName . '1'))); $this->assertTrue($subnets instanceof \ArrayIterator); foreach ($subnets as $subnet) { //Removes previously created subnets $rs->network->subnets->delete($subnet->id); } //Creates new network $network = $rs->network->networks->create($testNetworkName, false, false); $this->assertInternalType('object', $network); $this->assertNotEmpty($network->id); $this->assertEquals(false, $network->admin_state_up); $this->assertEquals(false, $network->shared); //Updates newtork state $network = $rs->network->networks->update($network->id, null, true); $this->assertInternalType('object', $network); $this->assertEquals(true, $network->admin_state_up); //Creates subnet $subnet = $rs->network->subnets->create(array('network_id' => $network->id, 'cidr' => self::SUBNET_CIDR, 'name' => $testSubnetName)); $this->assertInternalType('object', $subnet); $this->assertEquals($testSubnetName, $subnet->name); $this->assertNotEmpty($subnet->id); //Updates the subnet $subnet = $rs->network->subnets->update($subnet->id, array('name' => $testSubnetName . '1')); $this->assertInternalType('object', $subnet); $this->assertNotEmpty($subnet->name); $this->assertEquals($testSubnetName . '1', $subnet->name); //Load Balancing Service (LBaaS) tests if ($rs->network->isExtensionSupported(NetworkExtension::loadbalancingService())) { $this->assertNotEmpty($subnet->id, 'Subnet is needed to proceed.'); //The tenant creates a pool, which is initially empty $lbPool = $rs->network->lbPools->create(array('subnet_id' => $subnet->id, 'lb_method' => 'ROUND_ROBIN', 'protocol' => 'TCP', 'name' => $testLbPoolName)); $this->assertNotEmpty($lbPool); $this->assertInstanceOf('stdClass', $lbPool); $this->assertEquals($testLbPoolName, $lbPool->name); $this->assertNotEmpty($lbPool->id); //Tests update pool method $lbPool = $rs->network->lbPools->update($lbPool->id, array('name' => $testLbPoolName)); $this->assertNotEmpty($lbPool); $this->assertInstanceOf('stdClass', $lbPool); $this->assertEquals($testLbPoolName, $lbPool->name); //The tenant creates one or several members in the pool $lbMember = $rs->network->lbMembers->create(array('pool_id' => $lbPool->id, 'protocol_port' => 8080, 'address' => self::LB_MEMBER_ADDRESS, 'weight' => 2)); $this->assertNotEmpty($lbMember); $this->assertInternalType('object', $lbMember); $this->assertEquals($lbPool->id, $lbMember->pool_id); $this->assertTrue($lbMember->admin_state_up); //Tests update member method $lbMember = $rs->network->lbMembers->update($lbMember->id, array('weight' => 3)); $this->assertNotEmpty($lbMember); $this->assertInternalType('object', $lbMember); $this->assertEquals(3, $lbMember->weight); //The tenant create one or several health monitors $lbHealthMonitor = $rs->network->lbHealthMonitors->create(array('delay' => 4, 'max_retries' => 3, 'type' => 'TCP', 'timeout' => 1)); $this->assertNotEmpty($lbHealthMonitor); $this->assertInternalType('object', $lbHealthMonitor); $this->assertNotEmpty($lbHealthMonitor->id); $this->assertTrue($lbHealthMonitor->admin_state_up); $this->assertEquals(4, $lbHealthMonitor->delay); $this->assertEquals(3, $lbHealthMonitor->max_retries); $this->assertEquals('TCP', $lbHealthMonitor->type); $this->assertEquals(1, $lbHealthMonitor->timeout); //Tests update health monitor $lbHealthMonitor = $rs->network->lbHealthMonitors->update($lbHealthMonitor->id, array('max_retries' => 4)); $this->assertNotEmpty($lbHealthMonitor); $this->assertInternalType('object', $lbHealthMonitor); $this->assertNotEmpty($lbHealthMonitor->id); $this->assertEquals(4, $lbHealthMonitor->max_retries); //The tenant associates the Health Monitors with the Pool $ret = $rs->network->lbPools->associateHealthMonitor($lbPool->id, $lbHealthMonitor->id); $this->assertInternalType('object', $ret); //Checks if health monitor is successfully associated $tmpPool = $rs->network->lbPools->list($lbPool->id); $this->assertNotEmpty($tmpPool); $this->assertInternalType('object', $tmpPool); $this->assertEquals($lbPool->id, $tmpPool->id); $this->assertNotEmpty($tmpPool->health_monitors); $this->assertContains($lbHealthMonitor->id, $tmpPool->health_monitors); $lbPool = $tmpPool; unset($tmpPool); //The tenant finally creates a VIP associated with the Pool $lbVip = $rs->network->lbVips->create(array('protocol' => 'TCP', 'protocol_port' => 8080, 'name' => $testLbVipName, 'subnet_id' => $subnet->id, 'pool_id' => $lbPool->id)); $this->assertNotEmpty($lbVip); $this->assertInternalType('object', $lbVip); $this->assertEquals('TCP', $lbVip->protocol); $this->assertEquals(8080, $lbVip->protocol_port); $this->assertEquals($testLbVipName, $lbVip->name); $this->assertEquals($subnet->id, $lbVip->subnet_id); $this->assertEquals($lbPool->id, $lbVip->pool_id); //Tests update method $lbVip = $rs->network->lbVips->update($lbVip->id, array('name' => $testLbVipName)); $this->assertNotEmpty($lbVip); $this->assertInternalType('object', $lbVip); sleep(1); //Deletes VIP $ret = $rs->network->lbVips->delete($lbVip->id); $this->assertTrue($ret); //Disassotiates the Health Monitors with the pool $ret = $rs->network->lbPools->disassociateHealthMonitor($lbPool->id, $lbHealthMonitor->id); $this->assertTrue($ret); //Checks if health monitor is successfully disassociated $tmpPool = $rs->network->lbPools->list($lbPool->id); $this->assertNotEmpty($tmpPool); $this->assertInternalType('object', $tmpPool); $this->assertEquals($lbPool->id, $tmpPool->id); $this->assertNotContains($lbHealthMonitor->id, $tmpPool->health_monitors); $lbPool = $tmpPool; unset($tmpPool); //Deletes LBaaS health monitor $ret = $rs->network->lbHealthMonitors->delete($lbHealthMonitor->id); $this->assertTrue($ret); //Delete LBaaS member $ret = $rs->network->lbMembers->delete($lbMember->id); $this->assertTrue($ret); //Delete LBaaS pool $ret = $rs->network->lbPools->delete($lbPool->id); $this->assertTrue($ret); } //Removes subnet $ret = $rs->network->subnets->delete($subnet->id); $this->assertTrue($ret); //Removes created network $rs->network->networks->update($network->id, null, false); $ret = $rs->network->networks->delete($network->id); $this->assertTrue($ret); unset($network); //Security group extension test if ($rs->network->isExtensionSupported(NetworkExtension::securityGroup())) { $sgTestName = self::getTestName(self::NAME_SECURITY_GROUP); //Removes previously created test security group if it actually exists $sgList = $rs->network->securityGroups->list(null, ['name' => $sgTestName]); $this->assertInstanceOf(self::ABSTRACT_PAGINATION_CLASS, $sgList); foreach ($sgList as $sg) { $this->assertNotEmpty($sg->name); $this->assertNotEmpty($sg->id); if ($sg->name === $sgTestName) { //Removes previously created test security group $res = $rs->network->securityGroups->delete($sg->id); $this->assertTrue($res); } } unset($sgList); //List Security groups test $sgList = $rs->network->securityGroups->list(); $this->assertInstanceOf(self::ABSTRACT_PAGINATION_CLASS, $sgList); unset($sgList); //Create security group test $sg = $rs->network->securityGroups->create($sgTestName, 'phpunit test security group'); $this->assertNotEmpty($sg); $this->assertInternalType('object', $sg); $this->assertNotEmpty($sg->id); $this->assertEquals($sgTestName, $sg->name); $this->assertNotEmpty($sg->description); //Update security group test //ListRules test //Gets the rules set for the created security group $rulesList = $rs->network->securityGroups->listRules(null, ['securityGroupId' => $sg->id]); $this->assertInstanceOf(self::ABSTRACT_PAGINATION_CLASS, $rulesList); if (count($rulesList)) { //Some providers have default rules out from the box foreach ($rulesList as $r) { //Removing default rules $rs->network->securityGroups->deleteRule($r->id); } } $ruleToAdd = ["security_group_id" => $sg->id, "remote_group_id" => null, "direction" => "ingress", "remote_ip_prefix" => "0.0.0.0/0", "port_range_max" => null, "port_range_min" => null]; //Add a new rule to security group $rule = $rs->network->securityGroups->addRule($ruleToAdd); $this->assertNotEmpty($rule); $this->assertNotEmpty($rule->id); $this->assertInternalType('object', $rule); //Verifies that all properties are set properly foreach ($ruleToAdd as $property => $value) { $this->assertObjectHasAttribute($property, $rule); $this->assertEquals($value, $rule->{$property}); } //Checks that new rule does exist $rulesList = $rs->network->securityGroups->listRules(null, ['securityGroupId' => $sg->id]); $this->assertEquals(1, count($rulesList)); unset($rulesList); //Removes rule $ret = $rs->network->securityGroups->deleteRule($rule->id); $this->assertTrue($ret); //Checks whether rule is removed properly $rulesList = $rs->network->securityGroups->listRules(null, ['securityGroupId' => $sg->id]); $this->assertEquals(0, count($rulesList)); unset($rulesList); //Delete security group test $ret = $rs->network->securityGroups->delete($sg->id); $this->assertTrue($ret); unset($sg); } } //List snapshots test $snList = $rs->volume->snapshots->list(); $this->assertTrue($snList instanceof \ArrayIterator); foreach ($snList as $v) { if ($v->display_name == self::getTestSnapshotName()) { $rs->volume->snapshots->delete($v->id); } } unset($snList); //List Volume Types test $volumeTypes = $rs->volume->listVolumeTypes(); $this->assertTrue($volumeTypes instanceof \ArrayIterator); foreach ($volumeTypes as $v) { $volumeTypeDesc = $rs->volume->getVolumeType($v->id); $this->assertTrue(is_object($volumeTypeDesc)); unset($volumeTypeDesc); break; } //List Volumes test $aVolumes = $rs->volume->listVolumes(); $this->assertTrue($aVolumes instanceof \ArrayIterator); foreach ($aVolumes as $v) { if ($v->display_name == self::getTestVolumeName()) { if (in_array($v->status, array(VolumeStatus::STATUS_AVAILABLE, VolumeStatus::STATUS_ERROR))) { $ret = $rs->volume->deleteVolume($v->id); } } } //Create Volume test $volume = $rs->volume->createVolume(self::VOLUME_SIZE, self::getTestVolumeName()); $this->assertTrue(is_object($volume)); $this->assertNotEmpty($volume->id); for ($t = time(), $s = 1; time() - $t < 300 && !in_array($volume->status, array(VolumeStatus::STATUS_AVAILABLE, VolumeStatus::STATUS_ERROR)); $s += 5) { sleep($s); $volume = $rs->volume->getVolume($volume->id); $this->assertTrue(is_object($volume)); $this->assertNotEmpty($volume->id); } $this->assertContains($volume->status, array(VolumeStatus::STATUS_AVAILABLE, VolumeStatus::STATUS_ERROR)); // //Create snapshot test // //WARNING! It takes too long time. // $snap = $rs->volume->snapshots->create($volume->id, self::getTestSnapshotName()); // $this->assertTrue(is_object($snap)); // $this->assertNotEmpty($snap->id); // for ($t = time(), $s = 1; (time() - $t) < 600 && !in_array($snap->status, array('available', 'error')); $s += 5) { // sleep($s); // $snap = $rs->volume->snapshots->get($snap->id); // $this->assertNotEmpty($snap->id); // } // $this->assertContains($snap->status, array('available', 'error')); // //Delete snapshot test // $ret = $rs->volume->snapshots->delete($snap->id); // $this->assertTrue($ret); // unset($snap); // sleep(5); //Delete Volume test $ret = $rs->volume->deleteVolume($volume->id); $this->assertTrue($ret); unset($volume); sleep(5); $pool = null; if ($rs->servers->isExtensionSupported(ServersExtension::floatingIpPools())) { $aFloatingIpPools = $rs->servers->listFloatingIpPools(); $this->assertTrue($aFloatingIpPools instanceof \ArrayIterator); foreach ($aFloatingIpPools as $v) { $pool = $v->name; break; } $this->assertNotNull($pool); unset($aFloatingIpPools); } if ($rs->servers->isExtensionSupported(ServersExtension::floatingIps())) { $this->assertNotNull($pool); $aFloatingIps = $rs->servers->floatingIps->list(); $this->assertTrue($aFloatingIps instanceof \ArrayIterator); foreach ($aFloatingIps as $v) { $r = $rs->servers->floatingIps->get($v->id); $this->assertTrue(is_object($r)); break; } unset($aFloatingIps); //default pool for rackspase is 'nova' $fip = $rs->servers->floatingIps->create($pool); $this->assertTrue(is_object($fip)); $r = $rs->servers->floatingIps->delete($fip->id); $this->assertTrue($r); try { //Verifies that ip has been successfully removed $res = $rs->servers->floatingIps->get($fip->id); $this->assertTrue(false, 'Exception must be thrown here'); } catch (RestClientException $e) { if ($e->error->code == 404) { $this->assertTrue(true); } else { //OpenStack Grizzly fails with 500 error code. //throw $e; } } unset($fip); } //List flavors test $flavorsList = $listFlavors = $rs->servers->listFlavors(); $this->assertTrue($flavorsList instanceof \ArrayIterator); $flavorId = null; foreach ($flavorsList as $v) { $flavorId = $v->id; break; } $this->assertNotNull($flavorId); unset($flavorsList); //List servers test $ret = $rs->servers->list(); if (!empty($ret) && $ret->count()) { foreach ($ret as $v) { if ($v->name == self::getTestServerName() || $v->name == self::getTestServerName('renamed')) { //Removes servers try { $rs->servers->deleteServer($v->id); } catch (RestClientException $e) { echo $e->getMessage() . "\n"; } } } } $personality = new PersonalityList(); $personality->append(new Personality('/etc/scalr/private.d/.user-data', base64_encode('super data'))); $personality->append(new Personality('/etc/.scalr-user-data', base64_encode('super data'))); $netList = null; //Create server test $srv = $rs->servers->createServer(self::getTestServerName(), $flavorId, $imageId, null, null, $personality, $netList); $this->assertInstanceOf('stdClass', $srv); $srv = $rs->servers->getServerDetails($srv->id); $this->assertInstanceOf('stdClass', $srv); $this->assertNotEmpty($srv->status); for ($t = time(), $s = 10; time() - $t < 600 && !in_array($srv->status, array('ACTIVE', 'ERROR')); $s += 1) { sleep($s); $srv = $rs->servers->getServerDetails($srv->id); } $this->assertContains($srv->status, array('ACTIVE', 'ERROR')); if ($rs->servers->isExtensionSupported(ServersExtension::consoleOutput())) { $consoleOut = $rs->servers->getConsoleOutput($srv->id, 50); } //List Addresses test $addresses = $rs->servers->listAddresses($srv->id); $this->assertTrue(is_object($addresses)); //Get server details test $srvDetails = $rs->servers->getServerDetails($srv->id); $this->assertInstanceOf('stdClass', $srvDetails); unset($srvDetails); //Images List test $imagesList = $rs->servers->images->list(); $this->assertTrue($imagesList instanceof DefaultPaginationList); foreach ($imagesList as $img) { if ($img->name == self::getTestName('image')) { $rs->servers->images->delete($img->id); } $imageDetails = $rs->servers->images->get($img->id); $this->assertTrue(is_object($imageDetails)); unset($imageDetails); break; } unset($imagesList); //Keypairs extension test if ($rs->servers->isExtensionSupported(ServersExtension::keypairs())) { $aKeypairs = $rs->servers->keypairs->list(); $this->assertTrue($aKeypairs instanceof \ArrayIterator); foreach ($aKeypairs as $v) { if ($v->keypair->name == self::getTestName('key')) { $rs->servers->keypairs->delete($v->keypair->name); } } unset($aKeypairs); $kp = $rs->servers->keypairs->create(self::getTestName('key')); $this->assertNotEmpty($kp); $this->assertTrue(is_object($kp)); $kptwin = $rs->servers->keypairs->get($kp->name); $this->assertNotEmpty($kptwin); $this->assertEquals($kp->public_key, $kptwin->public_key); unset($kptwin); $res = $rs->servers->keypairs->delete($kp->name); $this->assertTrue($res); unset($kp); } //Security Groups extension test if ($rs->servers->isExtensionSupported(ServersExtension::securityGroups())) { $listSecurityGroups = $rs->servers->securityGroups->list(); $this->assertTrue($listSecurityGroups instanceof \ArrayIterator); foreach ($listSecurityGroups as $v) { if ($v->name == self::getTestName('security-group')) { $rs->servers->securityGroups->delete($v->id); } } unset($listSecurityGroups); $listForSpecificServer = $rs->servers->securityGroups->list($srv->id); $this->assertTrue(is_array($listForSpecificServer) || $listForSpecificServer instanceof \ArrayIterator); unset($listForSpecificServer); $sg = $rs->servers->securityGroups->create(self::getTestName('security-group'), 'This is phpunit security group test.'); $this->assertNotEmpty($sg); $this->assertTrue(is_object($sg)); $sgmirror = $rs->servers->securityGroups->get($sg->id); $this->assertNotEmpty($sgmirror); $this->assertEquals($sg->id, $sgmirror->id); unset($sgmirror); $sgrule = $rs->servers->securityGroups->addRule(array("ip_protocol" => "tcp", "from_port" => "80", "to_port" => "8080", "cidr" => "0.0.0.0/0", "parent_group_id" => $sg->id)); $this->assertNotEmpty($sgrule); $this->assertTrue(is_object($sgrule)); $this->assertEquals($sg->id, $sgrule->parent_group_id); $ret = $rs->servers->securityGroups->deleteRule($sgrule->id); $this->assertTrue($ret); unset($sgrule); $ret = $rs->servers->securityGroups->delete($sg->id); $this->assertTrue($ret); } //Create image test $imageId = $rs->servers->images->create($srv->id, self::getTestName('image')); $this->assertTrue(is_string($imageId)); //It requires ACTIVE state of the server // $res = $rs->servers->resizeServer($srv->id, $srv->name, '3'); // $this->assertTrue($res); // $res = $rs->servers->confirmResizedServer($srv->id); // $this->assertTrue($res); $ret = $rs->servers->images->delete($imageId); $this->assertTrue($ret); //Update server test $renamedDetails = $rs->servers->updateServer($srv->id, self::getTestServerName('renamed')); $this->assertInstanceOf('stdClass', $renamedDetails); $this->assertEquals(self::getTestServerName('renamed'), $renamedDetails->server->name); unset($renamedDetails); //Delete Server test $ret = $rs->servers->deleteServer($srv->id); $this->assertTrue($ret); }
/** * {@inheritdoc} * @see \Scalr\Modules\PlatformModuleInterface::LaunchServer() */ public function LaunchServer(DBServer $DBServer, \Scalr_Server_LaunchOptions $launchOptions = null) { $config = \Scalr::getContainer()->config; $environment = $DBServer->GetEnvironmentObject(); $governance = new \Scalr_Governance($environment->id); if (!$launchOptions) { $launchOptions = new \Scalr_Server_LaunchOptions(); $DBRole = DBRole::loadById($DBServer->roleId); $launchOptions->imageId = $DBRole->getImageId($this->platform, $DBServer->GetCloudLocation()); $launchOptions->serverType = $DBServer->GetFarmRoleObject()->GetSetting(\DBFarmRole::SETTING_OPENSTACK_FLAVOR_ID); $launchOptions->cloudLocation = $DBServer->GetFarmRoleObject()->CloudLocation; $launchOptions->userData = $DBServer->GetCloudUserData(); $launchOptions->userData['platform'] = 'openstack'; $launchOptions->userData['region'] = $launchOptions->cloudLocation; $launchOptions->networks = @json_decode($DBServer->GetFarmRoleObject()->GetSetting(\DBFarmRole::SETTING_OPENSTACK_NETWORKS)); $gevernanceNetworks = $governance->getValue($this->platform, 'openstack.networks'); if (count($launchOptions->networks) == 0 && $gevernanceNetworks) { $launchOptions->networks = $gevernanceNetworks[$launchOptions->cloudLocation]; } foreach ($launchOptions->userData as $k => $v) { if (!$v) { unset($launchOptions->userData[$k]); } } $launchOptions->architecture = 'x86_64'; $isWindows = $DBServer->osType == 'windows' || $DBRole->osFamily == 'windows'; if ($DBServer->GetFarmRoleObject()->GetSetting('openstack.boot_from_volume') == 1) { $deviceMapping = new \stdClass(); $deviceMapping->device_name = 'vda'; $deviceMapping->source_type = 'image'; $deviceMapping->destination_type = 'volume'; $deviceMapping->delete_on_termination = true; $deviceMapping->guest_format = null; $deviceMapping->volume_size = 10; $deviceMapping->uuid = $launchOptions->imageId; $deviceMapping->boot_index = 0; } } else { $launchOptions->userData = array(); if (!$launchOptions->networks) { $launchOptions->networks = array(); } $isWindows = $DBServer->osType == 'windows'; } $client = $this->getOsClient($environment, $launchOptions->cloudLocation); // Prepare user data $u_data = ""; foreach ($launchOptions->userData as $k => $v) { $u_data .= "{$k}={$v};"; } $u_data = trim($u_data, ";"); $personality = new PersonalityList(); if ($isWindows) { $personality->append(new Personality('C:\\Program Files\\Scalarizr\\etc\\private.d\\.user-data', base64_encode($u_data))); } else { if ($DBServer->platform == \SERVER_PLATFORMS::ECS) { $personality->append(new Personality('/etc/.scalr-user-data', base64_encode($u_data))); } else { $personality->append(new Personality('/etc/scalr/private.d/.user-data', base64_encode($u_data))); } } //Check SecurityGroups $securityGroupsEnabled = $this->getConfigVariable(self::EXT_SECURITYGROUPS_ENABLED, $environment, false); $extProperties['security_groups'] = array(); if ($securityGroupsEnabled) { $securityGroups = $this->GetServerSecurityGroupsList($DBServer, $client, $governance); foreach ($securityGroups as $sg) { $itm = new \stdClass(); $itm->name = $sg; $extProperties['security_groups'][] = $itm; } } if ($deviceMapping) { $extProperties['block_device_mapping_v2'][] = $deviceMapping; } //Check key-pairs $keyPairsEnabled = $this->getConfigVariable(self::EXT_KEYPAIRS_ENABLED, $environment, false); if ($keyPairsEnabled === null || $keyPairsEnabled === false) { if ($client->servers->isExtensionSupported(ServersExtension::keypairs())) { $keyPairsEnabled = 1; } else { $keyPairsEnabled = 0; } $this->setConfigVariable(array(self::EXT_KEYPAIRS_ENABLED => $keyPairsEnabled), $environment, false); } if ($keyPairsEnabled) { $sshKey = \Scalr_SshKey::init(); if ($DBServer->status == \SERVER_STATUS::TEMPORARY) { $keyName = "SCALR-ROLESBUILDER-" . SCALR_ID; $farmId = NULL; } else { $keyName = "FARM-{$DBServer->farmId}-" . SCALR_ID; $farmId = $DBServer->farmId; } if ($sshKey->loadGlobalByName($keyName, $launchOptions->cloudLocation, $DBServer->envId, \SERVER_PLATFORMS::OPENSTACK)) { $keyLoaded = true; } if (!$keyLoaded && !$sshKey->loadGlobalByName($keyName, $launchOptions->cloudLocation, $DBServer->envId, $DBServer->platform)) { $result = $client->servers->createKeypair($keyName); if ($result->private_key) { $sshKey->farmId = $farmId; $sshKey->envId = $DBServer->envId; $sshKey->type = \Scalr_SshKey::TYPE_GLOBAL; $sshKey->cloudLocation = $launchOptions->cloudLocation; $sshKey->cloudKeyName = $keyName; $sshKey->platform = $DBServer->platform; $sshKey->setPrivate($result->private_key); $sshKey->setPublic($result->public_key); $sshKey->save(); } } $extProperties['key_name'] = $keyName; } //TODO: newtorks $networks = new NetworkList(); foreach ((array) $launchOptions->networks as $network) { if ($network) { $networks->append(new Network($network)); } } $osUserData = null; $osPersonality = null; $userDataMethod = $config->defined("scalr.{$this->platform}.user_data_method") ? $config("scalr.{$this->platform}.user_data_method") : null; if (!$userDataMethod || $userDataMethod == 'both' || $userDataMethod == 'personality') { $osPersonality = $personality; } if (!$userDataMethod || $userDataMethod == 'both' || $userDataMethod == 'meta-data' || $isWindows) { $osUserData = $launchOptions->userData; } try { $result = $client->servers->createServer($DBServer->serverId, $launchOptions->serverType, $launchOptions->imageId, null, $osUserData, $osPersonality, $networks, $extProperties); $DBServer->SetProperties([\OPENSTACK_SERVER_PROPERTIES::SERVER_ID => $result->id, \OPENSTACK_SERVER_PROPERTIES::IMAGE_ID => $launchOptions->imageId, \OPENSTACK_SERVER_PROPERTIES::FLAVOR_ID => $launchOptions->serverType, \OPENSTACK_SERVER_PROPERTIES::ADMIN_PASS => $result->adminPass, \OPENSTACK_SERVER_PROPERTIES::NAME => $DBServer->serverId, \SERVER_PROPERTIES::ARCHITECTURE => $launchOptions->architecture, \OPENSTACK_SERVER_PROPERTIES::CLOUD_LOCATION => $launchOptions->cloudLocation, \SERVER_PROPERTIES::SYSTEM_USER_DATA_METHOD => $userDataMethod]); if ($DBServer->farmRoleId) { $ipPool = $DBServer->GetFarmRoleObject()->GetSetting(\DBFarmRole::SETTING_OPENSTACK_IP_POOL); if ($ipPool) { $DBServer->SetProperty(\SERVER_PROPERTIES::SYSTEM_IGNORE_INBOUND_MESSAGES, 1); } } $DBServer->osType = $isWindows ? 'windows' : 'linux'; $DBServer->cloudLocation = $launchOptions->cloudLocation; $DBServer->cloudLocationZone = ""; // Not supported by openstack return $DBServer; } catch (\Exception $e) { if (stripos($e->getMessage(), 'Invalid key_name provided')) { $sshKey->delete(); throw new \Exception(sprintf(_("Cannot launch new instance: KeyPair was removed from cloud. Re-generating it."), $e->getMessage())); } throw new \Exception(sprintf(_("Cannot launch new instance. %s"), $e->getMessage())); } }
/** * {@inheritdoc} * @see \Scalr\Modules\PlatformModuleInterface::GetServerConsoleOutput() */ public function GetServerConsoleOutput(DBServer $DBServer) { if ($DBServer->GetRealStatus()->getName() != 'ACTIVE') { return false; } $client = $this->getOsClient($DBServer->GetEnvironmentObject(), $DBServer->GetProperty(\OPENSTACK_SERVER_PROPERTIES::CLOUD_LOCATION)); if ($client->servers->isExtensionSupported(ServersExtension::consoleOutput())) { return $client->servers->getConsoleOutput($DBServer->GetCloudServerID(), 200); } else { throw new \Exception("Not supported by Openstack"); } }
/** * @test * @dataProvider providerRs */ public function testFunctionalOpenStack($platform, $region, $imageId) { if ($this->isSkipFunctionalTests() || $platform === self::EMPTY_CONFIG) { $this->markTestSkipped(); } /* @var $rs OpenStack */ if ($this->getContainer()->environment->isPlatformEnabled($platform)) { $rs = $this->getContainer()->openstack($platform, $region); // $rs->setDebug(); $this->assertInstanceOf($this->getOpenStackClassName('OpenStack'), $rs); } else { //Environment has not been activated yet. $this->markTestSkipped(sprintf('Environment for the "%s" platform has not been activated.', $platform)); } $os = $this->getContainer()->openstack($platform, 'INVALID-REGION-TEST'); try { $ext = $os->servers->listExtensions(); unset($os); $this->assertTrue(false, 'An exception must be thrown in this test'); } catch (OpenStackException $e) { $this->assertTrue(true); } unset($os); // security groups test $sgTestName = self::getTestName(self::NAME_SECURITY_GROUP); $listSecurityGroups = $rs->listSecurityGroups(); $this->assertTrue($listSecurityGroups instanceof \ArrayIterator); foreach ($listSecurityGroups as $v) { if ($v->name == self::getTestName('security-group')) { $rs->deleteSecurityGroup($v->id); } } unset($listSecurityGroups); //Create security group test $sg = $rs->createSecurityGroup($sgTestName, 'phpunit test security group'); $this->assertNotEmpty($sg); $this->assertInternalType('object', $sg); $this->assertNotEmpty($sg->id); $this->assertEquals($sgTestName, $sg->name); $this->assertNotEmpty($sg->description); $ruleToAdd = ["security_group_id" => $sg->id, "protocol" => 'tcp', "remote_group_id" => $sg->id, "direction" => "ingress", "port_range_max" => null, "port_range_min" => null]; //Add a new rule to security group $rule = $rs->createSecurityGroupRule($ruleToAdd); $this->assertNotEmpty($rule); $this->assertNotEmpty($rule->id); $this->assertInternalType('object', $rule); //Removes rule $ret = $rs->deleteSecurityGroupRule($rule->id); $this->assertTrue($ret); //Delete security group test $ret = $rs->deleteSecurityGroup($sg->id); $this->assertTrue($ret); unset($sg); //Pagination test $list = $rs->servers->listImages(true, array('limit' => 10)); $this->assertInstanceOf(self::ABSTRACT_PAGINATION_CLASS, $list); do { foreach ($list as $image) { $this->assertNotEmpty($image->id); } } while (false !== ($list = $list->getNextPage())); $one = $rs->servers; $this->assertInstanceOf($this->getOpenStackClassName('Services\\ServersService'), $one); $two = $rs->servers; $this->assertInstanceOf($this->getOpenStackClassName('Services\\ServersService'), $two); $this->assertSame($one, $two, 'Service interface is expected to be cached within each separate OpenStack instance.'); $aZones = $rs->listZones(); $this->assertNotEmpty($aZones); unset($aZones); //List tenants test $tenants = $rs->listTenants(); $this->assertNotEmpty($tenants); $this->assertTrue(is_array($tenants)); unset($tenants); //Contrail related tests if ($rs->hasService(OpenStack::SERVICE_CONTRAIL)) { //Look at SCALRCORE-726 for more info about Contrail responses $testFqName = self::getTestName(self::NAME_FQ); $testDomainName = self::getTestName(self::NAME_DOMAIN) . '.com'; $testFqNetworkName = self::getTestName(self::NAME_FQ_NETWORK); $testNetworkPolicyName = self::getTestName(self::NAME_NETWORK_POLICY); $tenant = $rs->getConfig()->getTenantName(); //Lists virtual networks $listVirtualNetworks = $rs->contrail->listVirtualNetworks(); $this->assertTrue($listVirtualNetworks instanceof DefaultPaginationList, 'The list of virtual networks is expected to be DefaultPaginationList instance.'); //Removes previously created test virtual networks foreach ($listVirtualNetworks as $v) { if (isset($v->fq_name) && is_array($v->fq_name) && in_array($testFqNetworkName, $v->fq_name)) { $ret = $rs->contrail->deleteVirtualNetwork($v->uuid); $this->assertTrue($ret); } } unset($listVirtualNetworks); //Describes network policies $listNetworkPolicies = $rs->contrail->listNetworkPolicies(); $this->assertTrue($listNetworkPolicies instanceof DefaultPaginationList, 'The list of network policies is expected to be DefaultPaginationList instance.'); foreach ($listNetworkPolicies as $v) { if (isset($v->fq_name) && is_array($v->fq_name) && in_array($testNetworkPolicyName, $v->fq_name)) { $ret = $rs->contrail->deleteNetworkPolicy($v->uuid); $this->assertTrue($ret); } } unset($listNetworkPolicies); //Select IPAMs $listIpams = $rs->contrail->listIpam(); $this->assertTrue($listIpams instanceof DefaultPaginationList, 'The list of IPAMs is expected to be DefaultPaginationList instance.'); //Removes previously created IPAM if it does exist foreach ($listIpams as $ipam) { if (isset($ipam->fq_name) && is_array($ipam->fq_name) && in_array($testFqName, $ipam->fq_name)) { $ret = $rs->contrail->deleteIpam($ipam->uuid); $this->assertTrue($ret); } } unset($listIpams); //Lists virtual DNSs $dnsList = $rs->contrail->listVirtualDns(); $this->assertTrue($dnsList instanceof DefaultPaginationList, 'The list of virtual DNSs is expected to be DefaultPaginationList instance.'); //Removes previously created virtual dns foreach ($dnsList as $v) { if (!empty($v->fq_name) && is_array($v->fq_name) && in_array($testFqName, $v->fq_name)) { $ret = $rs->contrail->deleteVirtualDns($v->uuid); $this->assertTrue($ret); } } unset($dnsList); //Creates a virtual DNS $virtualDns = $rs->contrail->createVirtualDns(array('parent_type' => 'domain', 'fq_name' => array('default-domain', $testFqName), 'virtual_DNS_data' => array("default_ttl_seconds" => 8144, "domain_name" => $testDomainName, "dynamic_records_from_client" => true, "next_virtual_DNS" => self::NEXT_VIRTUAL_DNS_ADDRESS, "record_order" => "random"))); $this->assertInternalType('object', $virtualDns); foreach (array('fq_name', 'parent_uuid', 'parent_href', 'uuid', 'href', 'name') as $attr) { $this->assertObjectHasAttribute('href', $virtualDns); } $this->assertNotEmpty($virtualDns->uuid); $this->assertEquals($testFqName, $virtualDns->name); //List of the specified virtual DNS $vdns = $rs->contrail->listVirtualDns($virtualDns->uuid); $this->assertInternalType('object', $vdns); foreach (array('fq_name', 'parent_uuid', 'parent_href', 'uuid', 'href', 'name', 'virtual_DNS_data', 'id_perms') as $attr) { $this->assertObjectHasAttribute('href', $virtualDns); } $this->assertEquals($virtualDns->name, $vdns->name); $this->assertEquals($virtualDns->uuid, $vdns->uuid); unset($virtualDns); //Creates IPAM $ipam = $rs->contrail->createIpam(array("parent_type" => "project", "fq_name" => array("default-domain", $tenant, $testFqName), "network_ipam_mgmt" => array("dhcp_option_list" => array("dhcp_option" => array(array("dhcp_option_name" => "15", "dhcp_option_value" => $testDomainName))), "ipam_dns_method" => "tenant-dns-server", "ipam_dns_server" => array("tenant_dns_server_address" => array("ip_address" => array(self::DNS_SERVER_ADDRESS)), "virtual_dns_server_name" => null)))); $this->assertInternalType('object', $ipam); //Show specified IPAM $ipam2 = $rs->contrail->listIpam($ipam->uuid); $this->assertInternalType('object', $ipam2); $this->assertEquals($ipam2->uuid, $ipam->uuid); unset($ipam2); //Creates virtual network $virtualNetwork = $rs->contrail->createVirtualNetwork(array("parent_type" => "project", "fq_name" => array("default-domain", $tenant, $testFqNetworkName))); $this->assertInternalType('object', $virtualNetwork); $this->assertNotEmpty($virtualNetwork->uuid); //Show specified virtual network $vn2 = $rs->contrail->listVirtualNetworks($virtualNetwork->uuid); $this->assertInternalType('object', $vn2); $this->assertEquals($virtualNetwork->uuid, $vn2->uuid); unset($vn2); //Creating network policy $networkPolicy = $rs->contrail->createNetworkPolicy(["parent_type" => "project", "fq_name" => ["default-domain", $tenant, $testNetworkPolicyName], "network_policy_entries" => ["policy_rule" => [["direction" => "<>", "protocol" => "any", "src_addresses" => [["virtual_network" => "default-domain:" . $tenant . ":" . $testFqNetworkName]], "dst_ports" => [["start_port" => -1, "end_port" => -1]], "action_list" => ["apply_service" => null], "dst_addresses" => [["virtual_network" => "default-domain:" . $tenant . ":" . $testFqNetworkName]], "src_ports" => [["end_port" => -1, "start_port" => -1]]]]]]); $this->assertInternalType('object', $networkPolicy); $this->assertNotEmpty($networkPolicy->uuid); //Show detailed info of the specified network policy $np2 = $rs->contrail->listNetworkPolicies($networkPolicy->uuid); $this->assertInternalType('object', $np2); $this->assertEquals($networkPolicy->uuid, $np2->uuid); unset($np2); //Associates IPAM and Network Policy to virtual network $rs->contrail->updateVirtualNetwork($virtualNetwork->uuid, ["fq_name" => $virtualNetwork->fq_name, "network_ipam_refs" => [["attr" => ["ipam_subnets" => [["default_gateway" => "192.168.80.6", "subnet" => ["ip_prefix" => "192.168.80.1", "ip_prefix_len" => 29]]]], "to" => ["default-domain", $tenant, $testFqName]]], "network_policy_refs" => [["to" => ["default-domain", $tenant, $testNetworkPolicyName], "attr" => ["sequence" => ["major" => 0, "minor" => 0], "timer" => null]]]]); //Removing Virtual Network $ret = $rs->contrail->deleteVirtualNetwork($virtualNetwork->uuid); $this->assertTrue($ret); //Removing network policy $ret = $rs->contrail->deleteNetworkPolicy($networkPolicy->uuid); $this->assertTrue($ret); //Removing IPAM $ret = $rs->contrail->deleteIpam($ipam->uuid); $this->assertTrue($ret); //Removing virtual DNS $ret = $rs->contrail->deleteVirtualDns($vdns->uuid); $this->assertTrue($ret); $this->markTestSkipped('For Contrail to check only its API and nothing more.'); return; } //Get Limits test $limits = $rs->servers->getLimits(); $this->assertTrue(is_object($limits)); unset($limits); $aExtensions = $rs->servers->listExtensions(); $this->assertTrue(is_array($aExtensions)); unset($aExtensions); $aExtensions = $rs->volume->listExtensions(); $this->assertTrue(is_array($aExtensions)); unset($aExtensions); $hasNetwork = $rs->hasService(OpenStack::SERVICE_NETWORK); if ($hasNetwork) { $aExtensions = $rs->network->listExtensions(); $this->assertTrue(is_array($aExtensions)); unset($aExtensions); //Quantum API tests $testNetworkName = self::getTestName(self::NAME_NETWORK); $testSubnetName = self::getTestName(self::NAME_SUBNET); $testPortName = self::getTestName(self::NAME_PORT); $testRouterName = self::getTestName(self::NAME_ROUTER); $testLbPoolName = self::getTestName(self::NAME_LB_POOL); $testLbVipName = self::getTestName(self::NAME_LB_VIP); //ListNetworks test $networks = $rs->network->networks->list(null, array('status' => 'ACTIVE', 'shared' => false)); $this->assertTrue($networks instanceof \ArrayIterator); if (isset($networks[0])) { $this->assertInternalType('object', $networks[0]); $this->assertNotEmpty($networks[0]->id); //Show Network test $network = $rs->network->networks->list($networks[0]->id); $this->assertEquals($networks[0], $network); unset($network); } $publicNetworkId = null; foreach ($networks as $network) { if ($network->{"router:external"} == true) { $publicNetworkId = $network->id; } } unset($networks); $this->assertNotEmpty($publicNetworkId, 'Could not find public network to continue.'); //ListSubnets test $subnets = $rs->network->subnets->list(); $this->assertTrue($subnets instanceof \ArrayIterator); if (isset($subnets[0])) { $this->assertInternalType('object', $subnets[0]); $this->assertNotEmpty($subnets[0]->id); //Show Subnet test $subnet = $rs->network->subnets->list($subnets[0]->id); $this->assertEquals($subnets[0], $subnet); unset($subnet); } unset($subnets); //ListPorts test $ports = $rs->network->ports->list(); $this->assertTrue($ports instanceof \ArrayIterator); if (isset($ports[0])) { $this->assertInternalType('object', $ports[0]); $this->assertNotEmpty($ports[0]->id); //Show Port test $port = $rs->network->ports->list($ports[0]->id); $this->assertEquals($ports[0], $port); unset($port); } unset($ports); if ($rs->network->isExtensionSupported(NetworkExtension::loadbalancingService())) { //Removes previously created LBaaS VIP if it exists $lbVips = $rs->network->lbVips->list(null, array('name' => $testLbVipName)); foreach ($lbVips as $lbVip) { $ret = $rs->network->lbVips->delete($lbVip->id); $this->assertTrue($ret, 'Could not remove previously created Load balancer VIP (id:' . $lbVip->id . ').'); } $this->assertTrue($lbVips instanceof \ArrayIterator); unset($lbVips); //Removes previously created pools if they exist. $lbPools = $rs->network->lbPools->list(null, array('name' => $testLbPoolName)); $this->assertTrue($lbPools instanceof \ArrayIterator); foreach ($lbPools as $lbPool) { if (!empty($lbPool->health_monitors)) { foreach ($lbPool->health_monitors as $healthMonitorId) { //Removes previously associated health monitors with test pools $ret = $rs->network->lbPools->disassociateHealthMonitor($lbPool->id, $healthMonitorId); $this->assertTrue($ret); $ret = $rs->network->lbHealthMonitors->delete($healthMonitorId); $this->assertTrue($ret); } } if (!empty($lbPool->members)) { foreach ($lbPool->members as $memberId) { //Remove previously created members $ret = $rs->network->lbMembers->delete($memberId); $this->assertTrue($ret, 'Could not remove previously created LBaas member (id:' . $memberId . ').'); } } $ret = $rs->network->lbPools->delete($lbPool->id); $this->assertTrue($ret, 'Could not remove previously created LBaaS pool.'); } unset($lbPools); } //Tries to find the ports which have been created recently by this test $ports = $rs->network->ports->list(null, array('name' => array($testPortName, $testPortName . '1'))); foreach ($ports as $port) { //Removes previously created ports $rs->network->ports->delete($port->id); } unset($ports); //Tries to find the networks that have been created recently by this test $networks = $rs->network->networks->list(null, array('name' => $testNetworkName)); foreach ($networks as $network) { //Removes previously created networks $rs->network->networks->update($network->id, null, false); //Trying to remove allocated ports $portsToRemove = $rs->network->ports->list(null, array('networkId' => $network->id)); foreach ($portsToRemove as $p) { if (isset($p->device_owner) && isset($p->device_id) && $p->device_owner == 'network:router_interface') { $rs->network->ports->update($p->id, array('admin_state_up' => false)); $rs->network->routers->removeInterface($p->device_id, null, $p->id); } } $rs->network->networks->delete($network->id); } unset($networks); //Tries to find the subnets that where created by this test but hadn't been removed yet. $subnets = $rs->network->subnets->list(null, array('name' => array($testSubnetName, $testSubnetName . '1'))); $this->assertTrue($subnets instanceof \ArrayIterator); foreach ($subnets as $subnet) { //Removes previously created subnets $rs->network->subnets->delete($subnet->id); } //Creates new network $network = $rs->network->networks->create($testNetworkName, false, false); $this->assertInternalType('object', $network); $this->assertNotEmpty($network->id); $this->assertEquals(false, $network->admin_state_up); $this->assertEquals(false, $network->shared); //Updates newtork state $network = $rs->network->networks->update($network->id, null, true); $this->assertInternalType('object', $network); $this->assertEquals(true, $network->admin_state_up); //Creates subnet $subnet = $rs->network->subnets->create(array('network_id' => $network->id, 'cidr' => self::SUBNET_CIDR, 'name' => $testSubnetName)); $this->assertInternalType('object', $subnet); $this->assertEquals($testSubnetName, $subnet->name); $this->assertNotEmpty($subnet->id); //Updates the subnet $subnet = $rs->network->subnets->update($subnet->id, array('name' => $testSubnetName . '1')); $this->assertInternalType('object', $subnet); $this->assertNotEmpty($subnet->name); $this->assertEquals($testSubnetName . '1', $subnet->name); //Quantum L3 Router related tests if ($platform !== \SERVER_PLATFORMS::ECS && $rs->network->isExtensionSupported(NetworkExtension::quantumL3Router())) { //ListRouters test $routers = $rs->network->routers->list(null, array('status' => array('ACTIVE', 'PENDING')), array('id', 'name')); $this->assertTrue($routers instanceof \ArrayIterator); foreach ($routers as $r) { $router = $rs->network->routers->list($r->id); $this->assertInternalType('object', $router); if ($r->name == $testRouterName) { //Removes the router which is created by phpunit test before and is still alive by any reason. //It requires all internal interfaces to be removed from router. $ret = $rs->network->routers->delete($r->id); $this->assertTrue($ret); } } unset($routers); //Creates router $router = $rs->network->routers->create(new CreateRouter($testRouterName, true, $publicNetworkId)); $this->assertInternalType('object', $router); $this->assertObjectHasAttribute('name', $router); $this->assertNotEmpty($router->name); $this->assertEquals($testRouterName, $router->name); $this->assertObjectHasAttribute('id', $router); $this->assertNotEmpty($router->id); $this->assertObjectHasAttribute('admin_state_up', $router); $this->assertTrue($router->admin_state_up); //Updates the router $r2 = $rs->network->routers->update($router->id, array('admin_state_up' => false)); $this->assertInternalType('object', $r2); $this->assertObjectHasAttribute('admin_state_up', $r2); $this->assertEquals(false, $r2->admin_state_up); //Adds interface to router $routerInterface1 = $rs->network->routers->addInterface($router->id, $subnet->id); $this->assertInternalType('object', $routerInterface1); $this->assertObjectHasAttribute('subnet_id', $routerInterface1); $this->assertEquals($subnet->id, $routerInterface1->subnet_id); $this->assertObjectHasAttribute('port_id', $routerInterface1); //Removes interface from router $obj = $rs->network->routers->removeInterface($router->id, $subnet->id); //Removes router $ret = $rs->network->routers->delete($router->id); $this->assertTrue($ret); unset($router); } //Load Balancing Service (LBaaS) tests if ($rs->network->isExtensionSupported(NetworkExtension::loadbalancingService())) { $this->assertNotEmpty($subnet->id, 'Subnet is needed to proceed.'); //The tenant creates a pool, which is initially empty $lbPool = $rs->network->lbPools->create(array('subnet_id' => $subnet->id, 'lb_method' => 'ROUND_ROBIN', 'protocol' => 'TCP', 'name' => $testLbPoolName)); $this->assertNotEmpty($lbPool); $this->assertInstanceOf('stdClass', $lbPool); $this->assertEquals($testLbPoolName, $lbPool->name); $this->assertNotEmpty($lbPool->id); //Tests update pool method $lbPool = $rs->network->lbPools->update($lbPool->id, array('name' => $testLbPoolName)); $this->assertNotEmpty($lbPool); $this->assertInstanceOf('stdClass', $lbPool); $this->assertEquals($testLbPoolName, $lbPool->name); //The tenant creates one or several members in the pool $lbMember = $rs->network->lbMembers->create(array('pool_id' => $lbPool->id, 'protocol_port' => 8080, 'address' => self::LB_MEMBER_ADDRESS, 'weight' => 2)); $this->assertNotEmpty($lbMember); $this->assertInternalType('object', $lbMember); $this->assertEquals($lbPool->id, $lbMember->pool_id); $this->assertTrue($lbMember->admin_state_up); //Tests update member method $lbMember = $rs->network->lbMembers->update($lbMember->id, array('weight' => 3)); $this->assertNotEmpty($lbMember); $this->assertInternalType('object', $lbMember); $this->assertEquals(3, $lbMember->weight); //The tenant create one or several health monitors $lbHealthMonitor = $rs->network->lbHealthMonitors->create(array('delay' => 4, 'max_retries' => 3, 'type' => 'TCP', 'timeout' => 1)); $this->assertNotEmpty($lbHealthMonitor); $this->assertInternalType('object', $lbHealthMonitor); $this->assertNotEmpty($lbHealthMonitor->id); $this->assertTrue($lbHealthMonitor->admin_state_up); $this->assertEquals(4, $lbHealthMonitor->delay); $this->assertEquals(3, $lbHealthMonitor->max_retries); $this->assertEquals('TCP', $lbHealthMonitor->type); $this->assertEquals(1, $lbHealthMonitor->timeout); //Tests update health monitor $lbHealthMonitor = $rs->network->lbHealthMonitors->update($lbHealthMonitor->id, array('max_retries' => 4)); $this->assertNotEmpty($lbHealthMonitor); $this->assertInternalType('object', $lbHealthMonitor); $this->assertNotEmpty($lbHealthMonitor->id); $this->assertEquals(4, $lbHealthMonitor->max_retries); //The tenant associates the Health Monitors with the Pool $ret = $rs->network->lbPools->associateHealthMonitor($lbPool->id, $lbHealthMonitor->id); $this->assertInternalType('object', $ret); //Checks if health monitor is successfully associated $tmpPool = $rs->network->lbPools->list($lbPool->id); $this->assertNotEmpty($tmpPool); $this->assertInternalType('object', $tmpPool); $this->assertEquals($lbPool->id, $tmpPool->id); $this->assertNotEmpty($tmpPool->health_monitors); $this->assertContains($lbHealthMonitor->id, $tmpPool->health_monitors); $lbPool = $tmpPool; unset($tmpPool); //The tenant finally creates a VIP associated with the Pool $lbVip = $rs->network->lbVips->create(array('protocol' => 'TCP', 'protocol_port' => 8080, 'name' => $testLbVipName, 'subnet_id' => $subnet->id, 'pool_id' => $lbPool->id)); $this->assertNotEmpty($lbVip); $this->assertInternalType('object', $lbVip); $this->assertEquals('TCP', $lbVip->protocol); $this->assertEquals(8080, $lbVip->protocol_port); $this->assertEquals($testLbVipName, $lbVip->name); $this->assertEquals($subnet->id, $lbVip->subnet_id); $this->assertEquals($lbPool->id, $lbVip->pool_id); //Tests update method $lbVip = $rs->network->lbVips->update($lbVip->id, array('name' => $testLbVipName)); $this->assertNotEmpty($lbVip); $this->assertInternalType('object', $lbVip); sleep(1); //Deletes VIP $ret = $rs->network->lbVips->delete($lbVip->id); $this->assertTrue($ret); //Disassotiates the Health Monitors with the pool $ret = $rs->network->lbPools->disassociateHealthMonitor($lbPool->id, $lbHealthMonitor->id); $this->assertTrue($ret); //Checks if health monitor is successfully disassociated $tmpPool = $rs->network->lbPools->list($lbPool->id); $this->assertNotEmpty($tmpPool); $this->assertInternalType('object', $tmpPool); $this->assertEquals($lbPool->id, $tmpPool->id); $this->assertNotContains($lbHealthMonitor->id, $tmpPool->health_monitors); $lbPool = $tmpPool; unset($tmpPool); //Deletes LBaaS health monitor $ret = $rs->network->lbHealthMonitors->delete($lbHealthMonitor->id); $this->assertTrue($ret); //Delete LBaaS member $ret = $rs->network->lbMembers->delete($lbMember->id); $this->assertTrue($ret); //Delete LBaaS pool $ret = $rs->network->lbPools->delete($lbPool->id); $this->assertTrue($ret); } //Removes subnet $ret = $rs->network->subnets->delete($subnet->id); $this->assertTrue($ret); //Removes created network $rs->network->networks->update($network->id, null, false); $ret = $rs->network->networks->delete($network->id); $this->assertTrue($ret); unset($network); //Security group extension test if ($rs->network->isExtensionSupported(NetworkExtension::securityGroup())) { $sgTestName = self::getTestName(self::NAME_SECURITY_GROUP); //Removes previously created test security group if it actually exists $sgList = $rs->network->securityGroups->list(null, ['name' => $sgTestName]); $this->assertInstanceOf(self::ABSTRACT_PAGINATION_CLASS, $sgList); foreach ($sgList as $sg) { $this->assertNotEmpty($sg->name); $this->assertNotEmpty($sg->id); if ($sg->name === $sgTestName) { //Removes previously created test security group $res = $rs->network->securityGroups->delete($sg->id); $this->assertTrue($res); } } unset($sgList); //List Security groups test $sgList = $rs->network->securityGroups->list(); $this->assertInstanceOf(self::ABSTRACT_PAGINATION_CLASS, $sgList); unset($sgList); //Create security group test $sg = $rs->network->securityGroups->create($sgTestName, 'phpunit test security group'); $this->assertNotEmpty($sg); $this->assertInternalType('object', $sg); $this->assertNotEmpty($sg->id); $this->assertEquals($sgTestName, $sg->name); $this->assertNotEmpty($sg->description); //Update security group test //ListRules test //Gets the rules set for the created security group $rulesList = $rs->network->securityGroups->listRules(null, ['securityGroupId' => $sg->id]); $this->assertInstanceOf(self::ABSTRACT_PAGINATION_CLASS, $rulesList); $this->assertEquals(0, count($rulesList), 'New security group is expected to have empty set of the rules.'); $ruleToAdd = ["security_group_id" => $sg->id, "remote_group_id" => null, "direction" => "ingress", "remote_ip_prefix" => "0.0.0.0/0", "port_range_max" => null, "port_range_min" => null]; //Add a new rule to security group $rule = $rs->network->securityGroups->addRule($ruleToAdd); $this->assertNotEmpty($rule); $this->assertNotEmpty($rule->id); $this->assertInternalType('object', $rule); //Verifies that all properties are set properly foreach ($ruleToAdd as $property => $value) { $this->assertObjectHasAttribute($property, $rule); $this->assertEquals($value, $rule->{$property}); } //Checks that new rule does exist $rulesList = $rs->network->securityGroups->listRules(null, ['securityGroupId' => $sg->id]); $this->assertEquals(1, count($rulesList)); unset($rulesList); //Removes rule $ret = $rs->network->securityGroups->deleteRule($rule->id); $this->assertTrue($ret); //Checks whether rule is removed properly $rulesList = $rs->network->securityGroups->listRules(null, ['securityGroupId' => $sg->id]); $this->assertEquals(0, count($rulesList)); unset($rulesList); //Delete security group test $ret = $rs->network->securityGroups->delete($sg->id); $this->assertTrue($ret); unset($sg); } } //List snapshots test $snList = $rs->volume->snapshots->list(); $this->assertTrue($snList instanceof \ArrayIterator); foreach ($snList as $v) { if ($v->display_name == self::getTestSnapshotName()) { $rs->volume->snapshots->delete($v->id); } } unset($snList); //List Volume Types test $volumeTypes = $rs->volume->listVolumeTypes(); $this->assertTrue($volumeTypes instanceof \ArrayIterator); foreach ($volumeTypes as $v) { $volumeTypeDesc = $rs->volume->getVolumeType($v->id); $this->assertTrue(is_object($volumeTypeDesc)); unset($volumeTypeDesc); break; } //List Volumes test $aVolumes = $rs->volume->listVolumes(); $this->assertTrue($aVolumes instanceof \ArrayIterator); foreach ($aVolumes as $v) { if ($v->display_name == self::getTestVolumeName()) { if (in_array($v->status, array(VolumeStatus::STATUS_AVAILABLE, VolumeStatus::STATUS_ERROR))) { $ret = $rs->volume->deleteVolume($v->id); } } } //Create Volume test $volume = $rs->volume->createVolume(self::VOLUME_SIZE, self::getTestVolumeName()); $this->assertTrue(is_object($volume)); $this->assertNotEmpty($volume->id); for ($t = time(), $s = 1; time() - $t < 300 && !in_array($volume->status, array(VolumeStatus::STATUS_AVAILABLE, VolumeStatus::STATUS_ERROR)); $s += 5) { sleep($s); $volume = $rs->volume->getVolume($volume->id); $this->assertTrue(is_object($volume)); $this->assertNotEmpty($volume->id); } $this->assertContains($volume->status, array(VolumeStatus::STATUS_AVAILABLE, VolumeStatus::STATUS_ERROR)); // //Create snapshot test // //WARNING! It takes too long time. // $snap = $rs->volume->snapshots->create($volume->id, self::getTestSnapshotName()); // $this->assertTrue(is_object($snap)); // $this->assertNotEmpty($snap->id); // for ($t = time(), $s = 1; (time() - $t) < 600 && !in_array($snap->status, array('available', 'error')); $s += 5) { // sleep($s); // $snap = $rs->volume->snapshots->get($snap->id); // $this->assertNotEmpty($snap->id); // } // $this->assertContains($snap->status, array('available', 'error')); // //Delete snapshot test // $ret = $rs->volume->snapshots->delete($snap->id); // $this->assertTrue($ret); // unset($snap); // sleep(5); //Delete Volume test $ret = $rs->volume->deleteVolume($volume->id); $this->assertTrue($ret); unset($volume); sleep(5); $pool = null; if ($rs->servers->isExtensionSupported(ServersExtension::floatingIpPools())) { $aFloatingIpPools = $rs->servers->listFloatingIpPools(); $this->assertTrue($aFloatingIpPools instanceof \ArrayIterator); foreach ($aFloatingIpPools as $v) { $pool = $v->name; break; } $this->assertNotNull($pool); unset($aFloatingIpPools); } if ($rs->servers->isExtensionSupported(ServersExtension::floatingIps())) { $this->assertNotNull($pool); $aFloatingIps = $rs->servers->floatingIps->list(); $this->assertTrue($aFloatingIps instanceof \ArrayIterator); foreach ($aFloatingIps as $v) { $r = $rs->servers->floatingIps->get($v->id); $this->assertTrue(is_object($r)); break; } unset($aFloatingIps); //default pool for rackspase is 'nova' $fip = $rs->servers->floatingIps->create($pool); $this->assertTrue(is_object($fip)); $r = $rs->servers->floatingIps->delete($fip->id); $this->assertTrue($r); try { //Verifies that ip has been successfully removed $res = $rs->servers->floatingIps->get($fip->id); $this->assertTrue(false, 'Exception must be thrown here'); } catch (RestClientException $e) { if ($e->error->code == 404) { $this->assertTrue(true); } else { //OpenStack Grizzly fails with 500 error code. //throw $e; } } unset($fip); } //List flavors test $flavorsList = $listFlavors = $rs->servers->listFlavors(); $this->assertTrue($flavorsList instanceof \ArrayIterator); $flavorId = null; foreach ($flavorsList as $v) { $flavorId = $v->id; break; } $this->assertNotNull($flavorId); unset($flavorsList); //List servers test $ret = $rs->servers->list(); if (!empty($ret) && $ret->count()) { foreach ($ret as $v) { if ($v->name == self::getTestServerName() || $v->name == self::getTestServerName('renamed')) { //Removes servers try { $rs->servers->deleteServer($v->id); } catch (RestClientException $e) { echo $e->getMessage() . "\n"; } } } } $personality = new PersonalityList(); $personality->append(new Personality('/etc/scalr/private.d/.user-data', base64_encode('super data'))); $personality->append(new Personality('/etc/.scalr-user-data', base64_encode('super data'))); $netList = null; //Create server test $srv = $rs->servers->createServer(self::getTestServerName(), $flavorId, $imageId, null, null, $personality, $netList); $this->assertInstanceOf('stdClass', $srv); $srv = $rs->servers->getServerDetails($srv->id); $this->assertInstanceOf('stdClass', $srv); $this->assertNotEmpty($srv->status); for ($t = time(), $s = 10; time() - $t < 600 && !in_array($srv->status, array('ACTIVE', 'ERROR')); $s += 1) { sleep($s); $srv = $rs->servers->getServerDetails($srv->id); } $this->assertContains($srv->status, array('ACTIVE', 'ERROR')); if ($rs->servers->isExtensionSupported(ServersExtension::consoleOutput())) { $consoleOut = $rs->servers->getConsoleOutput($srv->id, 50); } //List Addresses test $addresses = $rs->servers->listAddresses($srv->id); $this->assertTrue(is_object($addresses)); //Get server details test $srvDetails = $rs->servers->getServerDetails($srv->id); $this->assertInstanceOf('stdClass', $srvDetails); unset($srvDetails); //Images List test $imagesList = $rs->servers->images->list(); $this->assertTrue($imagesList instanceof DefaultPaginationList); foreach ($imagesList as $img) { if ($img->name == self::getTestName('image')) { $rs->servers->images->delete($img->id); } $imageDetails = $rs->servers->images->get($img->id); $this->assertTrue(is_object($imageDetails)); unset($imageDetails); break; } unset($imagesList); //Keypairs extension test if ($rs->servers->isExtensionSupported(ServersExtension::keypairs())) { $aKeypairs = $rs->servers->keypairs->list(); $this->assertTrue($aKeypairs instanceof \ArrayIterator); foreach ($aKeypairs as $v) { if ($v->keypair->name == self::getTestName('key')) { $rs->servers->keypairs->delete($v->keypair->name); } } unset($aKeypairs); $kp = $rs->servers->keypairs->create(self::getTestName('key')); $this->assertNotEmpty($kp); $this->assertTrue(is_object($kp)); $kptwin = $rs->servers->keypairs->get($kp->name); $this->assertNotEmpty($kptwin); $this->assertEquals($kp->public_key, $kptwin->public_key); unset($kptwin); $res = $rs->servers->keypairs->delete($kp->name); $this->assertTrue($res); unset($kp); } //Security Groups extension test if ($rs->servers->isExtensionSupported(ServersExtension::securityGroups())) { $listSecurityGroups = $rs->servers->securityGroups->list(); $this->assertTrue($listSecurityGroups instanceof \ArrayIterator); foreach ($listSecurityGroups as $v) { if ($v->name == self::getTestName('security-group')) { $rs->servers->securityGroups->delete($v->id); } } unset($listSecurityGroups); $listForSpecificServer = $rs->servers->securityGroups->list($srv->id); $this->assertTrue(is_array($listForSpecificServer) || $listForSpecificServer instanceof \ArrayIterator); unset($listForSpecificServer); $sg = $rs->servers->securityGroups->create(self::getTestName('security-group'), 'This is phpunit security group test.'); $this->assertNotEmpty($sg); $this->assertTrue(is_object($sg)); $sgmirror = $rs->servers->securityGroups->get($sg->id); $this->assertNotEmpty($sgmirror); $this->assertEquals($sg->id, $sgmirror->id); unset($sgmirror); $sgrule = $rs->servers->securityGroups->addRule(array("ip_protocol" => "tcp", "from_port" => "80", "to_port" => "8080", "cidr" => "0.0.0.0/0", "parent_group_id" => $sg->id)); $this->assertNotEmpty($sgrule); $this->assertTrue(is_object($sgrule)); $this->assertEquals($sg->id, $sgrule->parent_group_id); $ret = $rs->servers->securityGroups->deleteRule($sgrule->id); $this->assertTrue($ret); unset($sgrule); $ret = $rs->servers->securityGroups->delete($sg->id); $this->assertTrue($ret); } //Create image test $imageId = $rs->servers->images->create($srv->id, self::getTestName('image')); $this->assertTrue(is_string($imageId)); //It requires ACTIVE state of server // $res = $rs->servers->resizeServer($srv->id, $srv->name, '3'); // $this->assertTrue($res); // $res = $rs->servers->confirmResizedServer($srv->id); // $this->assertTrue($res); $ret = $rs->servers->images->delete($imageId); $this->assertTrue($ret); //Update server test $renamedDetails = $rs->servers->updateServer($srv->id, self::getTestServerName('renamed')); $this->assertInstanceOf('stdClass', $renamedDetails); $this->assertEquals(self::getTestServerName('renamed'), $renamedDetails->server->name); unset($renamedDetails); //Delete Server test $ret = $rs->servers->deleteServer($srv->id); $this->assertTrue($ret); }
/** * @param Entity\CloudCredentials $entity * @param Entity\CloudCredentials $prevConfig */ public function validateEntity($entity, $prevConfig = null) { parent::validateEntity($entity, $prevConfig); $ccProps = $entity->properties; $prevCcProps = isset($prevConfig) ? $prevConfig->properties : null; if ($this->needValidation($ccProps, $prevCcProps)) { if (empty($ccProps[Entity\CloudCredentialsProperty::OPENSTACK_KEYSTONE_URL])) { throw new ApiErrorException(400, ErrorMessage::ERR_INVALID_VALUE, "Missed property keystoneUrl"); } /* @var $config Yaml */ $config = $this->controller->getContainer()->config; if ($config->defined("scalr.{$entity->cloud}.use_proxy") && $config("scalr.{$entity->cloud}.use_proxy") && in_array($config('scalr.connections.proxy.use_on'), ['both', 'scalr'])) { $proxySettings = $config('scalr.connections.proxy'); } else { $proxySettings = null; } try { $os = new OpenStack(new OpenStackConfig($ccProps[Entity\CloudCredentialsProperty::OPENSTACK_USERNAME], $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_KEYSTONE_URL], 'fake-region', $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_API_KEY], null, null, $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_PASSWORD], $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_TENANT_NAME], $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_DOMAIN_NAME], $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_IDENTITY_VERSION], $proxySettings)); //It throws an exception on failure $zones = $os->listZones(); $zone = array_shift($zones); $os = new OpenStack(new OpenStackConfig($ccProps[Entity\CloudCredentialsProperty::OPENSTACK_USERNAME], $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_KEYSTONE_URL], $zone->name, $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_API_KEY], null, null, $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_PASSWORD], $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_TENANT_NAME], $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_DOMAIN_NAME], $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_IDENTITY_VERSION], $proxySettings)); // Check SG Extension $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_EXT_SECURITYGROUPS_ENABLED] = (int) $os->servers->isExtensionSupported(ServersExtension::securityGroups()); // Check Floating Ips Extension $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_EXT_FLOATING_IPS_ENABLED] = (int) $os->servers->isExtensionSupported(ServersExtension::floatingIps()); // Check Cinder Extension $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_EXT_CINDER_ENABLED] = (int) $os->hasService('volume'); // Check Swift Extension $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_EXT_SWIFT_ENABLED] = (int) $os->hasService('object-store'); // Check LBaas Extension $ccProps[Entity\CloudCredentialsProperty::OPENSTACK_EXT_LBAAS_ENABLED] = !in_array($entity->cloud, array(SERVER_PLATFORMS::RACKSPACENG_US, SERVER_PLATFORMS::RACKSPACENG_UK)) && $os->hasService('network') ? (int) $os->network->isExtensionSupported('lbaas') : 0; } catch (Exception $e) { throw new ApiErrorException(400, ErrorMessage::ERR_INVALID_VALUE, "Failed to verify your Openstack credentials: {$e->getMessage()}"); } $entity->status = Entity\CloudCredentials::STATUS_ENABLED; } }
/** * @test * @dataProvider providerRs */ public function testFunctionalOpenStack($platform, $region, $imageId) { if ($this->isSkipFunctionalTests()) { $this->markTestSkipped(); } /* @var $rs OpenStack */ if ($this->getContainer()->environment->isPlatformEnabled($platform)) { $rs = $this->getContainer()->openstack($platform, $region); // $rs->setDebug(); $this->assertInstanceOf($this->getOpenStackClassName('OpenStack'), $rs); } else { //Environment has not been activated yet. $this->markTestSkipped(sprintf('Environment for the "%s" platform has not been activated.', $platform)); } $os = $this->getContainer()->openstack($platform, 'INVALID-REGION-TEST'); try { $ext = $os->servers->listExtensions(); unset($os); $this->assertTrue(false, 'An exception must be thrown in this test'); } catch (OpenStackException $e) { $this->assertTrue(true); } unset($os); //Activates rest client debug output $one = $rs->servers; $this->assertInstanceOf($this->getOpenStackClassName('Services\\ServersService'), $one); $two = $rs->servers; $this->assertInstanceOf($this->getOpenStackClassName('Services\\ServersService'), $two); $this->assertSame($one, $two, 'Service interface is expected to be cached within each separate OpenStack instance.'); $aZones = $rs->listZones(); $this->assertNotEmpty($aZones); unset($aZones); //List tenants test $tenants = $rs->listTenants(); $this->assertNotEmpty($tenants); $this->assertTrue(is_array($tenants)); unset($tenants); //Get Limits test $limits = $rs->servers->getLimits(); $this->assertTrue(is_object($limits)); unset($limits); $aExtensions = $rs->servers->listExtensions(); $this->assertTrue(is_array($aExtensions)); unset($aExtensions); $aExtensions = $rs->volume->listExtensions(); $this->assertTrue(is_array($aExtensions)); unset($aExtensions); $hasNetwork = $rs->hasService(OpenStack::SERVICE_NETWORK); if ($platform != SERVER_PLATFORMS::ECS && $hasNetwork) { $aExtensions = $rs->network->listExtensions(); $this->assertTrue(is_array($aExtensions)); unset($aExtensions); //Quantum API tests $testNetworkName = self::getTestName(self::NAME_NETWORK); $testSubnetName = self::getTestName(self::NAME_SUBNET); $testPortName = self::getTestName(self::NAME_PORT); $testRouterName = self::getTestName(self::NAME_ROUTER); //ListNetworks test $networks = $rs->network->networks->list(null, array('status' => 'ACTIVE', 'shared' => false)); $this->assertInternalType('array', $networks); if (isset($networks[0])) { $this->assertInternalType('object', $networks[0]); $this->assertNotEmpty($networks[0]->id); //Show Network test $network = $rs->network->networks->list($networks[0]->id); $this->assertEquals($networks[0], $network); unset($network); } unset($networks); //ListSubnets test $subnets = $rs->network->subnets->list(); $this->assertInternalType('array', $subnets); if (isset($subnets[0])) { $this->assertInternalType('object', $subnets[0]); $this->assertNotEmpty($subnets[0]->id); //Show Subnet test $subnet = $rs->network->subnets->list($subnets[0]->id); $this->assertEquals($subnets[0], $subnet); unset($subnet); } unset($subnets); //ListPorts test $ports = $rs->network->ports->list(); $this->assertInternalType('array', $ports); if (isset($ports[0])) { $this->assertInternalType('object', $ports[0]); $this->assertNotEmpty($ports[0]->id); //Show Port test $port = $rs->network->ports->list($ports[0]->id); $this->assertEquals($ports[0], $port); unset($port); } unset($ports); //Tries to find the ports that were created recently by this test //but hadn't been removed at any reason. $ports = $rs->network->ports->list(null, array('name' => array($testPortName, $testPortName . '1'))); foreach ($ports as $port) { //Removes previously created ports $rs->network->ports->delete($port->id); } unset($ports); //Tries to find the networks that were created recently by this test //but hadn't been removed at any reason. $networks = $rs->network->networks->list(null, array('name' => $testNetworkName)); foreach ($networks as $network) { //Removes previously created networks $rs->network->networks->update($network->id, null, false); //Trying to remove allocated ports $portsToRemove = $rs->network->ports->list(null, array('networkId' => $network->id)); foreach ($portsToRemove as $p) { if (isset($p->device_owner) && isset($p->device_id) && $p->device_owner == 'network:router_interface') { $rs->network->ports->update($p->id, array('admin_state_up' => false)); $rs->network->routers->removeInterface($p->device_id, null, $p->id); } } $rs->network->networks->delete($network->id); } unset($networks); //Tries to find the subnets that where created by this test but hadn't been removed yet. $subnets = $rs->network->subnets->list(null, array('name' => array($testSubnetName, $testSubnetName . '1'))); $this->assertInternalType('array', $subnets); foreach ($subnets as $subnet) { //Removes previously created subnets $rs->network->subnets->delete($subnet->id); } //Creates new network $network = $rs->network->networks->create($testNetworkName, false, false); $this->assertInternalType('object', $network); $this->assertNotEmpty($network->id); $this->assertEquals(false, $network->admin_state_up); $this->assertEquals(false, $network->shared); //Updates newtork state $network = $rs->network->networks->update($network->id, null, true); $this->assertInternalType('object', $network); $this->assertEquals(true, $network->admin_state_up); //Creates subnet $subnet = $rs->network->subnets->create(array('network_id' => $network->id, 'cidr' => '10.0.3.0/24', 'name' => $testSubnetName, 'allocation_pools' => array(new AllocationPool('10.0.3.20', '10.0.3.22')))); $this->assertInternalType('object', $subnet); $this->assertEquals($testSubnetName, $subnet->name); $this->assertNotEmpty($subnet->id); $this->assertInternalType('array', $subnet->allocation_pools); $this->assertNotEmpty($subnet->allocation_pools); $this->assertEquals('10.0.3.22', $subnet->allocation_pools[0]->end); //Updates the subnet $subnet = $rs->network->subnets->update($subnet->id, array('name' => $testSubnetName . '1')); $this->assertInternalType('object', $subnet); $this->assertNotEmpty($subnet->name); $this->assertEquals($testSubnetName . '1', $subnet->name); //Creates port //Let's use object here $req = new CreatePort($network->id); $req->name = $testPortName; //You may pass object aw well as array $port = $rs->network->ports->create($req); $this->assertInternalType('object', $port); $this->assertEquals($network->id, $port->network_id); $this->assertEquals($testPortName, $port->name); $this->assertNotEmpty($port->id); //Updates port $port = $rs->network->ports->update($port->id, array('name' => $testPortName . '1')); $this->assertInternalType('object', $port); $this->assertEquals($testPortName . '1', $port->name); //Quantum L3 Router related tests if ($rs->network->isExtensionSupported(NetworkExtension::quantumL3Router())) { //ListRouters test $routers = $rs->network->routers->list(null, array('status' => array('ACTIVE', 'PENDING')), array('id', 'name')); $this->assertInternalType('array', $routers); foreach ($routers as $r) { $router = $rs->network->routers->list($r->id); $this->assertInternalType('object', $router); if ($r->name == $testRouterName) { //Removes the router which is created by phpunit test before and is still alive by any reason. //It requires all internal interfaces to be removed from router. $ret = $rs->network->routers->delete($r->id); $this->assertTrue($ret); } } unset($routers); //Creates router $router = $rs->network->routers->create(new CreateRouter($testRouterName)); $this->assertInternalType('object', $router); $this->assertObjectHasAttribute('name', $router); $this->assertNotEmpty($router->name); $this->assertEquals($testRouterName, $router->name); $this->assertObjectHasAttribute('id', $router); $this->assertNotEmpty($router->id); $this->assertObjectHasAttribute('admin_state_up', $router); $this->assertTrue($router->admin_state_up); //Updates the router $r2 = $rs->network->routers->update($router->id, array('admin_state_up' => false)); $this->assertInternalType('object', $r2); $this->assertObjectHasAttribute('admin_state_up', $r2); $this->assertEquals(false, $r2->admin_state_up); //Adds interface to router $routerInterface1 = $rs->network->routers->addInterface($router->id, $subnet->id); $this->assertInternalType('object', $routerInterface1); $this->assertObjectHasAttribute('subnet_id', $routerInterface1); $this->assertEquals($subnet->id, $routerInterface1->subnet_id); $this->assertObjectHasAttribute('port_id', $routerInterface1); //Removes interface from router $obj = $rs->network->routers->removeInterface($router->id, $subnet->id); // It returns nothing NULL // $this->assertInternalType('object', $obj); // $this->assertObjectHasAttribute('subnet_id', $obj); // $this->assertEquals($subnet->id, $obj->subnet_id); // $this->assertObjectHasAttribute('port_id', $obj); // unset($obj); //Removes router $ret = $rs->network->routers->delete($router->id); $this->assertTrue($ret); unset($router); } //Removes port $ret = $rs->network->ports->delete($port->id); $this->assertTrue($ret); //Removes subnet $ret = $rs->network->subnets->delete($subnet->id); $this->assertTrue($ret); //Removes created network $rs->network->networks->update($network->id, null, false); $ret = $rs->network->networks->delete($network->id); $this->assertTrue($ret); unset($network); } //List snapshots test $snList = $rs->volume->snapshots->list(); $this->assertTrue(is_array($snList)); foreach ($snList as $v) { if ($v->display_name == self::getTestSnapshotName()) { $rs->volume->snapshots->delete($v->id); } } unset($snList); //List Volume Types test $volumeTypes = $rs->volume->listVolumeTypes(); $this->assertTrue(is_array($volumeTypes)); foreach ($volumeTypes as $v) { $volumeTypeDesc = $rs->volume->getVolumeType($v->id); $this->assertTrue(is_object($volumeTypeDesc)); unset($volumeTypeDesc); break; } //List Volumes test $aVolumes = $rs->volume->listVolumes(); $this->assertTrue(is_array($aVolumes)); foreach ($aVolumes as $v) { if ($v->display_name == self::getTestVolumeName()) { if (in_array($v->status, array(VolumeStatus::STATUS_AVAILABLE, VolumeStatus::STATUS_ERROR))) { $ret = $rs->volume->deleteVolume($v->id); } } } //Create Volume test $volume = $rs->volume->createVolume(self::VOLUME_SIZE, self::getTestVolumeName()); $this->assertTrue(is_object($volume)); $this->assertNotEmpty($volume->id); for ($t = time(), $s = 1; time() - $t < 300 && !in_array($volume->status, array(VolumeStatus::STATUS_AVAILABLE, VolumeStatus::STATUS_ERROR)); $s += 5) { sleep($s); $volume = $rs->volume->getVolume($volume->id); $this->assertTrue(is_object($volume)); $this->assertNotEmpty($volume->id); } $this->assertContains($volume->status, array(VolumeStatus::STATUS_AVAILABLE, VolumeStatus::STATUS_ERROR)); // //Create snapshot test // //WARNING! It takes too long time. // $snap = $rs->volume->snapshots->create($volume->id, self::getTestSnapshotName()); // $this->assertTrue(is_object($snap)); // $this->assertNotEmpty($snap->id); // for ($t = time(), $s = 1; (time() - $t) < 600 && !in_array($snap->status, array('available', 'error')); $s += 5) { // sleep($s); // $snap = $rs->volume->snapshots->get($snap->id); // $this->assertNotEmpty($snap->id); // } // $this->assertContains($snap->status, array('available', 'error')); // //Delete snapshot test // $ret = $rs->volume->snapshots->delete($snap->id); // $this->assertTrue($ret); // unset($snap); // sleep(5); //Delete Volume test $ret = $rs->volume->deleteVolume($volume->id); $this->assertTrue($ret); unset($volume); sleep(5); $pool = null; if ($rs->servers->isExtensionSupported(ServersExtension::floatingIpPools())) { $aFloatingIpPools = $rs->servers->listFloatingIpPools(); $this->assertTrue(is_array($aFloatingIpPools)); foreach ($aFloatingIpPools as $v) { $pool = $v->name; break; } $this->assertNotNull($pool); unset($aFloatingIpPools); } if ($rs->servers->isExtensionSupported(ServersExtension::floatingIps())) { $this->assertNotNull($pool); $aFloatingIps = $rs->servers->floatingIps->list(); $this->assertTrue(is_array($aFloatingIps)); foreach ($aFloatingIps as $v) { $r = $rs->servers->floatingIps->get($v->id); $this->assertTrue(is_object($r)); break; } unset($aFloatingIps); //default pool for rackspase is 'nova' $fip = $rs->servers->floatingIps->create($pool); $this->assertTrue(is_object($fip)); $r = $rs->servers->floatingIps->delete($fip->id); $this->assertTrue($r); try { //Verifies that ip has been successfully removed $res = $rs->servers->floatingIps->get($fip->id); $this->assertTrue(false, 'Exception must be thrown here'); } catch (RestClientException $e) { if ($e->error->code == 404) { $this->assertTrue(true); } else { //OpenStack Grizzly fails with 500 error code. //throw $e; } } unset($fip); } //List flavors test $flavorsList = $listFlavors = $rs->servers->listFlavors(); $this->assertTrue(is_array($flavorsList)); $flavorId = null; foreach ($flavorsList as $v) { $flavorId = $v->id; break; } $this->assertNotNull($flavorId); unset($flavorsList); //List servers test $ret = $rs->servers->list(); $this->assertTrue(is_array($ret)); if (!empty($ret)) { foreach ($ret as $v) { if ($v->name == self::getTestServerName() || $v->name == self::getTestServerName('renamed')) { //Removes servers try { $rs->servers->deleteServer($v->id); } catch (RestClientException $e) { echo $e->getMessage() . "\n"; } } } } $personality = new PersonalityList(); $personality->append(new Personality('/etc/scalr/private.d/.user-data', base64_encode('super data'))); $personality->append(new Personality('/etc/.scalr-user-data', base64_encode('super data'))); $netList = null; //Create server test $srv = $rs->servers->createServer(self::getTestServerName(), $flavorId, $imageId, null, null, $personality, $netList); $this->assertInstanceOf('stdClass', $srv); $srv = $rs->servers->getServerDetails($srv->id); $this->assertInstanceOf('stdClass', $srv); $this->assertNotEmpty($srv->status); for ($t = time(), $s = 10; time() - $t < 600 && !in_array($srv->status, array('ACTIVE', 'ERROR')); $s += 1) { sleep($s); $srv = $rs->servers->getServerDetails($srv->id); } $this->assertContains($srv->status, array('ACTIVE', 'ERROR')); if ($rs->servers->isExtensionSupported(ServersExtension::consoleOutput())) { $consoleOut = $rs->servers->getConsoleOutput($srv->id, 50); } //List Addresses test $addresses = $rs->servers->listAddresses($srv->id); $this->assertTrue(is_object($addresses)); //Get server details test $srvDetails = $rs->servers->getServerDetails($srv->id); $this->assertInstanceOf('stdClass', $srvDetails); unset($srvDetails); //Images List test $imagesList = $rs->servers->images->list(); $this->assertTrue(is_array($imagesList)); foreach ($imagesList as $img) { if ($img->name == self::getTestName('image')) { $rs->servers->images->delete($img->id); } $imageDetails = $rs->servers->images->get($img->id); $this->assertTrue(is_object($imageDetails)); unset($imageDetails); break; } unset($imagesList); //Keypairs extension test if ($rs->servers->isExtensionSupported(ServersExtension::keypairs())) { $aKeypairs = $rs->servers->keypairs->list(); $this->assertTrue(is_array($aKeypairs)); foreach ($aKeypairs as $v) { if ($v->keypair->name == self::getTestName('key')) { $rs->servers->keypairs->delete($v->keypair->name); } } unset($aKeypairs); $kp = $rs->servers->keypairs->create(self::getTestName('key')); $this->assertNotEmpty($kp); $this->assertTrue(is_object($kp)); $kptwin = $rs->servers->keypairs->get($kp->name); $this->assertNotEmpty($kptwin); $this->assertEquals($kp->public_key, $kptwin->public_key); unset($kptwin); $res = $rs->servers->keypairs->delete($kp->name); $this->assertTrue($res); unset($kp); } //Security Groups extension test if ($rs->servers->isExtensionSupported(ServersExtension::securityGroups())) { $listSecurityGroups = $rs->servers->securityGroups->list(); $this->assertTrue(is_array($listSecurityGroups)); foreach ($listSecurityGroups as $v) { if ($v->name == self::getTestName('security-group')) { $rs->servers->securityGroups->delete($v->id); } } unset($listSecurityGroups); $listForSpecificServer = $rs->servers->securityGroups->list($srv->id); $this->assertTrue(is_array($listForSpecificServer)); unset($listForSpecificServer); $sg = $rs->servers->securityGroups->create(self::getTestName('security-group'), 'This is phpunit security group test.'); $this->assertNotEmpty($sg); $this->assertTrue(is_object($sg)); $sgmirror = $rs->servers->securityGroups->get($sg->id); $this->assertNotEmpty($sgmirror); $this->assertEquals($sg->id, $sgmirror->id); unset($sgmirror); $sgrule = $rs->servers->securityGroups->addRule(array("ip_protocol" => "tcp", "from_port" => "80", "to_port" => "8080", "cidr" => "0.0.0.0/0", "parent_group_id" => $sg->id)); $this->assertNotEmpty($sgrule); $this->assertTrue(is_object($sgrule)); $this->assertEquals($sg->id, $sgrule->parent_group_id); $ret = $rs->servers->securityGroups->deleteRule($sgrule->id); $this->assertTrue($ret); unset($sgrule); $ret = $rs->servers->securityGroups->delete($sg->id); $this->assertTrue($ret); } //Create image test $imageId = $rs->servers->images->create($srv->id, self::getTestName('image')); $this->assertTrue(is_string($imageId)); //It requires ACTIVE state of server // $res = $rs->servers->resizeServer($srv->id, $srv->name, '3'); // $this->assertTrue($res); // $res = $rs->servers->confirmResizedServer($srv->id); // $this->assertTrue($res); $ret = $rs->servers->images->delete($imageId); $this->assertTrue($ret); //Update server test $renamedDetails = $rs->servers->updateServer($srv->id, self::getTestServerName('renamed')); $this->assertInstanceOf('stdClass', $renamedDetails); $this->assertEquals(self::getTestServerName('renamed'), $renamedDetails->server->name); unset($renamedDetails); //Delete Server test $ret = $rs->servers->deleteServer($srv->id); $this->assertTrue($ret); }
private function saveOpenstack() { $pars = array(); $enabled = false; $platform = $this->getParam('platform'); $bNew = !$this->env->isPlatformEnabled($platform); if (!$bNew) { $oldUrl = $this->env->getPlatformConfigValue($this->getOpenStackOption('KEYSTONE_URL')); } if ($this->getParam("{$platform}_is_enabled")) { $enabled = true; $pars[$this->getOpenStackOption('KEYSTONE_URL')] = trim($this->checkVar(OpenstackPlatformModule::KEYSTONE_URL, 'string', 'KeyStone URL required')); $pars[$this->getOpenStackOption('SSL_VERIFYPEER')] = trim($this->checkVar(OpenstackPlatformModule::SSL_VERIFYPEER, 'int')); $pars[$this->getOpenStackOption('USERNAME')] = $this->checkVar(OpenstackPlatformModule::USERNAME, 'string', 'Username required'); $pars[$this->getOpenStackOption('PASSWORD')] = $this->checkVar(OpenstackPlatformModule::PASSWORD, 'password', '', '', false, $platform); $pars[$this->getOpenStackOption('API_KEY')] = $this->checkVar(OpenstackPlatformModule::API_KEY, 'string'); if ($platform == SERVER_PLATFORMS::ECS) { $pars[$this->getOpenStackOption('TENANT_NAME')] = $this->checkVar(OpenstackPlatformModule::TENANT_NAME, 'password', '', '', false, $platform); } else { $pars[$this->getOpenStackOption('TENANT_NAME')] = $this->checkVar(OpenstackPlatformModule::TENANT_NAME, 'string'); } if (empty($this->checkVarError) && empty($pars[$this->getOpenStackOption('PASSWORD')]) && empty($pars[$this->getOpenStackOption('API_KEY')])) { $this->checkVarError['api_key'] = $this->checkVarError['password'] = '******'; } } if (count($this->checkVarError)) { $this->response->failure(); $this->response->data(array('errors' => $this->checkVarError)); } else { if ($this->getParam($platform . "_is_enabled")) { $os = new OpenStack(new OpenStackConfig($pars[$this->getOpenStackOption('USERNAME')], $pars[$this->getOpenStackOption('KEYSTONE_URL')], 'fake-region', $pars[$this->getOpenStackOption('API_KEY')], null, null, $pars[$this->getOpenStackOption('PASSWORD')], $pars[$this->getOpenStackOption('TENANT_NAME')])); //It throws an exception on failure $zones = $os->listZones(); $zone = array_shift($zones); $os = new OpenStack(new OpenStackConfig($pars[$this->getOpenStackOption('USERNAME')], $pars[$this->getOpenStackOption('KEYSTONE_URL')], $zone->name, $pars[$this->getOpenStackOption('API_KEY')], null, null, $pars[$this->getOpenStackOption('PASSWORD')], $pars[$this->getOpenStackOption('TENANT_NAME')])); // Check SG Extension $pars[$this->getOpenStackOption('EXT_SECURITYGROUPS_ENABLED')] = (int) $os->servers->isExtensionSupported(ServersExtension::securityGroups()); // Check Floating Ips Extension $pars[$this->getOpenStackOption('EXT_FLOATING_IPS_ENABLED')] = (int) $os->servers->isExtensionSupported(ServersExtension::floatingIps()); // Check Cinder Extension $pars[$this->getOpenStackOption('EXT_CINDER_ENABLED')] = (int) $os->hasService('volume'); // Check Swift Extension $pars[$this->getOpenStackOption('EXT_SWIFT_ENABLED')] = (int) $os->hasService('object-store'); // Check LBaas Extension $pars[$this->getOpenStackOption('EXT_LBAAS_ENABLED')] = $os->hasService('network') ? (int) $os->network->isExtensionSupported('lbaas') : 0; } $this->db->BeginTrans(); try { $this->env->enablePlatform($platform, $enabled); if ($enabled) { $this->env->setPlatformConfig($pars); if ($this->getContainer()->analytics->enabled && ($bNew || $oldUrl !== $pars[$this->getOpenStackOption('KEYSTONE_URL')])) { $this->getContainer()->analytics->notifications->onCloudAdd($platform, $this->env, $this->user); } } else { $this->env->setPlatformConfig(array("{$platform}." . OpenstackPlatformModule::AUTH_TOKEN => false)); } if (!$this->user->getAccount()->getSetting(Scalr_Account::SETTING_DATE_ENV_CONFIGURED)) { $this->user->getAccount()->setSetting(Scalr_Account::SETTING_DATE_ENV_CONFIGURED, time()); } $this->response->success('Cloud credentials have been ' . ($enabled ? 'saved' : 'removed from Scalr')); $this->response->data(array('enabled' => $enabled)); } catch (Exception $e) { $this->db->RollbackTrans(); throw new Exception(_('Failed to save ' . ucfirst($platform) . ' settings')); } $this->db->CommitTrans(); } }