mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	Co-authored-by: rtodirica <rtodirica@ena.com> Co-authored-by: Huy Le <huylm@unitech.vn> Co-authored-by: radu-todirica <Radu.Todirica@ness.com> Co-authored-by: Huy Le <minh.le@ext.ewerk.com> Co-authored-by: Simon Weller <siweller77@gmail.com> Co-authored-by: dahn <daan@onecht.net>
		
			
				
	
	
		
			1411 lines
		
	
	
		
			50 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			1411 lines
		
	
	
		
			50 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.
 | |
| 
 | |
| import logging
 | |
| import time
 | |
| import requests
 | |
| 
 | |
| from nose.plugins.attrib import attr
 | |
| 
 | |
| from marvin.cloudstackTestCase import cloudstackTestCase
 | |
| from marvin.lib.base import (Network, NetworkOffering, Account, VirtualMachine, ServiceOffering,
 | |
|                              NATRule, PublicIPAddress, EgressFireWallRule, Host,
 | |
|                              FireWallRule, LoadBalancerRule, LogicalRouter, ApplicationPolicySet,
 | |
|                              FirewallPolicy, FirewallRule, TungstenTag, ServiceGroup,
 | |
|                              NetworkPolicy, PolicyRule)
 | |
| from marvin.cloudstackAPI import migrateVirtualMachine
 | |
| from marvin.lib.utils import (is_server_ssh_ready, get_host_credentials, execute_command_in_host)
 | |
| from marvin.lib.common import get_zone, get_template
 | |
| from marvin.lib.decoratorGenerators import skipTestIf
 | |
| from .common import is_object_created, is_object_deleted, get_list_system_vm, cleanup_resources, not_tungsten_fabric_zone
 | |
| 
 | |
| class Services:
 | |
|     """Test Tungsten Plugin
 | |
|     """
 | |
| 
 | |
|     def __init__(self):
 | |
