api,server: support templatetype when upload template from local (#11682)

This commit is contained in:
Wei Zhou 2025-09-22 10:46:43 +02:00 committed by GitHub
parent aca8732102
commit 69998f7c40
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 50 additions and 15 deletions

View File

@ -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") description = "if true, the templates would be available for deploying CKS clusters", since = "4.21.0")
protected Boolean forCks; 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() { public String getDisplayText() {
return StringUtils.isBlank(displayText) ? getName() : displayText; return StringUtils.isBlank(displayText) ? getName() : displayText;
} }
@ -181,6 +186,10 @@ public class GetUploadParamsForTemplateCmd extends AbstractGetUploadParamsCmd {
return CPU.CPUArch.fromType(arch); return CPU.CPUArch.fromType(arch);
} }
public String getTemplateType() {
return templateType;
}
@Override @Override
public void execute() throws ServerApiException { public void execute() throws ServerApiException {
validateRequest(); validateRequest();

View File

@ -30,10 +30,11 @@ public class TemplateUploadParams extends UploadParamsBase {
Long zoneId, Hypervisor.HypervisorType hypervisorType, String chksum, Long zoneId, Hypervisor.HypervisorType hypervisorType, String chksum,
String templateTag, long templateOwnerId, String templateTag, long templateOwnerId,
Map details, Boolean sshkeyEnabled, 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, super(userId, name, displayText, arch, bits, passwordEnabled, requiresHVM, isPublic, featured, isExtractable,
format, guestOSId, zoneId, hypervisorType, chksum, templateTag, templateOwnerId, details, format, guestOSId, zoneId, hypervisorType, chksum, templateTag, templateOwnerId, details,
sshkeyEnabled, isDynamicallyScalable, isRoutingType, deployAsIs, forCks); sshkeyEnabled, isDynamicallyScalable, isRoutingType, deployAsIs, forCks, templateType);
setBootable(true); setBootable(true);
} }
} }

View File

@ -49,4 +49,6 @@ public interface UploadParams {
boolean isDirectDownload(); boolean isDirectDownload();
boolean isDeployAsIs(); boolean isDeployAsIs();
CPU.CPUArch getArch(); CPU.CPUArch getArch();
boolean isForCks();
String getTemplateType();
} }

View File

