@@ -8306,42 +8306,59 @@ public NetworkOffering cloneNetworkOffering(final CloneNetworkOfferingCmd cmd) {
83068306 logger .info ("Cloning network offering {} (id: {}) to new offering with name: {}" ,
83078307 sourceOffering .getName (), sourceOfferingId , name );
83088308
8309- String detectedProvider = cmd .getProvider ();
8310-
8311- if (detectedProvider == null || detectedProvider .isEmpty ()) {
8312- Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap =
8309+ Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap =
83138310 _networkModel .getNetworkOfferingServiceProvidersMap (sourceOfferingId );
83148311
8315- if (sourceServiceProviderMap .containsKey (Network .Service .NetworkACL )) {
8316- Set <Network .Provider > networkAclProviders = sourceServiceProviderMap .get (Network .Service .NetworkACL );
8317- if (networkAclProviders != null && !networkAclProviders .isEmpty ()) {
8318- Network .Provider provider = networkAclProviders .iterator ().next ();
8319- if (provider == Network .Provider .Nsx ) {
8320- detectedProvider = "NSX" ;
8321- } else if (provider == Network .Provider .Netris ) {
8322- detectedProvider = "Netris" ;
8323- }
8324- }
8325- }
8326- }
8312+ validateProvider (sourceOffering , sourceServiceProviderMap , cmd .getProvider (), cmd .getNetworkMode ());
8313+
8314+ applySourceOfferingValuesToCloneCmd (cmd , sourceServiceProviderMap , sourceOffering );
83278315
8316+ return createNetworkOffering (cmd );
8317+ }
8318+
8319+ private void validateProvider (NetworkOfferingVO sourceOffering ,
8320+ Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap ,
8321+ String detectedProvider , String networkMode ) {
8322+
8323+ detectedProvider = getExternalNetworkProvider (detectedProvider , sourceServiceProviderMap );
83288324 // If this is an NSX/Netris offering, prevent network mode changes
83298325 if (detectedProvider != null && (detectedProvider .equals ("NSX" ) || detectedProvider .equals ("Netris" ))) {
8330- String cmdNetworkMode = cmd .getNetworkMode ();
8331- if (cmdNetworkMode != null && sourceOffering .getNetworkMode () != null ) {
8332- if (!cmdNetworkMode .equalsIgnoreCase (sourceOffering .getNetworkMode ().toString ())) {
8326+ if (networkMode != null && sourceOffering .getNetworkMode () != null ) {
8327+ if (!networkMode .equalsIgnoreCase (sourceOffering .getNetworkMode ().toString ())) {
83338328 throw new InvalidParameterValueException (
8334- String .format ("Cannot change network mode when cloning %s provider network offerings. " +
8335- "Source offering has network mode '%s', but '%s' was specified. " +
8336- "The network mode is determined by the provider configuration and cannot be modified." ,
8337- detectedProvider , sourceOffering .getNetworkMode (), cmdNetworkMode ));
8329+ String .format ("Cannot change network mode when cloning %s provider network offerings. " +
8330+ "Source offering has network mode '%s', but '%s' was specified. " ,
8331+ detectedProvider , sourceOffering .getNetworkMode (), networkMode ));
83388332 }
83398333 }
83408334 }
8335+ }
83418336
8342- applySourceOfferingValuesToCloneCmd (cmd , sourceOffering );
8337+ public static String getExternalNetworkProvider (String detectedProvider ,
8338+ Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap ) {
8339+ if (StringUtils .isNotEmpty (detectedProvider )) {
8340+ return detectedProvider ;
8341+ }
83438342
8344- return createNetworkOffering (cmd );
8343+ if (sourceServiceProviderMap == null || sourceServiceProviderMap .isEmpty ()) {
8344+ return null ;
8345+ }
8346+
8347+ for (Set <Provider > providers : sourceServiceProviderMap .values ()) {
8348+ if (CollectionUtils .isEmpty (providers )) {
8349+ continue ;
8350+ }
8351+ for (Provider provider : providers ) {
8352+ if (provider == Provider .Nsx ) {
8353+ return "NSX" ;
8354+ }
8355+ if (provider == Provider .Netris ) {
8356+ return "Netris" ;
8357+ }
8358+ }
8359+ }
8360+
8361+ return null ;
83458362 }
83468363
83478364 /**
@@ -8372,12 +8389,11 @@ private Map<String, Map<String, String>> convertToApiParameterFormat(Map<String,
83728389 return apiFormatMap ;
83738390 }
83748391
8375- private void applySourceOfferingValuesToCloneCmd (CloneNetworkOfferingCmd cmd , NetworkOfferingVO sourceOffering ) {
8392+ private void applySourceOfferingValuesToCloneCmd (CloneNetworkOfferingCmd cmd ,
8393+ Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap ,
8394+ NetworkOfferingVO sourceOffering ) {
83768395 Long sourceOfferingId = sourceOffering .getId ();
83778396
8378- Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap =
8379- _networkModel .getNetworkOfferingServiceProvidersMap (sourceOfferingId );
8380-
83818397 // Build final services list with add/drop support
83828398 List <String > finalServices = resolveFinalServicesList (cmd , sourceServiceProviderMap );
83838399
0 commit comments