diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/MigrateNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateNetworkCmd.java index 651fce87fd3..298d9b043e8 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/network/MigrateNetworkCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateNetworkCmd.java @@ -18,12 +18,14 @@ package org.apache.cloudstack.api.command.admin.network; import org.apache.log4j.Logger; +import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ResponseObject.ResponseView; import org.apache.cloudstack.api.ServerApiException; @@ -38,12 +40,18 @@ import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; import com.cloud.user.User; -@APICommand(name = "migrateNetwork", description = "moves a network to another physical network", responseObject = NetworkResponse.class, responseView = ResponseView.Restricted, entityType = {Network.class}, - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +@APICommand(name = MigrateNetworkCmd.APINAME, description = "moves a network to another physical network", + responseObject = NetworkResponse.class, + responseView = ResponseView.Restricted, + entityType = {Network.class}, + requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false, + since = "4.11.0", + authorized = {RoleType.Admin}) public class MigrateNetworkCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(MigrateNetworkCmd.class.getName()); - private static final String s_name = "migratenetworkresponse"; + public static final String APINAME = "migrateNetwork"; ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// @@ -81,7 +89,7 @@ public class MigrateNetworkCmd extends BaseAsyncCmd { @Override public String getCommandName() { - return s_name; + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; } @Override diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/MigrateVPCCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateVPCCmd.java index 6cf115742a8..a5611c67aa4 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/network/MigrateVPCCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateVPCCmd.java @@ -16,34 +16,44 @@ // under the License. package org.apache.cloudstack.api.command.admin.network; +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker; import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ResponseObject; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.VpcOfferingResponse; import org.apache.cloudstack.api.response.VpcResponse; import org.apache.cloudstack.context.CallContext; -import org.apache.log4j.Logger; - -import java.util.HashMap; -import java.util.Map; import com.cloud.event.EventTypes; import com.cloud.network.vpc.Vpc; import com.cloud.user.Account; import com.cloud.user.User; -@APICommand(name = "migrateVPC", description = "moves a vpc to another physical network", responseObject = VpcResponse.class, responseView = ResponseObject.ResponseView.Restricted, entityType = {Vpc.class}, - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +@APICommand(name = MigrateVPCCmd.APINAME, + description = "moves a vpc to another physical network", + responseObject = VpcResponse.class, + responseView = ResponseObject.ResponseView.Restricted, + entityType = {Vpc.class}, + requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false, + since = "4.11.0", + authorized = {RoleType.Admin}) public class MigrateVPCCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(MigrateVPCCmd.class.getName()); - private static final String s_name = "migratevpcresponse"; + public static final String APINAME = "migrateVPC"; ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// @@ -86,7 +96,7 @@ public class MigrateVPCCmd extends BaseAsyncCmd { } for (HashMap map : tierNetworkOfferings.values()) { - flatMap.put(map.get("networkid"), map.get("networkofferingid")); + flatMap.put(map.get("networkid"), map.get("networkofferingid")); } return flatMap; @@ -98,7 +108,7 @@ public class MigrateVPCCmd extends BaseAsyncCmd { @Override public String getCommandName() { - return s_name; + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; } @Override diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReplugNicCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReplugNicCommandWrapper.java index 8c20a33e608..c91e719aabe 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReplugNicCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReplugNicCommandWrapper.java @@ -87,14 +87,6 @@ public final class LibvirtReplugNicCommandWrapper extends CommandWrapper 0, "There are no Vms deployed in the account" + " %s" % self.account.name) + vm = vms[0] + self.assert_(vm.id == str(deployVmResponse.id), + "Vm deployed is different from the test") + self.assert_(vm.state == "Running", "VM is not in Running state") + + self.migrate_network( + self.network_offering_nouserdata, + isolated_network, resume=False) + + self.migrate_network( + self.network_offering_all, + isolated_network, resume=False) + + @attr(tags=["advanced", "smoke", "nativevpconly"], + required_hardware="false") + def test_02_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 + """ + + self.debug("Creating Native VSP VPC offering with Static NAT service " + "provider as VPCVR...") + native_vpc_off = VpcOffering.create( + self.apiclient, + self.test_data["vpc_offering_reduced"]) + + self.debug("Enabling the VPC offering created") + native_vpc_off.update(self.apiclient, state='Enabled') + + self.debug("Creating a VPC with Static NAT service provider as " + "VpcVirtualRouter") + self.services["vpc"]["cidr"] = '10.1.1.1/16' + vpc = VPC.create( + self.apiclient, + self.services["vpc"], + vpcofferingid=native_vpc_off.id, + zoneid=self.zone.id, + account=self.account.name, + domainid=self.account.domainid + ) + self.debug("Creating native VPC Network Tier offering " + "with Static NAT service provider as VPCVR") + native_tiernet_off = \ + NetworkOffering.create(self.apiclient, + self.test_data + ["nw_offering_reduced_vpc"], + conservemode=False) + native_tiernet_off.update(self.apiclient, state='Enabled') + + self.debug("Creating a VPC tier network with Static NAT service") + vpc_tier = Network.create(self.apiclient, + self.services["network"], + accountid=self.account.name, + domainid=self.account.domainid, + networkofferingid=native_tiernet_off.id, + zoneid=self.zone.id, + gateway='10.1.1.1', + vpcid=vpc.id if vpc else self.vpc.id + ) + self.debug("Created network with ID: %s" % vpc_tier.id) + + network_offering_map = \ + [{"networkid": vpc_tier.id, + "networkofferingid": self.native_vpc_network_offering.id}] + + self.migrate_vpc(vpc, native_vpc_off, + network_offering_map, resume=False) + + network_offering_map = \ + [{"networkid": vpc_tier.id, + "networkofferingid": native_tiernet_off.id}] + + self.migrate_vpc(vpc, native_vpc_off, + network_offering_map, resume=False) + + self.debug('Creating VM in network=%s' % native_tiernet_off.name) + vm = VirtualMachine.create( + self.apiclient, + self.services["virtual_machine"], + accountid=self.account.name, + domainid=self.account.domainid, + serviceofferingid=self.service_offering.id, + networkids=[str(vpc_tier.id)], + templateid=self.template.id, + zoneid=self.zone.id + ) + self.debug('Created VM=%s in network=%s' % + (vm.id, native_tiernet_off.name)) + + network_offering_map = \ + [{"networkid": vpc_tier.id, + "networkofferingid": self.native_vpc_network_offering.id}] + + self.migrate_vpc(vpc, native_vpc_off, + network_offering_map, resume=False) + + network_offering_map = \ + [{"networkid": vpc_tier.id, + "networkofferingid": native_tiernet_off.id}] + + self.migrate_vpc(vpc, native_vpc_off, + network_offering_map, resume=False) diff --git a/tools/marvin/marvin/config/test_data.py b/tools/marvin/marvin/config/test_data.py index e9389e23eef..9fb8e8a527e 100644 --- a/tools/marvin/marvin/config/test_data.py +++ b/tools/marvin/marvin/config/test_data.py @@ -427,8 +427,8 @@ test_data = { "displaytext": "MySharedOffering", "guestiptype": "Shared", "supportedservices": "Dhcp,Dns,UserData", - "specifyVlan": "True", - "specifyIpRanges": "True", + "specifyVlan": "False", + "specifyIpRanges": "False", "traffictype": "GUEST", "tags": "native", "serviceProviderList": { @@ -491,6 +491,12 @@ test_data = { "supportedservices": "Dhcp,Dns,SourceNat,PortForwarding,Vpn,Lb,UserData,StaticNat,NetworkACL" }, + "vpc_offering_reduced": { + "name": "VPC reduced off", + "displaytext": "VPC reduced off", + "supportedservices": + "Dhcp,Dns,SourceNat,UserData,StaticNat,NetworkACL" + }, "vpc_offering_multi_lb": { "name": "VPC offering with multiple Lb service providers", "displaytext": "VPC offering with multiple Lb service providers", @@ -507,12 +513,6 @@ test_data = { "NetworkACL": 'VpcVirtualRouter' } }, - "vpc_offering_native": { - "name": "VPC native off", - "displaytext": "VPC native off", - "supportedservices": - "Dhcp,Dns,SourceNat,UserData,StaticNat,NetworkACL" - }, "vpc": { "name": "TestVPC", "displaytext": "TestVPC", @@ -662,6 +662,26 @@ test_data = { "Lb": "VpcVirtualRouter" } }, + "nw_offering_reduced_vpc": { + "name": 'Reduced Network for VPC', + "displaytext": 'Reduced Network for VPC', + "guestiptype": 'Isolated', + "supportedservices": 'Dhcp,StaticNat,SourceNat,NetworkACL,UserData,' + 'Dns', + "traffictype": 'GUEST', + "availability": 'Optional', + "tags": "native", + "useVpc": 'on', + "ispersistent": 'True', + "serviceProviderList": { + "Dhcp": "VpcVirtualRouter", + "StaticNat": "VpcVirtualRouter", + "SourceNat": "VpcVirtualRouter", + "NetworkACL": "VpcVirtualRouter", + "UserData": "VpcVirtualRouter", + "Dns": "VpcVirtualRouter" + } + }, "nw_off_persistent_VPCVR_LB": { "name": "Persistent Network VPC with LB", "displaytext": "Persistent Network VPC No LB", @@ -723,25 +743,6 @@ test_data = { "StaticNat": "VirtualRouter" } }, - "vpc_network_offering_native": { - "name": 'vpc_net_off_marvin_native', - "displaytext": 'vpc_net_off_marvin_native', - "guestiptype": 'Isolated', - "supportedservices": 'Dhcp,StaticNat,SourceNat,NetworkACL,UserData,Dns', - "traffictype": 'GUEST', - "availability": 'Optional', - "tags": "native", - "useVpc": 'on', - "ispersistent": 'True', - "serviceProviderList": { - "Dhcp": "VpcVirtualRouter", - "StaticNat": "VpcVirtualRouter", - "SourceNat": "VpcVirtualRouter", - "NetworkACL": "VpcVirtualRouter", - "UserData": "VpcVirtualRouter", - "Dns": "VpcVirtualRouter" - } - }, "fwrule": { "startport": 22, "endport": 22,