Skip to content

Commit c436bc3

Browse files
fmaximussmeetsrkrissterckx
authored andcommitted
CLOUDSTACK-10024: Network Migration (apache#2374)
Handle PR comments Co-Authored-By: Raf Smeets <raf.smeets@nuagenetworks.net> Co-Authored-By: Kris Sterckx <kris.sterckx@nuagenetworks.net>
1 parent 36f43b5 commit c436bc3

9 files changed

Lines changed: 446 additions & 73 deletions

File tree

api/src/org/apache/cloudstack/api/command/admin/network/MigrateNetworkCmd.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818

1919
import org.apache.log4j.Logger;
2020

21+
import org.apache.cloudstack.acl.RoleType;
2122
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
2223
import org.apache.cloudstack.api.ACL;
2324
import org.apache.cloudstack.api.APICommand;
2425
import org.apache.cloudstack.api.ApiConstants;
2526
import org.apache.cloudstack.api.ApiErrorCode;
2627
import org.apache.cloudstack.api.BaseAsyncCmd;
28+
import org.apache.cloudstack.api.BaseCmd;
2729
import org.apache.cloudstack.api.Parameter;
2830
import org.apache.cloudstack.api.ResponseObject.ResponseView;
2931
import org.apache.cloudstack.api.ServerApiException;
@@ -38,12 +40,18 @@
3840
import com.cloud.user.Account;
3941
import com.cloud.user.User;
4042

41-
@APICommand(name = "migrateNetwork", description = "moves a network to another physical network", responseObject = NetworkResponse.class, responseView = ResponseView.Restricted, entityType = {Network.class},
42-
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
43+
@APICommand(name = MigrateNetworkCmd.APINAME, description = "moves a network to another physical network",
44+
responseObject = NetworkResponse.class,
45+
responseView = ResponseView.Restricted,
46+
entityType = {Network.class},
47+
requestHasSensitiveInfo = false,
48+
responseHasSensitiveInfo = false,
49+
since = "4.11.0",
50+
authorized = {RoleType.Admin})
4351
public class MigrateNetworkCmd extends BaseAsyncCmd {
4452
public static final Logger s_logger = Logger.getLogger(MigrateNetworkCmd.class.getName());
4553

46-
private static final String s_name = "migratenetworkresponse";
54+
public static final String APINAME = "migrateNetwork";
4755

4856
/////////////////////////////////////////////////////
4957
//////////////// API parameters /////////////////////
@@ -81,7 +89,7 @@ public Boolean getResume() {
8189

8290
@Override
8391
public String getCommandName() {
84-
return s_name;
92+
return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
8593
}
8694

8795
@Override

api/src/org/apache/cloudstack/api/command/admin/network/MigrateVPCCmd.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,34 +16,44 @@
1616
// under the License.
1717
package org.apache.cloudstack.api.command.admin.network;
1818

19+
import java.util.HashMap;
20+
import java.util.Map;
21+
22+
import org.apache.log4j.Logger;
23+
24+
import org.apache.cloudstack.acl.RoleType;
1925
import org.apache.cloudstack.acl.SecurityChecker;
2026
import org.apache.cloudstack.api.ACL;
2127
import org.apache.cloudstack.api.APICommand;
2228
import org.apache.cloudstack.api.ApiConstants;
2329
import org.apache.cloudstack.api.ApiErrorCode;
2430
import org.apache.cloudstack.api.BaseAsyncCmd;
31+
import org.apache.cloudstack.api.BaseCmd;
2532
import org.apache.cloudstack.api.Parameter;
2633
import org.apache.cloudstack.api.ResponseObject;
2734
import org.apache.cloudstack.api.ServerApiException;
2835
import org.apache.cloudstack.api.response.VpcOfferingResponse;
2936
import org.apache.cloudstack.api.response.VpcResponse;
3037
import org.apache.cloudstack.context.CallContext;
31-
import org.apache.log4j.Logger;
32-
33-
import java.util.HashMap;
34-
import java.util.Map;
3538

3639
import com.cloud.event.EventTypes;
3740
import com.cloud.network.vpc.Vpc;
3841
import com.cloud.user.Account;
3942
import com.cloud.user.User;
4043

41-
@APICommand(name = "migrateVPC", description = "moves a vpc to another physical network", responseObject = VpcResponse.class, responseView = ResponseObject.ResponseView.Restricted, entityType = {Vpc.class},
42-
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
44+
@APICommand(name = MigrateVPCCmd.APINAME,
45+
description = "moves a vpc to another physical network",
46+
responseObject = VpcResponse.class,
47+
responseView = ResponseObject.ResponseView.Restricted,
48+
entityType = {Vpc.class},
49+
requestHasSensitiveInfo = false,
50+
responseHasSensitiveInfo = false,
51+
since = "4.11.0",
52+
authorized = {RoleType.Admin})
4353
public class MigrateVPCCmd extends BaseAsyncCmd {
4454
public static final Logger s_logger = Logger.getLogger(MigrateVPCCmd.class.getName());
4555

46-
private static final String s_name = "migratevpcresponse";
56+
public static final String APINAME = "migrateVPC";
4757

4858
/////////////////////////////////////////////////////
4959
//////////////// API parameters /////////////////////
@@ -86,7 +96,7 @@ public Map<String, String> getTierNetworkOfferings() {
8696
}
8797

8898
for (HashMap<String, String> map : tierNetworkOfferings.values()) {
89-
flatMap.put(map.get("networkid"), map.get("networkofferingid"));
99+
flatMap.put(map.get("networkid"), map.get("networkofferingid"));
90100
}
91101

92102
return flatMap;
@@ -98,7 +108,7 @@ public Map<String, String> getTierNetworkOfferings() {
98108

99109
@Override
100110
public String getCommandName() {
101-
return s_name;
111+
return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
102112
}
103113

104114
@Override

plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReplugNicCommandWrapper.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,6 @@ public Answer execute(final ReplugNicCommand command, final LibvirtComputingReso
8787
s_logger.debug("ReplugNic: Updating interface" + interfaceDef);
8888
vm.updateDeviceFlags(interfaceDef.toString(), DomainAffect.LIVE.getValue());
8989

90-
/*
91-
// Manual replug
92-
for (final VifDriver vifDriver : libvirtComputingResource.getAllVifDrivers()) {
93-
vifDriver.detach(oldPluggedNic);
94-
}
95-
newVifDriver.attach(interfaceDef);
96-
*/
97-
9890
// We don't know which "traffic type" is associated with
9991
// each interface at this point, so inform all vif drivers
10092
for (final VifDriver vifDriver : libvirtComputingResource.getAllVifDrivers()) {

plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/AssociateNuageVspDomainTemplateCmd.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,7 @@
1919

2020
package com.cloud.api.commands;
2121

22-
import com.cloud.exception.ConcurrentOperationException;
23-
import com.cloud.exception.InsufficientCapacityException;
24-
import com.cloud.exception.InvalidParameterValueException;
25-
import com.cloud.exception.ResourceAllocationException;
26-
import com.cloud.exception.ResourceUnavailableException;
27-
import com.cloud.network.manager.NuageVspManager;
28-
import com.cloud.utils.exception.CloudRuntimeException;
22+
import javax.inject.Inject;
2923

3024
import org.apache.cloudstack.acl.RoleType;
3125
import org.apache.cloudstack.api.APICommand;
@@ -40,11 +34,20 @@
4034
import org.apache.cloudstack.api.response.ZoneResponse;
4135
import org.apache.cloudstack.context.CallContext;
4236

43-
import javax.inject.Inject;
37+
import com.cloud.exception.ConcurrentOperationException;
38+
import com.cloud.exception.InsufficientCapacityException;
39+
import com.cloud.exception.InvalidParameterValueException;
40+
import com.cloud.exception.ResourceAllocationException;
41+
import com.cloud.exception.ResourceUnavailableException;
42+
import com.cloud.network.manager.NuageVspManager;
43+
import com.cloud.utils.exception.CloudRuntimeException;
4444

45-
@APICommand(name = AssociateNuageVspDomainTemplateCmd.APINAME, responseObject = SuccessResponse.class, description = "associate a vpc with a domain template", authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.User})
45+
@APICommand(name = AssociateNuageVspDomainTemplateCmd.APINAME, responseObject = SuccessResponse.class,
46+
description = "associate a vpc with a domain template", authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.User},
47+
since = "4.11.0")
4648
public class AssociateNuageVspDomainTemplateCmd extends BaseCmd {
4749
static final String APINAME = "associateNuageVspDomainTemplate";
50+
4851
@Inject
4952
NuageVspManager _nuageVspManager;
5053

plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspDomainTemplatesCmd.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
import javax.inject.Inject;
4444
import java.util.List;
4545

46-
@APICommand(name = ListNuageVspDomainTemplatesCmd.APINAME, responseObject = BaseResponse.class, description = "Lists Nuage VSP domain templates", since = "4.11", responseHasSensitiveInfo = false, authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.User})
46+
@APICommand(name = ListNuageVspDomainTemplatesCmd.APINAME, responseObject = BaseResponse.class, description = "Lists Nuage VSP domain templates", since = "4.11.0", responseHasSensitiveInfo = false, authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.User})
4747
public class ListNuageVspDomainTemplatesCmd extends BaseCmd {
4848
static final String APINAME = "listNuageVspDomainTemplates";
4949

plugins/network-elements/nuage-vsp/src/com/cloud/api/commands/ListNuageVspGlobalDomainTemplateCmd.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919

2020
package com.cloud.api.commands;
2121

22+
import java.util.LinkedList;
23+
import java.util.List;
24+
25+
import javax.inject.Inject;
26+
2227
import org.apache.cloudstack.acl.RoleType;
2328
import org.apache.cloudstack.api.APICommand;
2429
import org.apache.cloudstack.api.ApiErrorCode;
@@ -27,11 +32,6 @@
2732
import org.apache.cloudstack.api.ServerApiException;
2833
import org.apache.cloudstack.api.response.ListResponse;
2934

30-
import javax.inject.Inject;
31-
32-
import java.util.LinkedList;
33-
import java.util.List;
34-
3535
import com.cloud.api.response.NuageVspDomainTemplateResponse;
3636
import com.cloud.exception.ConcurrentOperationException;
3737
import com.cloud.exception.InsufficientCapacityException;
@@ -43,7 +43,9 @@
4343
import com.cloud.user.Account;
4444
import com.cloud.utils.exception.CloudRuntimeException;
4545

46-
@APICommand(name = ListNuageVspGlobalDomainTemplateCmd.APINAME, responseObject = BaseResponse.class, description = "Lists Nuage VSP domain templates", authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.User})
46+
@APICommand(name = ListNuageVspGlobalDomainTemplateCmd.APINAME, responseObject = BaseResponse.class,
47+
description = "Lists Nuage VSP domain templates", authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.User},
48+
since = "4.11.0")
4749
public class ListNuageVspGlobalDomainTemplateCmd extends BaseCmd {
4850
static final String APINAME = "listNuageVspGlobalDomainTemplate";
4951

test/integration/plugins/nuagevsp/test_nuage_network_migration.py

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,37 @@
3131
import re
3232

3333

34+
class Services:
35+
"""Test network services
36+
"""
37+
def __init__(self):
38+
self.services = {
39+
"shared_network_offering": {
40+
"name": "MySharedOffering-shared",
41+
"displaytext": "MySharedOffering",
42+
"guestiptype": "Shared",
43+
"supportedservices": "Dhcp,Dns,UserData",
44+
"specifyVlan": "True",
45+
"specifyIpRanges": "True",
46+
"traffictype": "GUEST",
47+
"tags": "native",
48+
"serviceProviderList": {
49+
"Dhcp": "VirtualRouter",
50+
"Dns": "VirtualRouter",
51+
"UserData": "VirtualRouter"
52+
}
53+
}
54+
}
55+
56+
3457
class TestNuageMigration(nuageTestCase):
3558
"""Test Native to Nuage Migration
3659
"""
3760

3861
@classmethod
3962
def setUpClass(cls):
4063
super(TestNuageMigration, cls).setUpClass()
64+
cls.services = Services().services
4165

4266
if not hasattr(cls.vsp_physical_network, "tags") \
4367
or cls.vsp_physical_network.tags != 'nuage':
@@ -99,7 +123,7 @@ def setUpClass(cls):
99123

100124
# create a Native shared network offering
101125
cls.native_shared_network_offering = cls.create_NetworkOffering(
102-
cls.test_data["shared_network_offering"], False)
126+
cls.services["shared_network_offering"], False)
103127

104128
# create a Nuage shared network offering
105129
cls.nuage_shared_network_offering = cls.create_NetworkOffering(
@@ -1217,7 +1241,7 @@ def test_11_migrate_native_vpc_staticnat_to_nuage_traffic(self):
12171241
self.debug("Creating Native VSP VPC offering with Static NAT service "
12181242
"provider as VPCVR...")
12191243
native_vpc_off = self.create_VpcOffering(
1220-
self.test_data["vpc_offering_native"])
1244+
self.test_data["vpc_offering_reduced"])
12211245
self.validate_VpcOffering(native_vpc_off, state="Enabled")
12221246

12231247
self.debug("Creating a VPC with Static NAT service provider as "
@@ -1228,7 +1252,7 @@ def test_11_migrate_native_vpc_staticnat_to_nuage_traffic(self):
12281252
self.debug("Creating native VPC Network Tier offering "
12291253
"with Static NAT service provider as VPCVR")
12301254
native_tiernet_off = self.create_NetworkOffering(
1231-
self.test_data["vpc_network_offering_native"])
1255+
self.test_data["nw_offering_reduced_vpc"])
12321256
self.validate_NetworkOffering(native_tiernet_off, state="Enabled")
12331257

12341258
acl_list = self.create_NetworkAclList(
@@ -1479,7 +1503,7 @@ def test_12_migrate_native_vpc_multinic_to_nuage_traffic(self):
14791503
self.debug("Creating Native VSP VPC offering with Static NAT service "
14801504
"provider as VPCVR...")
14811505
native_vpc_off = self.create_VpcOffering(
1482-
self.test_data["vpc_offering_native"])
1506+
self.test_data["vpc_offering_reduced"])
14831507
self.validate_VpcOffering(native_vpc_off, state="Enabled")
14841508

14851509
self.debug("Creating a VPC with Static NAT service provider as "
@@ -1490,7 +1514,7 @@ def test_12_migrate_native_vpc_multinic_to_nuage_traffic(self):
14901514
self.debug("Creating native VPC Network Tier offering "
14911515
"with Static NAT service provider as VPCVR")
14921516
native_tiernet_off = self.create_NetworkOffering(
1493-
self.test_data["vpc_network_offering_native"])
1517+
self.test_data["nw_offering_reduced_vpc"])
14941518
self.validate_NetworkOffering(native_tiernet_off, state="Enabled")
14951519

14961520
acl_list = self.create_NetworkAclList(
@@ -1797,7 +1821,7 @@ def test_13_verify_guestvmip2_when_migrating_to_nuage(self):
17971821
self.debug("Creating Native VSP VPC offering with Static NAT service "
17981822
"provider as VPCVR...")
17991823
native_vpc_off = self.create_VpcOffering(
1800-
self.test_data["vpc_offering_native"])
1824+
self.test_data["vpc_offering_reduced"])
18011825
self.validate_VpcOffering(native_vpc_off, state="Enabled")
18021826

18031827
self.debug("Creating a VPC with Static NAT service provider as "
@@ -1808,7 +1832,7 @@ def test_13_verify_guestvmip2_when_migrating_to_nuage(self):
18081832
self.debug("Creating native VPC Network Tier offering "
18091833
"with Static NAT service provider as VPCVR")
18101834
native_tiernet_off = self.create_NetworkOffering(
1811-
self.test_data["vpc_network_offering_native"])
1835+
self.test_data["nw_offering_reduced_vpc"])
18121836
self.validate_NetworkOffering(native_tiernet_off, state="Enabled")
18131837

18141838
acl_list = self.create_NetworkAclList(
@@ -1917,7 +1941,7 @@ def test_15_native_to_native_vpc_migration(self):
19171941
self.debug("Creating Native VSP VPC offering with Static NAT service "
19181942
"provider as VPCVR...")
19191943
native_vpc_off = self.create_VpcOffering(
1920-
self.test_data["vpc_offering_native"])
1944+
self.test_data["vpc_offering_reduced"])
19211945
self.validate_VpcOffering(native_vpc_off, state="Enabled")
19221946

19231947
self.debug("Creating a VPC with Static NAT service provider as "
@@ -1928,7 +1952,7 @@ def test_15_native_to_native_vpc_migration(self):
19281952
self.debug("Creating native VPC Network Tier offering "
19291953
"with Static NAT service provider as VPCVR")
19301954
native_tiernet_off = self.create_NetworkOffering(
1931-
self.test_data["vpc_network_offering_native"])
1955+
self.test_data["nw_offering_reduced_vpc"])
19321956
self.validate_NetworkOffering(native_tiernet_off, state="Enabled")
19331957

19341958
acl_list = self.create_NetworkAclList(

0 commit comments

Comments
 (0)