You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by we...@apache.org on 2024/06/20 07:56:21 UTC

(cloudstack) branch main updated (3e6900ac1a5 -> fbeee491377)

This is an automated email from the ASF dual-hosted git repository.

weizhou pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


    from 3e6900ac1a5 api,server: purge expunged resources (#8999)
     add 8b02624e610 User data content size validation, and related code improvements (#8418)
     add 227c15624d9 vxlan: do not create duplicated network for private gateway (#9232)
     add 7a0cd55e989 ui: fix user create featured template from volume (#9253)
     add 2315a73a209 User friendly name of Downloaded Templates Volumes and ISOs (#9252)
     add 81269ad62af VNF: add API listVnfAppliances (#8994)
     add cc52b38e54d Update extraconfig for platform param in xen/xcpng (#9248)
     add 3997e596786 Merge release branch 4.18 to 4.19
     add 84b91cc9a3d assertion improvement on cluster DRS (#8508)
     new d81ffd2d864 Merge remote-tracking branch 'apache/4.19'
     new fbeee491377 fix build errors after forward-merge

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 PULL_REQUEST_TEMPLATE.md                           |  1 +
 ...Admin.java => ListVnfAppliancesCmdByAdmin.java} | 18 ++---
 .../autoscale/CreateAutoScaleVmProfileCmd.java     |  2 +-
 .../autoscale/UpdateAutoScaleVmProfileCmd.java     |  2 +-
 .../command/user/userdata/RegisterUserDataCmd.java |  9 ++-
 .../api/command/user/vm/DeployVMCmd.java           |  6 +-
 .../ListVnfAppliancesCmd.java}                     | 20 ++++--
 .../api/command/user/vm/ResetVMUserDataCmd.java    |  2 +-
 .../api/command/user/vm/UpdateVMCmd.java           |  2 +-
 .../api/response/AutoScaleVmProfileResponse.java   |  2 +-
 .../api/response/VMUserDataResponse.java           |  2 +-
 .../cloudstack/userdata/UserDataManager.java       |  5 ++
 .../storage/CreateEntityDownloadURLCommand.java    | 27 +++++---
 .../engine/subsystem/api/storage/DataObject.java   |  2 +
 .../cloud/configuration/ConfigurationManager.java  |  3 -
 .../cloudstack/userdata/UserDataManagerImpl.java   | 81 ++++++++++++----------
 .../xenserver/ExtraConfigurationUtility.java       | 50 +++++++++----
 .../xenserver/ExtraConfigurationUtilityTest.java   | 52 ++++++++++++++
 .../cloud/network/guru/VxlanGuestNetworkGuru.java  |  2 +-
 .../driver/CloudStackImageStoreDriverImpl.java     | 44 +++++++++---
 .../configuration/ConfigurationManagerImpl.java    |  7 +-
 .../com/cloud/network/as/AutoScaleManagerImpl.java |  7 +-
 .../cloud/storage/upload/UploadMonitorImpl.java    |  4 +-
 .../src/main/java/com/cloud/vm/UserVmManager.java  |  2 -
 .../main/java/com/cloud/vm/UserVmManagerImpl.java  | 55 +--------------
 .../diagnostics/to/DiagnosticsDataObject.java      |  5 ++
 .../storage/template/VnfTemplateManagerImpl.java   |  4 ++
 .../cloud/network/as/AutoScaleManagerImplTest.java | 10 ++-
 .../storage/template/UploadManagerImpl.java        |  5 +-
 test/integration/smoke/test_cluster_drs.py         | 61 +++++++++++++---
 ui/src/config/section/image.js                     |  2 +-
 ui/src/config/section/network.js                   |  4 +-
 ui/src/config/section/storage.js                   |  8 ++-
 ui/src/views/network/VnfAppliancesTab.vue          |  2 +-
 34 files changed, 330 insertions(+), 178 deletions(-)
 copy api/src/main/java/org/apache/cloudstack/api/command/admin/vm/{DeployVnfApplianceCmdByAdmin.java => ListVnfAppliancesCmdByAdmin.java} (71%)
 copy api/src/main/java/org/apache/cloudstack/api/command/user/{template/ListVnfTemplatesCmd.java => vm/ListVnfAppliancesCmd.java} (68%)
 create mode 100644 plugins/hypervisors/xenserver/src/test/java/org/apache/cloudstack/hypervisor/xenserver/ExtraConfigurationUtilityTest.java


(cloudstack) 02/02: fix build errors after forward-merge

Posted by we...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

weizhou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit fbeee491377e28e945ded7be94682bcd4a24bbbe
Author: Wei Zhou <we...@apache.org>
AuthorDate: Thu Jun 20 09:55:35 2024 +0200

    fix build errors after forward-merge
---
 .../java/com/cloud/configuration/ConfigurationManager.java |  1 +
 .../apache/cloudstack/userdata/UserDataManagerImpl.java    | 14 ++++++--------
 .../hypervisor/xenserver/ExtraConfigurationUtility.java    |  2 +-
 3 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java b/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java
index d078a86b06a..c877ebbe8d2 100644
--- a/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java
+++ b/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java
@@ -21,6 +21,7 @@ import java.util.Map;
 import java.util.Set;
 
 import com.cloud.dc.VlanVO;
+import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.impl.ConfigurationSubGroupVO;
 
 import com.cloud.dc.ClusterVO;
diff --git a/engine/userdata/src/main/java/org/apache/cloudstack/userdata/UserDataManagerImpl.java b/engine/userdata/src/main/java/org/apache/cloudstack/userdata/UserDataManagerImpl.java
index 81a77fa5c0b..664d308e28d 100644
--- a/engine/userdata/src/main/java/org/apache/cloudstack/userdata/UserDataManagerImpl.java
+++ b/engine/userdata/src/main/java/org/apache/cloudstack/userdata/UserDataManagerImpl.java
@@ -26,14 +26,12 @@ import org.apache.cloudstack.api.BaseCmd;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.log4j.Logger;
 
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 public class UserDataManagerImpl extends ManagerBase implements UserDataManager {
-    private static final Logger s_logger = Logger.getLogger(UserDataManagerImpl.class);
     private static final int MAX_USER_DATA_LENGTH_BYTES = 2048;
     private static final int MAX_HTTP_GET_LENGTH = 2 * MAX_USER_DATA_LENGTH_BYTES; // 4KB
     private static final int NUM_OF_2K_BLOCKS = 512;
@@ -89,9 +87,9 @@ public class UserDataManagerImpl extends ManagerBase implements UserDataManager
 
     @Override
     public String validateUserData(String userData, BaseCmd.HTTPMethod httpmethod) {
-        s_logger.trace(String.format("Validating base64 encoded user data: [%s].", userData));
+        logger.trace(String.format("Validating base64 encoded user data: [%s].", userData));
         if (StringUtils.isBlank(userData)) {
-            s_logger.debug("Null/empty base64 encoded user data set");
+            logger.debug("Null/empty base64 encoded user data set");
             return null;
         }
 
@@ -126,17 +124,17 @@ public class UserDataManagerImpl extends ManagerBase implements UserDataManager
             throw new InvalidParameterValueException("User data is too short.");
         }
 
-        s_logger.trace(String.format("Decoded user data: [%s].", decodedUserData));
+        logger.trace(String.format("Decoded user data: [%s].", decodedUserData));
         int userDataLength = userData.length();
         int decodedUserDataLength = decodedUserData.length;
-        s_logger.info(String.format("Configured base64 encoded user data size: %d bytes, actual user data size: %d bytes", userDataLength, decodedUserDataLength));
+        logger.info(String.format("Configured base64 encoded user data size: %d bytes, actual user data size: %d bytes", userDataLength, decodedUserDataLength));
 
         if (userDataLength > maxHTTPLength) {
-            s_logger.warn(String.format("Base64 encoded user data (size: %d bytes) too long for http %s request (accepted size: %d bytes)", userDataLength, httpMethod.toString(), maxHTTPLength));
+            logger.warn(String.format("Base64 encoded user data (size: %d bytes) too long for http %s request (accepted size: %d bytes)", userDataLength, httpMethod.toString(), maxHTTPLength));
             throw new InvalidParameterValueException(String.format("User data is too long for http %s request", httpMethod.toString()));
         }
         if (userDataLength > VM_USERDATA_MAX_LENGTH.value()) {
-            s_logger.warn(String.format("Base64 encoded user data (size: %d bytes) has exceeded configurable max length of %d bytes", userDataLength, VM_USERDATA_MAX_LENGTH.value()));
+            logger.warn(String.format("Base64 encoded user data (size: %d bytes) has exceeded configurable max length of %d bytes", userDataLength, VM_USERDATA_MAX_LENGTH.value()));
             throw new InvalidParameterValueException("User data has exceeded configurable max length: " + VM_USERDATA_MAX_LENGTH.value());
         }
 
diff --git a/plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/hypervisor/xenserver/ExtraConfigurationUtility.java b/plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/hypervisor/xenserver/ExtraConfigurationUtility.java
index 94586af179a..97efbea02df 100644
--- a/plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/hypervisor/xenserver/ExtraConfigurationUtility.java
+++ b/plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/hypervisor/xenserver/ExtraConfigurationUtility.java
@@ -39,7 +39,7 @@ public class ExtraConfigurationUtility {
             // cfg is either param=value or map-param:key=value
             Pair<String, String> configParam = prepareKeyValuePair(cfg);
             if (configParam == null) {
-                LOG.warn("Invalid extra config passed: " + cfg);
+                LOGGER.warn("Invalid extra config passed: " + cfg);
                 continue;
             }
 


(cloudstack) 01/02: Merge remote-tracking branch 'apache/4.19'

Posted by we...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

weizhou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit d81ffd2d86493e06d5f0baebd8b117086bc32667
Merge: 3e6900ac1a5 84b91cc9a3d
Author: Wei Zhou <we...@apache.org>
AuthorDate: Thu Jun 20 08:57:17 2024 +0200

    Merge remote-tracking branch 'apache/4.19'

 PULL_REQUEST_TEMPLATE.md                           |  1 +
 .../admin/vm/ListVnfAppliancesCmdByAdmin.java      | 36 ++++++++++
 .../autoscale/CreateAutoScaleVmProfileCmd.java     |  2 +-
 .../autoscale/UpdateAutoScaleVmProfileCmd.java     |  2 +-
 .../command/user/userdata/RegisterUserDataCmd.java |  9 ++-
 .../api/command/user/vm/DeployVMCmd.java           |  6 +-
 .../api/command/user/vm/ListVnfAppliancesCmd.java  | 39 ++++++++++
 .../api/command/user/vm/ResetVMUserDataCmd.java    |  2 +-
 .../api/command/user/vm/UpdateVMCmd.java           |  2 +-
 .../api/response/AutoScaleVmProfileResponse.java   |  2 +-
 .../api/response/VMUserDataResponse.java           |  2 +-
 .../cloudstack/userdata/UserDataManager.java       |  5 ++
 .../storage/CreateEntityDownloadURLCommand.java    | 27 ++++---
 .../engine/subsystem/api/storage/DataObject.java   |  2 +
 .../cloud/configuration/ConfigurationManager.java  |  4 --
 .../cloudstack/userdata/UserDataManagerImpl.java   | 83 ++++++++++++----------
 .../xenserver/ExtraConfigurationUtility.java       | 50 +++++++++----
 .../xenserver/ExtraConfigurationUtilityTest.java   | 52 ++++++++++++++
 .../cloud/network/guru/VxlanGuestNetworkGuru.java  |  2 +-
 .../driver/CloudStackImageStoreDriverImpl.java     | 44 +++++++++---
 .../configuration/ConfigurationManagerImpl.java    |  7 +-
 .../com/cloud/network/as/AutoScaleManagerImpl.java |  7 +-
 .../cloud/storage/upload/UploadMonitorImpl.java    |  4 +-
 .../src/main/java/com/cloud/vm/UserVmManager.java  |  2 -
 .../main/java/com/cloud/vm/UserVmManagerImpl.java  | 55 +-------------
 .../diagnostics/to/DiagnosticsDataObject.java      |  5 ++
 .../storage/template/VnfTemplateManagerImpl.java   |  4 ++
 .../cloud/network/as/AutoScaleManagerImplTest.java | 10 ++-
 .../storage/template/UploadManagerImpl.java        |  5 +-
 test/integration/smoke/test_cluster_drs.py         | 61 +++++++++++++---
 ui/src/config/section/image.js                     |  2 +-
 ui/src/config/section/network.js                   |  4 +-
 ui/src/config/section/storage.js                   |  8 ++-
 ui/src/views/network/VnfAppliancesTab.vue          |  2 +-
 34 files changed, 384 insertions(+), 164 deletions(-)

diff --cc engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java
index 0aff8435d9e,3341f6e6bb0..d078a86b06a
--- a/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java
+++ b/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java
@@@ -61,12 -60,6 +60,9 @@@ public interface ConfigurationManager 
      public static final String MESSAGE_CREATE_VLAN_IP_RANGE_EVENT = "Message.CreateVlanIpRange.Event";
      public static final String MESSAGE_DELETE_VLAN_IP_RANGE_EVENT = "Message.DeleteVlanIpRange.Event";
  
-     static final String VM_USERDATA_MAX_LENGTH_STRING = "vm.userdata.max.length";
-     static final ConfigKey<Integer> VM_USERDATA_MAX_LENGTH = new ConfigKey<>("Advanced", Integer.class, VM_USERDATA_MAX_LENGTH_STRING, "32768",
-             "Max length of vm userdata after base64 decoding. Default is 32768 and maximum is 1048576", true);
 +    public static final ConfigKey<Boolean> AllowNonRFC1918CompliantIPs = new ConfigKey<>(Boolean.class,
 +            "allow.non.rfc1918.compliant.ips", "Advanced", "false",
 +            "Allows non-compliant RFC 1918 IPs for Shared, Isolated networks and VPCs", true, null);
  
      /**
       * @param offering
diff --cc plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/hypervisor/xenserver/ExtraConfigurationUtility.java
index 64d83c1427b,a0a51b121c7..94586af179a
--- a/plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/hypervisor/xenserver/ExtraConfigurationUtility.java
+++ b/plugins/hypervisors/xenserver/src/main/java/org/apache/cloudstack/hypervisor/xenserver/ExtraConfigurationUtility.java
@@@ -16,11 -16,9 +16,10 @@@
  // under the License.
  package org.apache.cloudstack.hypervisor.xenserver;
  
- import java.util.HashMap;
  import java.util.Map;
  
 -import org.apache.log4j.Logger;
 +import org.apache.logging.log4j.Logger;
 +import org.apache.logging.log4j.LogManager;
  import org.apache.xmlrpc.XmlRpcException;
  
  import com.cloud.exception.InvalidParameterValueException;
@@@ -36,17 -35,22 +36,24 @@@ public class ExtraConfigurationUtility 
          Map<String, Object> recordMap = vmr.toMap();
          for (String key : extraConfig.keySet()) {
              String cfg = extraConfig.get(key);
-             Map<String, String> configParams = prepareKeyValuePair(cfg);
+             // cfg is either param=value or map-param:key=value
+             Pair<String, String> configParam = prepareKeyValuePair(cfg);
+             if (configParam == null) {
+                 LOG.warn("Invalid extra config passed: " + cfg);
+                 continue;
+             }
  
-             // paramKey is either param or param:key for map parameters
-             String paramKey = configParams.keySet().toString().replaceAll("[\\[\\]]", "");
-             String paramValue = configParams.get(paramKey);
+             // paramKey is either param or map-param:key for map parameters
+             String paramKey = configParam.first();
+             String paramValue = configParam.second();
  
 +            //Map params
 +            LOGGER.debug("Applying [{}] configuration as [{}].", paramKey, paramValue);
              if (paramKey.contains(":")) {
+                 // Map params - paramKey is map-param:key
                  applyConfigWithNestedKeyValue(conn, vm, recordMap, paramKey, paramValue);
              } else {
+                 // Params - paramKey is param
                  applyConfigWithKeyValue(conn, vm, recordMap, paramKey, paramValue);
              }
          }
@@@ -75,21 -75,22 +83,22 @@@
          }
  
          try {
+             // map-param param with '_'
              switch (actualParam) {
                  case "VCPUs_params":
 -                    vm.addToVCPUsParams(conn, keyName, paramValue);
 +                    vm.setVCPUsParams(conn, putInMap(vm.getVCPUsParams(conn), keyName, paramValue));
                      break;
                  case "platform":
-                     vm.setOtherConfig(conn, putInMap(vm.getOtherConfig(conn), keyName, paramValue));
+                     vm.addToPlatform(conn, keyName, paramValue);
                      break;
                  case "HVM_boot_params":
 -                    vm.addToHVMBootParams(conn, keyName, paramValue);
 +                    vm.setHVMBootParams(conn, putInMap(vm.getHVMBootParams(conn), keyName, paramValue));
                      break;
                  case "other_config":
 -                    vm.addToOtherConfig(conn, keyName, paramValue);
 +                    vm.setOtherConfig(conn, putInMap(vm.getOtherConfig(conn), keyName, paramValue));
                      break;
                  case "xenstore_data":
 -                    vm.addToXenstoreData(conn, keyName, paramValue);
 +                    vm.setXenstoreData(conn, putInMap(vm.getXenstoreData(conn), keyName, paramValue));
                      break;
                  default:
                      String msg = String.format("Passed configuration %s is not supported", paramKey);
diff --cc plugins/network-elements/vxlan/src/main/java/com/cloud/network/guru/VxlanGuestNetworkGuru.java
index a1ff8d309d9,410ed3c5c34..fc92775c697
--- a/plugins/network-elements/vxlan/src/main/java/com/cloud/network/guru/VxlanGuestNetworkGuru.java
+++ b/plugins/network-elements/vxlan/src/main/java/com/cloud/network/guru/VxlanGuestNetworkGuru.java
@@@ -57,10 -59,10 +57,10 @@@ public class VxlanGuestNetworkGuru exte
          // This guru handles only Guest Isolated network that supports Source nat service
          if (networkType == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) &&
                  (offering.getGuestType() == Network.GuestType.Isolated || offering.getGuestType() == Network.GuestType.L2) &&
-                 isMyIsolationMethod(physicalNetwork)) {
+                 isMyIsolationMethod(physicalNetwork) && !offering.isSystemOnly()) {
              return true;
          } else {
 -            s_logger.trace("We only take care of Guest networks of type   " + GuestType.Isolated + " or " + GuestType.L2 + " in zone of type " + NetworkType.Advanced);
 +            logger.trace("We only take care of Guest networks of type   " + GuestType.Isolated + " or " + GuestType.L2 + " in zone of type " + NetworkType.Advanced);
              return false;
          }
      }
diff --cc plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
index 3b5c47c5029,fca6db26169..d9a12d382ba
--- a/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
+++ b/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
@@@ -25,6 -25,8 +25,7 @@@ import javax.inject.Inject
  import com.cloud.agent.api.storage.DeleteEntityDownloadURLCommand;
  import com.cloud.host.dao.HostDao;
  import com.cloud.storage.Upload;
+ import com.cloud.utils.StringUtils;
 -import org.apache.log4j.Logger;
  
  import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
  import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
diff --cc server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
index ff7f0d4935e,f65dffb18cd..4f70149ad11
--- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
@@@ -7859,9 -7793,9 +7860,9 @@@ public class ConfigurationManagerImpl e
      @Override
      public ConfigKey<?>[] getConfigKeys() {
          return new ConfigKey<?>[] {SystemVMUseLocalStorage, IOPS_MAX_READ_LENGTH, IOPS_MAX_WRITE_LENGTH,
 -                BYTES_MAX_READ_LENGTH, BYTES_MAX_WRITE_LENGTH, ADD_HOST_ON_SERVICE_RESTART_KVM, SET_HOST_DOWN_TO_MAINTENANCE,
 -                VM_SERVICE_OFFERING_MAX_CPU_CORES, VM_SERVICE_OFFERING_MAX_RAM_SIZE, MIGRATE_VM_ACROSS_CLUSTERS,
 -                ENABLE_ACCOUNT_SETTINGS_FOR_DOMAIN, ENABLE_DOMAIN_SETTINGS_FOR_CHILD_DOMAIN, ALLOW_DOMAIN_ADMINS_TO_CREATE_TAGGED_OFFERINGS
 +                BYTES_MAX_READ_LENGTH, BYTES_MAX_WRITE_LENGTH, ADD_HOST_ON_SERVICE_RESTART_KVM, SET_HOST_DOWN_TO_MAINTENANCE, VM_SERVICE_OFFERING_MAX_CPU_CORES,
-                 VM_SERVICE_OFFERING_MAX_RAM_SIZE, VM_USERDATA_MAX_LENGTH, MIGRATE_VM_ACROSS_CLUSTERS, ENABLE_ACCOUNT_SETTINGS_FOR_DOMAIN,
++                VM_SERVICE_OFFERING_MAX_RAM_SIZE, MIGRATE_VM_ACROSS_CLUSTERS, ENABLE_ACCOUNT_SETTINGS_FOR_DOMAIN,
 +                ENABLE_DOMAIN_SETTINGS_FOR_CHILD_DOMAIN, ALLOW_DOMAIN_ADMINS_TO_CREATE_TAGGED_OFFERINGS, AllowNonRFC1918CompliantIPs
          };
      }
  
diff --cc server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index 427a0571222,f68b3a6237a..6406d75e866
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@@ -16,8 -16,6 +16,7 @@@
  // under the License.
  package com.cloud.vm;
  
- import static com.cloud.configuration.ConfigurationManagerImpl.VM_USERDATA_MAX_LENGTH;
 +import static com.cloud.storage.Volume.IOPS_LIMIT;
  import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
  import static org.apache.cloudstack.api.ApiConstants.MAX_IOPS;
  import static org.apache.cloudstack.api.ApiConstants.MIN_IOPS;
diff --cc services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java
index 468c20e9626,9c8587b6954..a14667886c7
--- a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java
+++ b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java
@@@ -266,7 -268,9 +266,8 @@@ public class UploadManagerImpl extends 
          }
          // Create the directory structure so that its visible under apache server root
          String extractDir = "/var/www/html/userdata/";
+         extractDir = extractDir + cmd.getFilepathInExtractURL() + File.separator;
 -        s_logger.info("HARI  " + extractDir);
 -        Script command = new Script("/bin/su", s_logger);
 +        Script command = new Script("/bin/su", logger);
          command.add("-s");
          command.add("/bin/bash");
          command.add("-c");
@@@ -288,11 -292,11 +289,11 @@@
          }
  
          // Create a random file under the directory for security reasons.
-         String uuid = cmd.getExtractLinkUUID();
+         String filename = cmd.getFilenameInExtractURL();
          // Create a symbolic link from the actual directory to the template location. The entity would be directly visible under /var/www/html/userdata/cmd.getInstallPath();
 -        command = new Script("/bin/bash", s_logger);
 +        command = new Script("/bin/bash", logger);
          command.add("-c");
-         command.add("ln -sf /mnt/SecStorage/" + cmd.getParent() + File.separator + cmd.getInstallPath() + " " + extractDir + uuid);
+         command.add("ln -sf /mnt/SecStorage/" + cmd.getParent() + File.separator + cmd.getInstallPath() + " " + extractDir + filename);
          result = command.execute();
          if (result != null) {
              String errorString = "Error in linking  err=" + result;