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

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


The following commit(s) were added to refs/heads/main by this push:
     new 69998f7c40f api,server: support templatetype when upload template from 
local (#11682)
69998f7c40f is described below

commit 69998f7c40fb0179b2ab5edcf50927c0e9f1fc17
Author: Wei Zhou <[email protected]>
AuthorDate: Mon Sep 22 10:46:43 2025 +0200

    api,server: support templatetype when upload template from local (#11682)
---
 .../template/GetUploadParamsForTemplateCmd.java    |  9 +++++++
 .../upload/params/TemplateUploadParams.java        |  5 ++--
 .../cloud/storage/upload/params/UploadParams.java  |  2 ++
 .../storage/upload/params/UploadParamsBase.java    | 28 ++++++++++++++++------
 .../com/cloud/template/TemplateAdapterBase.java    | 16 +++++++++----
 .../com/cloud/template/TemplateManagerImpl.java    |  5 +++-
 6 files changed, 50 insertions(+), 15 deletions(-)

diff --git 
a/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java
 
b/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java
index 330224a6055..2472a03b890 100644
--- 
a/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java
+++ 
b/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java
@@ -104,6 +104,11 @@ public class GetUploadParamsForTemplateCmd extends 
AbstractGetUploadParamsCmd {
             description = "if true, the templates would be available for 
deploying CKS clusters", since = "4.21.0")
     protected Boolean forCks;
 
+    @Parameter(name = ApiConstants.TEMPLATE_TYPE, type = CommandType.STRING,
+            description = "the type of the template. Valid options are: 
USER/VNF (for all users) and SYSTEM/ROUTING/BUILTIN (for admins only).",
+            since = "4.22.0")
+    private String templateType;
+
     public String getDisplayText() {
         return StringUtils.isBlank(displayText) ? getName() : displayText;
     }
@@ -181,6 +186,10 @@ public class GetUploadParamsForTemplateCmd extends 
AbstractGetUploadParamsCmd {
         return CPU.CPUArch.fromType(arch);
     }
 
+    public String getTemplateType() {
+        return templateType;
+    }
+
     @Override
     public void execute() throws ServerApiException {
         validateRequest();
diff --git 
a/server/src/main/java/com/cloud/storage/upload/params/TemplateUploadParams.java
 
b/server/src/main/java/com/cloud/storage/upload/params/TemplateUploadParams.java
index 769aa3dc1f2..aae7c0be812 100644
--- 
a/server/src/main/java/com/cloud/storage/upload/params/TemplateUploadParams.java
+++ 
b/server/src/main/java/com/cloud/storage/upload/params/TemplateUploadParams.java
@@ -30,10 +30,11 @@ public class TemplateUploadParams extends UploadParamsBase {
                                 Long zoneId, Hypervisor.HypervisorType 
hypervisorType, String chksum,
                                 String templateTag, long templateOwnerId,
                                 Map details, Boolean sshkeyEnabled,
-                                Boolean isDynamicallyScalable, Boolean 
isRoutingType, boolean deployAsIs, boolean forCks) {
+                                Boolean isDynamicallyScalable, Boolean 
isRoutingType, boolean deployAsIs,
+                                boolean forCks, String templateType) {
         super(userId, name, displayText, arch, bits, passwordEnabled, 
requiresHVM, isPublic, featured, isExtractable,
                 format, guestOSId, zoneId, hypervisorType, chksum, 
templateTag, templateOwnerId, details,
-                sshkeyEnabled, isDynamicallyScalable, isRoutingType, 
deployAsIs, forCks);
+                sshkeyEnabled, isDynamicallyScalable, isRoutingType, 
deployAsIs, forCks, templateType);
         setBootable(true);
     }
 }
diff --git 
a/server/src/main/java/com/cloud/storage/upload/params/UploadParams.java 
b/server/src/main/java/com/cloud/storage/upload/params/UploadParams.java
index 7be526d780d..5738cfaad88 100644
--- a/server/src/main/java/com/cloud/storage/upload/params/UploadParams.java
+++ b/server/src/main/java/com/cloud/storage/upload/params/UploadParams.java
@@ -49,4 +49,6 @@ public interface UploadParams {
     boolean isDirectDownload();
     boolean isDeployAsIs();
     CPU.CPUArch getArch();
+    boolean isForCks();
+    String getTemplateType();
 }
diff --git 
a/server/src/main/java/com/cloud/storage/upload/params/UploadParamsBase.java 
b/server/src/main/java/com/cloud/storage/upload/params/UploadParamsBase.java
index c3499d75c3b..945551a9318 100644
--- a/server/src/main/java/com/cloud/storage/upload/params/UploadParamsBase.java
+++ b/server/src/main/java/com/cloud/storage/upload/params/UploadParamsBase.java
@@ -48,15 +48,17 @@ public abstract class UploadParamsBase implements 
UploadParams {
     private boolean deployAsIs;
     private boolean forCks;
     private CPU.CPUArch arch;
+    private String templateType;
 
     UploadParamsBase(long userId, String name, String displayText, CPU.CPUArch 
arch,
-                               Integer bits, boolean passwordEnabled, boolean 
requiresHVM,
-                               boolean isPublic, boolean featured,
-                               boolean isExtractable, String format, Long 
guestOSId,
-                               Long zoneId, Hypervisor.HypervisorType 
hypervisorType, String checksum,
-                               String templateTag, long templateOwnerId,
-                               Map details, boolean sshkeyEnabled,
-                               boolean isDynamicallyScalable, boolean 
isRoutingType, boolean deployAsIs, boolean forCks) {
+                     Integer bits, boolean passwordEnabled, boolean 
requiresHVM,
+                     boolean isPublic, boolean featured,
+                     boolean isExtractable, String format, Long guestOSId,
+                     Long zoneId, Hypervisor.HypervisorType hypervisorType, 
String checksum,
+                     String templateTag, long templateOwnerId,
+                     Map details, boolean sshkeyEnabled,
+                     boolean isDynamicallyScalable, boolean isRoutingType, 
boolean deployAsIs,
+                     boolean forCks, String templateType) {
         this.userId = userId;
         this.name = name;
         this.displayText = displayText;
@@ -79,6 +81,8 @@ public abstract class UploadParamsBase implements 
UploadParams {
         this.isDynamicallyScalable = isDynamicallyScalable;
         this.isRoutingType = isRoutingType;
         this.deployAsIs = deployAsIs;
+        this.forCks = forCks;
+        this.templateType = templateType;
     }
 
     UploadParamsBase(long userId, String name, String displayText, boolean 
isPublic, boolean isFeatured,
@@ -261,4 +265,14 @@ public abstract class UploadParamsBase implements 
UploadParams {
     public void setArch(CPU.CPUArch arch) {
         this.arch = arch;
     }
+
+    @Override
+    public boolean isForCks() {
+        return forCks;
+    }
+
+    @Override
+    public String getTemplateType() {
+        return templateType;
+    }
 }
diff --git a/server/src/main/java/com/cloud/template/TemplateAdapterBase.java 
b/server/src/main/java/com/cloud/template/TemplateAdapterBase.java
index 75c63aebe0d..a9adfa93236 100644
--- a/server/src/main/java/com/cloud/template/TemplateAdapterBase.java
+++ b/server/src/main/java/com/cloud/template/TemplateAdapterBase.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import javax.inject.Inject;
 
 import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseCmd;
 import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
 import org.apache.cloudstack.api.command.user.iso.GetUploadParamsForIsoCmd;
 import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
@@ -469,7 +470,7 @@ public abstract class TemplateAdapterBase extends 
AdapterBase implements Templat
     /**
      * Prepare upload parameters internal method for templates and ISOs local 
upload
      */
-    private TemplateProfile prepareUploadParamsInternal(UploadParams params) 
throws ResourceAllocationException {
+    private TemplateProfile prepareUploadParamsInternal(BaseCmd cmd, 
UploadParams params) throws ResourceAllocationException {
         //check if the caller can operate with the template owner
         Account caller = CallContext.current().getCallingAccount();
         Account owner = _accountMgr.getAccount(params.getTemplateOwnerId());
@@ -490,12 +491,16 @@ public abstract class TemplateAdapterBase extends 
AdapterBase implements Templat
                     
StringUtils.join(Arrays.stream(HypervisorType.values()).filter(h -> h != 
HypervisorType.None).map(HypervisorType::name).toArray(), ", ")));
         }
 
+        TemplateType templateType = templateMgr.validateTemplateType(cmd, 
_accountMgr.isAdmin(caller.getAccountId()),
+                false, params.getHypervisorType());
+
         return prepare(params.isIso(), params.getUserId(), params.getName(), 
params.getDisplayText(), params.getArch(), params.getBits(),
                 params.isPasswordEnabled(), params.requiresHVM(), 
params.getUrl(), params.isPublic(), params.isFeatured(),
                 params.isExtractable(), params.getFormat(), 
params.getGuestOSId(), zoneList,
                 params.getHypervisorType(), params.getChecksum(), 
params.isBootable(), params.getTemplateTag(), owner,
                 params.getDetails(), params.isSshKeyEnabled(), 
params.getImageStoreUuid(),
-                params.isDynamicallyScalable(), params.isRoutingType() ? 
TemplateType.ROUTING : TemplateType.USER, params.isDirectDownload(), 
params.isDeployAsIs(), false, null);
+                params.isDynamicallyScalable(), templateType, 
params.isDirectDownload(), params.isDeployAsIs(),
+                params.isForCks(), null);
     }
 
     private Long getDefaultDeployAsIsGuestOsId() {
@@ -516,8 +521,9 @@ public abstract class TemplateAdapterBase extends 
AdapterBase implements Templat
                 BooleanUtils.toBoolean(cmd.isFeatured()), 
BooleanUtils.toBoolean(cmd.isExtractable()), cmd.getFormat(), osTypeId,
                 cmd.getZoneId(), HypervisorType.getType(cmd.getHypervisor()), 
cmd.getChecksum(),
                 cmd.getTemplateTag(), cmd.getEntityOwnerId(), 
cmd.getDetails(), BooleanUtils.toBoolean(cmd.isSshKeyEnabled()),
-                BooleanUtils.toBoolean(cmd.isDynamicallyScalable()), 
BooleanUtils.toBoolean(cmd.isRoutingType()), cmd.isDeployAsIs(), 
cmd.isForCks());
-        return prepareUploadParamsInternal(params);
+                BooleanUtils.toBoolean(cmd.isDynamicallyScalable()), 
BooleanUtils.toBoolean(cmd.isRoutingType()), cmd.isDeployAsIs(),
+                cmd.isForCks(), cmd.getTemplateType());
+        return prepareUploadParamsInternal(cmd, params);
     }
 
     @Override
