From a7bf66b9f030d84bec298df857e92e805673130e Mon Sep 17 00:00:00 2001 From: Amogh Vasekar Date: Mon, 12 May 2014 22:43:06 -0700 Subject: [PATCH] This patch disallows deleting / modifying system defined guest OS mappings Local env 1. Create user defined mapping 2. Delete / modify user defined mapping. Should pass 3. Delete / modify system defined mapping. Should fail Signed off by :- Nitin Mehta --- .../apache/cloudstack/api/ApiConstants.java | 1 + .../api/response/GuestOSResponse.java | 13 +++++++++++ .../api/response/GuestOsMappingResponse.java | 12 ++++++++++ .../storage/dao/GuestOSHypervisorDao.java | 2 ++ .../storage/dao/GuestOSHypervisorDaoImpl.java | 22 +++++++++++++++++++ .../src/com/cloud/api/ApiResponseHelper.java | 2 ++ .../cloud/server/ManagementServerImpl.java | 18 ++++++++++++++- 7 files changed, 69 insertions(+), 1 deletion(-) diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java index 70e19844202..850e67e64b9 100755 --- a/api/src/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/org/apache/cloudstack/api/ApiConstants.java @@ -290,6 +290,7 @@ public class ApiConstants { public static final String SPECIFY_VLAN = "specifyvlan"; public static final String IS_DEFAULT = "isdefault"; public static final String IS_SYSTEM = "issystem"; + public static final String IS_USER_DEFINED = "isuserdefined"; public static final String AVAILABILITY = "availability"; public static final String NETWORKRATE = "networkrate"; public static final String HOST_TAGS = "hosttags"; diff --git a/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java b/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java index 9737d6073ad..6822288a862 100644 --- a/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java +++ b/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java @@ -39,6 +39,10 @@ public class GuestOSResponse extends BaseResponse { @Param(description = "the name/description of the OS type") private String description; + @SerializedName(ApiConstants.IS_USER_DEFINED) + @Param(description = "is the guest OS user defined") + private String isUserDefined; + public String getId() { return id; } @@ -62,4 +66,13 @@ public class GuestOSResponse extends BaseResponse { public void setDescription(String description) { this.description = description; } + + public String getIsUserDefined() { + return isUserDefined; + } + + public void setIsUserDefined(String isUserDefined) { + this.isUserDefined = isUserDefined; + } + } diff --git a/api/src/org/apache/cloudstack/api/response/GuestOsMappingResponse.java b/api/src/org/apache/cloudstack/api/response/GuestOsMappingResponse.java index a0f7d1d0edd..583768d47be 100644 --- a/api/src/org/apache/cloudstack/api/response/GuestOsMappingResponse.java +++ b/api/src/org/apache/cloudstack/api/response/GuestOsMappingResponse.java @@ -52,6 +52,18 @@ public class GuestOsMappingResponse extends BaseResponse { @Param(description = "hypervisor specific name for the Guest OS") private String osNameForHypervisor; + @SerializedName(ApiConstants.IS_USER_DEFINED) + @Param(description = "is the mapping user defined") + private String isUserDefined; + + public String getIsUserDefined() { + return isUserDefined; + } + + public void setIsUserDefined(String isUserDefined) { + this.isUserDefined = isUserDefined; + } + public String getId() { return id; } diff --git a/engine/schema/src/com/cloud/storage/dao/GuestOSHypervisorDao.java b/engine/schema/src/com/cloud/storage/dao/GuestOSHypervisorDao.java index 5b6e7198f0d..a7775165265 100644 --- a/engine/schema/src/com/cloud/storage/dao/GuestOSHypervisorDao.java +++ b/engine/schema/src/com/cloud/storage/dao/GuestOSHypervisorDao.java @@ -27,4 +27,6 @@ public interface GuestOSHypervisorDao extends GenericDao guestOsSearch; protected final SearchBuilder mappingSearch; + protected final SearchBuilder userDefinedMappingSearch; protected GuestOSHypervisorDaoImpl() { guestOsSearch = createSearchBuilder(); @@ -45,6 +46,13 @@ public class GuestOSHypervisorDaoImpl extends GenericDaoBase sc = userDefinedMappingSearch.create(); + String version = "default"; + if (!(hypervisorVersion == null || hypervisorVersion.isEmpty())) { + version = hypervisorVersion; + } + sc.setParameters("guest_os_id", guestOsId); + sc.setParameters("hypervisor_type", hypervisorType); + sc.setParameters("hypervisor_version", version); + sc.setParameters("is_user_defined", isUserDefined); + return findOneBy(sc); + } + @Override public boolean removeGuestOsMapping(Long id) { GuestOSHypervisorVO guestOsHypervisor = findById(id); diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index d8e26d8f8bf..7c342d84322 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -3158,6 +3158,7 @@ public class ApiResponseHelper implements ResponseGenerator { GuestOSResponse response = new GuestOSResponse(); response.setDescription(guestOS.getDisplayName()); response.setId(guestOS.getUuid()); + response.setIsUserDefined(Boolean.valueOf(guestOS.getIsUserDefined()).toString()); GuestOSCategoryVO category = ApiDBUtils.findGuestOsCategoryById(guestOS.getCategoryId()); if (category != null) { response.setOsCategoryId(category.getUuid()); @@ -3174,6 +3175,7 @@ public class ApiResponseHelper implements ResponseGenerator { response.setHypervisor(guestOSHypervisor.getHypervisorType()); response.setHypervisorVersion(guestOSHypervisor.getHypervisorVersion()); response.setOsNameForHypervisor((guestOSHypervisor.getGuestOsName())); + response.setIsUserDefined(Boolean.valueOf(guestOSHypervisor.getIsUserDefined()).toString()); GuestOS guestOs = ApiDBUtils.findGuestOSById(guestOSHypervisor.getGuestOsId()); if (guestOs != null) { response.setOsStdName(guestOs.getDisplayName()); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index da252986011..4a4c74a93cf 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -2029,7 +2029,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe throw new InvalidParameterValueException("Unable to find the guest OS by name or UUID"); } //check for duplicates - GuestOSHypervisorVO duplicate = _guestOSHypervisorDao.findByOsIdAndHypervisor(guestOs.getId(), hypervisorType.toString(), hypervisorVersion); + GuestOSHypervisorVO duplicate = _guestOSHypervisorDao.findByOsIdAndHypervisorAndUserDefined(guestOs.getId(), hypervisorType.toString(), hypervisorVersion, true); if (duplicate != null) { throw new InvalidParameterValueException("Mapping from hypervisor : " + hypervisorType.toString() + ", version : " + hypervisorVersion + " and guest OS : " @@ -2096,6 +2096,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe throw new InvalidParameterValueException("Guest OS not found. Please specify a valid ID for the Guest OS"); } + if (!guestOsHandle.getIsUserDefined()) { + throw new InvalidParameterValueException("Unable to modify system defined guest OS"); + } + //Check if update is needed if (displayName.equals(guestOsHandle.getDisplayName())) { return guestOsHandle; @@ -2127,6 +2131,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe throw new InvalidParameterValueException("Guest OS not found. Please specify a valid ID for the Guest OS"); } + if (!guestOs.getIsUserDefined()) { + throw new InvalidParameterValueException("Unable to remove system defined guest OS"); + } + return _guestOSDao.remove(id); } @@ -2143,6 +2151,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe throw new InvalidParameterValueException("Guest OS Mapping not found. Please specify a valid ID for the Guest OS Mapping"); } + if (!guestOsHypervisorHandle.getIsUserDefined()) { + throw new InvalidParameterValueException("Unable to modify system defined Guest OS mapping"); + } + GuestOSHypervisorVO guestOsHypervisor = _guestOSHypervisorDao.createForUpdate(id); guestOsHypervisor.setGuestOsName(osNameForHypervisor); if (_guestOSHypervisorDao.update(id, guestOsHypervisor)) { @@ -2164,6 +2176,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe throw new InvalidParameterValueException("Guest OS Mapping not found. Please specify a valid ID for the Guest OS Mapping"); } + if (!guestOsHypervisorHandle.getIsUserDefined()) { + throw new InvalidParameterValueException("Unable to remove system defined Guest OS mapping"); + } + return _guestOSHypervisorDao.removeGuestOsMapping(id); }