@@ -8298,42 +8298,59 @@ public NetworkOffering cloneNetworkOffering(final CloneNetworkOfferingCmd cmd) {
82988298 logger .info ("Cloning network offering {} (id: {}) to new offering with name: {}" ,
82998299 sourceOffering .getName (), sourceOfferingId , name );
83008300
8301- String detectedProvider = cmd .getProvider ();
8302-
8303- if (detectedProvider == null || detectedProvider .isEmpty ()) {
8304- Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap =
8301+ Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap =
83058302 _networkModel .getNetworkOfferingServiceProvidersMap (sourceOfferingId );
83068303
8307- if (sourceServiceProviderMap .containsKey (Network .Service .NetworkACL )) {
8308- Set <Network .Provider > networkAclProviders = sourceServiceProviderMap .get (Network .Service .NetworkACL );
8309- if (networkAclProviders != null && !networkAclProviders .isEmpty ()) {
8310- Network .Provider provider = networkAclProviders .iterator ().next ();
8311- if (provider == Network .Provider .Nsx ) {
8312- detectedProvider = "NSX" ;
8313- } else if (provider == Network .Provider .Netris ) {
8314- detectedProvider = "Netris" ;
8315- }
8316- }
8317- }
8318- }
8304+ validateProvider (sourceOffering , sourceServiceProviderMap , cmd .getProvider (), cmd .getNetworkMode ());
8305+
8306+ applySourceOfferingValuesToCloneCmd (cmd , sourceServiceProviderMap , sourceOffering );
83198307
8308+ return createNetworkOffering (cmd );
8309+ }
8310+
8311+ private void validateProvider (NetworkOfferingVO sourceOffering ,
8312+ Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap ,
8313+ String detectedProvider , String networkMode ) {
8314+
8315+ detectedProvider = getExternalNetworkProvider (detectedProvider , sourceServiceProviderMap );
83208316 // If this is an NSX/Netris offering, prevent network mode changes
83218317 if (detectedProvider != null && (detectedProvider .equals ("NSX" ) || detectedProvider .equals ("Netris" ))) {
8322- String cmdNetworkMode = cmd .getNetworkMode ();
8323- if (cmdNetworkMode != null && sourceOffering .getNetworkMode () != null ) {
8324- if (!cmdNetworkMode .equalsIgnoreCase (sourceOffering .getNetworkMode ().toString ())) {
8318+ if (networkMode != null && sourceOffering .getNetworkMode () != null ) {
8319+ if (!networkMode .equalsIgnoreCase (sourceOffering .getNetworkMode ().toString ())) {
83258320 throw new InvalidParameterValueException (
8326- String .format ("Cannot change network mode when cloning %s provider network offerings. " +
8327- "Source offering has network mode '%s', but '%s' was specified. " +
8328- "The network mode is determined by the provider configuration and cannot be modified." ,
8329- detectedProvider , sourceOffering .getNetworkMode (), cmdNetworkMode ));
8321+ String .format ("Cannot change network mode when cloning %s provider network offerings. " +
8322+ "Source offering has network mode '%s', but '%s' was specified. " ,
8323+ detectedProvider , sourceOffering .getNetworkMode (), networkMode ));
83308324 }
83318325 }
83328326 }
8327+ }
83338328
8334- applySourceOfferingValuesToCloneCmd (cmd , sourceOffering );
8329+ public static String getExternalNetworkProvider (String detectedProvider ,
8330+ Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap ) {
8331+ if (StringUtils .isNotEmpty (detectedProvider )) {
8332+ return detectedProvider ;
8333+ }
83358334
8336- return createNetworkOffering (cmd );
8335+ if (sourceServiceProviderMap == null || sourceServiceProviderMap .isEmpty ()) {
8336+ return null ;
8337+ }
8338+
8339+ for (Set <Provider > providers : sourceServiceProviderMap .values ()) {
8340+ if (CollectionUtils .isEmpty (providers )) {
8341+ continue ;
8342+ }
8343+ for (Provider provider : providers ) {
8344+ if (provider == Provider .Nsx ) {
8345+ return "NSX" ;
8346+ }
8347+ if (provider == Provider .Netris ) {
8348+ return "Netris" ;
8349+ }
8350+ }
8351+ }
8352+
8353+ return null ;
83378354 }
83388355
83398356 /**
@@ -8364,12 +8381,11 @@ private Map<String, Map<String, String>> convertToApiParameterFormat(Map<String,
83648381 return apiFormatMap ;
83658382 }
83668383
8367- private void applySourceOfferingValuesToCloneCmd (CloneNetworkOfferingCmd cmd , NetworkOfferingVO sourceOffering ) {
8384+ private void applySourceOfferingValuesToCloneCmd (CloneNetworkOfferingCmd cmd ,
8385+ Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap ,
8386+ NetworkOfferingVO sourceOffering ) {
83688387 Long sourceOfferingId = sourceOffering .getId ();
83698388
8370- Map <Network .Service , Set <Network .Provider >> sourceServiceProviderMap =
8371- _networkModel .getNetworkOfferingServiceProvidersMap (sourceOfferingId );
8372-
83738389 // Build final services list with add/drop support
83748390 List <String > finalServices = resolveFinalServicesList (cmd , sourceServiceProviderMap );
83758391
0 commit comments