blob: fbfb61fd30e72fe3485d3417ea596892bc51eec8 [file] [log] [blame]
# 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.
""" Component tests for inter VLAN functionality
"""
# Import Local Modules
from marvin.cloudstackAPI import *
from marvin.cloudstackTestCase import *
from marvin.lib.base import *
from marvin.lib.common import *
from marvin.lib.utils import *
from nose.plugins.attrib import attr
import logging
class Services:
"""Test inter VLAN services
"""
def __init__(self):
self.services = {
"account": {
"email": "test@test.com",
"firstname": "Test",
"lastname": "User",
"username": "test",
# Random characters are appended for unique
# username
"password": "password",
},
"service_offering": {
"name": "Tiny Instance",
"displaytext": "Tiny Instance",
"cpunumber": 1,
"cpuspeed": 100,
"memory": 128,
},
"network_offering": {
"name": 'VPC Network offering',
"displaytext": 'VPC Network off',
"guestiptype": 'Isolated',
"supportedservices": 'Vpn,Dhcp,Dns,SourceNat,PortForwarding,Lb,UserData,StaticNat,NetworkACL',
"traffictype": 'GUEST',
"availability": 'Optional',
"useVpc": 'on',
"serviceProviderList": {
"Vpn": 'VpcVirtualRouter',
"Dhcp": 'VpcVirtualRouter',
"Dns": 'VpcVirtualRouter',
"SourceNat": 'VpcVirtualRouter',
"PortForwarding": 'VpcVirtualRouter',
"Lb": 'VpcVirtualRouter',
"UserData": 'VpcVirtualRouter',
"StaticNat": 'VpcVirtualRouter',
"NetworkACL": 'VpcVirtualRouter'
},
},
"vpc_offering": {
"name": 'VPC off',
"displaytext": 'VPC off',
"supportedservices": 'Dhcp,Dns,SourceNat,PortForwarding,Vpn,Lb,UserData,StaticNat',
},
"redundant_vpc_offering": {
"name": 'Redundant VPC off',
"displaytext": 'Redundant VPC off',
"supportedservices": 'Dhcp,Dns,SourceNat,PortForwarding,Vpn,Lb,UserData,StaticNat',
"serviceProviderList": {
"Vpn": 'VpcVirtualRouter',
"Dhcp": 'VpcVirtualRouter',
"Dns": 'VpcVirtualRouter',
"SourceNat": 'VpcVirtualRouter',
"PortForwarding": 'VpcVirtualRouter',
"Lb": 'VpcVirtualRouter',
"UserData": 'VpcVirtualRouter',
"StaticNat": 'VpcVirtualRouter',
"NetworkACL": 'VpcVirtualRouter'
},
"serviceCapabilityList": {
"SourceNat": {
"RedundantRouter": 'true'
}
},
},
"vpc": {
"name": "TestVPC",
"displaytext": "TestVPC",
"cidr": '10.0.0.1/24'
},
"redundant_vpc": {
"name": "TestRedundantVPC",
"displaytext": "TestRedundantVPC",
"cidr": '10.0.0.1/24'
},
"network": {
"name": "Test Network",
"displaytext": "Test Network",
"netmask": '255.255.255.0'
},
"lbrule": {
"name": "SSH",
"alg": "leastconn",
# Algorithm used for load balancing
"privateport": 22,
"publicport": 2222,
"openfirewall": False,
"startport": 2222,
"endport": 2222,
"cidrlist": '0.0.0.0/0',
"protocol": 'TCP'
},
"natrule": {
"privateport": 22,
"publicport": 22,
"startport": 22,
"endport": 22,
"protocol": "TCP",
"cidrlist": '0.0.0.0/0',
},
"fw_rule": {
"startport": 1,
"endport": 6000,
"cidr": '0.0.0.0/0',
# Any network (For creating FW rule)
"protocol": "TCP"
},
"virtual_machine": {
"displayname": "Test VM",
"username": "root",
"password": "password",
"ssh_port": 22,
"hypervisor": 'XenServer',
# Hypervisor type should be same as
# hypervisor type of cluster
"privateport": 22,
"publicport": 22,
"protocol": 'TCP',
},
"ostype": 'CentOS 5.3 (64-bit)',
# Cent OS 5.3 (64 bit)
"sleep": 60,
"timeout": 10,
}
class TestVPCOffering(cloudstackTestCase):
@classmethod
def setUpClass(cls):
cls.logger = logging.getLogger('TestVPCOffering')
cls.stream_handler = logging.StreamHandler()
cls.logger.setLevel(logging.DEBUG)
cls.logger.addHandler(cls.stream_handler)
cls.testClient = super(TestVPCOffering, cls).getClsTestClient()
cls.api_client = cls.testClient.getApiClient()
cls._cleanup = []
cls.services = Services().services
# 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.service_offering = ServiceOffering.create(
cls.api_client,
cls.services["service_offering"]
)
cls._cleanup.append(cls.service_offering)
return
@classmethod
def tearDownClass(cls):
super(TestVPCOffering,cls).tearDownClass()
def setUp(self):
self.logger.debug("test_vpc_offering#setUp")
self.apiclient = self.testClient.getApiClient()
self.dbclient = self.testClient.getDbConnection()
self.account = Account.create(
self.apiclient,
self.services["account"],
admin=True,
domainid=self.domain.id
)
self.cleanup = []
self.cleanup.append(self.account)
return
def tearDown(self):
self.logger.debug("test_vpc_offering#tearDown")
super(TestVPCOffering,self).tearDown()
def validate_vpc_offering(self, vpc_offering):
"""Validates the VPC offering"""
self.logger.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.logger.debug(
"VPC offering is created successfully - %s" %
vpc_offering.name)
return
def validate_vpc_network(self, network):
"""Validates the VPC network"""
self.logger.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"
)
self.logger.debug("VPC network created successfully - %s" % network.name)
return
@attr(tags=["advanced", "intervlan"], required_hardware="false")
def test_01_create_vpc_offering(self):
""" Test create VPC offering
"""
# Steps for validation
# 1. Create VPC Offering by specifying all supported Services
# 2. VPC offering should be created successfully.
self.logger.debug("Creating inter VPC offering")
vpc_off = VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.logger.debug("Check if the VPC offering is created successfully?")
self.cleanup.append(vpc_off)
self.validate_vpc_offering(vpc_off)
return
# was tags=["advanced", "intervlan"]
@attr(tags=["TODO"], required_hardware="true")
def test_02_deploy_vms_in_vpc_nw(self):
"""Test deploy virtual machines in VPC networks"""
# 1. Create VPC Offering by specifying all supported Services
# (Vpn,dhcpdns,UserData, SourceNat,Static NAT and PF,LB,NetworkAcl)
# 2. Create a VPC using the above VPC offering
# 3. Create a network as part of this VPC.
# 4. Deploy few Vms.
# 5. Create a LB rule for this VM.
# 6. Create a PF rule for this VM.
# 7. Create a Static Nat rule for this VM.
# 8. Create Ingress rules on the network to open the above created
# LB PF and Static Nat rule
# 9. Create Egress Network ACL for this network to access google.com.
# 10. Enable VPN services
self.logger.debug("Creating a VPC offering..")
vpc_off = VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.cleanup.append(vpc_off)
self.validate_vpc_offering(vpc_off)
self.logger.debug("Enabling the VPC offering created")
vpc_off.update(self.apiclient, state='Enabled')
self.logger.debug("creating a VPC network in the account: %s" %
self.account.name)
vpc = VPC.create(
self.apiclient,
self.services["vpc"],
vpcofferingid=vpc_off.id,
zoneid=self.zone.id,
account=self.account.name,
domainid=self.account.domainid
)
self.cleanup.append(vpc)
self.validate_vpc_network(vpc)
self.network_offering = NetworkOffering.create(
self.apiclient,
self.services["network_offering"],
conservemode=False
)
self.cleanup.append(self.network_offering)
# Enable Network offering
self.network_offering.update(self.apiclient, state='Enabled')
gateway = vpc.cidr.split('/')[0]
# Split the cidr to retrieve gateway
# for eg. cidr = 10.0.0.1/24
# Gateway = 10.0.0.1
# Creating network using the network offering created
self.logger.debug("Creating network with network offering: %s" %
self.network_offering.id)
network = Network.create(
self.apiclient,
self.services["network"],
accountid=self.account.name,
domainid=self.account.domainid,
networkofferingid=self.network_offering.id,
zoneid=self.zone.id,
gateway=gateway,
vpcid=vpc.id
)
self.cleanup.append(network)
self.logger.debug("Created network with ID: %s" % network.id)
# Spawn an instance in that network
virtual_machine = VirtualMachine.create(
self.apiclient,
self.services["virtual_machine"],
accountid=self.account.name,
domainid=self.account.domainid,
serviceofferingid=self.service_offering.id,
networkids=[str(network.id)]
)
self.cleanup.append(virtual_machine)
self.logger.debug("Deployed VM in network: %s" % network.id)
self.logger.debug("Associating public IP for network: %s" % network.name)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=network.id,
vpcid=vpc.id
)
self.cleanup.append(public_ip)
self.logger.debug("Associated %s with network %s" % (
public_ip.ipaddress.ipaddress,
network.id
))
self.logger.debug("Creating LB rule for IP address: %s" %
public_ip.ipaddress.ipaddress)
lb_rule = LoadBalancerRule.create(
self.apiclient,
self.services["lbrule"],
ipaddressid=public_ip.ipaddress.id,
accountid=self.account.name,
networkid=network.id,
vpcid=vpc.id,
domainid=self.account.domainid
)
self.cleanup.append(lb_rule)
self.logger.debug("Associating public IP for network: %s" % vpc.name)
public_ip_2 = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=network.id,
vpcid=vpc.id
)
self.cleanup.append(public_ip_2)
self.logger.debug("Associated %s with network %s" % (
public_ip_2.ipaddress.ipaddress,
network.id
))
nat_rule = NATRule.create(
self.apiclient,
virtual_machine,
self.services["natrule"],
ipaddressid=public_ip_2.ipaddress.id,
openfirewall=False,
networkid=network.id,
vpcid=vpc.id
)
self.cleanup.append(nat_rule)
self.logger.debug("Adding NetwrokACl rules to make PF and LB accessible")
networkacl_1 = NetworkACL.create(
self.apiclient,
networkid=network.id,
services=self.services["natrule"],
traffictype='Ingress'
)
self.cleanup.append(networkacl_1)
networkacl_2 = NetworkACL.create(
self.apiclient,
networkid=network.id,
services=self.services["lbrule"],
traffictype='Ingress'
)
self.cleanup.append(networkacl_2)
self.logger.debug("Checking if we can SSH into VM?")
try:
virtual_machine.get_ssh_client(
ipaddress=public_ip_2.ipaddress.ipaddress,
)
self.logger.debug("SSH into VM is successfully")
except Exception as e:
self.fail("Failed to SSH into VM - %s, %s" %
(public_ip_2.ipaddress.ipaddress, e))
self.logger.debug("Associating public IP for network: %s" % network.name)
public_ip_3 = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=network.id,
vpcid=vpc.id
)
self.cleanup.append(public_ip_3)
self.logger.debug("Associated %s with network %s" % (
public_ip_3.ipaddress.ipaddress,
network.id
))
self.logger.debug("Enabling static NAT for IP: %s" %
public_ip_3.ipaddress.ipaddress)
try:
StaticNATRule.enable(
self.apiclient,
ipaddressid=public_ip_3.ipaddress.id,
virtualmachineid=virtual_machine.id,
networkid=network.id
)
self.logger.debug("Static NAT enabled for IP: %s" %
public_ip_3.ipaddress.ipaddress)
except Exception as e:
self.fail("Failed to enable static NAT on IP: %s - %s" % (
public_ip_3.ipaddress.ipaddress, e))
public_ips = PublicIPAddress.list(
self.apiclient,
networkid=network.id,
listall=True,
isstaticnat=True,
account=self.account.name,
domainid=self.account.domainid
)
self.assertEqual(
isinstance(public_ips, list),
True,
"List public Ip for network should list the Ip addr"
)
self.assertEqual(
public_ips[0].ipaddress,
public_ip_3.ipaddress.ipaddress,
"List public Ip for network should list the Ip addr"
)
# TODO: Remote Access VPN is not yet supported in VPC
return
@attr(tags=["advanced", "intervlan"], required_hardware="false")
def test_03_vpc_off_without_lb(self):
"""Test VPC offering without load balancing service"""
# Validate the following
# 1. Create VPC Offering by specifying all supported Services except
# LB services.
# 2. Create a VPC using the above VPC offering.
# 3. Create a network as part of this VPC.
# 4. Deploy few Vms.
# 5. Try to create a LB rule for this VM. LB creation should fail
self.logger.debug(
"Creating a VPC offering with Vpn,dhcpdns,UserData," +
" SourceNat,Static NAT and PF services"
)
self.services["vpc_offering"]["supportedservices"] = 'Vpn,Dhcp,Dns,SourceNat,PortForwarding,UserData,StaticNat,NetworkACL'
self.services["network_offering"]["supportedservices"] = 'Vpn,Dhcp,Dns,SourceNat,PortForwarding,UserData,StaticNat,NetworkACL'
self.services["network_offering"]["serviceProviderList"] = {
"Vpn": 'VpcVirtualRouter',
"Dhcp": 'VpcVirtualRouter',
"Dns": 'VpcVirtualRouter',
"SourceNat": 'VpcVirtualRouter',
"PortForwarding": 'VpcVirtualRouter',
"UserData": 'VpcVirtualRouter',
"StaticNat": 'VpcVirtualRouter',
"NetworkACL": 'VpcVirtualRouter'
}
self.network_offering = NetworkOffering.create(
self.apiclient,
self.services["network_offering"],
conservemode=False
)
self.cleanup.append(self.network_offering)
# Enable Network offering
self.network_offering.update(self.apiclient, state='Enabled')
vpc_off = VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.cleanup.append(vpc_off)
self.validate_vpc_offering(vpc_off)
self.logger.debug("Enabling the VPC offering created")
vpc_off.update(self.apiclient, state='Enabled')
self.logger.debug("creating a VPC network in the account: %s" %
self.account.name)
vpc = VPC.create(
self.apiclient,
self.services["vpc"],
vpcofferingid=vpc_off.id,
zoneid=self.zone.id,
account=self.account.name,
domainid=self.account.domainid
)
self.cleanup.append(vpc)
self.validate_vpc_network(vpc)
gateway = vpc.cidr.split('/')[0]
# Split the cidr to retrieve gateway
# for eg. cidr = 10.0.0.1/24
# Gateway = 10.0.0.1
# Creating network using the network offering created
self.logger.debug("Creating network with network offering: %s" %
self.network_offering.id)
network = Network.create(
self.apiclient,
self.services["network"],
accountid=self.account.name,
domainid=self.account.domainid,
networkofferingid=self.network_offering.id,
zoneid=self.zone.id,
gateway=gateway,
vpcid=vpc.id
)
self.cleanup.append(network)
self.logger.debug("Created network with ID: %s" % network.id)
self.logger.debug("Deploying virtual machines in network: %s" % vpc.name)
# Spawn an instance in that network
virtual_machine = VirtualMachine.create(
self.apiclient,
self.services["virtual_machine"],
accountid=self.account.name,
domainid=self.account.domainid,
serviceofferingid=self.service_offering.id,
networkids=[str(network.id)]
)
self.cleanup.append(virtual_machine)
self.logger.debug("Deployed VM in network: %s" % network.id)
self.logger.debug("Associating public IP for network: %s" % network.name)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=network.id,
vpcid=vpc.id
)
self.cleanup.append(public_ip)
self.logger.debug("Associated %s with network %s" % (
public_ip.ipaddress.ipaddress,
vpc.id
))
self.logger.debug("Trying to LB rule for IP address: %s" %
public_ip.ipaddress.ipaddress)
with self.assertRaises(Exception):
LoadBalancerRule.create(
self.apiclient,
self.services["lbrule"],
ipaddressid=public_ip.ipaddress.id,
accountid=self.account.name,
networkid=network.id,
vpcid=vpc.id
)
return
@attr(tags=["advanced", "intervlan"], required_hardware="false")
def test_04_vpc_off_without_static_nat(self):
"""Test VPC offering without static NAT service"""
# Validate the following
# 1. Create VPC Offering by specifying all supported Services except
# static NAT services.
# 2. Create a VPC using the above VPC offering.
# 3. Create a network as part of this VPC.
# 4. Deploy few Vms
# 5. Try to create NAT rule for this VMStatic NAT creation should fail
self.logger.debug("Creating a VPC offering with Vpn,dhcpdns,UserData," +
"SourceNat,lb and PF services")
self.services["vpc_offering"]["supportedservices"] = 'Vpn,Dhcp,Dns,SourceNat,Lb,UserData,PortForwarding,NetworkACL'
self.services["network_offering"]["supportedservices"] = 'Vpn,Dhcp,Dns,SourceNat,Lb,UserData,PortForwarding,NetworkACL'
self.services["network_offering"]["serviceProviderList"] = {
"Vpn": 'VpcVirtualRouter',
"Dhcp": 'VpcVirtualRouter',
"Dns": 'VpcVirtualRouter',
"SourceNat": 'VpcVirtualRouter',
"Lb": 'VpcVirtualRouter',
"UserData": 'VpcVirtualRouter',
"PortForwarding": 'VpcVirtualRouter',
"NetworkACL": 'VpcVirtualRouter'
}
self.network_offering = NetworkOffering.create(
self.apiclient,
self.services["network_offering"],
conservemode=False
)
self.cleanup.append(self.network_offering)
# Enable Network offering
self.network_offering.update(self.apiclient, state='Enabled')
vpc_off = VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.cleanup.append(vpc_off)
self.validate_vpc_offering(vpc_off)
self.logger.debug("Enabling the VPC offering created")
vpc_off.update(self.apiclient, state='Enabled')
self.logger.debug("creating a VPC network in the account: %s" %
self.account.name)
vpc = VPC.create(
self.apiclient,
self.services["vpc"],
vpcofferingid=vpc_off.id,
zoneid=self.zone.id,
account=self.account.name,
domainid=self.account.domainid
)
self.cleanup.append(vpc)
self.validate_vpc_network(vpc)
gateway = vpc.cidr.split('/')[0]
# Split the cidr to retrieve gateway
# for eg. cidr = 10.0.0.1/24
# Gateway = 10.0.0.1
# Creating network using the network offering created
self.logger.debug("Creating network with network offering: %s" %
self.network_offering.id)
network = Network.create(
self.apiclient,
self.services["network"],
accountid=self.account.name,
domainid=self.account.domainid,
networkofferingid=self.network_offering.id,
zoneid=self.zone.id,
gateway=gateway,
vpcid=vpc.id
)
self.cleanup.append(network)
self.logger.debug("Created network with ID: %s" % network.id)
self.logger.debug("Deploying virtual machines in network: %s" % vpc.name)
# Spawn an instance in that network
virtual_machine = VirtualMachine.create(
self.apiclient,
self.services["virtual_machine"],
accountid=self.account.name,
domainid=self.account.domainid,
serviceofferingid=self.service_offering.id,
networkids=[str(network.id)]
)
self.cleanup.append(virtual_machine)
self.logger.debug("Deployed VM in network: %s" % network.id)
self.logger.debug("Associating public IP for network: %s" % network.name)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=network.id,
vpcid=vpc.id
)
self.cleanup.append(public_ip)
self.logger.debug("Associated %s with network %s" % (
public_ip.ipaddress.ipaddress,
network.id
))
with self.assertRaises(Exception):
static_nat = StaticNATRule.create(
self.apiclient,
self.services["fw_rule"],
ipaddressid=public_ip.ipaddress.id
)
static_nat.enable(
self.apiclient,
ipaddressid=public_ip.ipaddress.id,
virtualmachineid=virtual_machine.id
)
return
@attr(tags=["advanced", "intervlan"], required_hardware="false")
def test_05_vpc_off_without_pf(self):
"""Test VPC offering without port forwarding service"""
# Validate the following
# 1. Create VPC Offering by specifying all supported Services except
# PF services.
# 2. Create a VPC using the above VPC offering.
# 3. Create a network as part of this VPC.
# 4. Deploy few Vms.
# 5. Try to create a PF rule for this VM. PF creation should fail
self.logger.debug(
"Creating a VPC offering with Vpn,dhcpdns,UserData," +
"SourceNat,Static NAT and lb services"
)
self.services["vpc_offering"]["supportedservices"] = 'Vpn,Dhcp,Dns,SourceNat,Lb,UserData,StaticNat,NetworkACL'
self.services["network_offering"]["supportedservices"] = 'Vpn,Dhcp,Dns,SourceNat,Lb,UserData,StaticNat,NetworkACL'
self.services["network_offering"]["serviceProviderList"] = {
"Vpn": 'VpcVirtualRouter',
"Dhcp": 'VpcVirtualRouter',
"Dns": 'VpcVirtualRouter',
"SourceNat": 'VpcVirtualRouter',
"Lb": 'VpcVirtualRouter',
"UserData": 'VpcVirtualRouter',
"StaticNat": 'VpcVirtualRouter',
"NetworkACL": 'VpcVirtualRouter'
}
self.network_offering = NetworkOffering.create(
self.apiclient,
self.services["network_offering"],
conservemode=False
)
self.cleanup.append(self.network_offering)
# Enable Network offering
self.network_offering.update(self.apiclient, state='Enabled')
vpc_off = VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.cleanup.append(vpc_off)
self.validate_vpc_offering(vpc_off)
self.logger.debug("Enabling the VPC offering created")
vpc_off.update(self.apiclient, state='Enabled')
self.logger.debug("creating a VPC network in the account: %s" %
self.account.name)
vpc = VPC.create(
self.apiclient,
self.services["vpc"],
vpcofferingid=vpc_off.id,
zoneid=self.zone.id,
account=self.account.name,
domainid=self.account.domainid
)
self.cleanup.append(vpc)
self.validate_vpc_network(vpc)
gateway = vpc.cidr.split('/')[0]
# Split the cidr to retrieve gateway
# for eg. cidr = 10.0.0.1/24
# Gateway = 10.0.0.1
# Creating network using the network offering created
self.logger.debug("Creating network with network offering: %s" %
self.network_offering.id)
network = Network.create(
self.apiclient,
self.services["network"],
accountid=self.account.name,
domainid=self.account.domainid,
networkofferingid=self.network_offering.id,
zoneid=self.zone.id,
gateway=gateway,
vpcid=vpc.id
)
self.cleanup.append(network)
self.logger.debug("Deploying virtual machines in network: %s" % vpc.name)
# Spawn an instance in that network
virtual_machine = VirtualMachine.create(
self.apiclient,
self.services["virtual_machine"],
accountid=self.account.name,
domainid=self.account.domainid,
serviceofferingid=self.service_offering.id,
networkids=[str(network.id)]
)
self.cleanup.append(virtual_machine)
self.logger.debug("Deployed VM in network: %s" % network.id)
self.logger.debug("Associating public IP for network: %s" % network.name)
public_ip = PublicIPAddress.create(
self.apiclient,
accountid=self.account.name,
zoneid=self.zone.id,
domainid=self.account.domainid,
networkid=network.id,
vpcid=vpc.id
)
self.logger.debug("Associated %s with network %s" % (
public_ip.ipaddress.ipaddress,
network.id
))
self.logger.debug("Trying to create NAT rule for the IP: %s" %
public_ip.ipaddress.ipaddress)
with self.assertRaises(Exception):
NATRule.create(
self.apiclient,
virtual_machine,
self.services["natrule"],
ipaddressid=public_ip.ipaddress.id,
openfirewall=True
)
return
@attr(tags=["advanced", "intervlan"], required_hardware="false")
def test_06_vpc_off_invalid_services(self):
"""Test VPC offering with invalid services"""
# Validate the following
# 1. Creating VPC Offering with services NOT supported by VPC
# like Firewall should not be allowed
self.logger.debug("Creating a VPC offering with Firewall")
self.services["vpc_offering"]["supportedservices"] = 'Dhcp,Dns,PortForwarding,Firewall,Vpn,SourceNat,Lb,UserData,StaticNat'
with self.assertRaises(Exception):
VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.logger.debug("Creating a VPC offering with only sourceNAT service")
self.services["vpc_offering"]["supportedservices"] = 'SourceNat'
try:
vpc_off = VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.cleanup.append(vpc_off)
self.validate_vpc_offering(vpc_off)
# Appending to cleanup to delete after test
except Exception as e:
self.fail("Failed to create the VPC offering - %s" % e)
return
@attr(tags=["advanced", "intervlan"], required_hardware="false")
def test_07_update_vpc_off(self):
"""Test update VPC offering"""
# Validate the following
# 1. Create a VPC Offering.
# 2. Disable this VPC offering.
# 3. Create a VPC using this VPC offering. VPC creation should fail.
# 4. Enable the VPC offering again and create VPC. VPC should be
# created successfully
# 5. Change name and displaytext of the VPCOffering. Name and
# displaytext changes should be reflected in listVPCPffering call
self.logger.debug("Creating a VPC offering..")
vpc_off = VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.cleanup.append(vpc_off)
self.validate_vpc_offering(vpc_off)
self.logger.debug("Enabling the VPC offering created")
vpc_off.update(self.apiclient, state='Disabled')
self.logger.debug("creating a VPC network in the account: %s" %
self.account.name)
with self.assertRaises(Exception):
VPC.create(
self.apiclient,
self.services["vpc"],
vpcofferingid=vpc_off.id,
zoneid=self.zone.id,
account=self.account.name,
domainid=self.account.domainid
)
self.logger.debug("VPC network creation failed! (Test succeeded)")
self.logger.debug("Enabling the VPC offering created")
vpc_off.update(self.apiclient, state='Enabled')
self.logger.debug("creating a VPC network in the account: %s" %
self.account.name)
vpc = VPC.create(
self.apiclient,
self.services["vpc"],
vpcofferingid=vpc_off.id,
zoneid=self.zone.id,
account=self.account.name,
domainid=self.account.domainid
)
self.cleanup.append(vpc)
self.validate_vpc_network(vpc)
self.logger.debug("Updating name & display text of the vpc offering created")
new_name = random_gen()
new_displaytext = random_gen()
try:
vpc_off.update(
self.apiclient,
name=new_name,
displaytext=new_displaytext
)
except Exception as e:
self.fail("Failed to update VPC offering- %s" % e)
self.logger.debug("Checking if the changes are reflected to listVPC call?")
vpc_offs = vpc_off.list(
self.apiclient,
id=vpc_off.id,
listall=True
)
self.assertEqual(
isinstance(vpc_offs, list),
True,
"List VPC offerings shall return a valid list"
)
list_reposnse_vpc = vpc_offs[0]
self.assertEqual(
list_reposnse_vpc.name,
new_name,
"VPC off Name should be updated with new one"
)
self.assertEqual(
list_reposnse_vpc.displaytext,
new_displaytext,
"VPC off display text should be updated with new one"
)
return
@attr(tags=["advanced", "intervlan"], required_hardware="false")
def test_08_list_vpc_off(self):
"""Test list VPC offering"""
# Validate the following
# 1. Create multiple VPC Offerings
# 2. Delete few of the VPC offerings
# 3. List all the VPC offerings. Deleted VPC offering should not be
# returned by list VPC offerings command
# 4. List offerings by ID. Only offering having ID should get listed
# 5. List VPC Offerings by displaytext. Only offerings with same
# display text should be listed
# 6. List VPC Offerings by name. Only offerings with same
# name should be listed
# 7. List VPC Offerings by supported services. Only offerings with same
# supported services should be listed
# 8. All VPC offering in "Enabled" state should get listed.
# 9. All VPC offering in "Disabled" state should get listed
self.logger.debug("Creating multiple VPC offerings")
self.services["vpc_offering"]["supportedservices"] = 'SourceNat'
vpc_off_1 = VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.cleanup.append(vpc_off_1)
self.validate_vpc_offering(vpc_off_1)
self.logger.debug("Disabling the VPC offering created")
vpc_off_1.update(self.apiclient, state='Disabled')
vpc_off_2 = VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.cleanup.append(vpc_off_2)
self.validate_vpc_offering(vpc_off_2)
self.logger.debug("Enabling the VPC offering created")
vpc_off_2.update(self.apiclient, state='Enabled')
vpc_off_3 = VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.cleanup.append(vpc_off_3)
self.validate_vpc_offering(vpc_off_3)
self.logger.debug("Enabling the VPC offering created")
vpc_off_3.update(self.apiclient, state='Enabled')
vpc_off_4 = VpcOffering.create(
self.apiclient,
self.services["vpc_offering"]
)
self.logger.debug("Enabling the VPC offering created")
vpc_off_4.update(self.apiclient, state='Enabled')
self.logger.debug("Deleting the VPC offering: %s" % vpc_off_4.name)
vpc_off_4.delete(self.apiclient)
self.logger.debug("Checking if listVPCOff return the deleted VPC off")
vpc_offs = VpcOffering.list(
self.apiclient,
id=vpc_off_4.id,
listall=True
)
self.assertEqual(
vpc_offs,
None,
"List VPC offerings should nt return any response for deleted offering"
)
self.logger.debug("Validating the listVPCOfferings response by ids")
self.validate_vpc_offering(vpc_off_3)
self.logger.debug("ListVPCOfferings by displaytext & verifying the response")
vpc_offs = VpcOffering.list(
self.apiclient,
displaytext=vpc_off_3.displaytext,
listall=True
)
self.assertEqual(
isinstance(vpc_offs, list),
True,
"List VPC offerings shall return a valid response"
)
list_vpc_off_response = vpc_offs[0]
self.assertIn(
vpc_off_3.id,
[vpc.id for vpc in vpc_offs],
"ListVPC Off with displaytext should return same VPC off"
)
self.logger.debug("ListVPCOfferings by name and verifying the response")
vpc_offs = VpcOffering.list(
self.apiclient,
name=vpc_off_2.name,
listall=True
)
self.assertEqual(
isinstance(vpc_offs, list),
True,
"List VPC offerings shall return a valid response"
)
list_vpc_off_response = vpc_offs[0]
self.assertEqual(
list_vpc_off_response.id,
vpc_off_2.id,
"ListVPC Off with name should return same VPC off"
)
self.logger.debug(
"ListVPCOfferings by supported services & verifying the response")
vpc_offs = VpcOffering.list(
self.apiclient,
supportedservices='SourceNat',
listall=True
)
self.assertEqual(
isinstance(vpc_offs, list),
True,
"List VPC offerings shall return a valid response"
)
for vpc_off in vpc_offs:
self.logger.debug(vpc_off)
self.assertEqual(
'SourceNat' in str(vpc_off),
True,
"ListVPC Off with name should return same VPC off"
)
self.logger.debug("ListVPCOfferings by state & verifying the response")
vpc_offs = VpcOffering.list(
self.apiclient,
state='Enabled',
listall=True
)
self.assertEqual(
isinstance(vpc_offs, list),
True,
"List VPC offerings shall return a valid response"
)
for vpc_off in vpc_offs:
self.assertEqual(
vpc_off.state,
'Enabled',
"List VPC offering should return only offerings that are enabled"
)
self.logger.debug("ListVPCOfferings by state & verifying the response")
vpc_offs = VpcOffering.list(
self.apiclient,
state='Disabled',
listall=True
)
self.assertEqual(
isinstance(vpc_offs, list),
True,
"List VPC offerings shall return a valid response"
)
for vpc_off in vpc_offs:
self.assertEqual(
vpc_off.state,
'Disabled',
"List VPC offering should return only offerings that are disabled"
)
return
@attr(tags=["advanced", "redundancy"], required_hardware="false")
def test_09_create_redundant_vpc_offering(self):
self.logger.debug("Creating Redundant VPC offering")
vpc_off = VpcOffering.create(
self.apiclient,
self.services["redundant_vpc_offering"]
)
self.cleanup.append(vpc_off)
self.logger.debug("Check if the Redundant VPC offering is created successfully?")
self.validate_vpc_offering(vpc_off)
self.logger.debug("Enabling the created Redundant VPC offering")
vpc_off.update(self.apiclient, state='Enabled')
self.logger.debug("Creating a Redundant VPC network in the account: %s" %
self.account.name)
vpc = VPC.create(
self.apiclient,
self.services["redundant_vpc"],
vpcofferingid=vpc_off.id,
zoneid=self.zone.id,
account=self.account.name,
domainid=self.account.domainid
)
self.cleanup.append(vpc)
self.logger.debug("Validating Redundant VPC Nw creation")
self.validate_vpc_network(vpc)
vpcs = VPC.list(
self.apiclient,
id=vpc.id
)
found = False
redundant = False
for iVpc in vpcs:
if iVpc.id == vpc.id:
found = True
if iVpc.redundantvpcrouter:
redundant = True
break
self.assertEqual(
redundant,
True,
"Didn't create any Redundant Vpc"
)
return