@ -48,6 +48,7 @@ public abstract class UploadParamsBase implements UploadParams {
private boolean deployAsIs; private boolean deployAsIs;
private boolean forCks; private boolean forCks;
private CPU.CPUArch arch; private CPU.CPUArch arch;
private String templateType;
UploadParamsBase(long userId, String name, String displayText, CPU.CPUArch arch, UploadParamsBase(long userId, String name, String displayText, CPU.CPUArch arch,
Integer bits, boolean passwordEnabled, boolean requiresHVM, Integer bits, boolean passwordEnabled, boolean requiresHVM,
@ -56,7 +57,8 @@ public abstract class UploadParamsBase implements UploadParams {
Long zoneId, Hypervisor.HypervisorType hypervisorType, String checksum, Long zoneId, Hypervisor.HypervisorType hypervisorType, String checksum,
String templateTag, long templateOwnerId, String templateTag, long templateOwnerId,
Map details, boolean sshkeyEnabled, Map details, boolean sshkeyEnabled,
boolean isDynamicallyScalable, boolean isRoutingType, boolean deployAsIs, boolean forCks) { boolean isDynamicallyScalable, boolean isRoutingType, boolean deployAsIs,
boolean forCks, String templateType) {
this.userId = userId; this.userId = userId;
this.name = name; this.name = name;
this.displayText = displayText; this.displayText = displayText;
@ -79,6 +81,8 @@ public abstract class UploadParamsBase implements UploadParams {
this.isDynamicallyScalable = isDynamicallyScalable; this.isDynamicallyScalable = isDynamicallyScalable;
this.isRoutingType = isRoutingType; this.isRoutingType = isRoutingType;
this.deployAsIs = deployAsIs; this.deployAsIs = deployAsIs;
this.forCks = forCks;
this.templateType = templateType;
} }
UploadParamsBase(long userId, String name, String displayText, boolean isPublic, boolean isFeatured, 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) { public void setArch(CPU.CPUArch arch) {
this.arch = arch; this.arch = arch;
} }
@Override
public boolean isForCks() {
return forCks;
}
@Override
public String getTemplateType() {
return templateType;
}
} }

View File

@ -29,6 +29,7 @@ import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import org.apache.cloudstack.api.ApiConstants; 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.DeleteIsoCmd;
import org.apache.cloudstack.api.command.user.iso.GetUploadParamsForIsoCmd; import org.apache.cloudstack.api.command.user.iso.GetUploadParamsForIsoCmd;
import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd; 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 * 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 //check if the caller can operate with the template owner
Account caller = CallContext.current().getCallingAccount(); Account caller = CallContext.current().getCallingAccount();
Account owner = _accountMgr.getAccount(params.getTemplateOwnerId()); 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(), ", "))); 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(), 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.isPasswordEnabled(), params.requiresHVM(), params.getUrl(), params.isPublic(), params.isFeatured(),
params.isExtractable(), params.getFormat(), params.getGuestOSId(), zoneList, params.isExtractable(), params.getFormat(), params.getGuestOSId(), zoneList,
params.getHypervisorType(), params.getChecksum(), params.isBootable(), params.getTemplateTag(), owner, params.getHypervisorType(), params.getChecksum(), params.isBootable(), params.getTemplateTag(), owner,
params.getDetails(), params.isSshKeyEnabled(), params.getImageStoreUuid(), 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() { 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, BooleanUtils.toBoolean(cmd.isFeatured()), BooleanUtils.toBoolean(cmd.isExtractable()), cmd.getFormat(), osTypeId,
cmd.getZoneId(), HypervisorType.getType(cmd.getHypervisor()), cmd.getChecksum(), cmd.getZoneId(), HypervisorType.getType(cmd.getHypervisor()), cmd.getChecksum(),
cmd.getTemplateTag(), cmd.getEntityOwnerId(), cmd.getDetails(), BooleanUtils.toBoolean(cmd.isSshKeyEnabled()), cmd.getTemplateTag(), cmd.getEntityOwnerId(), cmd.getDetails(), BooleanUtils.toBoolean(cmd.isSshKeyEnabled()),
BooleanUtils.toBoolean(cmd.isDynamicallyScalable()), BooleanUtils.toBoolean(cmd.isRoutingType()), cmd.isDeployAsIs(), cmd.isForCks()); BooleanUtils.toBoolean(cmd.isDynamicallyScalable()), BooleanUtils.toBoolean(cmd.isRoutingType()), cmd.isDeployAsIs(),
return prepareUploadParamsInternal(params); cmd.isForCks(), cmd.getTemplateType());
return prepareUploadParamsInternal(cmd, params);
} }
@Override @Override
@ -526,7 +532,7 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
cmd.getDisplayText(), BooleanUtils.toBoolean(cmd.isPublic()), BooleanUtils.toBoolean(cmd.isFeatured()), cmd.getDisplayText(), BooleanUtils.toBoolean(cmd.isPublic()), BooleanUtils.toBoolean(cmd.isFeatured()),
BooleanUtils.toBoolean(cmd.isExtractable()), cmd.getOsTypeId(), BooleanUtils.toBoolean(cmd.isExtractable()), cmd.getOsTypeId(),
cmd.getZoneId(), BooleanUtils.toBoolean(cmd.isBootable()), cmd.getEntityOwnerId()); cmd.getZoneId(), BooleanUtils.toBoolean(cmd.isBootable()), cmd.getEntityOwnerId());
return prepareUploadParamsInternal(params); return prepareUploadParamsInternal(cmd, params);
} }
@Override @Override

View File

@ -2339,7 +2339,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
@Override @Override
public TemplateType validateTemplateType(BaseCmd cmd, boolean isAdmin, boolean isCrossZones, HypervisorType hypervisorType) { 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; return null;
} }
TemplateType templateType = null; TemplateType templateType = null;
@ -2351,6 +2351,9 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
} else if (cmd instanceof RegisterTemplateCmd) { } else if (cmd instanceof RegisterTemplateCmd) {
newType = ((RegisterTemplateCmd)cmd).getTemplateType(); newType = ((RegisterTemplateCmd)cmd).getTemplateType();
isRoutingType = ((RegisterTemplateCmd)cmd).isRoutingType(); isRoutingType = ((RegisterTemplateCmd)cmd).isRoutingType();
} else if (cmd instanceof GetUploadParamsForTemplateCmd) {
newType = ((GetUploadParamsForTemplateCmd)cmd).getTemplateType();
isRoutingType = ((GetUploadParamsForTemplateCmd)cmd).isRoutingType();
} }
if (newType != null) { if (newType != null) {
try { try {