| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| from nose.plugins.attrib import attr |
| from marvin.cloudstackTestCase import cloudstackTestCase |
| import unittest |
| from marvin.lib.base import (Account, |
| Host, |
| VPC, |
| VpcOffering) |
| from marvin.lib.common import (get_domain, |
| get_zone, |
| get_template) |
| import time |
| |
| class TestVPCHostMaintenance(cloudstackTestCase): |
| |
| @classmethod |
| def setUpClass(cls): |
| cls.testClient = super(TestVPCHostMaintenance, cls).getClsTestClient() |
| cls.api_client = cls.testClient.getApiClient() |
| cls._cleanup = [] |
| cls.hosts = [] |
| cls.vpcSupported = True |
| cls.hypervisor = cls.testClient.getHypervisorInfo() |
| if cls.hypervisor.lower() in ['hyperv']: |
| cls.vpcSupported = False |
| return |
| cls.services = cls.testClient.getParsedTestDataConfig() |
| # Get Zone, Domain and templates |
| cls.domain = get_domain(cls.api_client) |
| cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests()) |
| cls.template = get_template( |
| cls.api_client, |
| cls.zone.id, |
| cls.services["ostype"] |
| ) |
| cls.services["virtual_machine"]["zoneid"] = cls.zone.id |
| cls.services["virtual_machine"]["template"] = cls.template.id |
| cls.services["mode"] = cls.zone.networktype |
| |
| cls.vpc_off = VpcOffering.create( |
| cls.api_client, |
| cls.services["vpc_offering"] |
| ) |
| cls._cleanup.append(cls.vpc_off) |
| cls.vpc_off.update(cls.api_client, state='Enabled') |
| cls.hosts = Host.list( |
| cls.api_client, |
| zoneid=cls.zone.id, |
| listall=True, |
| type='Routing' |
| ) |
| |
| if isinstance(cls.hosts, list): |
| for host in cls.hosts: |
| Host.enableMaintenance( |
| cls.api_client, |
| id=host.id |
| ) |
| |
| timeout = cls.services["timeout"] |
| while True: |
| time.sleep(cls.services["sleep"]) |
| hosts_states = Host.list( |
| cls.api_client, |
| id=host.id, |
| listall=True |
| ) |
| if hosts_states[ |
| 0].resourcestate == 'PrepareForMaintenance': |
| # Wait for sometimetill host goes in maintenance state |
| time.sleep(cls.services["sleep"]) |
| elif hosts_states[0].resourcestate == 'Maintenance': |
| time.sleep(cls.services["sleep"]) |
| break |
| elif timeout == 0: |
| raise unittest.SkipTest( |
| "Failed to enable maintenance mode on %s" % |
| host.name) |
| timeout = timeout - 1 |
| return |
| |
| @classmethod |
| def tearDownClass(cls): |
| try: |
| for host in cls.hosts: |
| Host.cancelMaintenance( |
| cls.api_client, |
| id=host.id |
| ) |
| hosts_states = Host.list( |
| cls.api_client, |
| id=host.id, |
| listall=True |
| ) |
| if hosts_states[0].resourcestate != 'Enabled': |
| raise Exception( |
| "Failed to cancel maintenance mode on %s" % |
| (host.name)) |
| except Exception as e: |
| raise Exception("Warning: Exception during resetting hosts maintenance : %s" % e) |
| finally: |
| super(TestVPCHostMaintenance, cls).tearDownClass() |
| return |
| |
| def setUp(self): |
| self.apiclient = self.testClient.getApiClient() |
| self.dbclient = self.testClient.getDbConnection() |
| self.cleanup = [] |
| |
| if not self.vpcSupported: |
| self.skipTest("VPC is not supported on %s" % self.hypervisor) |
| |
| self.account = Account.create( |
| self.apiclient, |
| self.services["account"], |
| admin=True, |
| domainid=self.domain.id |
| ) |
| self.cleanup.append(self.account) |
| return |
| |
| def tearDown(self): |
| super(TestVPCHostMaintenance, self).tearDown() |
| |
| def validate_vpc_offering(self, vpc_offering): |
| """Validates the VPC offering""" |
| |
| self.debug("Check if the VPC offering is created successfully?") |
| vpc_offs = VpcOffering.list( |
| self.apiclient, |
| id=vpc_offering.id |
| ) |
| self.assertEqual( |
| isinstance(vpc_offs, list), |
| True, |
| "List VPC offerings should return a valid list" |
| ) |
| self.assertEqual( |
| vpc_offering.name, |
| vpc_offs[0].name, |
| "Name of the VPC offering should match with listVPCOff data" |
| ) |
| self.debug( |
| "VPC offering is created successfully - %s" % |
| vpc_offering.name) |
| return |
| |
| def validate_vpc_network(self, network, state=None): |
| """Validates the VPC network""" |
| |
| self.debug("Check if the VPC network is created successfully?") |
| vpc_networks = VPC.list( |
| self.apiclient, |
| id=network.id |
| ) |
| self.assertEqual( |
| isinstance(vpc_networks, list), |
| True, |
| "List VPC network should return a valid list" |
| ) |
| self.assertEqual( |
| network.name, |
| vpc_networks[0].name, |
| "Name of the VPC network should match with listVPC data" |
| ) |
| if state: |
| self.assertEqual( |
| vpc_networks[0].state.lower(), |
| state, |
| "VPC state should be '%s'" % state |
| ) |
| self.debug("VPC network validated - %s" % network.name) |
| return |
| |
| @attr(tags=["advanced", "intervlan"]) |
| def test_01_create_vpc_host_maintenance(self): |
| """ Test VPC when host is in maintenance mode |
| """ |
| |
| # Validate the following |
| # 1. Put the host in maintenance mode. |
| # 2. Attempt to Create a VPC with cidr - 10.1.1.1/16 |
| # 3. VPC will be created but will be in "Disabled" state |
| |
| self.debug("creating a VPC network in the account: %s" % |
| self.account.name) |
| self.services["vpc"]["cidr"] = '10.1.1.1/16' |
| vpc = VPC.create( |
| self.apiclient, |
| self.services["vpc"], |
| vpcofferingid=self.vpc_off.id, |
| zoneid=self.zone.id, |
| account=self.account.name, |
| domainid=self.account.domainid, |
| start=False |
| ) |
| self.cleanup.append(vpc) |
| self.validate_vpc_network(vpc, state='enabled') |
| return |