@@ -526,7 +532,7 @@ public abstract class TemplateAdapterBase extends 
AdapterBase implements Templat
                 cmd.getDisplayText(), BooleanUtils.toBoolean(cmd.isPublic()), 
BooleanUtils.toBoolean(cmd.isFeatured()),
                 BooleanUtils.toBoolean(cmd.isExtractable()), cmd.getOsTypeId(),
                 cmd.getZoneId(), BooleanUtils.toBoolean(cmd.isBootable()), 
cmd.getEntityOwnerId());
-        return prepareUploadParamsInternal(params);
+        return prepareUploadParamsInternal(cmd, params);
     }
 
     @Override
diff --git a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java 
b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
index 5518a29955b..7bb66958cb4 100755
--- a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
@@ -2339,7 +2339,7 @@ public class TemplateManagerImpl extends ManagerBase 
implements TemplateManager,
 
     @Override
     public TemplateType validateTemplateType(BaseCmd cmd, boolean isAdmin, 
boolean isCrossZones, HypervisorType hypervisorType) {
-        if (!(cmd instanceof UpdateTemplateCmd) && !(cmd instanceof 
RegisterTemplateCmd)) {
+        if (!(cmd instanceof UpdateTemplateCmd) && !(cmd instanceof 
RegisterTemplateCmd) && !(cmd instanceof GetUploadParamsForTemplateCmd)) {
             return null;
         }
         TemplateType templateType = null;
@@ -2351,6 +2351,9 @@ public class TemplateManagerImpl extends ManagerBase 
implements TemplateManager,
         } else if (cmd instanceof RegisterTemplateCmd) {
             newType = ((RegisterTemplateCmd)cmd).getTemplateType();
             isRoutingType = ((RegisterTemplateCmd)cmd).isRoutingType();
+        } else if (cmd instanceof GetUploadParamsForTemplateCmd) {
+            newType = ((GetUploadParamsForTemplateCmd)cmd).getTemplateType();
+            isRoutingType = 
((GetUploadParamsForTemplateCmd)cmd).isRoutingType();
         }
         if (newType != null) {
             try {

Reply via email to