Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
197ace3
List async jobs by the parameters below.
sureshanaparti Nov 28, 2025
6d29dc0
Add support to list usage server jobs, by the params below
sureshanaparti Dec 3, 2025
2f42139
List async jobs by resource type and resource id
sureshanaparti Dec 15, 2025
7d642fa
Support to cancel the async jobs
sureshanaparti Dec 24, 2025
1bee9f7
Additional cancel job and VMware resource changes
sureshanaparti Jan 22, 2026
a603abb
changes
sureshanaparti Jan 23, 2026
2ef03a5
simulator fix
sureshanaparti Jan 23, 2026
9677a40
Agent and VMware resource changes
sureshanaparti Feb 3, 2026
0fcdf83
changes and some code improvements
sureshanaparti Feb 6, 2026
c975615
Async job, Agent and XenServer resource changes, and some code improv…
sureshanaparti Feb 27, 2026
7b91d2d
changes
sureshanaparti Sep 29, 2026
9a7d962
api, job framework changes and some code improvements
sureshanaparti Sep 30, 2026
3955395
agent changes
sureshanaparti Sep 30, 2026
7ab3a24
usage server job changes
sureshanaparti Sep 30, 2026
26259a0
fixes for agent changes
sureshanaparti Sep 30, 2026
29b7697
VMware resource changes
sureshanaparti Sep 30, 2026
3112186
XenServer resource changes
sureshanaparti Sep 30, 2026
76d85bc
indirect agent changes
sureshanaparti Sep 30, 2026
0bc97af
KVM changes
sureshanaparti Sep 30, 2026
5a00b4c
cleanup / refactor
sureshanaparti Sep 30, 2026
e972d59
UI changes
sureshanaparti Sep 30, 2026
c47cc20
fixes for api, job framework changes
sureshanaparti Sep 30, 2026
e03ac52
fixes for UI changes
sureshanaparti Sep 30, 2026
89e87e0
marvin test for async jobs
sureshanaparti Sep 30, 2026
f013e0a
allow scroll to view job entries
sureshanaparti Sep 30, 2026
dd93433
UI: Add Jobs section, and Group Jobs, Events, Alerts under a new Acti…
sureshanaparti Sep 30, 2026
e0e829e
Remove queued vm jobs when parent job is cancelled
sureshanaparti Sep 30, 2026
d8a0a77
cleanup
sureshanaparti Sep 30, 2026
a3e86f2
review comments
sureshanaparti Sep 30, 2026
15be7f4
cancel the hypervisor tasks on timeout
sureshanaparti Oct 14, 2026
0d38408
add filters for domain, account and resource type in ui
sureshanaparti Oct 14, 2026
e63d96d
keep human readable date format in the ui
sureshanaparti Oct 14, 2026
4a736a0
keep sortable columns, column chooser and full result text for jobs i…
sureshanaparti Oct 14, 2026
33d9617
show complete job result on hover
sureshanaparti Oct 14, 2026
7cd98e7
add resource in the jobs view ui
sureshanaparti Oct 14, 2026
3d82ab1
support filter by job id in events view ui
sureshanaparti Oct 14, 2026
2fe62a0
add detail page for jobs
sureshanaparti Oct 15, 2026
92aecec
fix job actions in ui
sureshanaparti Oct 15, 2026
70ad1af
fix job filters in ui
sureshanaparti Oct 15, 2026
3d29417
fix cancelled job status
sureshanaparti Oct 15, 2026
f6894e3
link scheduled events to job
sureshanaparti Oct 15, 2026
e53f42b
refactor cancel event and message
sureshanaparti Oct 15, 2026
8b88671
stop and report jobs cancelled with appropriate messages
sureshanaparti Oct 15, 2026
d7c315c
update jobs with cancel requested and track them
sureshanaparti Oct 16, 2026
ba13e2a
try roll back for cancelled job
sureshanaparti Oct 16, 2026
4bd4939
refuse cancel when hypervisor tasks cannot be stopped, and report the…
sureshanaparti Oct 16, 2026
b87fd7c
handle cancellation expection for agent send calls
sureshanaparti Oct 16, 2026
dfde08d
expunge a cancelled volume creation, and cancel tasks on the ssvm
sureshanaparti Oct 21, 2026
73b9157
vm and volume snapshot fixes and improvements
sureshanaparti Oct 21, 2026
9e33c07
kvm, xen changes
sureshanaparti Oct 21, 2026
f405f25
usage related improvements
sureshanaparti Oct 21, 2026
954ac58
update jobs cancellable or not in the job response, and disable ui ac…
sureshanaparti Oct 21, 2026
1bdbe83
update cancelled for not pickup jobs when cancel requested
sureshanaparti Oct 21, 2026
fa7d03f
allow cancellation for not cancellable jobs that are in queue (not ru…
sureshanaparti Oct 21, 2026
fe660be
dependency fix
sureshanaparti Oct 22, 2026
da74a12
test fix
sureshanaparti Oct 23, 2026
2a76b15
review changes
sureshanaparti Oct 26, 2026
03d82c6
test fixes
sureshanaparti Oct 26, 2026
cef5c0f
rebase fixes
sureshanaparti Nov 4, 2026
3a18ecd
usage jobs ui listing fix
sureshanaparti Nov 4, 2026
f1b2167
rebase fixes
sureshanaparti Nov 4, 2026
6478606
finalize a cancelled job only once nothing is running, and keep resul…
sureshanaparti Nov 9, 2026
3528f9f
add job cancellation delivered status
sureshanaparti Nov 9, 2026
b0dac58
retry the cancel requests
sureshanaparti Nov 9, 2026
374ca5b
check the cancellation with server running the job, and a forwarded c…
sureshanaparti Nov 9, 2026
48416c2
check cancellation during vm migration is feasible or not
sureshanaparti Nov 9, 2026
62ca0d7
fix vm start during cancellation
sureshanaparti Nov 9, 2026
a404688
check and remove snapshots cancelled
sureshanaparti Nov 9, 2026
9e0bf4e
publish volume delete event for unsuccessful migration
sureshanaparti Nov 9, 2026
9880058
kvm: check abort status during migration cancel
sureshanaparti Nov 9, 2026
3719183
xenserver fixes for migrations and power operations
sureshanaparti Nov 9, 2026
05dc377
vmware fixes for copy/migration during cancellation
sureshanaparti Nov 9, 2026
aa7afc7
error msg improvements, refactor
sureshanaparti Nov 9, 2026
bd300df
vmware - cleanup left overs after failed import operation
sureshanaparti Nov 9, 2026
4de4c8f
usage fix for volume from snapshot
sureshanaparti Nov 9, 2026
d736e2f
xenserver - retry destroy/cleanup after snapshot cancelled
sureshanaparti Nov 9, 2026
cacfe0a
usage fix for cancelled volume from snapshot operation
sureshanaparti Nov 11, 2026
f838c5b
refuse the cancel for a job completed, keep the result
sureshanaparti Nov 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ jobs:
smoke/test_affinity_groups_projects
smoke/test_annotations
smoke/test_async_job
smoke/test_async_jobs
smoke/test_attach_multiple_volumes
smoke/test_backup_recovery_dummy
smoke/test_certauthority_root
Expand Down
8 changes: 2 additions & 6 deletions agent/src/main/java/com/cloud/agent/Agent.java
Original file line number Diff line number Diff line change
Expand Up @@ -807,9 +807,7 @@ protected void processRequest(final Request request, final Link link) {
}
commandsInProgress.incrementAndGet();
try {
if (cmd.isReconcile()) {
cmd.setRequestSequence(request.getSequence());
}
cmd.setRequestSequence(request.getSequence());
answer = serverResource.executeRequest(cmd);
} finally {
commandsInProgress.decrementAndGet();
Expand Down Expand Up @@ -1103,9 +1101,7 @@ public void processOtherTask(final Task task) {
Answer answer = null;
commandsInProgress.incrementAndGet();
try {
if (command.isReconcile()) {
command.setRequestSequence(req.getSequence());
}
command.setRequestSequence(req.getSequence());
answer = serverResource.executeRequest(command);
} finally {
commandsInProgress.decrementAndGet();
Expand Down
18 changes: 18 additions & 0 deletions api/src/main/java/com/cloud/agent/api/Answer.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
public class Answer extends Command {
protected boolean result;
protected String details;
// set when the command was stopped because its async job was cancelled
protected boolean cancelled;

protected Answer() {
this(null);
Expand All @@ -47,6 +49,20 @@ public String getDetails() {
return details;
}

public boolean isCancelled() {
return cancelled;
}

public void setCancelled(final boolean cancelled) {
this.cancelled = cancelled;
}

public static Answer createCancelledAnswer(final Command command, final String details) {
Answer answer = new Answer(command, false, details);
answer.setCancelled(true);
return answer;
}

@Override
public boolean executeInSequence() {
return false;
Expand All @@ -69,6 +85,7 @@ public boolean equals(Object o) {
Answer answer = (Answer) o;

if (result != answer.result) return false;
if (cancelled != answer.cancelled) return false;
if (details != null ? !details.equals(answer.details) : answer.details != null) return false;

return true;
Expand All @@ -78,6 +95,7 @@ public boolean equals(Object o) {
public int hashCode() {
int result1 = super.hashCode();
result1 = 31 * result1 + (result ? 1 : 0);
result1 = 31 * result1 + (cancelled ? 1 : 0);
result1 = 31 * result1 + (details != null ? details.hashCode() : 0);
return result1;
}
Expand Down
1 change: 1 addition & 0 deletions api/src/main/java/com/cloud/event/EventTypes.java
Original file line number Diff line number Diff line change
Expand Up @@ -923,6 +923,7 @@ public class EventTypes {
public static final String EVENT_INSTANCE_BOOT_GROUP_READINESS_RULE_UPDATE = "INSTANCE.BOOT.GROUP.READINESS.RULE.UPDATE";
public static final String EVENT_INSTANCE_BOOT_GROUP_READINESS_RULE_DELETE = "INSTANCE.BOOT.GROUP.READINESS.RULE.DELETE";

public static final String EVENT_JOB_CANCEL = "JOB.CANCEL";

static {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.exception;

import com.cloud.agent.api.Command;
import com.cloud.utils.SerialVersionUID;
import com.cloud.utils.exception.CloudRuntimeException;

import java.util.Arrays;
import java.util.stream.Collectors;

/** Thrown when an operation was stopped because its async job was cancelled. Unchecked: intermediate callers must not relabel it as a timeout. */
public class OperationCancelledException extends CloudRuntimeException {

private static final long serialVersionUID = SerialVersionUID.OperationCancelledException;

long _agentId;
long _seqId;
long _elapsedSeconds;
boolean _isActive;
String _reason;

transient Command[] _cmds;

public OperationCancelledException(Command[] cmds, long agentId, long seqId, long elapsedSeconds, boolean isActive, String reason) {
super(commandNames(cmds) + " (seq " + seqId + ") on host " + agentId + " cancelled after " + elapsedSeconds + " s" + (reason != null ? ": " + reason : ""));
_agentId = agentId;
_seqId = seqId;
_elapsedSeconds = elapsedSeconds;
_cmds = cmds;
_isActive = isActive;
_reason = reason;
}

private OperationCancelledException(String message, Command[] cmds, long agentId, String reason) {
super(message);
_agentId = agentId;
_cmds = cmds;
_reason = reason;
}

public OperationCancelledException(String reason) {
super(reason);
_reason = reason;
}

/** The commands were never sent: its job had already been cancelled. */
public static OperationCancelledException updateCmdsNotSent(Command[] cmds, long agentId, long jobId) {
final String reason = "job-" + jobId + " was cancelled";
return new OperationCancelledException(commandNames(cmds) + " to host " + agentId + " not sent: " + reason, cmds, agentId, reason);
}

static String commandNames(Command[] cmds) {
if (cmds == null || cmds.length == 0) {
return "Command";
}
return Arrays.stream(cmds).map(cmd -> cmd == null ? "null" : cmd.getClass().getSimpleName()).collect(Collectors.joining(", "));
}

public long getAgentId() {
return _agentId;
}

public long getSequenceId() {
return _seqId;
}

public long getElapsedSeconds() {
return _elapsedSeconds;
}

public boolean isActive() {
return _isActive;
}

public String getReason() {
return _reason;
}

public Command[] getCommands() {
return _cmds;
}
}
1 change: 1 addition & 0 deletions api/src/main/java/com/cloud/vm/VirtualMachine.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ public static StateMachine2<State, VirtualMachine.Event, VirtualMachine> getStat
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.AgentReportRunning, State.Running, Arrays.asList(new Impact[]{Impact.USAGE})));
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.AgentReportStopped, State.Stopped, null));
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.AgentReportShutdowned, State.Stopped, null));
s_fsm.addTransition(new Transition<State, Event>(State.Starting, VirtualMachine.Event.StopRequested, State.Stopping, null));
s_fsm.addTransition(new Transition<State, Event>(State.Destroyed, VirtualMachine.Event.RecoveryRequested, State.Stopped, Arrays.asList(new Impact[]{Impact.USAGE})));
s_fsm.addTransition(new Transition<State, Event>(State.Destroyed, VirtualMachine.Event.ExpungeOperation, State.Expunging, null));
s_fsm.addTransition(new Transition<State, Event>(State.Running, VirtualMachine.Event.MigrationRequested, State.Migrating, null));
Expand Down
2 changes: 2 additions & 0 deletions api/src/main/java/org/apache/cloudstack/api/APICommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@
Class<?>[] entityType() default {};

String httpMethod() default "";

boolean cancellable() default false;
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ public enum ApiCommandResourceType {
KmsKey(org.apache.cloudstack.kms.KMSKey.class),
HsmProfile(org.apache.cloudstack.kms.HSMProfile.class),
InstanceBootGroup(org.apache.cloudstack.vm.bootgroup.InstanceBootGroup.class),
InstanceBootGroupReadinessRule(InstanceBootGroupReadinessRule.class);
InstanceBootGroupReadinessRule(InstanceBootGroupReadinessRule.class),
Job(org.apache.cloudstack.jobs.JobInfo.class);

private final Class<?> clazz;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,7 @@ public class ApiConstants {
public static final String USAGE_ID = "usageid";
public static final String USAGE_NAME = "usagename";
public static final String USAGE_TYPE = "usagetype";
public static final String USAGE_SERVER = "usageserver";
public static final String INCLUDE_TAGS = "includetags";

public static final String VLAN = "vlan";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.Map;
import java.util.Set;

import org.apache.cloudstack.api.command.user.job.CancelAsyncJobCmd;
import org.apache.cloudstack.api.response.ConsoleSessionResponse;
import org.apache.cloudstack.consoleproxy.ConsoleSession;
import org.apache.cloudstack.acl.apikeypair.ApiKeyPair;
Expand Down Expand Up @@ -397,6 +398,8 @@ TemplatePermissionsResponse createTemplatePermissionsResponse(ResponseView view,

AsyncJobResponse queryJobResult(QueryAsyncJobResultCmd cmd);

AsyncJobResponse cancelJobResponse(CancelAsyncJobCmd cmd);

NetworkOfferingResponse createNetworkOfferingResponse(NetworkOffering offering);

NetworkResponse createNetworkResponse(ResponseView view, Network network);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package org.apache.cloudstack.api.command.admin.usage;

import java.util.Date;

import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseListCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.UsageJobResponse;

@APICommand(name = "listUsageJobs", description = "Lists the usage jobs.", responseObject = UsageJobResponse.class,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "24.0")
public class ListUsageJobsCmd extends BaseListCmd {

/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////

@Parameter(name = ApiConstants.START_DATE, type = CommandType.DATE, description = "The start date from which the usage jobs should be listed. Only jobs started on or after this date will be included. (use format \"yyyy-MM-dd'T'HH:mm:ss'+'SSSS\")")
private Date startDate;

@Parameter(name = ApiConstants.END_DATE, type = CommandType.DATE, description = "The end date up to which the usage jobs should be listed. Only jobs started on or before this date will be included. (use format \"yyyy-MM-dd'T'HH:mm:ss'+'SSSS\")")
private Date endDate;

@Parameter(name = ApiConstants.USAGE_SERVER, type = CommandType.STRING, description = "The usage server host name or ip")
private String usageServer;

@Parameter(name = ApiConstants.DURATION, type = CommandType.INTEGER, description = "the duration in hours to list the usage jobs started or completed within that period up to now.")
private Integer duration;

/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////

public Date getStartDate() {
return startDate;
}

public Date getEndDate() {
return endDate;
}

public String getUsageServer() {
return usageServer;
}

public Integer getDuration() {
return duration;
}

/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@Override
public void execute() {
ListResponse<UsageJobResponse> response = _usageService.getUsageJobs(this);
response.setResponseName(getCommandName());
this.setResponseObject(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@

@APICommand(name = "destroyVirtualMachine", description = "Destroys an Instance. Once destroyed, only the administrator can recover it.", responseObject = UserVmResponse.class, responseView = ResponseView.Full, entityType = {VirtualMachine.class},
requestHasSensitiveInfo = false,
responseHasSensitiveInfo = true)
responseHasSensitiveInfo = true,
cancellable = true)
public class DestroyVMCmdByAdmin extends DestroyVMCmd implements AdminCmd {

@Parameter( name = ApiConstants.FORCED,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,10 @@
description = "Attempts Migration of an Instance to a different host or Root volume of the Instance to a different storage pool",
responseObject = UserVmResponse.class, entityType = {VirtualMachine.class},
requestHasSensitiveInfo = false,
responseHasSensitiveInfo = true)
responseHasSensitiveInfo = true,
cancellable = true)
public class MigrateVMCmd extends BaseAsyncCmd {


/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@
description = "Attempts Migration of an Instance with its volumes to a different host",
responseObject = UserVmResponse.class, entityType = {VirtualMachine.class},
requestHasSensitiveInfo = false,
responseHasSensitiveInfo = true)
public class MigrateVirtualMachineWithVolumeCmd extends BaseAsyncCmd {

responseHasSensitiveInfo = true,
cancellable = true)
public class MigrateVirtualMachineWithVolumeCmd extends BaseAsyncCmd {

/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@
import com.cloud.vm.VirtualMachine;

@APICommand(name = "rebootVirtualMachine", description = "Reboots an Instance.", responseObject = UserVmResponse.class, responseView = ResponseView.Full, entityType = {VirtualMachine.class},
requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
requestHasSensitiveInfo = false, responseHasSensitiveInfo = true, cancellable = true)
public class RebootVMCmdByAdmin extends RebootVMCmd implements AdminCmd {}
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@
import com.cloud.vm.VirtualMachine;

@APICommand(name = "startVirtualMachine", responseObject = UserVmResponse.class, description = "Starts an Instance.", responseView = ResponseView.Full, entityType = {VirtualMachine.class},
requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
requestHasSensitiveInfo = false, responseHasSensitiveInfo = true, cancellable = true)
public class StartVMCmdByAdmin extends StartVMCmd implements AdminCmd {}
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@
import com.cloud.vm.VirtualMachine;

@APICommand(name = "stopVirtualMachine", responseObject = UserVmResponse.class, description = "Stops an Instance.", responseView = ResponseView.Full, entityType = {VirtualMachine.class},
requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
requestHasSensitiveInfo = false, responseHasSensitiveInfo = true, cancellable = true)
public class StopVMCmdByAdmin extends StopVMCmd implements AdminCmd {}
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@
import org.apache.cloudstack.api.response.UserVmResponse;

@APICommand(name = "revertToVMSnapshot", description = "Revert Instance from a vmsnapshot.", responseObject = UserVmResponse.class, since = "4.2.0", responseView = ResponseView.Full,
requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
requestHasSensitiveInfo = false, responseHasSensitiveInfo = true, cancellable = true)
public class RevertToVMSnapshotCmdByAdmin extends RevertToVMSnapshotCmd implements AdminCmd {}
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@
import com.cloud.vm.VirtualMachine;

@APICommand(name = "attachVolume", description = "Attaches a disk volume to an Instance.", responseObject = VolumeResponse.class, responseView = ResponseView.Full, entityType = {VirtualMachine.class},
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, cancellable = true)
public class AttachVolumeCmdByAdmin extends AttachVolumeCmd implements AdminCmd {}
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,5 @@

@APICommand(name = "createVolume", responseObject = VolumeResponse.class, description = "Creates a disk volume from a disk offering. This disk volume must still be attached to an Instance to make use of it.", responseView = ResponseView.Full, entityType = {
Volume.class, VirtualMachine.class},
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, cancellable = true)
public class CreateVolumeCmdByAdmin extends CreateVolumeCmd implements AdminCmd {}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@
since = "4.14.0",
authorized = {RoleType.Admin},
requestHasSensitiveInfo = false,
responseHasSensitiveInfo = true)
responseHasSensitiveInfo = true,
cancellable = true)
public class DestroyVolumeCmdByAdmin extends DestroyVolumeCmd implements AdminCmd {


Expand Down
Loading
Loading