mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
* Refactored nuage tests Added simulator support for ConfigDrive Allow all nuage tests to run against simulator Refactored nuage tests to remove code duplication * Move test data from test_data.py to nuage_test_data.py Nuage test data is now contained in nuage_test_data.py instead of test_data.py Removed all nuage test data from nuage_test_data.py * CLOUD-1252 fixed cleanup of vpc tier network * Import libVSD into the codebase * CLOUDSTACK-1253: Volumes are not expunged in simulator * Fixed some merge issues in test_nuage_vsp_mngd_subnets test * Implement GetVolumeStatsCommand in Simulator * Add vspk as marvin nuagevsp dependency, after removing libVSD dependency * correct libVSD files for license purposes pep8 pyflakes compliant
2003 lines
87 KiB
Python
2003 lines
87 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.
|
|
|
|
""" Network migration test with Nuage VSP SDN plugin
|
|
"""
|
|
# Import Local Modules
|
|
from nuageTestCase import nuageTestCase
|
|
from marvin.lib.base import (Account, Host)
|
|
from marvin.lib.utils import is_server_ssh_ready
|
|
from marvin.cloudstackAPI import updateZone
|
|
|
|
# Import System Modules
|
|
from nose.plugins.attrib import attr
|
|
import time
|
|
import base64
|
|
import unittest
|
|
import re
|
|
|
|
|
|
class TestNuageMigration(nuageTestCase):
|
|
"""Test Native to Nuage Migration
|
|
"""
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestNuageMigration, cls).setUpClass()
|
|
|
|
if not hasattr(cls.vsp_physical_network, "tags") \
|
|
or cls.vsp_physical_network.tags != 'nuage':
|
|
raise unittest.SkipTest("Require migrateACS configuration - skip")
|
|
|
|
# create a native vpc offering
|
|
cls.native_vpc_offering = cls.create_VpcOffering(cls.test_data
|
|
["vpc_offering"])
|
|
# create a nuage vpc offering
|
|
cls.nuage_vpc_offering = \
|
|
cls.create_VpcOffering(cls.test_data["nuagevsp"]["vpc_offering"])
|
|
|
|
# tier network offerings
|
|
cls.nuage_vpc_network_offering = \
|
|
cls.create_NetworkOffering(cls.test_data["nuagevsp"]
|
|
["vpc_network_offering"])
|
|
cls.native_vpc_network_offering = \
|
|
cls.create_NetworkOffering(cls.test_data
|
|
["nw_offering_isolated_vpc"])
|
|
|
|
# create a Nuage isolated network offering with vr
|
|
cls.nuage_isolated_network_offering = cls.create_NetworkOffering(
|
|
cls.test_data["nuagevsp"]["isolated_network_offering"], True)
|
|
|
|
# create a Nuage isolated network offering with vr and persistent
|
|
cls.nuage_isolated_network_offering_persistent = \
|
|
cls.create_NetworkOffering(
|
|
cls.test_data["nuagevsp"]
|
|
["isolated_network_offering_persistent"],
|
|
True)
|
|
|
|
# create a Nuage isolated network offering without vr
|
|
cls.nuage_isolated_network_offering_without_vr = \
|
|
cls.create_NetworkOffering(
|
|
cls.test_data["nuagevsp"]
|
|
["isolated_network_offering_without_vr"],
|
|
True)
|
|
|
|
# create a Nuage isolated network offering without vr but persistent
|
|
cls.nuage_isolated_network_offering_without_vr_persistent = \
|
|
cls.create_NetworkOffering(
|
|
cls.test_data["nuagevsp"]
|
|
["isolated_network_offering_without_vr_persistent"],
|
|
True)
|
|
|
|
# create a native isolated network offering
|
|
cls.native_isolated_network_offering = cls.create_NetworkOffering(
|
|
cls.test_data["isolated_network_offering"], True)
|
|
|
|
# create a native persistent isolated network offering
|
|
cls.native_isolated_network_offering_persistent = \
|
|
cls.create_NetworkOffering(
|
|
cls.test_data["nw_off_isolated_persistent"], True)
|
|
|
|
# create a native persistent staticNat isolated network offering
|
|
cls.native_isolated_network_staticnat_offering_persistent = \
|
|
cls.create_NetworkOffering(
|
|
cls.test_data["isolated_staticnat_network_offering"], True)
|
|
|
|
# create a Native shared network offering
|
|
cls.native_shared_network_offering = cls.create_NetworkOffering(
|
|
cls.services["shared_network_offering"], False)
|
|
|
|
# create a Nuage shared network offering
|
|
cls.nuage_shared_network_offering = cls.create_NetworkOffering(
|
|
cls.test_data["nuagevsp"]["shared_nuage_network_offering"],
|
|
False)
|
|
|
|
cls._cleanup = [
|
|
cls.nuage_isolated_network_offering,
|
|
cls.nuage_isolated_network_offering_persistent,
|
|
cls.nuage_isolated_network_offering_without_vr,
|
|
cls.nuage_isolated_network_offering_without_vr_persistent,
|
|
cls.native_isolated_network_offering,
|
|
cls.native_isolated_network_offering_persistent,
|
|
cls.native_vpc_offering,
|
|
cls.nuage_vpc_offering,
|
|
cls.nuage_vpc_network_offering,
|
|
cls.native_vpc_network_offering,
|
|
cls.native_shared_network_offering,
|
|
cls.nuage_shared_network_offering
|
|
]
|
|
return
|
|
|
|
def setUp(self):
|
|
# Create an account
|
|
self.account = Account.create(self.api_client,
|
|
self.test_data["account"],
|
|
admin=True,
|
|
domainid=self.domain.id
|
|
)
|
|
self.cleanup = [self.account]
|
|
return
|
|
|
|
def migrate_network(self, nw_off, network, resume=False):
|
|
return network.migrate(self.api_client, nw_off.id, resume)
|
|
|
|
def migrate_vpc(self, vpc, vpc_offering,
|
|
network_offering_map, resume=False):
|
|
return vpc.migrate(self.api_client,
|
|
vpc_offering.id,
|
|
network_offering_map, resume)
|
|
|
|
def verify_pingtovmipaddress(self, ssh, pingtovmipaddress):
|
|
"""verify ping to ipaddress of the vm and retry 3 times"""
|
|
successfull_ping = False
|
|
nbr_retries = 0
|
|
max_retries = 5
|
|
cmd = 'ping -c 2 ' + pingtovmipaddress
|
|
|
|
while not successfull_ping and nbr_retries < max_retries:
|
|
self.debug("ping vm by ipaddress with command: " + cmd)
|
|
outputlist = ssh.execute(cmd)
|
|
self.debug("command is executed properly " + cmd)
|
|
completeoutput = str(outputlist).strip('[]')
|
|
self.debug("complete output is " + completeoutput)
|
|
if '2 received' in completeoutput:
|
|
self.debug("PASS as vm is pingeable: " + completeoutput)
|
|
successfull_ping = True
|
|
else:
|
|
self.debug("FAIL as vm is not pingeable: " + completeoutput)
|
|
time.sleep(3)
|
|
nbr_retries = nbr_retries + 1
|
|
|
|
if not successfull_ping:
|
|
self.fail("FAILED TEST as excepted value not found in vm")
|
|
|
|
def verify_pingtovmhostname(self, ssh, pingtovmhostname):
|
|
"""verify ping to hostname of the vm and retry 3 times"""
|
|
successfull_ping = False
|
|
nbr_retries = 0
|
|
max_retries = 5
|
|
cmd = 'ping -c 2 ' + pingtovmhostname
|
|
|
|
while not successfull_ping and nbr_retries < max_retries:
|
|
self.debug("ping vm by hostname with command: " + cmd)
|
|
outputlist = ssh.execute(cmd)
|
|
self.debug("command is executed properly " + cmd)
|
|
completeoutput = str(outputlist).strip('[]')
|
|
self.debug("complete output is " + completeoutput)
|
|
if '2 received' in completeoutput:
|
|
self.debug("PASS as vm is pingeable: " + completeoutput)
|
|
successfull_ping = True
|
|
else:
|
|
self.debug("FAIL as vm is not pingeable: " + completeoutput)
|
|
time.sleep(3)
|
|
nbr_retries = nbr_retries + 1
|
|
|
|
if not successfull_ping:
|
|
self.fail("FAILED TEST as excepted value not found in vm")
|
|
|
|
def update_userdata(self, vm, expected_user_data):
|
|
updated_user_data = base64.b64encode(expected_user_data)
|
|
vm.update(self.api_client, userdata=updated_user_data)
|
|
return expected_user_data
|
|
|
|
def get_userdata_url(self, vm):
|
|
self.debug("Getting user data url")
|
|
nic = vm.nic[0]
|
|
gateway = str(nic.gateway)
|
|
self.debug("Gateway: " + gateway)
|
|
user_data_url = 'curl "http://' + gateway + ':80/latest/user-data"'
|
|
return user_data_url
|
|
|
|
def define_cloudstack_managementip(self):
|
|
# get cloudstack managementips from cfg file
|
|
config = self.getClsConfig()
|
|
return [config.mgtSvr[0].mgtSvrIp, config.mgtSvr[1].mgtSvrIp]
|
|
|
|
def cloudstack_connection_vsd(self, connection="up",
|
|
cscip=["csc-1", "csc-2"]):
|
|
self.debug("SSH into cloudstack management server(s), setting "
|
|
"connection to VSD as %s " % connection)
|
|
try:
|
|
for ip in cscip:
|
|
csc_ssh_client = is_server_ssh_ready(
|
|
ipaddress=ip,
|
|
port=22,
|
|
username="root",
|
|
password="tigris",
|
|
retries=2
|
|
)
|
|
self.debug("SSH is successful for cloudstack management "
|
|
"server with IP %s" % ip)
|
|
if connection == "down":
|
|
cmd = "iptables -A OUTPUT -p tcp --dport 8443 -j DROP"
|
|
else:
|
|
cmd = "iptables -D OUTPUT -p tcp --dport 8443 -j DROP"
|
|
self.execute_cmd(csc_ssh_client, cmd)
|
|
except Exception as e:
|
|
self.debug("Setting cloudstack management server(s) connection %s "
|
|
"to VSD fails with exception %s" % (connection, e))
|
|
|
|
def verify_cloudstack_host_state_up(self, state):
|
|
nbr_retries = 0
|
|
max_retries = 30
|
|
self.debug("Verify state by list hosts type=L2Networking")
|
|
result = Host.list(self.api_client, type="L2Networking")
|
|
while result[0].state != state and nbr_retries < max_retries:
|
|
time.sleep(5)
|
|
result = Host.list(self.api_client, type="L2Networking")
|
|
nbr_retries = nbr_retries + 1
|
|
|
|
if nbr_retries == max_retries:
|
|
self.debug("TIMEOUT - state of list hosts unchanged")
|
|
|
|
def verifymigrationerrortext(self, errortext, expectstr):
|
|
if expectstr in errortext:
|
|
self.debug("Migrate_network fails with expected errortext %s",
|
|
errortext)
|
|
else:
|
|
self.fail("Migrate_network fails but test expects "
|
|
"other errortext %s", expectstr)
|
|
|
|
@attr(tags=["migrateACS", "novms"],
|
|
required_hardware="false")
|
|
def test_01_native_to_nuage_network_migration_novms(self):
|
|
"""
|
|
Verify Migration for an isolated network without VMs
|
|
1. create multiple native non-persistent isolated network
|
|
2. move to nuage non-persistent isolated network
|
|
3. move to native persistent network, check VR state
|
|
4. move to nuage persistent network, check VR state
|
|
"""
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_offering, gateway="10.0.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
isolated_network2 = self.create_Network(
|
|
self.native_isolated_network_offering, gateway="10.1.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
shared_network = self.create_Network(
|
|
self.native_shared_network_offering, gateway="10.3.0.1",
|
|
netmask="255.255.255.0", vlan=1201)
|
|
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_shared_network_offering,
|
|
shared_network, resume=False)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "NetworkOfferingId can be upgraded only for the " \
|
|
"network of type Isolated"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_shared_network_offering,
|
|
isolated_network, resume=False)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Can't upgrade from network offering"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
self.nuage_isolated_network_offering.update(self.api_client,
|
|
state="Disabled")
|
|
self.validate_NetworkOffering(
|
|
self.nuage_isolated_network_offering, state="Disabled")
|
|
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering,
|
|
isolated_network, resume=False)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to migrate network as the specified network " \
|
|
"offering is not enabled."
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
self.nuage_isolated_network_offering.update(self.api_client,
|
|
state="Enabled")
|
|
self.validate_NetworkOffering(
|
|
self.nuage_isolated_network_offering, state="Enabled")
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering, isolated_network,
|
|
resume=True)
|
|
|
|
self.verify_vsd_network_not_present(isolated_network, None)
|
|
|
|
self.migrate_network(
|
|
self.native_isolated_network_offering_persistent, isolated_network)
|
|
self.verify_vsd_network_not_present(isolated_network, None)
|
|
vr = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr, "Running")
|
|
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_vpc_offering, isolated_network, resume=False)
|
|
except Exception as e:
|
|
self.debug("Migration fails with %s" % e)
|
|
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_vpc_network_offering, isolated_network,
|
|
resume=False)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to migrate network as the specified network " \
|
|
"offering is a VPC offering"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_persistent, isolated_network)
|
|
self.verify_vsd_network(self.domain.id, isolated_network, None)
|
|
|
|
vr = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr, "Running")
|
|
self.verify_vsd_router(vr)
|
|
with self.assertRaises(Exception):
|
|
self.verify_vsd_network(self.domain.id, isolated_network2, None)
|
|
|
|
self.add_resource_tag(
|
|
self.native_isolated_network_offering_persistent.id,
|
|
"NetworkOffering", "RelatedNetworkOffering",
|
|
self.native_isolated_network_offering.id)
|
|
result = self.list_resource_tag(
|
|
self.native_isolated_network_offering_persistent.id,
|
|
"NetworkOffering", "RelatedNetworkOffering")
|
|
if result[0].value != self.native_isolated_network_offering.id:
|
|
self.fail("Listed resource value does not match with stored"
|
|
" resource value!")
|
|
self.delete_resource_tag(
|
|
self.native_isolated_network_offering_persistent.id,
|
|
"NetworkOffering")
|
|
empty = self.list_resource_tag(
|
|
self.native_isolated_network_offering_persistent.id,
|
|
"NetworkOffering", "RelatedNetworkOffering")
|
|
if empty:
|
|
self.fail("clean up of resource values did was not successful!")
|
|
|
|
@attr(tags=["migrateACS", "stoppedvms"],
|
|
required_hardware="false")
|
|
def test_02_native_to_nuage_network_migration_stoppedvms(self):
|
|
"""
|
|
Verify Migration for an isolated network with stopped VMs
|
|
1. create multiple native non-persistent isolated network
|
|
2. deploy vm and stop vm
|
|
3. move to nuage non-persistent isolated network
|
|
4. deploy vm and stop vm
|
|
5. move to native persistent network, check VR state
|
|
6. deploy vm and stop vm
|
|
7. move to nuage persistent network, check VR state
|
|
"""
|
|
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_offering, gateway="10.0.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
vm_1 = self.create_VM(isolated_network)
|
|
vm_1.stop(self.api_client)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering, isolated_network)
|
|
|
|
vm_1.delete(self.api_client, expunge=True)
|
|
vm_2 = self.create_VM(isolated_network)
|
|
vm_2.stop(self.api_client)
|
|
|
|
self.verify_vsd_network(self.domain.id, isolated_network, None)
|
|
|
|
self.migrate_network(
|
|
self.native_isolated_network_offering_persistent, isolated_network)
|
|
|
|
self.verify_vsd_network_not_present(isolated_network, None)
|
|
vr = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr, "Running")
|
|
|
|
vm_2.delete(self.api_client, expunge=True)
|
|
vm_3 = self.create_VM(isolated_network)
|
|
vm_3.stop(self.api_client)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_persistent, isolated_network)
|
|
|
|
self.verify_vsd_network(self.domain.id, isolated_network, None)
|
|
vr2 = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr2, "Running")
|
|
self.verify_vsd_router(vr2)
|
|
self.verify_vsd_network(self.domain.id, isolated_network, None)
|
|
|
|
@attr(tags=["migrateACS", "nonpersist"],
|
|
required_hardware="false")
|
|
def test_03_migrate_native_nonpersistent_network_to_nuage_traffic(self):
|
|
"""
|
|
Verify traffic after Migration of a non-persistent isolated network
|
|
1. create native non-persistent isolated network
|
|
2. move to nuage non-persistent isolated network
|
|
3. Spin VM's and verify traffic provided by Nuage
|
|
"""
|
|
for i in range(1, 3):
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_offering, gateway="10.1.0.1",
|
|
netmask="255.255.255.0", account=self.account)
|
|
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_vpc_network_offering,
|
|
isolated_network, resume=False)
|
|
except Exception as e:
|
|
errortext = re.search(".*errortext\s*:\s*u?'([^']+)'.*",
|
|
e.message).group(1)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to migrate network as the specified network " \
|
|
"offering is a VPC offering"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr,
|
|
isolated_network, resume=True)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr,
|
|
isolated_network, resume=False)
|
|
|
|
self.verify_vsd_network_not_present(isolated_network, None)
|
|
|
|
self.debug("Deploying a VM in the created Isolated network...")
|
|
vm_1 = self.create_VM(isolated_network)
|
|
self.validate_Network(isolated_network, state="Implemented")
|
|
self.check_VM_state(vm_1, state="Running")
|
|
vm_2 = self.create_VM(isolated_network)
|
|
self.check_VM_state(vm_2, state="Running")
|
|
|
|
# VSD verification
|
|
self.verify_vsd_network(self.domain.id, isolated_network)
|
|
# self.verify_vsd_router(vr_1)
|
|
self.verify_vsd_vm(vm_1)
|
|
self.verify_vsd_vm(vm_2)
|
|
|
|
# Creating Static NAT rule
|
|
self.debug("Creating Static NAT rule for the deployed VM in the "
|
|
"created Isolated network...")
|
|
public_ip = self.acquire_PublicIPAddress(isolated_network)
|
|
self.validate_PublicIPAddress(public_ip, isolated_network)
|
|
self.create_StaticNatRule_For_VM(vm_1, public_ip, isolated_network)
|
|
self.validate_PublicIPAddress(
|
|
public_ip, isolated_network, static_nat=True, vm=vm_1)
|
|
fw_rule = self.create_FirewallRule(
|
|
public_ip, self.test_data["ingress_rule"])
|
|
|
|
# VSD verification for Static NAT functionality
|
|
self.verify_vsd_floating_ip(isolated_network, vm_1,
|
|
public_ip.ipaddress)
|
|
self.verify_vsd_firewall_rule(fw_rule)
|
|
|
|
# Ssh into the VM via floating ip
|
|
vm_public_ip = public_ip.ipaddress.ipaddress
|
|
try:
|
|
vm_1.ssh_ip = vm_public_ip
|
|
vm_1.ssh_port = self.test_data["virtual_machine"]["ssh_port"]
|
|
vm_1.username = self.test_data["virtual_machine"]["username"]
|
|
vm_1.password = self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vm_1.ssh_ip, vm_1.password))
|
|
|
|
ssh = vm_1.get_ssh_client(ipaddress=vm_public_ip)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
self.verify_pingtovmipaddress(ssh, vm_2.ipaddress)
|
|
|
|
vm_1.delete(self.api_client, expunge=True)
|
|
vm_2.delete(self.api_client, expunge=True)
|
|
isolated_network.delete(self.api_client)
|
|
self.debug("Number of loops %s" % i)
|
|
|
|
@attr(tags=["migrateACS", "persist"],
|
|
required_hardware="false")
|
|
def test_04_migrate_native_persistentnetwork_to_nuage_traffic(self):
|
|
"""
|
|
Verify traffic after Migration of a persistent isolated network
|
|
1. create native persistent isolated network
|
|
2. move to nuage persistent isolated network without VR
|
|
3. Spin VM's and verify traffic provided by Nuage
|
|
"""
|
|
for i in range(1, 3):
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_offering_persistent,
|
|
gateway="10.2.0.1",
|
|
netmask="255.255.255.0", account=self.account)
|
|
self.verify_vsd_network_not_present(isolated_network, None)
|
|
vr = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr, "Running")
|
|
|
|
csc_ips = self.define_cloudstack_managementip()
|
|
self.cloudstack_connection_vsd(connection="down", cscip=csc_ips)
|
|
self.debug("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=")
|
|
self.debug("Migrate_network fails if connection ACS VSD is down")
|
|
self.debug("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=")
|
|
self.verify_cloudstack_host_state_up("Alert")
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr_persistent,
|
|
isolated_network, resume=False)
|
|
except Exception as e:
|
|
errortext = re.search(".*errortext\s*:\s*u?'([^']+)'.*",
|
|
e.message).group(1)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to implement network (with specified id) " \
|
|
"elements and resources as a part of network update"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
self.cloudstack_connection_vsd(connection="up", cscip=csc_ips)
|
|
self.debug("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=")
|
|
self.debug("Migrate_network resumes if connection ACS VSD is up")
|
|
self.debug("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=")
|
|
self.verify_cloudstack_host_state_up("Up")
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr_persistent,
|
|
isolated_network, resume=False)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to migrate network as previous migration " \
|
|
"left this network in transient condition. " \
|
|
"Specify resume as true."
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr_persistent,
|
|
isolated_network, resume=True)
|
|
|
|
self.verify_vsd_network(self.domain.id, isolated_network, None)
|
|
with self.assertRaises(Exception):
|
|
self.get_Router(isolated_network)
|
|
self.debug("Deploying a VM in the created Isolated network...")
|
|
vm_1 = self.create_VM(isolated_network)
|
|
self.validate_Network(isolated_network, state="Implemented")
|
|
with self.assertRaises(Exception):
|
|
self.get_Router(isolated_network)
|
|
self.check_VM_state(vm_1, state="Running")
|
|
vm_2 = self.create_VM(isolated_network)
|
|
self.check_VM_state(vm_2, state="Running")
|
|
|
|
# VSD verification
|
|
self.verify_vsd_network(self.domain.id, isolated_network)
|
|
self.verify_vsd_vm(vm_1)
|
|
self.verify_vsd_vm(vm_2)
|
|
|
|
# Creating Static NAT rule
|
|
self.debug("Creating Static NAT rule for the deployed VM in the "
|
|
"created Isolated network...")
|
|
public_ip = self.acquire_PublicIPAddress(isolated_network)
|
|
self.validate_PublicIPAddress(public_ip, isolated_network)
|
|
self.create_StaticNatRule_For_VM(vm_1, public_ip, isolated_network)
|
|
self.validate_PublicIPAddress(
|
|
public_ip, isolated_network, static_nat=True, vm=vm_1)
|
|
fw_rule = self.create_FirewallRule(
|
|
public_ip, self.test_data["ingress_rule"])
|
|
|
|
# VSD verification for Static NAT functionality
|
|
self.verify_vsd_floating_ip(isolated_network, vm_1,
|
|
public_ip.ipaddress)
|
|
self.verify_vsd_firewall_rule(fw_rule)
|
|
|
|
# Ssh into the VM via floating ip
|
|
vm_public_ip = public_ip.ipaddress.ipaddress
|
|
try:
|
|
vm_1.ssh_ip = vm_public_ip
|
|
vm_1.ssh_port = self.test_data["virtual_machine"]["ssh_port"]
|
|
vm_1.username = self.test_data["virtual_machine"]["username"]
|
|
vm_1.password = self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vm_1.ssh_ip, vm_1.password))
|
|
|
|
ssh = vm_1.get_ssh_client(ipaddress=vm_public_ip)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
self.verify_pingtovmipaddress(ssh, vm_2.ipaddress)
|
|
|
|
vm_1.delete(self.api_client, expunge=True)
|
|
vm_2.delete(self.api_client, expunge=True)
|
|
isolated_network.delete(self.api_client)
|
|
self.debug("Number of loops %s" % i)
|
|
|
|
@attr(tags=["migrateACS", "nicmigration"],
|
|
required_hardware="false")
|
|
def test_05_native_to_nuage_nic_migration(self):
|
|
"""
|
|
Verify Nic migration of GuestVm in an isolated network
|
|
1. create multiple native non-persistent isolated network
|
|
2. populate network with 2 vm's
|
|
3. enable static nat + create FW rule
|
|
4. move to nuage non-persistent isolated network, check:
|
|
- public ip
|
|
- FW rules
|
|
- VR
|
|
- VM's
|
|
"""
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_offering, gateway="10.0.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
isolated_network2 = self.create_Network(
|
|
self.native_isolated_network_offering, gateway="10.1.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
vm1 = self.create_VM(isolated_network)
|
|
public_ip = self.acquire_PublicIPAddress(isolated_network)
|
|
self.create_StaticNatRule_For_VM(vm1, public_ip, isolated_network)
|
|
firewall_rule = self.create_FirewallRule(public_ip)
|
|
|
|
vm2 = self.create_VM(isolated_network)
|
|
vr = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr, "Running")
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering, isolated_network)
|
|
|
|
self.verify_vsd_network(self.domain.id, isolated_network, None)
|
|
self.verify_vsd_vm(vm1)
|
|
self.verify_vsd_floating_ip(isolated_network, vm1, public_ip.ipaddress)
|
|
self.verify_vsd_firewall_rule(firewall_rule)
|
|
self.verify_vsd_vm(vm2)
|
|
vr = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr, "Running")
|
|
self.verify_vsd_router(vr)
|
|
with self.assertRaises(Exception):
|
|
self.verify_vsd_network(self.domain.id, isolated_network2, None)
|
|
|
|
@attr(tags=["migrateACS", "nonpersistnic"],
|
|
required_hardware="false")
|
|
def test_06_migrate_native_nonpersistent_nic_to_nuage_traffic(self):
|
|
"""
|
|
Verify Nic migration of GuestVm in a non-persistent isolated network
|
|
1. create two native non-persistent isolated networks
|
|
2. Deploy 2 vm's in first network
|
|
3. enable static nat + create FW rule
|
|
4. move first network to nuage non-persistent isolated network,
|
|
check:
|
|
- public ip
|
|
- FW rules
|
|
- VR
|
|
- VM's
|
|
5. Destroy and expunge 1 VM in first network
|
|
6. Deploy a new VM in first network and check traffic
|
|
7. Move second network to nuage non-persistent isolated network,
|
|
check:
|
|
- public ip
|
|
- FW rules
|
|
- VR
|
|
- VM's
|
|
8. Deploy 2 vm in second network , move it and check
|
|
9. Cleanup
|
|
"""
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_offering, gateway="10.3.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
isolated_network2 = self.create_Network(
|
|
self.native_isolated_network_offering, gateway="10.4.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
vm_1 = self.create_VM(isolated_network)
|
|
public_ip = self.acquire_PublicIPAddress(isolated_network)
|
|
self.create_StaticNatRule_For_VM(vm_1, public_ip, isolated_network)
|
|
firewall_rule = self.create_FirewallRule(public_ip)
|
|
|
|
vm_2 = self.create_VM(isolated_network)
|
|
vr = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr, "Running")
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering, isolated_network)
|
|
|
|
self.verify_vsd_network(self.domain.id, isolated_network, None)
|
|
self.verify_vsd_vm(vm_1)
|
|
self.verify_vsd_floating_ip(isolated_network, vm_1,
|
|
public_ip.ipaddress)
|
|
self.verify_vsd_firewall_rule(firewall_rule)
|
|
self.verify_vsd_vm(vm_2)
|
|
vr_3 = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr_3, "Running")
|
|
self.verify_vsd_router(vr_3)
|
|
|
|
# VSD verification for Static NAT functionality
|
|
self.verify_vsd_floating_ip(isolated_network, vm_1,
|
|
public_ip.ipaddress)
|
|
self.verify_vsd_firewall_rule(firewall_rule)
|
|
|
|
# Ssh into the VM via floating ip
|
|
vm_public_ip = public_ip.ipaddress.ipaddress
|
|
try:
|
|
vm_1.ssh_ip = vm_public_ip
|
|
vm_1.ssh_port = self.test_data["virtual_machine"]["ssh_port"]
|
|
vm_1.username = self.test_data["virtual_machine"]["username"]
|
|
vm_1.password = self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vm_1.ssh_ip, vm_1.password))
|
|
|
|
ssh = vm_1.get_ssh_client(ipaddress=vm_public_ip)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
self.verify_pingtovmipaddress(ssh, vm_2.ipaddress)
|
|
|
|
vm_2.delete(self.api_client, expunge=True)
|
|
with self.assertRaises(Exception):
|
|
self.verify_vsd_vm(vm_2)
|
|
vm_4 = self.create_VM(isolated_network)
|
|
self.verify_vsd_vm(vm_4)
|
|
with self.assertRaises(Exception):
|
|
self.verify_vsd_network(self.domain.id, isolated_network2, None)
|
|
|
|
vm_3 = self.create_VM(isolated_network2)
|
|
vr_2 = self.get_Router(isolated_network2)
|
|
self.check_Router_state(vr_2, "Running")
|
|
|
|
# Ssh into the VM via floating ip
|
|
vm_public_ip = public_ip.ipaddress.ipaddress
|
|
try:
|
|
vm_1.ssh_ip = vm_public_ip
|
|
vm_1.ssh_port = self.test_data["virtual_machine"]["ssh_port"]
|
|
vm_1.username = self.test_data["virtual_machine"]["username"]
|
|
vm_1.password = self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vm_1.ssh_ip, vm_1.password))
|
|
|
|
ssh = vm_1.get_ssh_client(ipaddress=vm_public_ip)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
self.verify_pingtovmipaddress(ssh, vm_4.ipaddress)
|
|
|
|
vm_1.delete(self.api_client, expunge=True)
|
|
vm_4.delete(self.api_client, expunge=True)
|
|
isolated_network.delete(self.api_client)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr,
|
|
isolated_network2)
|
|
|
|
public_ip_2 = self.acquire_PublicIPAddress(isolated_network2)
|
|
self.create_StaticNatRule_For_VM(vm_3, public_ip_2, isolated_network2)
|
|
firewall_rule_2 = self.create_FirewallRule(public_ip_2)
|
|
self.verify_vsd_floating_ip(isolated_network2, vm_3,
|
|
public_ip_2.ipaddress)
|
|
self.verify_vsd_firewall_rule(firewall_rule_2)
|
|
|
|
self.verify_vsd_network(self.domain.id, isolated_network2, None)
|
|
self.verify_vsd_vm(vm_3)
|
|
self.verify_vsd_floating_ip(isolated_network2, vm_3,
|
|
public_ip_2.ipaddress)
|
|
self.verify_vsd_firewall_rule(firewall_rule_2)
|
|
|
|
with self.assertRaises(Exception):
|
|
self.get_Router(isolated_network2)
|
|
vm_5 = self.create_VM(isolated_network2)
|
|
self.verify_vsd_vm(vm_5)
|
|
|
|
# Ssh into the VM via floating ip
|
|
vm_public_ip_2 = public_ip_2.ipaddress.ipaddress
|
|
try:
|
|
vm_3.ssh_ip = vm_public_ip_2
|
|
vm_3.ssh_port = self.test_data["virtual_machine"]["ssh_port"]
|
|
vm_3.username = self.test_data["virtual_machine"]["username"]
|
|
vm_3.password = self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vm_3.ssh_ip, vm_3.password))
|
|
|
|
ssh = vm_3.get_ssh_client(ipaddress=vm_public_ip_2)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
self.verify_pingtovmipaddress(ssh, vm_5.ipaddress)
|
|
|
|
@attr(tags=["migrateACS", "persistnic"],
|
|
required_hardware="false")
|
|
def test_07_migrate_native_persistent_nic_to_nuage_traffic(self):
|
|
"""
|
|
Verify Nic migration of GuestVm in a persistent isolated network
|
|
1. create two native persistent isolated networks
|
|
2. deploy 2 vm's in this network
|
|
3. move to nuage non-persistent isolated network,
|
|
4. enable static nat + create FW rule
|
|
check:
|
|
- public ip
|
|
- FW rules
|
|
- VR
|
|
- VM's
|
|
"""
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_offering_persistent,
|
|
gateway="10.5.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
isolated_network2 = self.create_Network(
|
|
self.native_isolated_network_offering_persistent,
|
|
gateway="10.6.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
vm_1 = self.create_VM(isolated_network)
|
|
vm_2 = self.create_VM(isolated_network)
|
|
vr = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr, "Running")
|
|
vm_3 = self.create_VM(isolated_network2)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr_persistent,
|
|
isolated_network)
|
|
|
|
public_ip = self.acquire_PublicIPAddress(isolated_network)
|
|
self.create_StaticNatRule_For_VM(vm_1, public_ip, isolated_network)
|
|
firewall_rule = self.create_FirewallRule(public_ip)
|
|
|
|
self.verify_vsd_network(self.domain.id, isolated_network, None)
|
|
self.verify_vsd_vm(vm_1)
|
|
self.verify_vsd_floating_ip(isolated_network, vm_1,
|
|
public_ip.ipaddress)
|
|
self.verify_vsd_firewall_rule(firewall_rule)
|
|
self.verify_vsd_vm(vm_2)
|
|
with self.assertRaises(Exception):
|
|
self.get_Router(isolated_network)
|
|
|
|
# Ssh into the VM via floating ip
|
|
vm_public_ip = public_ip.ipaddress.ipaddress
|
|
try:
|
|
vm_1.ssh_ip = vm_public_ip
|
|
vm_1.ssh_port = self.test_data["virtual_machine"]["ssh_port"]
|
|
vm_1.username = self.test_data["virtual_machine"]["username"]
|
|
vm_1.password = self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vm_1.ssh_ip, vm_1.password))
|
|
|
|
ssh = vm_1.get_ssh_client(ipaddress=vm_public_ip)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
self.verify_pingtovmipaddress(ssh, vm_2.ipaddress)
|
|
|
|
vm_1.delete(self.api_client, expunge=True)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr_persistent,
|
|
isolated_network2)
|
|
|
|
vm_2.delete(self.api_client, expunge=True)
|
|
isolated_network.delete(self.api_client)
|
|
|
|
self.verify_vsd_network(self.domain.id, isolated_network2, None)
|
|
self.verify_vsd_vm(vm_3)
|
|
public_ip_2 = self.acquire_PublicIPAddress(isolated_network2)
|
|
self.create_StaticNatRule_For_VM(vm_3, public_ip_2, isolated_network2)
|
|
firewall_rule_2 = self.create_FirewallRule(public_ip_2)
|
|
vm_4 = self.create_VM(isolated_network2)
|
|
self.verify_vsd_floating_ip(isolated_network2, vm_3,
|
|
public_ip_2.ipaddress)
|
|
self.verify_vsd_firewall_rule(firewall_rule_2)
|
|
self.verify_vsd_vm(vm_4)
|
|
|
|
# Ssh into the VM via floating ip
|
|
vm_public_ip_2 = public_ip_2.ipaddress.ipaddress
|
|
try:
|
|
vm_3.ssh_ip = vm_public_ip_2
|
|
vm_3.ssh_port = self.test_data["virtual_machine"]["ssh_port"]
|
|
vm_3.username = self.test_data["virtual_machine"]["username"]
|
|
vm_3.password = self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vm_3.ssh_ip, vm_3.password))
|
|
|
|
ssh = vm_3.get_ssh_client(ipaddress=vm_public_ip_2)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
self.verify_pingtovmipaddress(ssh, vm_4.ipaddress)
|
|
|
|
@attr(tags=["migrateACS", "isomultinic"],
|
|
required_hardware="false")
|
|
def test_08_migrate_native_multinic_to_nuage_traffic(self):
|
|
"""
|
|
Verify MultiNic migration of GuestVm with multiple isolated networks
|
|
1. create one native non-persistent isolated network
|
|
2. create one native persistent isolated network
|
|
3. deploy 2 vm's in both these network
|
|
4. move non-persist to nuage non-persistent isolated network,
|
|
5. move persist to nuage persistent isolated network
|
|
6. enable static nat + create FW rule
|
|
check:
|
|
- public ip
|
|
- FW rules
|
|
- VR
|
|
- VM's
|
|
"""
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_offering,
|
|
gateway="10.7.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
isolated_network2 = self.create_Network(
|
|
self.native_isolated_network_offering_persistent,
|
|
gateway="10.8.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
vm_1 = self.create_VM([isolated_network, isolated_network2])
|
|
vm_2 = self.create_VM([isolated_network2, isolated_network])
|
|
vr = self.get_Router(isolated_network2)
|
|
self.check_Router_state(vr, "Running")
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr,
|
|
isolated_network)
|
|
|
|
vm_3 = self.create_VM(isolated_network)
|
|
|
|
public_ip = self.acquire_PublicIPAddress(isolated_network)
|
|
self.create_StaticNatRule_For_VM(vm_3, public_ip, isolated_network)
|
|
firewall_rule = self.create_FirewallRule(public_ip)
|
|
|
|
self.verify_vsd_network(self.domain.id, isolated_network, None)
|
|
|
|
self.verify_vsd_vm(vm_3)
|
|
self.verify_vsd_floating_ip(isolated_network, vm_3,
|
|
public_ip.ipaddress)
|
|
self.verify_vsd_firewall_rule(firewall_rule)
|
|
|
|
# Ssh into the VM via floating ip
|
|
vm_public_ip = public_ip.ipaddress.ipaddress
|
|
try:
|
|
vm_3.ssh_ip = vm_public_ip
|
|
vm_3.ssh_port = self.test_data["virtual_machine"]["ssh_port"]
|
|
vm_3.username = self.test_data["virtual_machine"]["username"]
|
|
vm_3.password = self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vm_3.ssh_ip, vm_3.password))
|
|
|
|
ssh = vm_3.get_ssh_client(ipaddress=vm_public_ip)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
defaultipaddress = \
|
|
[nic.ipaddress for nic in vm_1.nic if nic.isdefault][0]
|
|
|
|
self.verify_pingtovmipaddress(ssh, defaultipaddress)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr_persistent,
|
|
isolated_network2)
|
|
|
|
vm_3.delete(self.api_client, expunge=True)
|
|
public_ip.delete(self.api_client)
|
|
vm_4 = self.create_VM(isolated_network2)
|
|
|
|
public_ip_2 = self.acquire_PublicIPAddress(isolated_network2)
|
|
self.create_StaticNatRule_For_VM(vm_4, public_ip_2, isolated_network2)
|
|
firewall_rule_2 = self.create_FirewallRule(public_ip_2)
|
|
|
|
self.verify_vsd_floating_ip(isolated_network2, vm_4,
|
|
public_ip_2.ipaddress)
|
|
self.verify_vsd_firewall_rule(firewall_rule_2)
|
|
self.verify_vsd_vm(vm_4)
|
|
|
|
# Ssh into the VM via floating ip
|
|
vm_public_ip_2 = public_ip_2.ipaddress.ipaddress
|
|
try:
|
|
vm_4.ssh_ip = vm_public_ip_2
|
|
vm_4.ssh_port = self.test_data["virtual_machine"]["ssh_port"]
|
|
vm_4.username = self.test_data["virtual_machine"]["username"]
|
|
vm_4.password = self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vm_4.ssh_ip, vm_4.password))
|
|
|
|
ssh = vm_4.get_ssh_client(ipaddress=vm_public_ip_2)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
defaultipaddress2 = \
|
|
[nic.ipaddress for nic in vm_2.nic if nic.isdefault][0]
|
|
|
|
self.verify_pingtovmipaddress(ssh, defaultipaddress2)
|
|
|
|
@attr(tags=["migrateACS", "persiststaticnat"],
|
|
required_hardware="false")
|
|
def test_09_migrate_native_persist_staticnat_to_nuage_traffic(self):
|
|
"""
|
|
Verify StaticNat migration of GuestVm in a persistent isolated network
|
|
1. create one native persistent isolated network offering
|
|
2. with Dhcp,SourceNat,StaticNat,Dns,Userdata and Firewall
|
|
3. create one native persistent isolated network with above
|
|
4. deploy 2 vm's in this network
|
|
5. In a loop
|
|
enable staticnat on first vm and open port 22 for ssh
|
|
login to vm1 and ping vm2
|
|
verify userdata in Native
|
|
move to nuage persistent isolated network,
|
|
deploy 2 new vm's in this network
|
|
enable staticnat on new vm and open port 22 for ssh
|
|
check:
|
|
- public ips
|
|
- FW rules
|
|
- VR
|
|
- VM's ping old and new VM's
|
|
- verify userdata in Nuage
|
|
- Release public ips
|
|
move back to native persistent isolated network,
|
|
"""
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_staticnat_offering_persistent,
|
|
gateway="10.9.0.1",
|
|
netmask="255.255.255.0", account=self.account)
|
|
|
|
vm_1 = self.create_VM(isolated_network)
|
|
vm_2 = self.create_VM(isolated_network)
|
|
vr = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr, "Running")
|
|
|
|
for i in range(1, 3):
|
|
self.debug("+++++Starting again as Native in Loop+++++")
|
|
public_ip = self.acquire_PublicIPAddress(isolated_network)
|
|
self.create_StaticNatRule_For_VM(vm_1, public_ip, isolated_network)
|
|
firewall_rule = self.create_FirewallRule(public_ip)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_persistent,
|
|
isolated_network)
|
|
|
|
self.verify_vsd_network(self.domain.id, isolated_network, None)
|
|
self.verify_vsd_vm(vm_1)
|
|
self.verify_vsd_floating_ip(isolated_network, vm_1,
|
|
public_ip.ipaddress)
|
|
self.verify_vsd_firewall_rule(firewall_rule)
|
|
self.verify_vsd_vm(vm_2)
|
|
|
|
vm_3 = self.create_VM(isolated_network)
|
|
public_ip_2 = self.acquire_PublicIPAddress(isolated_network)
|
|
self.create_StaticNatRule_For_VM(vm_3,
|
|
public_ip_2,
|
|
isolated_network)
|
|
firewall_rule_2 = self.create_FirewallRule(public_ip_2)
|
|
vm_4 = self.create_VM(isolated_network)
|
|
self.verify_vsd_floating_ip(isolated_network, vm_3,
|
|
public_ip_2.ipaddress)
|
|
self.verify_vsd_firewall_rule(firewall_rule_2)
|
|
self.verify_vsd_vm(vm_3)
|
|
self.verify_vsd_vm(vm_4)
|
|
|
|
# Ssh into the VM via floating ip
|
|
vm_public_ip_2 = public_ip_2.ipaddress.ipaddress
|
|
try:
|
|
vm_3.ssh_ip = vm_public_ip_2
|
|
vm_3.ssh_port = self.test_data["virtual_machine"]["ssh_port"]
|
|
vm_3.username = self.test_data["virtual_machine"]["username"]
|
|
vm_3.password = self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vm_3.ssh_ip, vm_3.password))
|
|
|
|
ssh2 = vm_3.get_ssh_client(ipaddress=vm_public_ip_2)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
self.verify_pingtovmipaddress(ssh2, vm_1.ipaddress)
|
|
|
|
self.verify_pingtovmipaddress(ssh2, vm_4.ipaddress)
|
|
|
|
self.verify_pingtovmipaddress(ssh2, vm_2.ipaddress)
|
|
|
|
self.debug("Updating the running vm_3 with new user data...")
|
|
expected_user_data2 = self.update_userdata(vm_3, "hellonuage vm3")
|
|
self.debug("SSHing into the vm_3 for verifying its user data...")
|
|
user_data_cmd = self.get_userdata_url(vm_3)
|
|
self.debug("Getting user data with command: " + user_data_cmd)
|
|
actual_user_data2 = self.execute_cmd(ssh2, user_data_cmd)
|
|
self.debug("Actual user data - " + actual_user_data2 +
|
|
", Expected user data - " + expected_user_data2)
|
|
self.assertEqual(actual_user_data2, expected_user_data2,
|
|
"Un-expected VM (VM_3) user data")
|
|
|
|
vm_3.delete(self.api_client, expunge=True)
|
|
vm_4.delete(self.api_client, expunge=True)
|
|
public_ip_2.delete(self.api_client)
|
|
|
|
# ReleaseIP as get_ssh_client fails when migrating back to native
|
|
public_ip.delete(self.api_client)
|
|
|
|
self.debug("++++++++Migrating network back to native+++++++")
|
|
self.migrate_network(
|
|
self.native_isolated_network_staticnat_offering_persistent,
|
|
isolated_network)
|
|
|
|
@attr(tags=["migrateACS", "vpcnovms"],
|
|
required_hardware="false")
|
|
def test_10_migrate_native_vpc(self):
|
|
vpc = self.create_Vpc(self.native_vpc_offering)
|
|
network = self.create_Network(self.native_vpc_network_offering,
|
|
vpc=vpc)
|
|
self.create_VM(network)
|
|
|
|
network_offering_map = \
|
|
[{"networkid": network.id,
|
|
"networkofferingid":
|
|
self.nuage_isolated_network_offering_without_vr.id}]
|
|
|
|
try:
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map, resume=False)
|
|
except Exception as e:
|
|
errortext = re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "can't be used for VPC networks"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
network_offering_map = \
|
|
[{"networkid": network.id,
|
|
"networkofferingid": self.nuage_vpc_network_offering.id}]
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map)
|
|
self.verify_vsd_network(self.domain.id, network, vpc)
|
|
|
|
@attr(tags=["migrateACS", "vpcstaticnat"],
|
|
required_hardware="false")
|
|
def test_11_migrate_native_vpc_staticnat_to_nuage_traffic(self):
|
|
"""
|
|
Verify StaticNat migration of GuestVm in a vpc network
|
|
1. create one native vpc network offering
|
|
2. create one native vpc tier network offering
|
|
3. with Dhcp,SourceNat,StaticNat,Dns,Userdata and NetworkACL
|
|
4. create one vpc with above native vpc network offering
|
|
5. create one native vpc tier network in above vpc
|
|
6. deploy 2 vm's in this tier network
|
|
7. In a loop
|
|
enable staticnat on first vm and ssh into vm
|
|
login to vm1 and ping vm2
|
|
verify userdata in Native
|
|
move to nuage vpc tier networkoffering,
|
|
deploy 2 new vm's in this network
|
|
enable staticnat on new vm and ssh into vm
|
|
check:
|
|
- public ips
|
|
- NetworkACL rules
|
|
- VR
|
|
- VM's ping old and new VM's
|
|
- verify userdata in Nuage
|
|
- Release public ips
|
|
move back to native vpc tier network offering,
|
|
"""
|
|
cmd = updateZone.updateZoneCmd()
|
|
cmd.id = self.zone.id
|
|
cmd.domain = "vpc.com"
|
|
self.api_client.updateZone(cmd)
|
|
|
|
self.debug("Creating Native VSP VPC offering with Static NAT service "
|
|
"provider as VPCVR...")
|
|
native_vpc_off = self.create_VpcOffering(
|
|
self.test_data["vpc_offering_reduced"])
|
|
self.validate_VpcOffering(native_vpc_off, state="Enabled")
|
|
|
|
self.debug("Creating a VPC with Static NAT service provider as "
|
|
"VpcVirtualRouter")
|
|
vpc = self.create_Vpc(native_vpc_off, cidr='10.1.0.0/16')
|
|
self.validate_Vpc(vpc, state="Enabled")
|
|
|
|
self.debug("Creating native VPC Network Tier offering "
|
|
"with Static NAT service provider as VPCVR")
|
|
native_tiernet_off = self.create_NetworkOffering(
|
|
self.test_data["nw_offering_reduced_vpc"])
|
|
self.validate_NetworkOffering(native_tiernet_off, state="Enabled")
|
|
|
|
acl_list = self.create_NetworkAclList(
|
|
name="acl", description="acl", vpc=vpc)
|
|
|
|
acl_item = self.create_NetworkAclRule(
|
|
self.test_data["ingress_rule"], acl_list=acl_list)
|
|
self.create_NetworkAclRule(
|
|
self.test_data["icmprule"], acl_list=acl_list)
|
|
|
|
self.debug("Creating a VPC tier network with Static NAT service")
|
|
vpc_tier = self.create_Network(native_tiernet_off,
|
|
gateway='10.1.0.1',
|
|
vpc=vpc,
|
|
acl_list=acl_list)
|
|
self.validate_Network(vpc_tier, state="Implemented")
|
|
|
|
self.debug("Creating 2nd VPC tier network with Static NAT service")
|
|
vpc_2ndtier = self.create_Network(native_tiernet_off,
|
|
gateway='10.1.128.1',
|
|
vpc=vpc,
|
|
acl_list=acl_list)
|
|
self.validate_Network(vpc_2ndtier, state="Implemented")
|
|
|
|
vpc_vr = self.get_Router(vpc_tier)
|
|
self.check_Router_state(vpc_vr, state="Running")
|
|
|
|
self.debug("Deploying a VM in the created VPC tier network")
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm1"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm1"
|
|
vpc_vm_1 = self.create_VM(vpc_tier)
|
|
self.check_VM_state(vpc_vm_1, state="Running")
|
|
|
|
self.debug("Deploying another VM in the created VPC tier network")
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm2"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm2"
|
|
vpc_vm_2 = self.create_VM(vpc_tier)
|
|
self.check_VM_state(vpc_vm_2, state="Running")
|
|
|
|
self.debug("Deploying a VM in the 2nd VPC tier network")
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm12"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm12"
|
|
vpc_vm_12 = self.create_VM(vpc_2ndtier)
|
|
self.check_VM_state(vpc_vm_2, state="Running")
|
|
self.test_data["virtual_machine"]["displayname"] = None
|
|
self.test_data["virtual_machine"]["name"] = None
|
|
|
|
for i in range(1, 3):
|
|
self.debug("+++++Starting again as Native in Loop+++++")
|
|
self.debug("Creating Static NAT rule for the deployed VM "
|
|
"in the created VPC network...")
|
|
public_ip_1 = self.acquire_PublicIPAddress(vpc_tier, vpc=vpc)
|
|
self.validate_PublicIPAddress(public_ip_1, vpc_tier)
|
|
self.create_StaticNatRule_For_VM(vpc_vm_1, public_ip_1, vpc_tier)
|
|
self.validate_PublicIPAddress(
|
|
public_ip_1, vpc_tier, static_nat=True, vm=vpc_vm_1)
|
|
|
|
network_offering_map = \
|
|
[{"networkid": vpc_tier.id,
|
|
"networkofferingid": self.nuage_vpc_network_offering.id},
|
|
{"networkid": vpc_2ndtier.id,
|
|
"networkofferingid": self.nuage_vpc_network_offering.id}]
|
|
|
|
csc_ips = self.define_cloudstack_managementip()
|
|
self.cloudstack_connection_vsd(connection="down",
|
|
cscip=csc_ips)
|
|
self.debug("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=")
|
|
self.debug("Migrate_vpc fails when connection ACS VSD is down")
|
|
self.debug("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=")
|
|
self.verify_cloudstack_host_state_up("Alert")
|
|
try:
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map, resume=False)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to implement network (with specified id) " \
|
|
"elements and resources as a part of network update"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
self.cloudstack_connection_vsd(connection="up",
|
|
cscip=csc_ips)
|
|
self.debug("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=")
|
|
self.debug("Migrate_vpc resumes when connection ACS VSD is up")
|
|
self.debug("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=")
|
|
self.verify_cloudstack_host_state_up("Up")
|
|
try:
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map, resume=False)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to migrate VPC as previous migration " \
|
|
"left this VPC in transient condition. " \
|
|
"Specify resume as true."
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
network_offering_map = \
|
|
[{"networkid": vpc_tier.id,
|
|
"networkofferingid": self.nuage_vpc_network_offering.id},
|
|
{"networkid": vpc_2ndtier.id,
|
|
"networkofferingid":
|
|
self.nuage_isolated_network_offering.id}]
|
|
try:
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map, resume=True)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "can't be used for VPC networks for network"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
network_offering_map = \
|
|
[{"networkid": vpc_tier.id,
|
|
"networkofferingid": self.nuage_vpc_network_offering.id},
|
|
{"networkid": vpc_2ndtier.id,
|
|
"networkofferingid": self.nuage_vpc_network_offering.id}]
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map, resume=True)
|
|
# checking after successful migrate vpc, migrate still succeeds
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map, resume=True)
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map, resume=False)
|
|
|
|
# VSD verification after VPC migration functionality
|
|
self.verify_vsd_network(self.domain.id, vpc_tier, vpc)
|
|
self.verify_vsd_vm(vpc_vm_1)
|
|
self.verify_vsd_vm(vpc_vm_2)
|
|
self.verify_vsd_floating_ip(
|
|
vpc_tier, vpc_vm_1, public_ip_1.ipaddress, vpc=vpc)
|
|
self.verify_vsd_firewall_rule(acl_item)
|
|
# self.verify_vsd_firewall_rule(acl_item2)
|
|
self.verify_vsd_vm(vpc_vm_12)
|
|
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm3"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm3"
|
|
vpc_vm_3 = self.create_VM(vpc_tier)
|
|
|
|
public_ip_2 = self.acquire_PublicIPAddress(vpc_tier, vpc=vpc)
|
|
self.create_StaticNatRule_For_VM(vpc_vm_3,
|
|
public_ip_2,
|
|
vpc_tier)
|
|
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm4"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm4"
|
|
vpc_vm_4 = self.create_VM(vpc_tier)
|
|
self.verify_vsd_floating_ip(vpc_tier, vpc_vm_3,
|
|
public_ip_2.ipaddress, vpc=vpc)
|
|
self.verify_vsd_vm(vpc_vm_3)
|
|
self.verify_vsd_vm(vpc_vm_4)
|
|
self.test_data["virtual_machine"]["displayname"] = None
|
|
self.test_data["virtual_machine"]["name"] = None
|
|
|
|
vm_public_ip_2 = public_ip_2.ipaddress.ipaddress
|
|
try:
|
|
vpc_vm_3.ssh_ip = vm_public_ip_2
|
|
vpc_vm_3.ssh_port = \
|
|
self.test_data["virtual_machine"]["ssh_port"]
|
|
vpc_vm_3.username = \
|
|
self.test_data["virtual_machine"]["username"]
|
|
vpc_vm_3.password = \
|
|
self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vpc_vm_3.ssh_ip, vpc_vm_3.password))
|
|
|
|
ssh2 = vpc_vm_3.get_ssh_client(ipaddress=vm_public_ip_2)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
self.verify_pingtovmipaddress(ssh2, vpc_vm_1.ipaddress)
|
|
self.verify_pingtovmhostname(ssh2, "vpcvm1")
|
|
|
|
self.verify_pingtovmipaddress(ssh2, vpc_vm_4.ipaddress)
|
|
self.verify_pingtovmhostname(ssh2, "vpcvm4")
|
|
|
|
self.verify_pingtovmipaddress(ssh2, vpc_vm_2.ipaddress)
|
|
self.verify_pingtovmhostname(ssh2, "vpcvm2")
|
|
|
|
self.debug("Updating the running vm_3 with new user data...")
|
|
expected_user_data2 = self.update_userdata(vpc_vm_3,
|
|
"hellonuage vm3")
|
|
self.debug("SSHing into the vm_3 for verifying its user data...")
|
|
user_data_cmd = self.get_userdata_url(vpc_vm_3)
|
|
self.debug("Getting user data with command: " + user_data_cmd)
|
|
actual_user_data2 = self.execute_cmd(ssh2, user_data_cmd)
|
|
self.debug("Actual user data - " + actual_user_data2 +
|
|
", Expected user data - " + expected_user_data2)
|
|
self.assertEqual(actual_user_data2, expected_user_data2,
|
|
"Un-expected VM (VM_3) user data")
|
|
|
|
self.verify_pingtovmipaddress(ssh2, vpc_vm_12.ipaddress)
|
|
self.verify_pingtovmhostname(ssh2, "vpcvm12")
|
|
|
|
vpc_vm_3.delete(self.api_client, expunge=True)
|
|
vpc_vm_4.delete(self.api_client, expunge=True)
|
|
public_ip_2.delete(self.api_client)
|
|
|
|
# ReleaseIP as get_ssh_client fails when migrating back to native
|
|
public_ip_1.delete(self.api_client)
|
|
|
|
self.debug("++++++++Migrating network back to native+++++++")
|
|
network_offering_map = \
|
|
[{"networkid": vpc_tier.id,
|
|
"networkofferingid": native_tiernet_off.id},
|
|
{"networkid": vpc_2ndtier.id,
|
|
"networkofferingid": native_tiernet_off.id}]
|
|
|
|
self.migrate_vpc(vpc, native_vpc_off,
|
|
network_offering_map)
|
|
|
|
@attr(tags=["migrateACS", "vpcmultinic"],
|
|
required_hardware="false")
|
|
def test_12_migrate_native_vpc_multinic_to_nuage_traffic(self):
|
|
"""
|
|
Verify MultiNic migration of GuestVm in multiple networks
|
|
1. create one native vpc network offering
|
|
2. create one native vpc tier network offering
|
|
3. with Dhcp,SourceNat,StaticNat,Dns,Userdata and NetworkACL
|
|
4. create one vpc with above native vpc network offering
|
|
5. create one native vpc tier network in above vpc
|
|
6. create 2nd isolated network
|
|
7. deploy 2 vm's in both networks
|
|
8. move to nuage vpc tier networkoffering,
|
|
9. deploy vm3 in vpc tier network
|
|
10. enable staticnat on first vm and ssh into vm
|
|
11. login to vm3 and ping vm1 nic1
|
|
12. move isolated network to nuage networkoffering,
|
|
13. deploy vm4 in 2nd vpc tier network
|
|
14. enable staticnat on new vm4 and ssh into vm
|
|
15. login to vm4 and ping vm2 nic1
|
|
"""
|
|
cmd = updateZone.updateZoneCmd()
|
|
cmd.id = self.zone.id
|
|
cmd.domain = "vpc.com"
|
|
self.api_client.updateZone(cmd)
|
|
|
|
self.debug("Creating Native VSP VPC offering with Static NAT service "
|
|
"provider as VPCVR...")
|
|
native_vpc_off = self.create_VpcOffering(
|
|
self.test_data["vpc_offering_reduced"])
|
|
self.validate_VpcOffering(native_vpc_off, state="Enabled")
|
|
|
|
self.debug("Creating a VPC with Static NAT service provider as "
|
|
"VpcVirtualRouter")
|
|
vpc = self.create_Vpc(native_vpc_off, cidr='10.1.0.0/16')
|
|
self.validate_Vpc(vpc, state="Enabled")
|
|
|
|
self.debug("Creating native VPC Network Tier offering "
|
|
"with Static NAT service provider as VPCVR")
|
|
native_tiernet_off = self.create_NetworkOffering(
|
|
self.test_data["nw_offering_reduced_vpc"])
|
|
self.validate_NetworkOffering(native_tiernet_off, state="Enabled")
|
|
|
|
acl_list = self.create_NetworkAclList(
|
|
name="acl", description="acl", vpc=vpc)
|
|
|
|
acl_item = self.create_NetworkAclRule(
|
|
self.test_data["ingress_rule"], acl_list=acl_list)
|
|
self.create_NetworkAclRule(
|
|
self.test_data["icmprule"], acl_list=acl_list)
|
|
|
|
self.debug("Creating a VPC tier network with Static NAT service")
|
|
vpc_tier = self.create_Network(native_tiernet_off,
|
|
gateway='10.1.0.1',
|
|
vpc=vpc,
|
|
acl_list=acl_list)
|
|
self.validate_Network(vpc_tier, state="Implemented")
|
|
|
|
self.debug("Creating 2nd VPC tier network with Static NAT service")
|
|
vpc_2ndtier = self.create_Network(native_tiernet_off,
|
|
gateway='10.1.128.1',
|
|
vpc=vpc,
|
|
acl_list=acl_list)
|
|
self.validate_Network(vpc_2ndtier, state="Implemented")
|
|
|
|
vpc_vr = self.get_Router(vpc_tier)
|
|
self.check_Router_state(vpc_vr, state="Running")
|
|
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_staticnat_offering_persistent,
|
|
gateway="10.10.0.1",
|
|
netmask="255.255.255.0", account=self.account)
|
|
self.debug("Creating isolated network with Static NAT service")
|
|
|
|
self.debug("Deploying a multinic VM in both networks")
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm1"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm1"
|
|
vpc_vm_1 = self.create_VM([vpc_tier, isolated_network])
|
|
self.check_VM_state(vpc_vm_1, state="Running")
|
|
|
|
self.debug("Deploying another VM in both networks other defaultnic")
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm2"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm2"
|
|
vpc_vm_2 = self.create_VM([isolated_network, vpc_tier])
|
|
self.check_VM_state(vpc_vm_2, state="Running")
|
|
self.test_data["virtual_machine"]["displayname"] = None
|
|
self.test_data["virtual_machine"]["name"] = None
|
|
network_offering_map_fault = \
|
|
[{"networkid": vpc_tier.id,
|
|
"networkofferingid": self.nuage_vpc_network_offering.id}]
|
|
|
|
try:
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map_fault, resume=False)
|
|
except Exception as e:
|
|
errortext = re.search(".*errortext\s*:\s*u?'([^']+)'.*",
|
|
e.message).group(1)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to migrate VPC as the specified " \
|
|
"tierNetworkOfferings is not complete"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
try:
|
|
self.migrate_network(self.nuage_isolated_network_offering,
|
|
vpc_tier, resume=False)
|
|
except Exception as e:
|
|
errortext = re.search(".*errortext\s*:\s*u?'([^']+)'.*",
|
|
e.message).group(1)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to migrate network as the specified " \
|
|
"network is a vpc tier. Use migrateVpc."
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
network_offering_map_fault2 = \
|
|
[{"networkid": vpc_tier.id,
|
|
"networkofferingid": self.nuage_vpc_network_offering.id},
|
|
{"networkid": vpc_2ndtier.id,
|
|
"networkofferingid": self.nuage_isolated_network_offering.id}]
|
|
|
|
try:
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map_fault2, resume=True)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "can't be used for VPC networks for network"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
network_offering_map = \
|
|
[{"networkid": vpc_tier.id,
|
|
"networkofferingid": self.nuage_vpc_network_offering.id},
|
|
{"networkid": vpc_2ndtier.id,
|
|
"networkofferingid": self.nuage_vpc_network_offering.id}]
|
|
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map, resume=True)
|
|
|
|
self.debug("Deploying another VM in the created VPC tier network")
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm3"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm3"
|
|
vpc_vm_3 = self.create_VM(vpc_tier)
|
|
self.check_VM_state(vpc_vm_3, state="Running")
|
|
self.test_data["virtual_machine"]["displayname"] = None
|
|
self.test_data["virtual_machine"]["name"] = None
|
|
self.debug("Creating Static NAT rule for the deployed VM "
|
|
"in the created VPC network...")
|
|
public_ip_1 = self.acquire_PublicIPAddress(vpc_tier, vpc=vpc)
|
|
self.validate_PublicIPAddress(public_ip_1, vpc_tier)
|
|
self.create_StaticNatRule_For_VM(vpc_vm_3, public_ip_1, vpc_tier)
|
|
self.validate_PublicIPAddress(
|
|
public_ip_1, vpc_tier, static_nat=True, vm=vpc_vm_3)
|
|
|
|
# VSD verification after VPC migration functionality
|
|
self.verify_vsd_network(self.domain.id, vpc_tier, vpc)
|
|
self.verify_vsd_vm(vpc_vm_3)
|
|
self.verify_vsd_floating_ip(
|
|
vpc_tier, vpc_vm_3, public_ip_1.ipaddress, vpc=vpc)
|
|
self.verify_vsd_firewall_rule(acl_item)
|
|
# self.verify_vsd_vm(vpc_vm_1)
|
|
|
|
vm_public_ip_1 = public_ip_1.ipaddress.ipaddress
|
|
try:
|
|
vpc_vm_3.ssh_ip = vm_public_ip_1
|
|
vpc_vm_3.ssh_port = \
|
|
self.test_data["virtual_machine"]["ssh_port"]
|
|
vpc_vm_3.username = \
|
|
self.test_data["virtual_machine"]["username"]
|
|
vpc_vm_3.password = \
|
|
self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vpc_vm_3.ssh_ip, vpc_vm_1.password))
|
|
|
|
ssh = vpc_vm_3.get_ssh_client(ipaddress=vm_public_ip_1)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
defaultipaddress = \
|
|
[nic.ipaddress for nic in vpc_vm_1.nic if nic.isdefault][0]
|
|
|
|
self.verify_pingtovmipaddress(ssh, defaultipaddress)
|
|
|
|
vpc_vm_3.delete(self.api_client, expunge=True)
|
|
public_ip_1.delete(self.api_client)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr,
|
|
isolated_network)
|
|
|
|
self.test_data["virtual_machine"]["displayname"] = "vm4"
|
|
self.test_data["virtual_machine"]["name"] = "vm4"
|
|
vm_4 = self.create_VM(isolated_network)
|
|
self.test_data["virtual_machine"]["displayname"] = None
|
|
self.test_data["virtual_machine"]["name"] = None
|
|
self.debug("Creating Static NAT rule for the deployed VM "
|
|
"in the created VPC network...")
|
|
public_ip_2 = self.acquire_PublicIPAddress(isolated_network)
|
|
self.validate_PublicIPAddress(public_ip_1, isolated_network)
|
|
self.create_StaticNatRule_For_VM(vm_4, public_ip_2, isolated_network)
|
|
self.validate_PublicIPAddress(
|
|
public_ip_2, isolated_network, static_nat=True, vm=vm_4)
|
|
firewall_rule_2 = self.create_FirewallRule(public_ip_2)
|
|
self.verify_vsd_network(self.domain.id, isolated_network)
|
|
self.verify_vsd_floating_ip(isolated_network, vm_4,
|
|
public_ip_2.ipaddress)
|
|
self.verify_vsd_vm(vm_4)
|
|
self.verify_vsd_firewall_rule(firewall_rule_2)
|
|
# self.verify_vsd_vm(vpc_vm_2)
|
|
|
|
vm_public_ip_2 = public_ip_2.ipaddress.ipaddress
|
|
try:
|
|
vm_4.ssh_ip = vm_public_ip_2
|
|
vm_4.ssh_port = self.test_data["virtual_machine"]["ssh_port"]
|
|
vm_4.username = self.test_data["virtual_machine"]["username"]
|
|
vm_4.password = self.test_data["virtual_machine"]["password"]
|
|
self.debug("SSHing into VM: %s with %s" %
|
|
(vm_4.ssh_ip, vm_4.password))
|
|
|
|
ssh2 = vm_4.get_ssh_client(ipaddress=vm_public_ip_2)
|
|
|
|
except Exception as e:
|
|
self.fail("SSH into VM failed with exception %s" % e)
|
|
|
|
defaultipaddress2 = \
|
|
[nic.ipaddress for nic in vpc_vm_2.nic if nic.isdefault][0]
|
|
|
|
self.verify_pingtovmipaddress(ssh2, defaultipaddress2)
|
|
|
|
@attr(tags=["migrateACS", "guestvmip2"],
|
|
required_hardware="false")
|
|
def test_13_verify_guestvmip2_when_migrating_to_nuage(self):
|
|
"""
|
|
Verify migration of GuestVm with ip .2 still works
|
|
when migrating isolated or vpc tier networks
|
|
"""
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_offering,
|
|
gateway="10.13.0.1",
|
|
netmask="255.255.255.248", account=self.account)
|
|
|
|
self.test_data["virtual_machine"]["ipaddress"] = "10.13.0.2"
|
|
vm_11 = self.create_VM(isolated_network)
|
|
self.test_data["virtual_machine"]["ipaddress"] = "10.13.0.3"
|
|
vm_12 = self.create_VM(isolated_network)
|
|
self.test_data["virtual_machine"]["ipaddress"] = "10.13.0.4"
|
|
vm_13 = self.create_VM(isolated_network)
|
|
self.test_data["virtual_machine"]["ipaddress"] = "10.13.0.5"
|
|
vm_14 = self.create_VM(isolated_network)
|
|
self.test_data["virtual_machine"]["ipaddress"] = None
|
|
vm_15 = self.create_VM(isolated_network)
|
|
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_persistent,
|
|
isolated_network, resume=False)
|
|
except Exception as e:
|
|
errortext = re.search(".*errortext\s*:\s*u?'([^']+)'.*",
|
|
e.message).group(1)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to implement network (with specified id) " \
|
|
"elements and resources as a part of network update"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr,
|
|
isolated_network, resume=False)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to migrate network as previous migration " \
|
|
"left this network in transient condition. " \
|
|
"Specify resume as true."
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr,
|
|
isolated_network, resume=True)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to resume migrating network as network offering " \
|
|
"does not match previously specified network offering"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
vm_13.delete(self.api_client, expunge=True)
|
|
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_without_vr,
|
|
isolated_network, resume=True)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to resume migrating network as network offering " \
|
|
"does not match previously specified network offering"
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
try:
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_persistent,
|
|
isolated_network, resume=False)
|
|
except Exception as e:
|
|
errortext = \
|
|
re.search(".*errortext\s*:\s*u?(['\"])([^\\1]+)\\1.*",
|
|
e.message).group(2)
|
|
self.debug("Migration fails with %s" % errortext)
|
|
|
|
expectstr = "Failed to migrate network as previous migration " \
|
|
"left this network in transient condition. " \
|
|
"Specify resume as true."
|
|
self.verifymigrationerrortext(errortext, expectstr)
|
|
|
|
self.migrate_network(
|
|
self.nuage_isolated_network_offering_persistent,
|
|
isolated_network, resume=True)
|
|
|
|
self.verify_vsd_network(self.domain.id, isolated_network, None)
|
|
self.verify_vsd_vm(vm_11)
|
|
self.verify_vsd_vm(vm_12)
|
|
self.verify_vsd_vm(vm_14)
|
|
self.verify_vsd_vm(vm_15)
|
|
|
|
cmd = updateZone.updateZoneCmd()
|
|
cmd.id = self.zone.id
|
|
cmd.domain = "vpc.com"
|
|
self.api_client.updateZone(cmd)
|
|
|
|
self.debug("Creating Native VSP VPC offering with Static NAT service "
|
|
"provider as VPCVR...")
|
|
native_vpc_off = self.create_VpcOffering(
|
|
self.test_data["vpc_offering_reduced"])
|
|
self.validate_VpcOffering(native_vpc_off, state="Enabled")
|
|
|
|
self.debug("Creating a VPC with Static NAT service provider as "
|
|
"VpcVirtualRouter")
|
|
vpc = self.create_Vpc(native_vpc_off, cidr='10.1.0.0/16')
|
|
self.validate_Vpc(vpc, state="Enabled")
|
|
|
|
self.debug("Creating native VPC Network Tier offering "
|
|
"with Static NAT service provider as VPCVR")
|
|
native_tiernet_off = self.create_NetworkOffering(
|
|
self.test_data["nw_offering_reduced_vpc"])
|
|
self.validate_NetworkOffering(native_tiernet_off, state="Enabled")
|
|
|
|
acl_list = self.create_NetworkAclList(
|
|
name="acl", description="acl", vpc=vpc)
|
|
|
|
self.create_NetworkAclRule(
|
|
self.test_data["ingress_rule"], acl_list=acl_list)
|
|
self.create_NetworkAclRule(
|
|
self.test_data["icmprule"], acl_list=acl_list)
|
|
|
|
self.debug("Creating a VPC tier network with Static NAT service")
|
|
vpc_tier = self.create_Network(native_tiernet_off,
|
|
gateway='10.1.1.1',
|
|
vpc=vpc,
|
|
acl_list=acl_list)
|
|
self.validate_Network(vpc_tier, state="Implemented")
|
|
|
|
vpc_vr = self.get_Router(vpc_tier)
|
|
self.check_Router_state(vpc_vr, state="Running")
|
|
|
|
self.debug("Deploying a VM in a vpc tier network")
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm1"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm1"
|
|
self.test_data["virtual_machine"]["ipaddress"] = "10.1.1.2"
|
|
vpc_vm_1 = self.create_VM(vpc_tier)
|
|
self.test_data["virtual_machine"]["ipaddress"] = None
|
|
self.check_VM_state(vpc_vm_1, state="Running")
|
|
|
|
self.debug("Deploying another VM in vpc tier")
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm2"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm2"
|
|
vpc_vm_2 = self.create_VM(vpc_tier)
|
|
self.check_VM_state(vpc_vm_2, state="Running")
|
|
|
|
network_offering_map = \
|
|
[{"networkid": vpc_tier.id,
|
|
"networkofferingid": self.nuage_vpc_network_offering.id}]
|
|
|
|
self.migrate_vpc(vpc, self.nuage_vpc_offering,
|
|
network_offering_map, resume=False)
|
|
|
|
self.verify_vsd_network(self.domain.id, vpc_tier, vpc)
|
|
self.verify_vsd_vm(vpc_vm_1)
|
|
self.verify_vsd_vm(vpc_vm_2)
|
|
|
|
@attr(tags=["migrateACS", "nativeisoonly"],
|
|
required_hardware="false")
|
|
def test_14_native_to_native_network_migration(self):
|
|
"""
|
|
Verify Migration for an isolated network nativeOnly
|
|
1. create native non-persistent isolated network
|
|
2. migrate to native persistent isolated network, check VR state
|
|
3. migrate back to native non-persistent network
|
|
4. deploy VM in non-persistent isolated network
|
|
5. acquire ip and enable staticnat
|
|
6. migrate to native persistent isolated network
|
|
7. migrate back to native non-persistent network
|
|
"""
|
|
isolated_network = self.create_Network(
|
|
self.native_isolated_network_offering, gateway="10.0.0.1",
|
|
netmask="255.255.255.0")
|
|
|
|
self.migrate_network(
|
|
self.native_isolated_network_offering_persistent,
|
|
isolated_network, resume=False)
|
|
|
|
vr = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr, "Running")
|
|
|
|
self.migrate_network(
|
|
self.native_isolated_network_offering,
|
|
isolated_network, resume=False)
|
|
|
|
vm_1 = self.create_VM(isolated_network)
|
|
vr = self.get_Router(isolated_network)
|
|
self.check_Router_state(vr, "Running")
|
|
public_ip = self.acquire_PublicIPAddress(isolated_network)
|
|
self.create_StaticNatRule_For_VM(vm_1, public_ip, isolated_network)
|
|
self.create_FirewallRule(public_ip)
|
|
|
|
self.migrate_network(
|
|
self.native_isolated_network_offering_persistent,
|
|
isolated_network, resume=False)
|
|
|
|
self.migrate_network(
|
|
self.native_isolated_network_offering,
|
|
isolated_network, resume=False)
|
|
|
|
@attr(tags=["migrateACS", "nativevpconly"],
|
|
required_hardware="false")
|
|
def test_15_native_to_native_vpc_migration(self):
|
|
"""
|
|
Verify Migration for a vpc network nativeOnly
|
|
1. create native vpc with 2 tier networks
|
|
2. migrate to native vpc, check VR state
|
|
3. deploy VM in vpc tier network
|
|
4. acquire ip and enable staticnat
|
|
5. migrate to native vpc network
|
|
"""
|
|
|
|
cmd = updateZone.updateZoneCmd()
|
|
cmd.id = self.zone.id
|
|
cmd.domain = "vpc.com"
|
|
self.api_client.updateZone(cmd)
|
|
|
|
self.debug("Creating Native VSP VPC offering with Static NAT service "
|
|
"provider as VPCVR...")
|
|
native_vpc_off = self.create_VpcOffering(
|
|
self.test_data["vpc_offering_reduced"])
|
|
self.validate_VpcOffering(native_vpc_off, state="Enabled")
|
|
|
|
self.debug("Creating a VPC with Static NAT service provider as "
|
|
"VpcVirtualRouter")
|
|
vpc = self.create_Vpc(native_vpc_off, cidr='10.1.0.0/16')
|
|
self.validate_Vpc(vpc, state="Enabled")
|
|
|
|
self.debug("Creating native VPC Network Tier offering "
|
|
"with Static NAT service provider as VPCVR")
|
|
native_tiernet_off = self.create_NetworkOffering(
|
|
self.test_data["nw_offering_reduced_vpc"])
|
|
self.validate_NetworkOffering(native_tiernet_off, state="Enabled")
|
|
|
|
acl_list = self.create_NetworkAclList(
|
|
name="acl", description="acl", vpc=vpc)
|
|
|
|
self.create_NetworkAclRule(
|
|
self.test_data["ingress_rule"], acl_list=acl_list)
|
|
self.create_NetworkAclRule(
|
|
self.test_data["icmprule"], acl_list=acl_list)
|
|
|
|
self.debug("Creating a VPC tier network with Static NAT service")
|
|
vpc_tier = self.create_Network(native_tiernet_off,
|
|
gateway='10.1.0.1',
|
|
vpc=vpc,
|
|
acl_list=acl_list)
|
|
self.validate_Network(vpc_tier, state="Implemented")
|
|
|
|
self.debug("Creating 2nd VPC tier network with Static NAT service")
|
|
vpc_2ndtier = self.create_Network(native_tiernet_off,
|
|
gateway='10.1.128.1',
|
|
vpc=vpc,
|
|
acl_list=acl_list)
|
|
self.validate_Network(vpc_2ndtier, state="Implemented")
|
|
|
|
vpc_vr = self.get_Router(vpc_tier)
|
|
self.check_Router_state(vpc_vr, state="Running")
|
|
|
|
network_offering_map = \
|
|
[{"networkid": vpc_tier.id,
|
|
"networkofferingid": self.native_vpc_network_offering.id},
|
|
{"networkid": vpc_2ndtier.id,
|
|
"networkofferingid": self.native_vpc_network_offering.id}]
|
|
|
|
self.migrate_vpc(vpc, self.native_vpc_offering,
|
|
network_offering_map, resume=False)
|
|
|
|
self.debug("Deploying a VM in the created VPC tier network")
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm1"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm1"
|
|
vpc_vm_1 = self.create_VM(vpc_tier)
|
|
self.check_VM_state(vpc_vm_1, state="Running")
|
|
|
|
self.debug("Deploying another VM in the created VPC tier network")
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm2"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm2"
|
|
vpc_vm_2 = self.create_VM(vpc_tier)
|
|
self.check_VM_state(vpc_vm_2, state="Running")
|
|
|
|
self.debug("Deploying a VM in the 2nd VPC tier network")
|
|
self.test_data["virtual_machine"]["displayname"] = "vpcvm12"
|
|
self.test_data["virtual_machine"]["name"] = "vpcvm12"
|
|
self.create_VM(vpc_2ndtier)
|
|
self.check_VM_state(vpc_vm_2, state="Running")
|
|
self.test_data["virtual_machine"]["displayname"] = None
|
|
self.test_data["virtual_machine"]["name"] = None
|
|
|
|
self.debug("Creating Static NAT rule for the deployed VM "
|
|
"in the created VPC network...")
|
|
public_ip_1 = self.acquire_PublicIPAddress(vpc_tier, vpc=vpc)
|
|
self.validate_PublicIPAddress(public_ip_1, vpc_tier)
|
|
self.create_StaticNatRule_For_VM(vpc_vm_1, public_ip_1, vpc_tier)
|
|
self.validate_PublicIPAddress(
|
|
public_ip_1, vpc_tier, static_nat=True, vm=vpc_vm_1)
|
|
|
|
network_offering_map = \
|
|
[{"networkid": vpc_tier.id,
|
|
"networkofferingid": self.native_vpc_network_offering.id},
|
|
{"networkid": vpc_2ndtier.id,
|
|
"networkofferingid": self.native_vpc_network_offering.id}]
|
|
self.migrate_vpc(vpc, self.native_vpc_offering,
|
|
network_offering_map, resume=False)
|