This is an automated email from the ASF dual-hosted git repository.
sureshanaparti 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 1f1e38f3a85 Support to list templates in ready state (new API
parameter 'isready', similar to list ISOs) (#11343)
1f1e38f3a85 is described below
commit 1f1e38f3a85f6bfe3e941c88671e36878a971fda
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Thu Jul 31 10:08:35 2025 +0530
Support to list templates in ready state (new API parameter 'isready',
similar to list ISOs) (#11343)
* Support to list templates in ready state (new API parameter 'isready',
similar to list ISOs), and UI to display Templates/ISOs in ready state wherever
applicable
---
.../cloudstack/api/command/user/iso/ListIsosCmd.java | 2 +-
.../api/command/user/template/ListTemplatesCmd.java | 14 ++++++++++++++
ui/src/views/compute/AttachIso.vue | 4 ++--
ui/src/views/compute/AutoScaleVmProfile.vue | 1 +
ui/src/views/compute/CreateAutoScaleVmGroup.vue | 2 ++
ui/src/views/compute/CreateKubernetesCluster.vue | 3 ++-
ui/src/views/compute/DeployVM.vue | 4 ++++
ui/src/views/compute/DeployVnfAppliance.vue | 1 +
ui/src/views/compute/EditVM.vue | 1 +
ui/src/views/compute/ReinstallVm.vue | 1 +
ui/src/views/compute/ResetUserData.vue | 1 +
ui/src/views/compute/ScaleVM.vue | 1 +
ui/src/views/tools/ImportUnmanagedInstance.vue | 1 +
13 files changed, 32 insertions(+), 4 deletions(-)
diff --git
a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
index 760a531e899..346eca8cff0 100644
---
a/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
+++
b/api/src/main/java/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
@@ -57,7 +57,7 @@ public class ListIsosCmd extends BaseListTaggedResourcesCmd
implements UserCmd {
@Parameter(name = ApiConstants.IS_PUBLIC, type = CommandType.BOOLEAN,
description = "true if the ISO is publicly available to all users, false
otherwise.")
private Boolean publicIso;
- @Parameter(name = ApiConstants.IS_READY, type = CommandType.BOOLEAN,
description = "true if this ISO is ready to be deployed")
+ @Parameter(name = ApiConstants.IS_READY, type = CommandType.BOOLEAN,
description = "list ISOs that are ready to be deployed")
private Boolean ready;
@Parameter(name = ApiConstants.ISO_FILTER,
diff --git
a/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
b/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
index 4727e395c41..223ac57b11f 100644
---
a/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
+++
b/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
@@ -126,6 +126,9 @@ public class ListTemplatesCmd extends
BaseListTaggedResourcesCmd implements User
since = "4.21.0")
private Long extensionId;
+ @Parameter(name = ApiConstants.IS_READY, type = CommandType.BOOLEAN,
description = "list templates that are ready to be deployed", since = "4.21.0")
+ private Boolean ready;
+
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@@ -195,6 +198,13 @@ public class ListTemplatesCmd extends
BaseListTaggedResourcesCmd implements User
boolean onlyReady =
(templateFilter == TemplateFilter.featured) || (templateFilter ==
TemplateFilter.selfexecutable) || (templateFilter ==
TemplateFilter.sharedexecutable) ||
(templateFilter == TemplateFilter.executable &&
isAccountSpecific) || (templateFilter == TemplateFilter.community);
+
+ if (!onlyReady) {
+ if (isReady() != null && isReady().booleanValue() != onlyReady) {
+ onlyReady = isReady().booleanValue();
+ }
+ }
+
return onlyReady;
}
@@ -230,6 +240,10 @@ public class ListTemplatesCmd extends
BaseListTaggedResourcesCmd implements User
return extensionId;
}
+ public Boolean isReady() {
+ return ready;
+ }
+
@Override
public String getCommandName() {
return s_name;
diff --git a/ui/src/views/compute/AttachIso.vue
b/ui/src/views/compute/AttachIso.vue
index 9a1bcb50a42..aafed017a21 100644
--- a/ui/src/views/compute/AttachIso.vue
+++ b/ui/src/views/compute/AttachIso.vue
@@ -106,8 +106,8 @@ export default {
const params = {
listall: true,
zoneid: this.resource.zoneid,
- isready: true,
- isofilter: isoFilter
+ isofilter: isoFilter,
+ isready: true
}
return new Promise((resolve, reject) => {
getAPI('listIsos', params).then((response) => {
diff --git a/ui/src/views/compute/AutoScaleVmProfile.vue
b/ui/src/views/compute/AutoScaleVmProfile.vue
index 92ff9c8777b..9d944c59898 100644
--- a/ui/src/views/compute/AutoScaleVmProfile.vue
+++ b/ui/src/views/compute/AutoScaleVmProfile.vue
@@ -424,6 +424,7 @@ export default {
}
if (isAdmin()) {
params.templatefilter = 'all'
+ params.isready = true
} else {
params.templatefilter = 'executable'
}
diff --git a/ui/src/views/compute/CreateAutoScaleVmGroup.vue
b/ui/src/views/compute/CreateAutoScaleVmGroup.vue
index 292d3fc6a7f..3c509462958 100644
--- a/ui/src/views/compute/CreateAutoScaleVmGroup.vue
+++ b/ui/src/views/compute/CreateAutoScaleVmGroup.vue
@@ -1881,6 +1881,7 @@ export default {
apiName = 'listTemplates'
params.listall = true
params.templatefilter = this.isNormalAndDomainUser ? 'executable' :
'all'
+ params.isready = true
params.id = this.queryTemplateId
this.dataPreFill.templateid = this.queryTemplateId
} else if (this.queryNetworkId) {
@@ -2989,6 +2990,7 @@ export default {
args.arch = this.selectedArchitecture
}
args.templatefilter = templateFilter
+ args.isready = true
args.details = 'all'
args.showicon = 'true'
args.id = this.queryTemplateId
diff --git a/ui/src/views/compute/CreateKubernetesCluster.vue
b/ui/src/views/compute/CreateKubernetesCluster.vue
index 7a2bcec49b9..f945da73213 100644
--- a/ui/src/views/compute/CreateKubernetesCluster.vue
+++ b/ui/src/views/compute/CreateKubernetesCluster.vue
@@ -671,7 +671,8 @@ export default {
for (const filtername of filters) {
const params = {
templatefilter: filtername,
- forcks: true
+ forcks: true,
+ isready: true
}
this.templateLoading = true
getAPI('listTemplates', params).then(json => {
diff --git a/ui/src/views/compute/DeployVM.vue
b/ui/src/views/compute/DeployVM.vue
index cd248f123f1..e4b15e5bbe2 100644
--- a/ui/src/views/compute/DeployVM.vue
+++ b/ui/src/views/compute/DeployVM.vue
@@ -1796,12 +1796,14 @@ export default {
apiName = 'listTemplates'
params.listall = true
params.templatefilter = this.isNormalAndDomainUser ? 'executable' :
'all'
+ params.isready = true
params.id = this.queryTemplateId
this.dataPreFill.templateid = this.queryTemplateId
} else if (this.queryIsoId) {
apiName = 'listIsos'
params.listall = true
params.isofilter = this.isNormalAndDomainUser ? 'executable' : 'all'
+ params.isready = true
params.id = this.queryIsoId
this.dataPreFill.isoid = this.queryIsoId
} else if (this.queryNetworkId) {
@@ -2617,6 +2619,7 @@ export default {
args.domainid = store.getters.project?.id ? null : this.owner.domainid
args.projectid = store.getters.project?.id || this.owner.projectid
args.templatefilter = templateFilter
+ args.isready = true
args.details = 'all'
args.showicon = 'true'
args.id = this.queryTemplateId
@@ -2652,6 +2655,7 @@ export default {
args.domainid = store.getters.project?.id ? null : this.owner.domainid
args.projectid = store.getters.project?.id || this.owner.projectid
args.isoFilter = isoFilter
+ args.isready = true
args.bootable = true
args.showicon = 'true'
args.id = this.queryIsoId
diff --git a/ui/src/views/compute/DeployVnfAppliance.vue
b/ui/src/views/compute/DeployVnfAppliance.vue
index cf8677a2c61..6a467c34cb6 100644
--- a/ui/src/views/compute/DeployVnfAppliance.vue
+++ b/ui/src/views/compute/DeployVnfAppliance.vue
@@ -2555,6 +2555,7 @@ export default {
args.arch = this.selectedArchitecture
}
args.templatefilter = templateFilter
+ args.isready = true
args.details = 'all'
args.showicon = 'true'
args.id = this.queryTemplateId
diff --git a/ui/src/views/compute/EditVM.vue b/ui/src/views/compute/EditVM.vue
index e35ca6dd49d..7489674b966 100644
--- a/ui/src/views/compute/EditVM.vue
+++ b/ui/src/views/compute/EditVM.vue
@@ -283,6 +283,7 @@ export default {
params.id = this.resource.templateid
params.isrecursive = true
params.templatefilter = 'all'
+ params.isready = true
var apiName = 'listTemplates'
getAPI(apiName, params).then(json => {
const templateResponses = json.listtemplatesresponse.template
diff --git a/ui/src/views/compute/ReinstallVm.vue
b/ui/src/views/compute/ReinstallVm.vue
index 982c4543a37..4c7ad2191c0 100644
--- a/ui/src/views/compute/ReinstallVm.vue
+++ b/ui/src/views/compute/ReinstallVm.vue
@@ -367,6 +367,7 @@ export default {
}
args.zoneid = this.resource.zoneid
args.templatefilter = templateFilter
+ args.isready = true
if (this.resource.arch) {
args.arch = this.resource.arch
}
diff --git a/ui/src/views/compute/ResetUserData.vue
b/ui/src/views/compute/ResetUserData.vue
index c05c9452b2d..2870af7dd1a 100644
--- a/ui/src/views/compute/ResetUserData.vue
+++ b/ui/src/views/compute/ResetUserData.vue
@@ -245,6 +245,7 @@ export default {
params.id = this.resource.templateid
params.isrecursive = true
params.templatefilter = 'all'
+ params.isready = true
var apiName = 'listTemplates'
getAPI(apiName, params).then(json => {
const templateResponses = json.listtemplatesresponse.template
diff --git a/ui/src/views/compute/ScaleVM.vue b/ui/src/views/compute/ScaleVM.vue
index 1a80f595f63..a040a81d32b 100644
--- a/ui/src/views/compute/ScaleVM.vue
+++ b/ui/src/views/compute/ScaleVM.vue
@@ -189,6 +189,7 @@ export default {
return new Promise((resolve, reject) => {
getAPI('listTemplates', {
templatefilter: 'all',
+ isready: true,
id: this.resource.templateid
}).then(response => {
var template = response?.listtemplatesresponse?.template?.[0] || null
diff --git a/ui/src/views/tools/ImportUnmanagedInstance.vue
b/ui/src/views/tools/ImportUnmanagedInstance.vue
index aabd1df7572..4c1a3d53fbc 100644
--- a/ui/src/views/tools/ImportUnmanagedInstance.vue
+++ b/ui/src/views/tools/ImportUnmanagedInstance.vue
@@ -584,6 +584,7 @@ export default {
isLoad: true,
options: {
templatefilter: 'all',
+ isready: true,
hypervisor: this.cluster.hypervisortype,
showicon: true
},