mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
This PR prepares marvin and tests for python3. it was part of #4479, until nose2 was decided to be abandoned from that PR. Re-PR of #4543 and #3730 to enable cooperation Co-authored-by: Daan Hoogland <dahn@onecht.net> Co-authored-by: Gabriel Beims Bräscher <gabriel@apache.org> Co-authored-by: Rohit Yadav <rohit.yadav@shapeblue.com>
488 lines
18 KiB
Python
488 lines
18 KiB
Python
# 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.
|
|
|
|
"""
|
|
Tests of acquiring a specified public IP for isolated network or vpc
|
|
"""
|
|
|
|
# Import Local Modules
|
|
from nose.plugins.attrib import attr
|
|
from marvin.cloudstackTestCase import cloudstackTestCase
|
|
import unittest
|
|
from marvin.cloudstackAPI import createVlanIpRange
|
|
from marvin.lib.utils import (validateList,
|
|
cleanup_resources)
|
|
from marvin.lib.base import (Account,
|
|
Domain,
|
|
Configurations,
|
|
VirtualMachine,
|
|
ServiceOffering,
|
|
VpcOffering,
|
|
Zone,
|
|
Network,
|
|
VPC,
|
|
PublicIPAddress,
|
|
PublicIpRange)
|
|
from marvin.lib.common import (get_domain,
|
|
get_zone,
|
|
get_free_vlan,
|
|
get_template)
|
|
import logging
|
|
import random
|
|
|
|
class TestAcquireSpecifiedPublicIp(cloudstackTestCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.testClient = super(
|
|
TestAcquireSpecifiedPublicIp,
|
|
cls).getClsTestClient()
|
|
cls.apiclient = cls.testClient.getApiClient()
|
|
cls.services = cls.testClient.getParsedTestDataConfig()
|
|
|
|
zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests())
|
|
cls.zone = Zone(zone.__dict__)
|
|
cls.template = get_template(cls.apiclient, cls.zone.id)
|
|
cls._cleanup = []
|
|
|
|
if str(cls.zone.securitygroupsenabled) == "True":
|
|
sys.exit(1)
|
|
|
|
cls.logger = logging.getLogger("TestAcquireSpecifiedPublicIp")
|
|
cls.stream_handler = logging.StreamHandler()
|
|
cls.logger.setLevel(logging.DEBUG)
|
|
cls.logger.addHandler(cls.stream_handler)
|
|
|
|
# Get Zone, Domain and templates
|
|
cls.domain = get_domain(cls.apiclient)
|
|
|
|
# Create new domain1
|
|
cls.domain1 = Domain.create(
|
|
cls.apiclient,
|
|
services=cls.services["acl"]["domain1"],
|
|
parentdomainid=cls.domain.id)
|
|
|
|
# Create account1
|
|
cls.account1 = Account.create(
|
|
cls.apiclient,
|
|
cls.services["acl"]["accountD1"],
|
|
domainid=cls.domain1.id
|
|
)
|
|
|
|
# Create domain2
|
|
cls.domain2 = Domain.create(
|
|
cls.apiclient,
|
|
services=cls.services["acl"]["domain2"],
|
|
parentdomainid=cls.domain.id)
|
|
|
|
# Create account2
|
|
cls.account2 = Account.create(
|
|
cls.apiclient,
|
|
cls.services["acl"]["accountD2"],
|
|
domainid=cls.domain2.id
|
|
)
|
|
|
|
cls.services["publiciprange"]["zoneid"] = cls.zone.id
|
|
cls.services["publiciprange"]["forvirtualnetwork"] = "true"
|
|
|
|
# Create public ip range 1
|
|
cls.services["publiciprange"]["vlan"] = get_free_vlan(
|
|
cls.apiclient,
|
|
cls.zone.id)[1]
|
|
random_subnet_number = random.randrange(10,20)
|
|
cls.services["publiciprange"]["gateway"] = "172.16." + \
|
|
str(random_subnet_number) + ".1"
|
|
cls.services["publiciprange"]["startip"] = "172.16." + \
|
|
str(random_subnet_number) + ".2"
|
|
cls.services["publiciprange"]["endip"] = "172.16." + \
|
|
str(random_subnet_number) + ".10"
|
|
cls.services["publiciprange"]["netmask"] = "255.255.255.0"
|
|
cls.public_ip_range1 = PublicIpRange.create(
|
|
cls.apiclient,
|
|
cls.services["publiciprange"]
|
|
)
|
|
PublicIpRange.dedicate(
|
|
cls.apiclient,
|
|
cls.public_ip_range1.vlan.id,
|
|
domainid=cls.account1.domainid
|
|
)
|
|
|
|
# Create public ip range 2
|
|
cls.services["publiciprange"]["vlan"] = get_free_vlan(
|
|
cls.apiclient,
|
|
cls.zone.id)[1]
|
|
cls.services["publiciprange"]["gateway"] = "172.16." + \
|
|
str(random_subnet_number + 1) + ".1"
|
|
cls.services["publiciprange"]["startip"] = "172.16." + \
|
|
str(random_subnet_number + 1) + ".2"
|
|
cls.services["publiciprange"]["endip"] = "172.16." + \
|
|
str(random_subnet_number + 1) + ".10"
|
|
cls.services["publiciprange"]["netmask"] = "255.255.255.0"
|
|
cls.public_ip_range2 = PublicIpRange.create(
|
|
cls.apiclient,
|
|
cls.services["publiciprange"]
|
|
)
|
|
PublicIpRange.dedicate(
|
|
cls.apiclient,
|
|
cls.public_ip_range2.vlan.id,
|
|
account=cls.account1.name,
|
|
domainid=cls.account1.domainid
|
|
)
|
|
|
|
# Create public ip range 3
|
|
cls.services["publiciprange"]["vlan"] = get_free_vlan(
|
|
cls.apiclient,
|
|
cls.zone.id)[1]
|
|
cls.services["publiciprange"]["gateway"] = "172.16." + \
|
|
str(random_subnet_number + 2) + ".1"
|
|
cls.services["publiciprange"]["startip"] = "172.16." + \
|
|
str(random_subnet_number + 2) + ".2"
|
|
cls.services["publiciprange"]["endip"] = "172.16." + \
|
|
str(random_subnet_number + 2) + ".10"
|
|
cls.services["publiciprange"]["netmask"] = "255.255.255.0"
|
|
cls.public_ip_range3 = PublicIpRange.create(
|
|
cls.apiclient,
|
|
cls.services["publiciprange"]
|
|
)
|
|
PublicIpRange.dedicate(
|
|
cls.apiclient,
|
|
cls.public_ip_range3.vlan.id,
|
|
domainid=cls.account2.domainid
|
|
)
|
|
|
|
# Create public ip range 4
|
|
cls.services["publiciprange"]["vlan"] = get_free_vlan(
|
|
cls.apiclient,
|
|
cls.zone.id)[1]
|
|
cls.services["publiciprange"]["gateway"] = "172.16." + \
|
|
str(random_subnet_number + 3) + ".1"
|
|
cls.services["publiciprange"]["startip"] = "172.16." + \
|
|
str(random_subnet_number + 3) + ".2"
|
|
cls.services["publiciprange"]["endip"] = "172.16." + \
|
|
str(random_subnet_number + 3) + ".10"
|
|
cls.services["publiciprange"]["netmask"] = "255.255.255.0"
|
|
cls.public_ip_range4 = PublicIpRange.create(
|
|
cls.apiclient,
|
|
cls.services["publiciprange"]
|
|
)
|
|
PublicIpRange.dedicate(
|
|
cls.apiclient,
|
|
cls.public_ip_range4.vlan.id,
|
|
account=cls.account2.name,
|
|
domainid=cls.account2.domainid
|
|
)
|
|
|
|
# Create public ip range 5
|
|
cls.services["publiciprange"]["vlan"] = get_free_vlan(
|
|
cls.apiclient,
|
|
cls.zone.id)[1]
|
|
cls.services["publiciprange"]["gateway"] = "172.16." + \
|
|
str(random_subnet_number + 4) + ".1"
|
|
cls.services["publiciprange"]["startip"] = "172.16." + \
|
|
str(random_subnet_number + 4) + ".2"
|
|
cls.services["publiciprange"]["endip"] = "172.16." + \
|
|
str(random_subnet_number + 4) + ".10"
|
|
cls.services["publiciprange"]["netmask"] = "255.255.255.0"
|
|
cls.public_ip_range5 = PublicIpRange.create(
|
|
cls.apiclient,
|
|
cls.services["publiciprange"]
|
|
)
|
|
|
|
cls._cleanup.append(cls.account1)
|
|
cls._cleanup.append(cls.domain1)
|
|
cls._cleanup.append(cls.account2)
|
|
cls._cleanup.append(cls.domain2)
|
|
cls._cleanup.append(cls.public_ip_range1)
|
|
cls._cleanup.append(cls.public_ip_range2)
|
|
cls._cleanup.append(cls.public_ip_range3)
|
|
cls._cleanup.append(cls.public_ip_range4)
|
|
cls._cleanup.append(cls.public_ip_range5)
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
try:
|
|
cleanup_resources(cls.apiclient, cls._cleanup)
|
|
except Exception as e:
|
|
raise Exception("Warning: Exception during cleanup : %s" % e)
|
|
return
|
|
|
|
def setUp(cls):
|
|
cls.apiclient = cls.testClient.getApiClient()
|
|
cls.cleanup = []
|
|
return
|
|
|
|
def tearDown(cls):
|
|
try:
|
|
cleanup_resources(cls.apiclient, cls.cleanup)
|
|
except Exception as e:
|
|
raise Exception("Warning: Exception during cleanup : %s" % e)
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware="false")
|
|
def test_01_acquire_public_ip_in_isolated_network(self):
|
|
# Validate the following
|
|
# 1. create a vm . it will create a network as well.
|
|
# 2. assign a specified IP from subnet which is dedicated to domain1, it should succeed
|
|
# 3. assign a specified IP from subnet which is dedicated to domain1/account1, it should succeed
|
|
# 4. assign a specified IP from subnet which is dedicated to domain2, it should fail
|
|
# 5. assign a specified IP from subnet which is dedicated to domain2/account2, it should fail
|
|
# 6. update account setting use.system.public.ips to false, assign a specified IP from subnet which is public, it should fail
|
|
# 7. update account setting use.system.public.ips to true, assign a specified IP from subnet which is public, it should succeed
|
|
|
|
self.service_offering = ServiceOffering.create(
|
|
self.apiclient,
|
|
self.services["service_offering"]
|
|
)
|
|
self.cleanup.append(self.service_offering)
|
|
|
|
self.virtual_machine = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services["small"],
|
|
templateid=self.template.id,
|
|
accountid=self.account1.name,
|
|
domainid=self.account1.domainid,
|
|
serviceofferingid=self.service_offering.id,
|
|
zoneid=self.zone.id
|
|
)
|
|
|
|
networks = Network.list(
|
|
self.apiclient,
|
|
account=self.account1.name,
|
|
domainid=self.account1.domainid,
|
|
listall=True
|
|
)
|
|
self.assertEqual(
|
|
isinstance(networks, list),
|
|
True,
|
|
"List networks should return a valid response for created network"
|
|
)
|
|
network = networks[0]
|
|
|
|
# Associate IP in range dedicated to domain1
|
|
ip_address_1 = self.get_free_ipaddress(self.public_ip_range1.vlan.id)
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
networkid=network.id,
|
|
ipaddress=ip_address_1
|
|
)
|
|
self.assertIsNotNone(
|
|
ipaddress,
|
|
"Failed to Associate IP Address"
|
|
)
|
|
self.cleanup.append(ipaddress)
|
|
self.assertEqual(ipaddress.ipaddress.ipaddress, ip_address_1, "Associated IP is not same as specified")
|
|
|
|
# Associate IP in range dedicated to domain1/account1
|
|
ip_address_2 = self.get_free_ipaddress(self.public_ip_range2.vlan.id)
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
networkid=network.id,
|
|
ipaddress=ip_address_2
|
|
)
|
|
self.assertIsNotNone(
|
|
ipaddress,
|
|
"Failed to Associate IP Address"
|
|
)
|
|
self.cleanup.append(ipaddress)
|
|
self.assertEqual(ipaddress.ipaddress.ipaddress, ip_address_2, "Associated IP is not same as specified")
|
|
|
|
# Associate IP in range dedicated to domain2
|
|
ip_address_3 = self.get_free_ipaddress(self.public_ip_range3.vlan.id)
|
|
with self.assertRaises(Exception):
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
networkid=network.id,
|
|
ipaddress=ip_address_3
|
|
)
|
|
|
|
# Associate IP in range dedicated to domain2/account2
|
|
ip_address_4 = self.get_free_ipaddress(self.public_ip_range4.vlan.id)
|
|
with self.assertRaises(Exception):
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
networkid=network.id,
|
|
ipaddress=ip_address_4
|
|
)
|
|
|
|
# Associate IP in public IP pool
|
|
Configurations.update(
|
|
self.apiclient,
|
|
name="use.system.public.ips",
|
|
value="false",
|
|
accountid=self.account1.id
|
|
)
|
|
|
|
ip_address_5 = self.get_free_ipaddress(self.public_ip_range5.vlan.id)
|
|
with self.assertRaises(Exception):
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
networkid=network.id,
|
|
ipaddress=ip_address_5
|
|
)
|
|
|
|
Configurations.update(
|
|
self.apiclient,
|
|
name="use.system.public.ips",
|
|
value="true",
|
|
accountid=self.account1.id
|
|
)
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
networkid=network.id,
|
|
ipaddress=ip_address_5
|
|
)
|
|
self.assertIsNotNone(
|
|
ipaddress,
|
|
"Failed to Associate IP Address"
|
|
)
|
|
self.cleanup.append(ipaddress)
|
|
self.assertEqual(ipaddress.ipaddress.ipaddress, ip_address_5, "Associated IP is not same as specified")
|
|
|
|
self.cleanup.append(self.virtual_machine)
|
|
self.cleanup.append(self.service_offering)
|
|
|
|
return
|
|
|
|
@attr(tags=["advanced"], required_hardware="false")
|
|
def test_02_acquire_public_ip_in_vpc(self):
|
|
# Validate the following
|
|
# 1. create a VPC with default offering.
|
|
# 2. assign a specified IP from subnet which is dedicated to domain1, it should succeed
|
|
# 3. assign a specified IP from subnet which is dedicated to domain1/account1, it should succeed
|
|
# 4. assign a specified IP from subnet which is dedicated to domain2, it should fail
|
|
# 5. assign a specified IP from subnet which is dedicated to domain2/account2, it should fail
|
|
# 6. update account setting use.system.public.ips to false, assign a specified IP from subnet which is public, it should fail
|
|
# 7. update account setting use.system.public.ips to true, assign a specified IP from subnet which is public, it should succeed
|
|
|
|
vpcOffering = VpcOffering.list(self.apiclient, name="Default VPC offering")
|
|
vpc = VPC.create(
|
|
apiclient=self.apiclient,
|
|
services=self.services["vpc"],
|
|
vpcofferingid=vpcOffering[0].id,
|
|
zoneid=self.zone.id,
|
|
account=self.account1.name,
|
|
domainid=self.account1.domainid
|
|
)
|
|
|
|
# Associate IP in range dedicated to domain1
|
|
ip_address_1 = self.get_free_ipaddress(self.public_ip_range1.vlan.id)
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
vpcid=vpc.id,
|
|
ipaddress=ip_address_1
|
|
)
|
|
self.assertIsNotNone(
|
|
ipaddress,
|
|
"Failed to Associate IP Address"
|
|
)
|
|
self.cleanup.append(ipaddress)
|
|
self.assertEqual(ipaddress.ipaddress.ipaddress, ip_address_1, "Associated IP is not same as specified")
|
|
|
|
# Associate IP in range dedicated to domain1/account1
|
|
ip_address_2 = self.get_free_ipaddress(self.public_ip_range2.vlan.id)
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
vpcid=vpc.id,
|
|
ipaddress=ip_address_2
|
|
)
|
|
self.assertIsNotNone(
|
|
ipaddress,
|
|
"Failed to Associate IP Address"
|
|
)
|
|
self.cleanup.append(ipaddress)
|
|
self.assertEqual(ipaddress.ipaddress.ipaddress, ip_address_2, "Associated IP is not same as specified")
|
|
|
|
# Associate IP in range dedicated to domain2
|
|
ip_address_3 = self.get_free_ipaddress(self.public_ip_range3.vlan.id)
|
|
with self.assertRaises(Exception):
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
vpcid=vpc.id,
|
|
ipaddress=ip_address_3
|
|
)
|
|
|
|
# Associate IP in range dedicated to domain2/account2
|
|
ip_address_4 = self.get_free_ipaddress(self.public_ip_range4.vlan.id)
|
|
with self.assertRaises(Exception):
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
vpcid=vpc.id,
|
|
ipaddress=ip_address_4
|
|
)
|
|
|
|
# Associate IP in public IP pool
|
|
Configurations.update(
|
|
self.apiclient,
|
|
name="use.system.public.ips",
|
|
value="false",
|
|
accountid=self.account1.id
|
|
)
|
|
|
|
ip_address_5 = self.get_free_ipaddress(self.public_ip_range5.vlan.id)
|
|
with self.assertRaises(Exception):
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
vpcid=vpc.id,
|
|
ipaddress=ip_address_5
|
|
)
|
|
|
|
Configurations.update(
|
|
self.apiclient,
|
|
name="use.system.public.ips",
|
|
value="true",
|
|
accountid=self.account1.id
|
|
)
|
|
ipaddress = PublicIPAddress.create(
|
|
self.apiclient,
|
|
zoneid=self.zone.id,
|
|
vpcid=vpc.id,
|
|
ipaddress=ip_address_5
|
|
)
|
|
self.assertIsNotNone(
|
|
ipaddress,
|
|
"Failed to Associate IP Address"
|
|
)
|
|
self.cleanup.append(ipaddress)
|
|
self.assertEqual(ipaddress.ipaddress.ipaddress, ip_address_5, "Associated IP is not same as specified")
|
|
|
|
self.cleanup.append(vpc)
|
|
return
|
|
|
|
def get_free_ipaddress(self, vlanId):
|
|
ipaddresses = PublicIPAddress.list(
|
|
self.apiclient,
|
|
vlanid=vlanId,
|
|
state='Free'
|
|
)
|
|
self.assertEqual(
|
|
isinstance(ipaddresses, list),
|
|
True,
|
|
"List ipaddresses should return a valid response for Free ipaddresses"
|
|
)
|
|
random.shuffle(ipaddresses)
|
|
return ipaddresses[0].ipaddress
|