[
https://issues.apache.org/jira/browse/CLOUDSTACK-8746?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14987049#comment-14987049
]
ASF GitHub Bot commented on CLOUDSTACK-8746:
--------------------------------------------
Github user wido commented on a diff in the pull request:
https://github.com/apache/cloudstack/pull/977#discussion_r43734035
--- Diff:
api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotFromVMSnapshotCmd.java
---
@@ -0,0 +1,219 @@
+// 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.user.snapshot;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandJobType;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.BaseAsyncCreateCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.SnapshotResponse;
+import org.apache.cloudstack.api.response.VMSnapshotResponse;
+import org.apache.cloudstack.api.response.VolumeResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.projects.Project;
+import com.cloud.storage.Snapshot;
+import com.cloud.user.Account;
+import com.cloud.uservm.UserVm;
+import com.cloud.vm.snapshot.VMSnapshot;
+
+@APICommand(name = "createSnapshotFromVMSnapshot", description = "Creates
an instant snapshot of a volume from existing vm snapshot.", responseObject =
SnapshotResponse.class, entityType = {Snapshot.class}, since = "4.6.0",
+ requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+public class CreateSnapshotFromVMSnapshotCmd extends BaseAsyncCreateCmd {
+ public static final Logger s_logger =
Logger.getLogger(CreateSnapshotFromVMSnapshotCmd.class.getName());
+ private static final String s_name =
"createsnapshotfromvmsnapshotresponse";
+
+ // ///////////////////////////////////////////////////
+ // ////////////// API parameters /////////////////////
+ // ///////////////////////////////////////////////////
+
+ @Parameter(name = ApiConstants.VOLUME_ID, type = CommandType.UUID,
entityType = VolumeResponse.class, required = true, description = "The ID of
the disk volume")
+ private Long volumeId;
+
+ @Parameter(name=ApiConstants.VM_SNAPSHOT_ID, type=CommandType.UUID,
entityType=VMSnapshotResponse.class,
+ required=true, description="The ID of the VM snapshot")
+ private Long vmSnapshotId;
+
+ @Parameter(name = ApiConstants.NAME, type = CommandType.STRING,
description = "the name of the snapshot")
+ private String snapshotName;
+
+ private String syncObjectType = BaseAsyncCmd.snapshotHostSyncObject;
+
+ // ///////////////////////////////////////////////////
+ // ///////////////// Accessors ///////////////////////
+ // ///////////////////////////////////////////////////
+
+ public Long getVolumeId() {
+ return volumeId;
+ }
+
+ public Long getVMSnapshotId() {
+ return vmSnapshotId;
+ }
+
+ public String getSnapshotName() {
+ return snapshotName;
+ }
+
+ private Long getVmId() {
+ VMSnapshot vmsnapshot = _entityMgr.findById(VMSnapshot.class,
getVMSnapshotId());
+ if (vmsnapshot == null) {
+ throw new InvalidParameterValueException("Unable to find vm
snapshot by id=" + getVMSnapshotId());
+ }
+ UserVm vm = _entityMgr.findById(UserVm.class,
vmsnapshot.getVmId());
+ if (vm == null) {
+ throw new InvalidParameterValueException("Unable to find vm by
vm snapshot id=" + getVMSnapshotId());
+ }
+ return vm.getId();
+ }
+ private Long getHostId() {
+ VMSnapshot vmsnapshot = _entityMgr.findById(VMSnapshot.class,
getVMSnapshotId());
+ if (vmsnapshot == null) {
+ throw new InvalidParameterValueException("Unable to find vm
snapshot by id=" + getVMSnapshotId());
+ }
+ UserVm vm = _entityMgr.findById(UserVm.class,
vmsnapshot.getVmId());
+ if (vm != null) {
+ if(vm.getHostId() != null) {
+ return vm.getHostId();
+ } else if(vm.getLastHostId() != null) {
+ return vm.getLastHostId();
+ }
+ }
+ return null;
+ }
+
+
+ // ///////////////////////////////////////////////////
+ // ///////////// API Implementation///////////////////
+ // ///////////////////////////////////////////////////
+
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ public static String getResultObjectName() {
+ return "snapshot";
+ }
+
+ @Override
+ public long getEntityOwnerId() {
+
+ VMSnapshot vmsnapshot = _entityMgr.findById(VMSnapshot.class,
getVMSnapshotId());
+ if (vmsnapshot == null) {
+ throw new InvalidParameterValueException("Unable to find
vmsnapshot by id=" + getVMSnapshotId());
+ }
+
+ Account account =
_accountService.getAccount(vmsnapshot.getAccountId());
+ //Can create templates for enabled projects/accounts only
+ if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
+ Project project =
_projectService.findByProjectAccountId(vmsnapshot.getAccountId());
+ if (project == null) {
+ throw new InvalidParameterValueException("Unable to find
project by account id=" + account.getUuid());
+ }
+ if (project.getState() != Project.State.Active) {
+ throw new PermissionDeniedException("Can't add resources
to the project id=" + project.getUuid() + " in state=" + project.getState() + "
as it's no longer active");
+ }
+ } else if (account.getState() == Account.State.disabled) {
+ throw new PermissionDeniedException("The owner of template is
disabled: " + account);
+ }
+
+ return vmsnapshot.getAccountId();
+ }
+
+ @Override
+ public String getEventType() {
+ return EventTypes.EVENT_SNAPSHOT_CREATE;
+ }
+
+ @Override
+ public String getEventDescription() {
+ return "creating snapshot from vm snapshot : " + getVMSnapshotId();
+ }
+
+ @Override
+ public ApiCommandJobType getInstanceType() {
+ return ApiCommandJobType.Snapshot;
+ }
+
+ @Override
+ public void create() throws ResourceAllocationException {
+ Snapshot snapshot =
this._volumeService.allocSnapshotForVm(getVmId(), getVolumeId(),
getSnapshotName());
+ if (snapshot != null) {
+ this.setEntityId(snapshot.getId());
+ this.setEntityUuid(snapshot.getUuid());
+ } else {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
"Failed to create snapshot from vm snapshot");
+ }
+ }
+
+ @Override
+ public void execute() {
+ s_logger.info("VOLSS: CreateSnapshotFromVMSnapshotCmd starts:" +
System.currentTimeMillis());
--- End diff --
What does VOLSS mean? I've never seen this before. Could you also add a bit
more about what we are starting to execute?
> VM Snapshotting implementation for KVM
> --------------------------------------
>
> Key: CLOUDSTACK-8746
> URL: https://issues.apache.org/jira/browse/CLOUDSTACK-8746
> Project: CloudStack
> Issue Type: Improvement
> Security Level: Public(Anyone can view this level - this is the
> default.)
> Reporter: Wei Zhou
> Assignee: Wei Zhou
>
> Currently it is not supported.
> https://cwiki.apache.org/confluence/display/CLOUDSTACK/VM+Snapshots
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)