Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id D054E10A7A for ; Thu, 3 Oct 2013 19:48:05 +0000 (UTC) Received: (qmail 13575 invoked by uid 500); 3 Oct 2013 19:48:01 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 13473 invoked by uid 500); 3 Oct 2013 19:48:00 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 12940 invoked by uid 99); 3 Oct 2013 19:47:55 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Oct 2013 19:47:55 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id C8E8690EE29; Thu, 3 Oct 2013 19:47:54 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: bfederle@apache.org To: commits@cloudstack.apache.org Date: Thu, 03 Oct 2013 19:48:02 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [09/10] git commit: updated refs/heads/ui-restyle to fbb0499 Signed-off-by: venkataswamybabu budumuru Have added a test for transferring portable ip across different works with in the same zone. (cherry picked from commit 32cdffdd629134864220fbc400d3d28f0e6549c2) Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/59ad4a9a Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/59ad4a9a Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/59ad4a9a Branch: refs/heads/ui-restyle Commit: 59ad4a9ab57b56745e5b97620b6073390d70dab7 Parents: 3f58368 Author: venkataswamybabu budumuru Authored: Thu Oct 3 19:58:45 2013 +0530 Committer: venkataswamybabu budumuru Committed: Thu Oct 3 20:01:22 2013 +0530 ---------------------------------------------------------------------- test/integration/component/test_portable_ip.py | 245 +++++++++++++++++++- 1 file changed, 244 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/59ad4a9a/test/integration/component/test_portable_ip.py ---------------------------------------------------------------------- diff --git a/test/integration/component/test_portable_ip.py b/test/integration/component/test_portable_ip.py index 55de60d..917e7f2 100644 --- a/test/integration/component/test_portable_ip.py +++ b/test/integration/component/test_portable_ip.py @@ -71,6 +71,14 @@ class Services: "name": "Test Network - Portable IP", "displaytext": "Test Network - Portable IP", }, + "network1": { + "name": "Test Network 1 - Portable IP", + "displaytext": "Test Network 1 - Portable IP", + }, + "network2": { + "name": "Test Network 2 - Portable IP", + "displaytext": "Test Network 2 - Portable IP", + }, "disk_offering": { "displaytext": "Small Disk", "name": "Small Disk", @@ -94,6 +102,30 @@ class Services: "publicport": 22, "protocol": 'TCP', }, + "vm1": + # Create a small virtual machine instance with disk offering + { + "displayname": "vm1", + "username": "root", # VM creds for SSH + "password": "password", + "ssh_port": 22, + "hypervisor": 'XenServer', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP', + }, + "vm2": + # Create a small virtual machine instance with disk offering + { + "displayname": "vm2", + "username": "root", # VM creds for SSH + "password": "password", + "ssh_port": 22, + "hypervisor": 'XenServer', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP', + }, "ostype": 'CentOS 5.3 (64-bit)', } @@ -726,7 +758,7 @@ class TestAssociatePublicIp(cloudstackTestCase): try: - self.debug("Deploying Virtual Machine") + self.debug("DeployingVirtual Machine") self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["small"], @@ -1307,3 +1339,214 @@ class TestDeleteAccount(cloudstackTestCase): id=portableip.ipaddress.id) return + + +class TestPortableIpTransferAcrossNetworks(cloudstackTestCase): + """Test Transfer Portable IP Across Networks + """ + + + @classmethod + def setUpClass(cls): + cls.api_client = super(TestPortableIpTransferAcrossNetworks, cls).getClsTestClient().getApiClient() + cls.services = Services().services + # Get Zone, Domain and templates + cls.region = get_region(cls.api_client, cls.services) + cls.domain = get_domain(cls.api_client, cls.services) + cls.zone = get_zone(cls.api_client, cls.services) + cls.pod = get_pod(cls.api_client, cls.zone.id, cls.services) + cls.services['mode'] = cls.zone.networktype + cls.services["domainid"] = cls.domain.id + cls.services["zoneid"] = cls.zone.id + cls.services["regionid"] = cls.region.id + + template = get_template( + cls.api_client, + cls.zone.id, + cls.services["ostype"] + ) + # Set Zones and disk offerings + cls.services["vm1"]["zoneid"] = cls.zone.id + cls.services["vm1"]["template"] = template.id + cls.services["vm2"]["zoneid"] = cls.zone.id + cls.services["vm2"]["template"] = template.id + + # Set Zones and Network offerings + cls.account = Account.create( + cls.api_client, + cls.services["account"], + domainid=cls.domain.id, + admin=True + ) + + cls.network_offering = NetworkOffering.create( + cls.api_client, + cls.services["network_offering"], + conservemode=False + ) + + # Enable Network offering + cls.network_offering.update(cls.api_client, state='Enabled') + cls.service_offering = ServiceOffering.create( + cls.api_client, + cls.services["service_offering"] + ) + + cls.debug("creating networks and virtual machines in each network for portable ip transfer tests: ") + cls.network1 = Network.create( + cls.api_client, + cls.services["network1"], + accountid=cls.account.name, + domainid=cls.account.domainid, + networkofferingid=cls.network_offering.id, + zoneid=cls.zone.id + ) + + cls.virtual_machine1 = VirtualMachine.create( + cls.api_client, + cls.services["vm1"], + accountid=cls.account.name, + domainid=cls.account.domainid, + serviceofferingid=cls.service_offering.id, + networkids = [cls.network1.id], + ) + cls.network2 = Network.create( + cls.api_client, + cls.services["network2"], + accountid=cls.account.name, + domainid=cls.account.domainid, + networkofferingid=cls.network_offering.id, + zoneid=cls.zone.id + ) + cls.virtual_machine2 = VirtualMachine.create( + cls.api_client, + cls.services["vm2"], + accountid=cls.account.name, + domainid=cls.account.domainid, + serviceofferingid=cls.service_offering.id, + networkids = [cls.network2.id], + ) + cls._cleanup = [cls.account, cls.network_offering] + + return + + @classmethod + def tearDownClass(cls): + try: + #Cleanup resources used + cleanup_resources(cls.api_client, cls._cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + def setUp(self): + self.apiclient = self.testClient.getApiClient() + self.dbclient = self.testClient.getDbConnection() + + #create new portable ip range + self.portable_ip_range_services = get_portable_ip_range_services(self.config) + + if self.portable_ip_range_services is None: + self.skipTest('Failed to read config values related to portable ip range') + + self.portable_ip_range_services["regionid"] = self.region.id + + self.debug("Creating new portable IP range with startip:%s and endip:%s" % + (str(self.portable_ip_range_services["startip"]), + str(self.portable_ip_range_services["endip"]))) + + #create new portable ip range + self.portable_ip_range = PortablePublicIpRange.create(self.apiclient, + self.portable_ip_range_services) + + self.debug("Created new portable IP range with startip:%s and endip:%s and id:%s" % + (self.portable_ip_range.startip, + self.portable_ip_range.endip, + self.portable_ip_range.id)) + + self.cleanup = [self.portable_ip_range, ] + return + + def tearDown(self): + try: + #Clean up, terminate the resources created + cleanup_resources(self.apiclient, self.cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + @attr(tags=["advanced","swamy"]) + def test_list_portable_ip_range_non_root_admin(self): + """Test list portable ip ranges with non admin root account + """ + # 1. Create new network 1 and associate portable IP 1 + # 2. Have at least 1 VM in network1 + # 3. Create a new network 2 and at least 1 VM in network 2 + # 2. enable static NAT on portable IP 1 with a VM in network 2 + # 3. SSH to the VM in network 2 + + portableip = PublicIPAddress.create( + self.apiclient, + accountid=self.account.name, + zoneid=self.zone.id, + domainid=self.account.domainid, + networkid=self.network1.id, + isportable=True + ) + self.debug("created public ip address (portable): %s" % portableip.ipaddress.ipaddress) + #Create NAT rule + self.debug("Creating NAT rule on the portable public ip") + # Enable Static NAT for VM + StaticNATRule.enable( + self.apiclient, + portableip.ipaddress.id, + self.virtual_machine2.id, + networkid=self.network2.id + ) + # Open up firewall port for SSH + self.debug("Opening firewall on the portable public ip") + fw_rule = FireWallRule.create( + self.apiclient, + ipaddressid=portableip.ipaddress.id, + protocol=self.services["natrule"]["protocol"], + cidrlist=[self.services["natrule"]["cidr"]], + startport=self.services["natrule"]["publicport"], + endport=self.services["natrule"]["publicport"] + ) + static_nat_list = PublicIPAddress.list( + self.apiclient, + associatednetworkid=self.network2.id, + listall=True, + isstaticnat=True, + ipaddress=portableip.ipaddress.ipaddress, + ) + self.assertEqual( + isinstance(static_nat_list, list), + True, + "List Public IP should return a valid static NAT info that was created on portable ip" + ) + self.assertTrue( + static_nat_list[0].ipaddress == portableip.ipaddress.ipaddress and static_nat_list[0].virtualmachineid==self.virtual_machine2.id, + "There is some issue in transferring portable ip {} across networks".format(portableip.ipaddress.ipaddress) + ) + try: + + self.debug("Trying to SSH to ip: %s" % portableip.ipaddress.ipaddress) + + remoteSSHClient( + portableip.ipaddress.ipaddress, + self.services['natrule']["publicport"], + self.virtual_machine2.username, + self.virtual_machine2.password + ) + except Exception as e: + self.fail("Exception while SSHing : %s" % e) + + self.debug("disassociating portable ip: %s" % portableip.ipaddress.ipaddress) + portableip.delete(self.apiclient) + + + + + +