|         self.services = {
 | |
|             "network_offering": {
 | |
|                 "name": "TungstenNetworkOffering",
 | |
|                 "displaytext": "TungstenNetworkOffering",
 | |
|                 "guestiptype": "Isolated",
 | |
|                 "traffictype": "GUEST",
 | |
|                 "supportedservices": [
 | |
|                     "Dhcp",
 | |
|                     "Dns",
 | |
|                     "Lb",
 | |
|                     "UserData",
 | |
|                     "SourceNat",
 | |
|                     "StaticNat",
 | |
|                     "PortForwarding",
 | |
|                     "Connectivity",
 | |
|                     "Firewall"
 | |
|                 ],
 | |
|                 "serviceProviderList": {
 | |
|                     "Dhcp": "Tungsten",
 | |
|                     "Dns": "Tungsten",
 | |
|                     "Lb": "Tungsten",
 | |
|                     "UserData": "ConfigDrive",
 | |
|                     "SourceNat": "Tungsten",
 | |
|                     "StaticNat": "Tungsten",
 | |
|                     "PortForwarding": "Tungsten",
 | |
|                     "Connectivity": "Tungsten",
 | |
|                     "Firewall": "Tungsten"
 | |
|                 },
 | |
|                 "useTungsten": "on"
 | |
|             },
 | |
|             "networks": {
 | |
|                 "network1": {
 | |
|                     "name": "TF-Network1",
 | |
|                     "displaytext": "TF-Network1",
 | |
|                     "gateway": "10.1.1.1",
 | |
|                     "netmask": "255.255.255.0",
 | |
|                     "startip": "10.1.1.100",
 | |
|                     "endip": "10.1.1.200"
 | |
|                 },
 | |
|                 "network2": {
 | |
|                     "name": "TF-Network2",
 | |
|                     "displaytext": "TF-Network2",
 | |
|                     "gateway": "10.1.2.1",
 | |
|                     "netmask": "255.255.255.0",
 | |
|                     "startip": "10.1.2.100",
 | |
|                     "endip": "10.1.2.200"
 | |
|                 }
 | |
|             },
 | |
|             "ostype": "112",
 | |
|             "account": {
 | |
|                 "email": "test@test.com",
 | |
|                 "firstname": "Test",
 | |
|                 "lastname": "User",
 | |
|                 "username": "test",
 | |
|                 "password": "password",
 | |
|             },
 | |
|             "virtual_machines": {
 | |
|                 "vm1": {
 | |
|                     "name": "vm1",
 | |
|                     "displayname": "vm1",
 | |
|                     "username": "root",
 | |
|                     "password": "password",
 | |
|                     "ssh_port": 22,
 | |
|                     "hypervisor": 'KVM',
 | |
|                     "privateport": 22,
 | |
|                     "publicport": 22,
 | |
|                     "protocol": 'TCP'
 | |
| 
 | |
|                 },
 | |
|                 "vm2": {
 | |
|                     "name": "vm2",
 | |
|                     "displayname": "vm2",
 | |
|                     "username": "root",
 | |
|                     "password": "password",
 | |
|                     "ssh_port": 22,
 | |
|                     "hypervisor": 'KVM',
 | |
|                     "privateport": 22,
 | |
|                     "publicport": 22,
 | |
|                     "protocol": 'TCP'
 | |
|                 },
 | |
|                 "vm3": {
 | |
|                     "name": "vm3",
 | |
|                     "displayname": "vm3",
 | |
|                     "username": "root",
 | |
|                     "password": "password",
 | |
|                     "ssh_port": 22,
 | |
|                     "hypervisor": 'KVM',
 | |
|                     "privateport": 22,
 | |
|                     "publicport": 22,
 | |
|                     "protocol": 'TCP'
 | |
|                 }
 | |
|             },
 | |
|             "fw_rule": {
 | |
|                 "startport": 80,
 | |
|                 "endport": 80,
 | |
|                 "cidr": '0.0.0.0/0',
 | |
|                 "protocol": "TCP"
 | |
|             },
 | |
|             "nat_rule": {
 | |
|                 "privateport": 80,
 | |
|                 "publicport": 80,
 | |
|                 "protocol": 'TCP'
 | |
|             },
 | |
|             "lbrule": {
 | |
|                 "name": "SSH",
 | |
|                 "alg": "roundrobin",
 | |
|                 "privateport": 80,
 | |
|                 "publicport": 80,
 | |
|                 "protocol": 'TCP'
 | |
|             },
 | |
|             "logicalrouter": {
 | |
|                 "name": "TFLogicalRouter"
 | |
|             },
 | |
|             "applicationpolicysets": {
 | |
|                 "aps1": {
 | |
|                     "name": "aps1"
 | |
|                 }
 | |
|             },
 | |
|             "firewallpolicys": {
 | |
|                 "frontend": {
 | |
|                     "name": "frontend"
 | |
|                 },
 | |
|                 "internet": {
 | |
|                     "name": "internet"
 | |
|                 },
 | |
|                 "host": {
 | |
|                     "name": "host"
 | |
|                 }
 | |
|             },
 | |
|             "firewallrules": {
 | |
|                 "frontend": {
 | |
|                     "name": "frontend",
 | |
|                     "action": "pass",
 | |
|                     "direction": "oneway"
 | |
|                 },
 | |
|                 "internet": {
 | |
|                     "name": "internet",
 | |
|                     "action": "pass",
 | |
|                     "direction": "oneway"
 | |
|                 },
 | |
|                 "host": {
 | |
|                     "name": "host",
 | |
|                     "action": "pass",
 | |
|                     "direction": "oneway"
 | |
|                 }
 | |
|             },
 | |
|             "servicegroups": {
 | |
|                 "any": {
 | |
|                     "name": "any",
 | |
|                     "protocol": "any",
 | |
|                     "startport": -1,
 | |
|                     "endport": -1
 | |
|                 }
 | |
|             },
 | |
|             "network_policy": {
 | |
|                 "policy1": {
 | |
|                     "name": "policy1",
 | |
|                     "rules": {
 | |
|                         "rule1": {
 | |
|                             "action": "pass",
 | |
|                             "direction": "twoway",
 | |
|                             "protocol": "icmp",
 | |
|                             "srcnetwork": "any",
 | |
|                             "srcipprefix": "0.0.0.0",
 | |
|                             "srcipprefixlend": 0,
 | |
|                             "srcstartport": -1,
 | |
|                             "srcendport": -1,
 | |
|                             "destnetwork": "any",
 | |
|                             "destipprefix": "0.0.0.0",
 | |
|                             "destipprefixlen": 0,
 | |
|                             "deststartport": -1,
 | |
|                             "destendport": -1
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             },
 | |
|             "network_route_table": {
 | |
|                 "route_table_1": {
 | |
|                     "name": "Network Route Table 1",
 | |
|                     "prefix": "10.1.2.0/24",
 | |
|                     "nexthoptype": "ip-address",
 | |
|                     "communities": ""
 | |
|                 },
 | |
|                 "route_table_2": {
 | |
|                     "name": "Network Route Table 2",
 | |
|                     "prefix": "10.1.1.0/24",
 | |
|                     "nexthoptype": "ip-address",
 | |
|                     "communities": ""
 | |
|                 }
 | |
|             },
 | |
|             "interface_route_table": {
 | |
|                 "route_table_1": {
 | |
|                     "name": "Interface Route Table 1",
 | |
|                     "prefix": "10.1.2.0/24",
 | |
|                     "communities": ""
 | |
|                 },
 | |
|                 "route_table_2": {
 | |
|                     "name": "Interface Route Table 2",
 | |
|                     "prefix": "10.1.1.0/24",
 | |
|                     "communities": ""
 | |
|                 }
 | |
|             },
 | |
|             "routing_policy": {
 | |
|                 "routing_policy_1": {
 | |
|                     "name": "Routing Policy 1",
 | |
|                     "matchall": "true",
 | |
|                     "protocollist": [""],
 | |
|                     "prefixlist": [
 | |
|                         "10.1.2.0/24&exact"
 | |
|                     ],
 | |
|                     "termlist": [
 | |
|                         "reject&action& "
 | |
|                     ],
 | |
|                     "communities": [""]
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 
 | |
| class TestIsolatedZone(cloudstackTestCase):
 | |
|     @classmethod
 | |
|     def setUpClass(cls):
 | |
|         cls.apiclient = cls.clstestclient.getApiClient()
 | |
|         cls.dbclient = cls.clstestclient.getDbConnection()
 | |
|         cls.services = Services().services
 | |
|         cls.testdata = cls.clstestclient.getParsedTestDataConfig()
 | |
|         cls.zone = get_zone(cls.apiclient, cls.clstestclient.getZoneForTests())
 | |
|         cls.hypervisor = cls.clstestclient.getHypervisorInfo()
 | |
|         cls.tfgw = cls.getClsConfig()["zones"][0]["tungstenprovider"]["gateway"]
 | |
|         cls.config = cls.getClsConfig()
 | |
|         cls.template = get_template(cls.apiclient, cls.zone.id)
 | |
|         cls.hosts = Host.list(cls.apiclient, zoneid=cls.zone.id, type="routing")
 | |
|         for host in cls.hosts:
 | |
|             Host.reconnect(cls.apiclient, id=host.id)
 | |
|         cls.not_tungsten_fabric_zone = not_tungsten_fabric_zone(cls.apiclient, cls.zone.id)
 | |
|         cls.is_single_host = len(cls.hosts) < 2
 | |
|         cls.can_not_migrate = cls.not_tungsten_fabric_zone or cls.is_single_host
 | |
|         cls._cleanup = []
 | |
| 
 | |
|         cls.logger = logging.getLogger("TestIsolatedZone")
 | |
|         cls.stream_handler = logging.StreamHandler()
 | |
|         cls.logger.setLevel(logging.DEBUG)
 | |
|         cls.logger.addHandler(cls.stream_handler)
 | |
| 
 | |
|     @classmethod
 | |
|     def tearDownClass(self):
 | |
|         try:
 | |
|             cleanup_resources(self.apiclient, self.zone.id, self._cleanup)
 | |
|         except Exception as e:
 | |
|             raise Exception("Warning: Exception during cleanup : %s" % e)
 | |
|         return
 | |
| 
 | |
|     def setUp(self):
 | |
|         self.account = Account.create(self.apiclient, self.services["account"], admin=True)
 | |
|         self.service_offering = ServiceOffering.create(self.apiclient, self.testdata["service_offering"])
 | |
|         self.cleanup = [self.account, self.service_offering]
 | |
|         return
 | |
| 
 | |
|     def tearDown(self):
 | |
|         try:
 | |
|             cleanup_resources(self.apiclient, self.zone.id, reversed(self.cleanup))
 | |
|         except Exception as e:
 | |
|             raise Exception("Warning: Exception during cleanup : %s" % e)
 | |
|         return
 | |
| 
 | |
|     @skipTestIf("not_tungsten_fabric_zone")
 | |
|     @attr(tags=["tungstenfabric"], required_hardware="false")
 | |
|     def test_01_configuration(self):
 | |
|         # check if public network was created in tungsten fabric when deployed zone with setup/dev/advancedtf.cfg
 | |
|         list_public_network = Network.list(self.apiclient, zoneid=self.zone.id, issystem=True,
 | |
|                                            traffictype="Public")
 | |
|         self.assertEqual(is_object_created(self.apiclient, self.zone.id, "virtual-network",
 | |
|                                            list_public_network[0].id), True,
 | |
|                          "Check if public network was created in tungsten")
 | |
| 
 | |
|         # check if management network was created in tungsten fabric when deployed zone with setup/dev/advancedtf.cfg
 | |
|         list_management_network = Network.list(self.apiclient, zoneid=self.zone.id, issystem=True,
 | |
|                                                traffictype="Management")
 | |
|         self.assertEqual(is_object_created(self.apiclient, self.zone.id, "virtual-network",
 | |
|                                            list_management_network[0].id), True,
 | |
|                          "Check if management network was created in tungsten")
 | |
| 
 | |
|         # check if ssvm and proxyvm was created in tungsten fabric when deployed zone with setup/dev/advancedtf.cfg
 | |
|         list_system_vm = get_list_system_vm(self.apiclient, self.zone.id)
 | |
|         for system_vm in list_system_vm:
 | |
|             # check if system vm was created in tungsten fabric
 | |
|             self.assertEqual(
 | |
|                 is_object_created(self.apiclient, self.zone.id, "virtual-machine", system_vm.id),
 | |
|                 True, "Check if system vm was created in tungsten fabric")
 | |
| 
 | |
|         # check if tungsten fabric virtual gateway was created
 | |
|         username, password = get_host_credentials(self.config, self.tfgw)
 | |
|         ssh = is_server_ssh_ready(self.tfgw, 22, username, password)
 | |
|         vgw = ssh.execute("vif --list | grep vgw")
 | |
|         self.assertEqual(
 | |
|             str(vgw).count("vgw"), 1, "Check if vgw was created in host"
 | |
|         )
 | |
| 
 | |
|         return
 | |
| 
 | |
|     @skipTestIf("not_tungsten_fabric_zone")
 | |
|     @attr(tags=["tungstenfabric"], required_hardware="false")
 | |
|     def test_01_connectivity(self):
 | |
|         # test create network offering
 | |
|         network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"])
 | |
|         network_offering.update(self.apiclient, state='Enabled')
 | |
|         self.cleanup.append(network_offering)
 | |
| 
 | |
|         # check if network offering was created
 | |
|         self.logger.info("network offering id is %s" % network_offering.id)
 | |
|         list_network_offering_response = NetworkOffering.list(self.apiclient,
 | |
|                                                               id=network_offering.id)
 | |
|         self.assertEqual(isinstance(list_network_offering_response, list), True,
 | |
|                          "Check for a valid list network response")
 | |
| 
 | |
|         # create network
 | |
|         network = Network.create(
 | |
|             self.apiclient,
 | |
|             self.services["networks"]["network1"],
 | |
|             networkofferingid=network_offering.id,
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid
 | |
|         )
 | |
| 
 | |
|         # check if network was created in cloudstack
 | |
|         self.logger.info("network id is %s" % network.id)
 | |
|         list_network_response = Network.list(self.apiclient, id=network.id, listall=True)
 | |
|         self.assertEqual(isinstance(list_network_response, list), True,
 | |
|                          "Check for a valid list network response")
 | |
| 
 | |
|         # create virtual machine 1
 | |
|         vm1 = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm1"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
| 
 | |
|         # create virtual machine 2
 | |
|         vm2 = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm2"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
| 
 | |
|         # check if vm 1 was created in cloudstack
 | |
|         self.logger.info("vm id is %s" % vm1.id)
 | |
|         list_vm_response = VirtualMachine.list(self.apiclient, id=vm1.id, listall=True)
 | |
|         self.assertEqual(isinstance(list_vm_response, list), True,
 | |
|                          "Check for a valid list vm response")
 | |
| 
 | |
|         # check if vm 2 was created in cloudstack
 | |
|         self.logger.info("vm id is %s" % vm2.id)
 | |
|         list_vm_response = VirtualMachine.list(self.apiclient, id=vm2.id, listall=True)
 | |
|         self.assertEqual(isinstance(list_vm_response, list), True,
 | |
|                          "Check for a valid list vm response")
 | |
| 
 | |
|         # wait for vm start
 | |
|         time.sleep(30)
 | |
| 
 | |
|         # tungsten fabric network was only created when network was implemented
 | |
|         # check if network was created in tungsten fabric
 | |
|         self.assertEqual(
 | |
|             is_object_created(self.apiclient, self.zone.id, "virtual-network", network.id), True,
 | |
|             "Check if network was created in tungsten")
 | |
| 
 | |
|         # check if vm 1 was created in tungsten fabric
 | |
|         self.assertEqual(is_object_created(self.apiclient, self.zone.id, "virtual-machine", vm1.id),
 | |
|                          True, "Check if vm1 was created in tungsten")
 | |
| 
 | |
|         # check if vm 2 was created in tungsten fabric
 | |
|         self.assertEqual(is_object_created(self.apiclient, self.zone.id, "virtual-machine", vm2.id),
 | |
|                          True, "Check if vm1 was created in tungsten")
 | |
| 
 | |
|         # check if nic 1 was created in tungsten fabric
 | |
|         self.assertEqual(
 | |
|             is_object_created(self.apiclient, self.zone.id, "virtual-machine-interface", vm1.nic[0].id),
 | |
|             True, "Check if nic 1 was created in tungsten")
 | |
| 
 | |
|         # check if nic 2 was created in tungsten fabric
 | |
|         self.assertEqual(
 | |
|             is_object_created(self.apiclient, self.zone.id, "virtual-machine-interface", vm2.nic[0].id),
 | |
|             True, "Check if nic 2 was created in tungsten")
 | |
| 
 | |
|         # check vm1 vif interface was created in host
 | |
|         host1 = Host.list(self.apiclient, id=vm1.hostid)
 | |
|         username, password = get_host_credentials(self.config, host1[0].ipaddress)
 | |
|         tap1 = "tap" + vm1.nic[0].macaddress.replace(":", "")
 | |
|         cmd1 = "vif --list | grep %s" % tap1
 | |
|         vif1 = execute_command_in_host(host1[0].ipaddress, 22, username, password, cmd1)
 | |
|         self.assertEqual(
 | |
|             str(vif1).count(tap1), 1, "Check if vm1 tap interface was created in host"
 | |
|         )
 | |
| 
 | |
|         # check vm2 vif interface was created in host
 | |
|         host2 = Host.list(self.apiclient, id=vm2.hostid)
 | |
|         username, password = get_host_credentials(self.config, host2[0].ipaddress)
 | |
|         tap2 = "tap" + vm2.nic[0].macaddress.replace(":", "")
 | |
|         cmd2 = "vif --list | grep %s" % tap2
 | |
|         vif2 = execute_command_in_host(host2[0].ipaddress, 22, username, password, cmd2)
 | |
|         self.assertEqual(
 | |
|             str(vif2).count(tap2), 1, "Check if vm2 tap interface was created in host"
 | |
|         )
 | |
| 
 | |
|         # ssh vm 1 and ping vm2
 | |
|         ssh1 = vm1.get_ssh_client()
 | |
|         res_1 = ssh1.execute("ping -c1 %s" % vm2.ipaddress)
 | |
| 
 | |
|         # ssh vm 2 and ping vm1
 | |
|         ssh2 = vm2.get_ssh_client()
 | |
|         res_2 = ssh2.execute("ping -c1 %s" % vm1.ipaddress)
 | |
| 
 | |
|         self.assertEqual(
 | |
|             str(res_1).count("1 received"),
 | |
|             1,
 | |
|             "Ping vm_2 from vm_1 should be successful"
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(
 | |
|             str(res_2).count("1 received"),
 | |
|             1,
 | |
|             "Ping vm_1 from vm_2 should be successful"
 | |
|         )
 | |
| 
 | |
|         # delete vm 1
 | |
|         try:
 | |
|             vm1.delete(self.apiclient, expunge=True)
 | |
|         except Exception as e:
 | |
|             raise Exception("Warning: Exception in expunging vms: %s" % e)
 | |
| 
 | |
|         # delete vm 2
 | |
|         try:
 | |
|             vm2.delete(self.apiclient, expunge=True)
 | |
|         except Exception as e:
 | |
|             raise Exception("Warning: Exception in expunging vms: %s" % e)
 | |
| 
 | |
|         # check if nic 1 was deleted in tungsten fabric
 | |
|         self.assertEqual(
 | |
|             is_object_deleted(self.apiclient, self.zone.id, "virtual-machine-interface", vm1.nic[0].id),
 | |
|             True, "Check if nic 1 was deleted in tungsten")
 | |
| 
 | |
|         # check if nic 2 was deleted in tungsten fabric
 | |
|         self.assertEqual(
 | |
|             is_object_deleted(self.apiclient, self.zone.id, "virtual-machine-interface", vm2.nic[0].id),
 | |
|             True, "Check if nic 2 was deleted in tungsten")
 | |
| 
 | |
|         # check if vm 1 was deleted in tungsten fabric
 | |
|         self.assertEqual(
 | |
|             is_object_deleted(self.apiclient, self.zone.id, "virtual-machine", vm1.id),
 | |
|             True, "Check if vm was deleted in tungsten")
 | |
| 
 | |
|         # check if vm 2 was deleted in tungsten fabric
 | |
|         self.assertEqual(
 | |
|             is_object_deleted(self.apiclient, self.zone.id, "virtual-machine", vm2.id),
 | |
|             True, "Check if vm was deleted in tungsten")
 | |
| 
 | |
|         network.delete(self.apiclient)
 | |
| 
 | |
|         # check if network was deleted in tungsten fabric
 | |
|         self.assertEqual(
 | |
|             is_object_deleted(self.apiclient, self.zone.id, "virtual-network", network.id),
 | |
|             True, "Check if network was deleted in tungsten")
 | |
| 
 | |
|         return
 | |
| 
 | |
|     @skipTestIf("not_tungsten_fabric_zone")
 | |
|     @attr(tags=["tungstenfabric"], required_hardware="false")
 | |
|     def test_01_sourcenat(self):
 | |
|         # create network offering
 | |
|         network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"])
 | |
|         network_offering.update(self.apiclient, state='Enabled')
 | |
|         self.cleanup.append(network_offering)
 | |
| 
 | |
|         # create network
 | |
|         network = Network.create(
 | |
|             self.apiclient,
 | |
|             self.services["networks"]["network1"],
 | |
|             networkofferingid=network_offering.id,
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid
 | |
|         )
 | |
|         self.cleanup.append(network)
 | |
| 
 | |
|         # create virtual machine
 | |
|         vm = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm1"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
|         self.cleanup.append(vm)
 | |
| 
 | |
|         # open firewall rule
 | |
|         EgressFireWallRule.create(
 | |
|             apiclient=self.apiclient,
 | |
|             networkid=network.id,
 | |
|             protocol='All',
 | |
|             cidrlist='0.0.0.0/0'
 | |
|         )
 | |
| 
 | |
|         # wait for vm start
 | |
|         # time.sleep(30)
 | |
| 
 | |
|         # ssh vm, ping google.com and verified response package
 | |
|         ssh = vm.get_ssh_client()
 | |
|         res = ssh.execute("ping -c1 google.com")
 | |
|         self.assertEqual(
 | |
|             str(res).count("1 received"),
 | |
|             1,
 | |
|             "Ping google.com from vm should be successful"
 | |
|         )
 | |
| 
 | |
|         return
 | |
| 
 | |
|     @skipTestIf("not_tungsten_fabric_zone")
 | |
|     @attr(tags=["tungstenfabric"], required_hardware="false")
 | |
|     def test_01_staticnat(self):
 | |
|         # create network offering
 | |
|         network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"])
 | |
|         network_offering.update(self.apiclient, state='Enabled')
 | |
|         self.cleanup.append(network_offering)
 | |
| 
 | |
|         # create network
 | |
|         network = Network.create(
 | |
|             self.apiclient,
 | |
|             self.services["networks"]["network1"],
 | |
|             networkofferingid=network_offering.id,
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid
 | |
|         )
 | |
|         self.cleanup.append(network)
 | |
| 
 | |
|         # create virtual machine
 | |
|         vm = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm1"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
|         self.cleanup.append(vm)
 | |
| 
 | |
|         # wait for vm start
 | |
|         time.sleep(30)
 | |
| 
 | |
|         public_ip = PublicIPAddress.create(
 | |
|             apiclient=self.apiclient,
 | |
|             accountid=self.account.name,
 | |
|             zoneid=self.zone.id,
 | |
|             domainid=self.account.domainid,
 | |
|             services=self.services,
 | |
|             networkid=network.id
 | |
|         )
 | |
| 
 | |
|         FireWallRule.create(
 | |
|             apiclient=self.apiclient,
 | |
|             ipaddressid=public_ip.ipaddress.id,
 | |
|             protocol='TCP',
 | |
|             cidrlist=['0.0.0.0/0'],
 | |
|             startport=80,
 | |
|             endport=80
 | |
|         )
 | |
| 
 | |
|         NATRule.create(
 | |
|             apiclient=self.apiclient,
 | |
|             virtual_machine=vm,
 | |
|             services=self.services["nat_rule"],
 | |
|             ipaddressid=public_ip.ipaddress.id
 | |
|         )
 | |
| 
 | |
|         # ssh vm, start httpd, clear iptables
 | |
|         ssh = vm.get_ssh_client()
 | |
|         ssh.execute("service httpd start")
 | |
|         ssh.execute("iptables -F")
 | |
|         ssh.execute("echo test > /var/www/html/test.html")
 | |
| 
 | |
|         headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'}
 | |
|         r = requests.get("http://%s/test.html" % public_ip.ipaddress.ipaddress, headers=headers)
 | |
|         self.assertEqual(r.status_code, 200, "Static nat was created and applied to vm")
 | |
| 
 | |
|         return
 | |
| 
 | |
|     @skipTestIf("not_tungsten_fabric_zone")
 | |
|     @attr(tags=["tungstenfabric"], required_hardware="false")
 | |
|     def test_01_loadbalancing(self):
 | |
|         # create network offering
 | |
|         network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"])
 | |
|         network_offering.update(self.apiclient, state='Enabled')
 | |
|         self.cleanup.append(network_offering)
 | |
| 
 | |
|         # create network
 | |
|         network = Network.create(
 | |
|             self.apiclient,
 | |
|             self.services["networks"]["network1"],
 | |
|             networkofferingid=network_offering.id,
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid
 | |
|         )
 | |
|         self.cleanup.append(network)
 | |
| 
 | |
|         # create virtual machine 1
 | |
|         vm1 = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm1"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
|         self.cleanup.append(vm1)
 | |
| 
 | |
|         # create virtual machine 2
 | |
|         vm2 = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm2"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
|         self.cleanup.append(vm2)
 | |
| 
 | |
|         public_ip = PublicIPAddress.create(
 | |
|             apiclient=self.apiclient,
 | |
|             accountid=self.account.name,
 | |
|             zoneid=self.zone.id,
 | |
|             domainid=self.account.domainid,
 | |
|             services=self.services,
 | |
|             networkid=network.id
 | |
|         )
 | |
| 
 | |
|         # open firewall rule
 | |
|         EgressFireWallRule.create(
 | |
|             apiclient=self.apiclient,
 | |
|             networkid=network.id,
 | |
|             protocol='All',
 | |
|             cidrlist='0.0.0.0/0'
 | |
|         )
 | |
| 
 | |
|         firewall_rule = FireWallRule.create(
 | |
|             apiclient=self.apiclient,
 | |
|             ipaddressid=public_ip.ipaddress.id,
 | |
|             protocol='TCP',
 | |
|             cidrlist=['0.0.0.0/0'],
 | |
|             startport=80,
 | |
|             endport=80
 | |
|         )
 | |
|         self.cleanup.append(firewall_rule)
 | |
| 
 | |
|         lb_rule = LoadBalancerRule.create(
 | |
|             self.apiclient,
 | |
|             self.services["lbrule"],
 | |
|             ipaddressid=public_ip.ipaddress.id,
 | |
|             accountid=self.account.name
 | |
|         )
 | |
|         self.cleanup.append(lb_rule)
 | |
|         lb_rule.assign(self.apiclient, [vm1, vm2])
 | |
| 
 | |
|         # ssh vm1 and vm2, start httpd, clear iptables
 | |
|         ssh1 = vm1.get_ssh_client()
 | |
|         ssh1.execute("service httpd start")
 | |
|         ssh1.execute("iptables -F")
 | |
|         ssh1.execute("echo test1 > /var/www/html/test.html")
 | |
|         ssh2 = vm2.get_ssh_client()
 | |
|         ssh2.execute("service httpd start")
 | |
|         ssh2.execute("iptables -F")
 | |
|         ssh2.execute("echo test2 > /var/www/html/test.html")
 | |
| 
 | |
|         # wait for tungsten instance service create
 | |
|         time.sleep(120)
 | |
| 
 | |
|         # check if load balancing was apply and content was load balancing with round robin method
 | |
|         contents = ["test1", "test2"]
 | |
|         headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'}
 | |
|         r1 = requests.get("http://%s/test.html" % public_ip.ipaddress.ipaddress, headers=headers)
 | |
|         self.assertEqual(r1.status_code, 200, "Load balance was created and applied to vms")
 | |
|         self.logger.info("http response 1 content %s" % r1.text)
 | |
|         contents.remove(r1.text.rstrip())
 | |
|         self.assertEqual(len(contents), 1, "Contents was load balancing with test1 or test2")
 | |
| 
 | |
|         r2 = requests.get("http://%s/test.html" % public_ip.ipaddress.ipaddress, headers=headers)
 | |
|         self.assertEqual(r2.status_code, 200, "Load balance was created and applied to vms")
 | |
|         self.logger.info("http response 2 content %s" % r2.text)
 | |
|         contents.remove(r2.text.rstrip())
 | |
|         self.assertEqual(len(contents), 0, "Contents was load balancing with the rest of contents")
 | |
| 
 | |
|         return
 | |
| 
 | |
|     @skipTestIf("not_tungsten_fabric_zone")
 | |
|     @attr(tags=["tungstenfabric"], required_hardware="false")
 | |
|     def test_01_logicalrouter(self):
 | |
|         # create network offering
 | |
|         network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"])
 | |
|         network_offering.update(self.apiclient, state='Enabled')
 | |
|         self.cleanup.append(network_offering)
 | |
| 
 | |
|         # create network 1
 | |
|         network1 = Network.create(
 | |
|             self.apiclient,
 | |
|             self.services["networks"]["network1"],
 | |
|             networkofferingid=network_offering.id,
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid
 | |
|         )
 | |
|         self.cleanup.append(network1)
 | |
| 
 | |
|         # create virtual machine 1
 | |
|         vm1 = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm1"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network1.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
|         self.cleanup.append(vm1)
 | |
| 
 | |
|         # create network 2
 | |
|         network2 = Network.create(
 | |
|             self.apiclient,
 | |
|             self.services["networks"]["network2"],
 | |
|             networkofferingid=network_offering.id,
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid
 | |
|         )
 | |
|         self.cleanup.append(network2)
 | |
| 
 | |
|         # create virtual machine 2
 | |
|         vm2 = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm2"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network2.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
|         self.cleanup.append(vm2)
 | |
| 
 | |
|         ssh1 = vm1.get_ssh_client()
 | |
|         res1 = ssh1.execute("ping -c1 %s" % vm2.ipaddress)
 | |
|         self.assertEqual(
 | |
|             str(res1).count("0 received"),
 | |
|             1,
 | |
|             "Ping vm2 from vm1 should be not successful"
 | |
|         )
 | |
| 
 | |
|         logicalrouter = LogicalRouter.create(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             self.services["logicalrouter"]["name"]
 | |
|         )
 | |
|         self.cleanup.append(logicalrouter)
 | |
| 
 | |
|         LogicalRouter.add(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             logicalrouter.uuid,
 | |
|             network1.id)
 | |
| 
 | |
|         LogicalRouter.add(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             logicalrouter.uuid,
 | |
|             network2.id)
 | |
| 
 | |
|         # open firewall rule for network 1
 | |
|         EgressFireWallRule.create(
 | |
|             apiclient=self.apiclient,
 | |
|             networkid=network1.id,
 | |
|             protocol='All',
 | |
|             cidrlist='0.0.0.0/0'
 | |
|         )
 | |
| 
 | |
|         # open firewall rule for network 2
 | |
|         EgressFireWallRule.create(
 | |
|             apiclient=self.apiclient,
 | |
|             networkid=network2.id,
 | |
|             protocol='All',
 | |
|             cidrlist='0.0.0.0/0'
 | |
|         )
 | |
| 
 | |
|         ssh2 = vm1.get_ssh_client()
 | |
|         res2 = ssh2.execute("ping -c1 %s" % vm2.ipaddress)
 | |
|         self.assertEqual(
 | |
|             str(res2).count("1 received"),
 | |
|             1,
 | |
|             "Ping vm2 from vm1 should be successful"
 | |
|         )
 | |
| 
 | |
|         LogicalRouter.remove(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             logicalrouter.uuid,
 | |
|             network1.id)
 | |
| 
 | |
|         LogicalRouter.remove(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             logicalrouter.uuid,
 | |
|             network2.id)
 | |
| 
 | |
|         return
 | |
| 
 | |
|     @skipTestIf("not_tungsten_fabric_zone")
 | |
|     @attr(tags=["tungstenfabric"], required_hardware="false")
 | |
|     def test_01_firewall(self):
 | |
|         # create network offering
 | |
|         network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"])
 | |
|         network_offering.update(self.apiclient, state='Enabled')
 | |
|         self.cleanup.append(network_offering)
 | |
| 
 | |
|         # create network
 | |
|         network = Network.create(
 | |
|             self.apiclient,
 | |
|             self.services["networks"]["network1"],
 | |
|             networkofferingid=network_offering.id,
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid
 | |
|         )
 | |
|         self.cleanup.append(network)
 | |
| 
 | |
|         # create virtual machine
 | |
|         vm = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm1"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
|         self.cleanup.append(vm)
 | |
| 
 | |
|         # ssh vm, ping google.com and verified response package
 | |
|         ssh1 = vm.get_ssh_client()
 | |
|         res1 = ssh1.execute("ping -c1 google.com")
 | |
|         self.assertEqual(
 | |
|             str(res1).count("0 received"),
 | |
|             1,
 | |
|             "Ping google.com from vm should be fail"
 | |
|         )
 | |
| 
 | |
|         # open firewall rule
 | |
|         EgressFireWallRule.create(
 | |
|             apiclient=self.apiclient,
 | |
|             networkid=network.id,
 | |
|             protocol='All',
 | |
|             cidrlist='0.0.0.0/0'
 | |
|         )
 | |
| 
 | |
|         # wait for vm start
 | |
|         time.sleep(30)
 | |
| 
 | |
|         # ssh vm, ping google.com and verified response package
 | |
|         ssh2 = vm.get_ssh_client()
 | |
|         res2 = ssh2.execute("ping -c1 google.com")
 | |
|         self.assertEqual(
 | |
|             str(res2).count("1 received"),
 | |
|             1,
 | |
|             "Ping google.com from vm should be successful"
 | |
|         )
 | |
| 
 | |
|         return
 | |
| 
 | |
|     @skipTestIf("not_tungsten_fabric_zone")
 | |
|     @attr(tags=["tungstenfabric"], required_hardware="false")
 | |
|     def test_01_network_policy(self):
 | |
|         # create network offering
 | |
|         network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"])
 | |
|         network_offering.update(self.apiclient, state='Enabled')
 | |
|         self.cleanup.append(network_offering)
 | |
| 
 | |
|         # create network
 | |
|         network = Network.create(
 | |
|             self.apiclient,
 | |
|             self.services["networks"]["network1"],
 | |
|             networkofferingid=network_offering.id,
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid
 | |
|         )
 | |
|         self.cleanup.append(network)
 | |
| 
 | |
|         networkpolicy = NetworkPolicy.create(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             self.services["network_policy"]["policy1"]["name"]
 | |
|         )
 | |
|         self.cleanup.append(networkpolicy)
 | |
| 
 | |
|         self.assertEqual(
 | |
|             is_object_created(self.apiclient, self.zone.id, "network-policy", networkpolicy.uuid),
 | |
|             True, "Check if network policy was created in tungsten")
 | |
| 
 | |
|         # create virtual machine
 | |
|         vm = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm1"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
|         self.cleanup.append(vm)
 | |
| 
 | |
|         ssh = vm.get_ssh_client()
 | |
|         res = ssh.execute("ping -c1 google.com")
 | |
|         self.assertEqual(
 | |
|             str(res).count("0 received"),
 | |
|             1,
 | |
|             "Ping google.com from vm should not be successful"
 | |
|         )
 | |
| 
 | |
|         NetworkPolicy.apply(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             network.id,
 | |
|             networkpolicy.uuid,
 | |
|             1,
 | |
|             1
 | |
|         )
 | |
| 
 | |
|         policyrule = PolicyRule.create(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             networkpolicy.uuid,
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["action"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["direction"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["protocol"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["srcnetwork"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["srcipprefix"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["srcipprefixlend"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["srcstartport"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["srcendport"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["destnetwork"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["destipprefix"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["destipprefixlen"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["deststartport"],
 | |
|             self.services["network_policy"]["policy1"]["rules"]["rule1"]["destendport"]
 | |
|         )
 | |
| 
 | |
|         ssh1 = vm.get_ssh_client()
 | |
|         res1 = ssh1.execute("ping -c1 google.com")
 | |
|         self.assertEqual(
 | |
|             str(res1).count("1 received"),
 | |
|             1,
 | |
|             "Ping google.com from vm should be successful"
 | |
|         )
 | |
| 
 | |
|         PolicyRule.delete(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             networkpolicy.uuid,
 | |
|             policyrule.uuid
 | |
|         )
 | |
| 
 | |
|         NetworkPolicy.remove(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             network.id,
 | |
|             networkpolicy.uuid
 | |
|         )
 | |
| 
 | |
|         return
 | |
| 
 | |
|     @skipTestIf("not_tungsten_fabric_zone")
 | |
|     @attr(tags=["tungstenfabric"], required_hardware="false")
 | |
|     def test_01_application_policy_set(self):
 | |
|         # create network offering
 | |
|         network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"])
 | |
|         network_offering.update(self.apiclient, state='Enabled')
 | |
|         self.cleanup.append(network_offering)
 | |
| 
 | |
|         # create network
 | |
|         network = Network.create(
 | |
|             self.apiclient,
 | |
|             self.services["networks"]["network1"],
 | |
|             networkofferingid=network_offering.id,
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid
 | |
|         )
 | |
|         self.cleanup.append(network)
 | |
| 
 | |
|         # create virtual machine 1
 | |
|         vm1 = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm1"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
|         self.cleanup.append(vm1)
 | |
| 
 | |
|         # create virtual machine 2
 | |
|         vm2 = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm2"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
|         self.cleanup.append(vm2)
 | |
| 
 | |
|         # create virtual machine 3
 | |
|         vm3 = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm3"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced'
 | |
|         )
 | |
|         self.cleanup.append(vm3)
 | |
| 
 | |
|         applicationtag = TungstenTag.create(
 | |
|             self.apiclient,
 | |
|             zoneid=self.zone.id,
 | |
|             tagtype="application",
 | |
|             tagvalue="webapp"
 | |
|         )
 | |
|         self.cleanup.append(applicationtag)
 | |
| 
 | |
|         frontendtag = TungstenTag.create(
 | |
|             self.apiclient,
 | |
|             zoneid=self.zone.id,
 | |
|             tagtype="tier",
 | |
|             tagvalue="frontend"
 | |
|         )
 | |
|         self.cleanup.append(frontendtag)
 | |
| 
 | |
|         backendtag = TungstenTag.create(
 | |
|             self.apiclient,
 | |
|             zoneid=self.zone.id,
 | |
|             tagtype="tier",
 | |
|             tagvalue="backend"
 | |
|         )
 | |
|         self.cleanup.append(backendtag)
 | |
| 
 | |
|         aps = ApplicationPolicySet.create(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             self.services["applicationpolicysets"]["aps1"]["name"]
 | |
|         )
 | |
|         self.cleanup.append(aps)
 | |
| 
 | |
|         frontendpolicy = FirewallPolicy.create(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             aps.uuid,
 | |
|             self.services["firewallpolicys"]["frontend"]["name"],
 | |
|             1
 | |
|         )
 | |
|         self.cleanup.append(frontendpolicy)
 | |
| 
 | |
|         internetpolicy = FirewallPolicy.create(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             aps.uuid,
 | |
|             self.services["firewallpolicys"]["internet"]["name"],
 | |
|             3
 | |
|         )
 | |
|         self.cleanup.append(internetpolicy)
 | |
| 
 | |
|         hostpolicy = FirewallPolicy.create(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             aps.uuid,
 | |
|             self.services["firewallpolicys"]["host"]["name"],
 | |
|             4
 | |
|         )
 | |
|         self.cleanup.append(hostpolicy)
 | |
| 
 | |
|         anyservicegroup = ServiceGroup.create(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             self.services["servicegroups"]["any"]["name"],
 | |
|             self.services["servicegroups"]["any"]["protocol"],
 | |
|             self.services["servicegroups"]["any"]["startport"],
 | |
|             self.services["servicegroups"]["any"]["endport"]
 | |
|         )
 | |
|         self.cleanup.append(anyservicegroup)
 | |
| 
 | |
|         frontendrule = FirewallRule.create(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             frontendpolicy.uuid,
 | |
|             name=self.services["firewallrules"]["frontend"]["name"],
 | |
|             action=self.services["firewallrules"]["frontend"]["action"],
 | |
|             direction=self.services["firewallrules"]["frontend"]["direction"],
 | |
|             servicegroupuuid=anyservicegroup.uuid,
 | |
|             srctaguuid=frontendtag.uuid,
 | |
|             desttaguuid=backendtag.uuid,
 | |
|             sequence=1
 | |
|         )
 | |
|         self.cleanup.append(frontendrule)
 | |
| 
 | |
|         internetrule = FirewallRule.create(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             internetpolicy.uuid,
 | |
|             name=self.services["firewallrules"]["internet"]["name"],
 | |
|             action=self.services["firewallrules"]["internet"]["action"],
 | |
|             direction=self.services["firewallrules"]["internet"]["direction"],
 | |
|             servicegroupuuid=anyservicegroup.uuid,
 | |
|             srctaguuid=applicationtag.uuid,
 | |
|             destnetworkuuid=network.id,
 | |
|             sequence=1
 | |
|         )
 | |
|         self.cleanup.append(internetrule)
 | |
| 
 | |
|         publicnetwork = Network.list(self.apiclient, listall=True, issystem=True, traffictype="Public")
 | |
|         hostrule = FirewallRule.create(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             hostpolicy.uuid,
 | |
|             name=self.services["firewallrules"]["host"]["name"],
 | |
|             action=self.services["firewallrules"]["host"]["action"],
 | |
|             direction=self.services["firewallrules"]["host"]["direction"],
 | |
|             servicegroupuuid=anyservicegroup.uuid,
 | |
|             srcnetworkuuid=publicnetwork[0].id,
 | |
|             desttaguuid=applicationtag.uuid,
 | |
|             sequence=1
 | |
|         )
 | |
|         self.cleanup.append(hostrule)
 | |
| 
 | |
|         TungstenTag.apply(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             applicationpolicysetuuid=aps.uuid,
 | |
|             taguuid=applicationtag.uuid
 | |
|         )
 | |
| 
 | |
|         TungstenTag.apply(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             taguuid=applicationtag.uuid,
 | |
|             nicuuid=vm1.nic[0].id
 | |
|         )
 | |
| 
 | |
|         TungstenTag.apply(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             taguuid=frontendtag.uuid,
 | |
|             nicuuid=vm1.nic[0].id
 | |
|         )
 | |
| 
 | |
|         TungstenTag.apply(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             taguuid=applicationtag.uuid,
 | |
|             nicuuid=vm2.nic[0].id
 | |
|         )
 | |
| 
 | |
|         TungstenTag.apply(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             taguuid=backendtag.uuid,
 | |
|             nicuuid=vm2.nic[0].id
 | |
|         )
 | |
| 
 | |
|         # open firewall rule for network
 | |
|         EgressFireWallRule.create(
 | |
|             apiclient=self.apiclient,
 | |
|             networkid=network.id,
 | |
|             protocol='All',
 | |
|             cidrlist='0.0.0.0/0'
 | |
|         )
 | |
| 
 | |
|         ssh1 = vm1.get_ssh_client()
 | |
|         ssh2 = vm2.get_ssh_client()
 | |
|         ssh3 = vm3.get_ssh_client()
 | |
| 
 | |
|         # vm1 can access to internet
 | |
|         res1 = ssh1.execute("ping -c1 google.com")
 | |
|         self.assertEqual(
 | |
|             str(res1).count("1 received"),
 | |
|             1,
 | |
|             "Ping google from vm1 should be successful"
 | |
|         )
 | |
| 
 | |
|         # vm2 can access to internet
 | |
|         res2 = ssh2.execute("ping -c1 google.com")
 | |
|         self.assertEqual(
 | |
|             str(res2).count("1 received"),
 | |
|             1,
 | |
|             "Ping google from vm2 should be successful"
 | |
|         )
 | |
| 
 | |
|         # vm3 can access to internet
 | |
|         res3 = ssh3.execute("ping -c1 google.com")
 | |
|         self.assertEqual(
 | |
|             str(res3).count("1 received"),
 | |
|             1,
 | |
|             "Ping google from vm3 should be successful"
 | |
|         )
 | |
| 
 | |
|         # vm3(outside) can not ping to vm1
 | |
|         res4 = ssh3.execute("ping -c1 %s" % vm1.ipaddress)
 | |
|         self.assertEqual(
 | |
|             str(res4).count("0 received"),
 | |
|             1,
 | |
|             "Ping vm1 from vm3 should be not successful"
 | |
|         )
 | |
| 
 | |
|         # vm3(outside) can not ping to vm2
 | |
|         res5 = ssh3.execute("ping -c1 %s" % vm2.ipaddress)
 | |
|         self.assertEqual(
 | |
|             str(res5).count("0 received"),
 | |
|             1,
 | |
|             "Ping vm2 from vm3 should be not successful"
 | |
|         )
 | |
| 
 | |
|         # vm1(frontend) can ping to vm2(backend)
 | |
|         res6 = ssh1.execute("ping -c1 %s" % vm2.ipaddress)
 | |
|         self.assertEqual(
 | |
|             str(res6).count("1 received"),
 | |
|             1,
 | |
|             "Ping vm1 from vm2 should be successful"
 | |
|         )
 | |
| 
 | |
|         TungstenTag.remove(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             applicationpolicysetuuid=aps.uuid,
 | |
|             taguuid=applicationtag.uuid
 | |
|         )
 | |
|         TungstenTag.remove(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             taguuid=applicationtag.uuid,
 | |
|             nicuuid=vm1.nic[0].id
 | |
|         )
 | |
|         TungstenTag.remove(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             taguuid=frontendtag.uuid,
 | |
|             nicuuid=vm1.nic[0].id
 | |
|         )
 | |
|         TungstenTag.remove(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             taguuid=applicationtag.uuid,
 | |
|             nicuuid=vm2.nic[0].id
 | |
|         )
 | |
|         TungstenTag.remove(
 | |
|             self.apiclient,
 | |
|             self.zone.id,
 | |
|             taguuid=backendtag.uuid,
 | |
|             nicuuid=vm2.nic[0].id
 | |
|         )
 | |
|         return
 | |
| 
 | |
|     @skipTestIf("can_not_migrate")
 | |
|     @attr(tags=["tungstenfabric"], required_hardware="false")
 | |
|     def test_01_vm_migration(self):
 | |
|         # create network offering
 | |
|         network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"])
 | |
|         network_offering.update(self.apiclient, state='Enabled')
 | |
|         self.cleanup.append(network_offering)
 | |
| 
 | |
|         # create network
 | |
|         network = Network.create(
 | |
|             self.apiclient,
 | |
|             self.services["networks"]["network1"],
 | |
|             networkofferingid=network_offering.id,
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid
 | |
|         )
 | |
|         self.cleanup.append(network)
 | |
| 
 | |
|         # create virtual machine
 | |
|         vm = VirtualMachine.create(
 | |
|             self.apiclient,
 | |
|             self.services["virtual_machines"]["vm1"],
 | |
|             serviceofferingid=self.service_offering.id,
 | |
|             templateid=self.template.id,
 | |
|             networkids=[str(network.id)],
 | |
|             zoneid=self.zone.id,
 | |
|             accountid=self.account.name,
 | |
|             domainid=self.account.domainid,
 | |
|             mode='advanced',
 | |
|             hostid=self.hosts[0].id
 | |
|         )
 | |
|         self.cleanup.append(vm)
 | |
| 
 | |
|         # open firewall rule for network 1
 | |
|         EgressFireWallRule.create(
 | |
|             apiclient=self.apiclient,
 | |
|             networkid=network.id,
 | |
|             protocol='All',
 | |
|             cidrlist='0.0.0.0/0'
 | |
|         )
 | |
| 
 | |
|         ssh = vm.get_ssh_client()
 | |
|         res = ssh.execute("ping -c1 google.com")
 | |
|         self.assertEqual(
 | |
|             str(res).count("1 received"),
 | |
|             1,
 | |
|             "Ping google.com from vm1 should be successful"
 | |
|         )
 | |
| 
 | |
|         cmd = migrateVirtualMachine.migrateVirtualMachineCmd()
 | |
|         cmd.virtualmachineid = vm.id
 | |
|         cmd.hostid = self.hosts[1].id
 | |
|         migrate = self.apiclient.migrateVirtualMachine(cmd)
 | |
| 
 | |
|         ssh = vm.get_ssh_client()
 | |
|         res = ssh.execute("ping -c1 google.com")
 | |
|         self.assertEqual(
 | |
|             str(res).count("1 received"),
 | |
|             1,
 | |
|             "Ping google.com from vm1 should be successful"
 | |
|         )
 |