CLOUDSTACK-7871: allow VM and template details update using update APIs

Allows updating details (key/value) pair which updatse entries
invm_template_details and user_vm_details tables using updateVM and updateTemplate
APIs. This allows sys admins to update nics, controllers etc without DB hacking.

Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
(cherry picked from commit 97fa4a023e2346b3b9f56bf213ed4125c371ca6d)
Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
This commit is contained in:
Rohit Yadav 2014-11-10 17:51:25 +05:30
parent 85ac979f72
commit c401dbc8f9
4 changed files with 45 additions and 2 deletions

View File

@ -22,6 +22,9 @@ import org.apache.cloudstack.api.command.user.iso.UpdateIsoCmd;
import org.apache.cloudstack.api.response.GuestOSResponse;
import org.apache.cloudstack.api.response.TemplateResponse;
import java.util.Collection;
import java.util.Map;
public abstract class BaseUpdateTemplateOrIsoCmd extends BaseCmd {
public static final Logger s_logger = Logger.getLogger(UpdateIsoCmd.class.getName());
@ -64,6 +67,9 @@ public abstract class BaseUpdateTemplateOrIsoCmd extends BaseCmd {
@Parameter(name = ApiConstants.ROUTING, type = CommandType.BOOLEAN, description = "true if the template type is routing i.e., if template is used to deploy router")
protected Boolean isRoutingType;
@Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "Details in key/value pairs.")
protected Map details;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@ -107,4 +113,13 @@ public abstract class BaseUpdateTemplateOrIsoCmd extends BaseCmd {
public Boolean isRoutingType() {
return isRoutingType;
}
}
public Map getDetails() {
if (this.details == null || this.details.isEmpty()) {
return null;
}
Collection paramsCollection = this.details.values();
return (Map) (paramsCollection.toArray())[0];
}
}

View File

@ -38,6 +38,9 @@ import com.cloud.user.Account;
import com.cloud.uservm.UserVm;
import com.cloud.vm.VirtualMachine;
import java.util.Collection;
import java.util.Map;
@APICommand(name = "updateVirtualMachine", description="Updates properties of a virtual machine. The VM has to be stopped and restarted for the " +
"new properties to take effect. UpdateVirtualMachine does not first check whether the VM is stopped. " +
"Therefore, stop the VM manually before issuing this call.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {VirtualMachine.class},
@ -90,6 +93,9 @@ public class UpdateVMCmd extends BaseCustomIdCmd {
@Parameter(name = ApiConstants.INSTANCE_NAME, type = CommandType.STRING, description = "instance name of the user vm", since = "4.4", authorized = {RoleType.Admin})
private String instanceName;
@Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "Details in key/value pairs.")
protected Map details;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@ -129,6 +135,16 @@ public class UpdateVMCmd extends BaseCustomIdCmd {
public String getInstanceName() {
return instanceName;
}
public Map getDetails() {
if (this.details == null || this.details.isEmpty()) {
return null;
}
Collection paramsCollection = this.details.values();
return (Map) (paramsCollection.toArray())[0];
}
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////

View File

@ -1776,6 +1776,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
Boolean isRoutingTemplate = cmd.isRoutingType();
Boolean bootable = cmd.isBootable();
Integer sortKey = cmd.getSortKey();
Map details = cmd.getDetails();
Account account = CallContext.current().getCallingAccount();
// verify that template exists
@ -1798,7 +1799,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
boolean updateNeeded =
!(name == null && displayText == null && format == null && guestOSId == null && passwordEnabled == null && bootable == null && sortKey == null &&
isDynamicallyScalable == null && isRoutingTemplate == null);
isDynamicallyScalable == null && isRoutingTemplate == null && details == null);
if (!updateNeeded) {
return template;
}
@ -1858,6 +1859,11 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
}
}
if (details != null && !details.isEmpty()) {
template.setDetails(details);
_tmpltDao.saveDetails(template);
}
_tmpltDao.update(id, template);
return _tmpltDao.findById(id);

View File

@ -1899,6 +1899,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
String userData = cmd.getUserData();
Boolean isDynamicallyScalable = cmd.isDynamicallyScalable();
String hostName = cmd.getHostName();
Map details = cmd.getDetails();
Account caller = CallContext.current().getCallingAccount();
// Input validation and permission checks
@ -1938,6 +1939,11 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
}
if (details != null && !details.isEmpty()) {
vmInstance.setDetails(details);
_vmDao.saveDetails(vmInstance);
}
return updateVirtualMachine(id, displayName, group, ha, isDisplayVm, osTypeId, userData, isDynamicallyScalable,
cmd.getHttpMethod(), cmd.getCustomId(), hostName, cmd.getInstanceName());
}