From bd79fb33a6978a9dbe7933bcda1579238da4bb27 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Thu, 16 Jan 2014 15:31:01 -0800 Subject: [PATCH] CLOUDSTACK-5870: API support for retrieving user data --- api/src/com/cloud/vm/UserVmService.java | 8 +++ .../command/admin/vm/GetVMUserDataCmd.java | 63 +++++++++++++++++++ .../api/response/VMUserDataResponse.java | 26 ++++++++ client/tomcatconf/commands.properties.in | 1 + .../cloud/server/ManagementServerImpl.java | 2 + .../src/com/cloud/vm/UserVmManagerImpl.java | 12 ++++ 6 files changed, 112 insertions(+) create mode 100644 api/src/org/apache/cloudstack/api/command/admin/vm/GetVMUserDataCmd.java create mode 100644 api/src/org/apache/cloudstack/api/response/VMUserDataResponse.java diff --git a/api/src/com/cloud/vm/UserVmService.java b/api/src/com/cloud/vm/UserVmService.java index e02573d7605..51a8fdfbe38 100755 --- a/api/src/com/cloud/vm/UserVmService.java +++ b/api/src/com/cloud/vm/UserVmService.java @@ -461,4 +461,12 @@ public interface UserVmService { UserVm expungeVm(long vmId) throws ResourceUnavailableException, ConcurrentOperationException; + /** + * Finds and returns an encrypted password for a VM. + * + * @param userVmId + * @return Base64 encoded userdata + */ + String getVmUserData(long vmId); + } diff --git a/api/src/org/apache/cloudstack/api/command/admin/vm/GetVMUserDataCmd.java b/api/src/org/apache/cloudstack/api/command/admin/vm/GetVMUserDataCmd.java new file mode 100644 index 00000000000..b02dc118bed --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/vm/GetVMUserDataCmd.java @@ -0,0 +1,63 @@ +package org.apache.cloudstack.api.command.admin.vm; + +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.response.UserVmResponse; +import org.apache.cloudstack.api.response.VMUserDataResponse; +import org.apache.log4j.Logger; + +import com.cloud.user.Account; +import com.cloud.uservm.UserVm; + +@APICommand(name = "getVirtualMachineUserData", description = "Returns user data associated with the VM", responseObject = VMUserDataResponse.class, since = "4.4") +public class GetVMUserDataCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(GetVMUserDataCmd.class); + private static final String s_name = "getvirtualmachineuserdataresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.VIRTUAL_MACHINE_ID, type = CommandType.UUID, entityType = UserVmResponse.class, required = true, description = "The ID of the virtual machine") + private Long vmId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public long getId() { + return vmId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public void execute() { + String userData = _userVmService.getVmUserData(getId()); + VMUserDataResponse resp = new VMUserDataResponse(); + resp.setVmId(_entityMgr.findById(UserVm.class, getId()).getUuid()); + resp.setUserData(userData); + resp.setObjectName("virtualmachineuserdata"); + resp.setResponseName(getCommandName()); + this.setResponseObject(resp); + } + + @Override + public long getEntityOwnerId() { + UserVm userVm = _entityMgr.findById(UserVm.class, getId()); + if (userVm != null) { + return userVm.getAccountId(); + } + + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked + } + + @Override + public String getCommandName() { + return s_name; + } +} diff --git a/api/src/org/apache/cloudstack/api/response/VMUserDataResponse.java b/api/src/org/apache/cloudstack/api/response/VMUserDataResponse.java new file mode 100644 index 00000000000..dacf656c122 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/VMUserDataResponse.java @@ -0,0 +1,26 @@ +package org.apache.cloudstack.api.response; + +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; + +public class VMUserDataResponse extends BaseResponse { + @SerializedName(ApiConstants.VIRTUAL_MACHINE_ID) + @Param(description = "the ID of the virtual machine") + private String vmId; + + @SerializedName(ApiConstants.USER_DATA) + @Param(description = "Base 64 encoded VM user data") + private String userData; + + public void setUserData(String userData) { + this.userData = userData; + } + + public void setVmId(String vmId) { + this.vmId = vmId; + } + +} diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index c5ac7fd67af..4f38c317bdd 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -72,6 +72,7 @@ migrateVirtualMachine=1 migrateVirtualMachineWithVolume=1 recoverVirtualMachine=7 expungeVirtualMachine=7 +getVirtualMachineUserData=15 #### snapshot commands createSnapshot=15 diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 59767f3fb15..bbb31cfbb6c 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -198,6 +198,7 @@ import org.apache.cloudstack.api.command.admin.vlan.ListVlanIpRangesCmd; import org.apache.cloudstack.api.command.admin.vlan.ReleasePublicIpRangeCmd; import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd; import org.apache.cloudstack.api.command.admin.vm.ExpungeVMCmd; +import org.apache.cloudstack.api.command.admin.vm.GetVMUserDataCmd; import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd; import org.apache.cloudstack.api.command.admin.vm.MigrateVirtualMachineWithVolumeCmd; import org.apache.cloudstack.api.command.admin.vm.RecoverVMCmd; @@ -2854,6 +2855,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe cmdList.add(GenerateAlertCmd.class); cmdList.add(ListOvsElementsCmd.class); cmdList.add(ConfigureOvsElementCmd.class); + cmdList.add(GetVMUserDataCmd.class); return cmdList; } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index f57e1b4711e..fc0ec0e4117 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -4806,4 +4806,16 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir public ConfigKey[] getConfigKeys() { return new ConfigKey[] {EnableDynamicallyScaleVm}; } + + @Override + public String getVmUserData(long vmId) { + UserVmVO vm = _vmDao.findById(vmId); + if (vm == null) { + throw new InvalidParameterValueException("Unable to find virual machine with id " + vmId); + } + + //check permissions + _accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, true, vm); + return vm.getUserData(); + } }