diff --git a/core/src/com/cloud/network/security/dao/NetworkGroupRulesDao.java b/core/src/com/cloud/network/security/dao/NetworkGroupRulesDao.java index 2ef4d9fd387..cf632b88bfb 100644 --- a/core/src/com/cloud/network/security/dao/NetworkGroupRulesDao.java +++ b/core/src/com/cloud/network/security/dao/NetworkGroupRulesDao.java @@ -26,12 +26,4 @@ public interface NetworkGroupRulesDao extends GenericDao listNetworkGroupRules(); - - /** - * List network groups and associated ingress rules for a particular domain - * @param domainId the id of the domain for which to list groups and associated rules - * @param recursive whether or not to recursively search the domain for network groups - * @return the list of network groups with associated ingress rules - */ - List listNetworkGroupRulesByDomain(long domainId, boolean recursive); } diff --git a/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java b/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java index 391771571a3..20ee78c7d9a 100644 --- a/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java @@ -4,11 +4,8 @@ import java.util.List; import javax.ejb.Local; -import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.network.security.NetworkGroupRulesVO; -import com.cloud.server.ManagementServer; -import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -58,34 +55,4 @@ public class NetworkGroupRulesDaoImpl extends GenericDaoBase listNetworkGroupRulesByDomain(long domainId, boolean recursive) { - - if (_domainDao == null) { - ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); - _domainDao = locator.getDao(DomainDao.class); - - DomainSearch = createSearchBuilder(); - DomainSearch.and("domainId", DomainSearch.entity().getDomainId(), SearchCriteria.Op.EQ); - SearchBuilder domainSearch = _domainDao.createSearchBuilder(); - domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE); - DomainSearch.join("domainSearch", domainSearch, DomainSearch.entity().getDomainId(), domainSearch.entity().getId()); - DomainSearch.done(); - } - - Filter searchFilter = new Filter(NetworkGroupRulesVO.class, "id", true, null, null); - SearchCriteria sc = DomainSearch.create(); - - if (!recursive) { - sc.setParameters("domainId", domainId); - } - - DomainVO domain = _domainDao.findById(domainId); - if (domain != null) { - sc.setJoinParameters("domainSearch", "path", domain.getPath() + "%"); - } - - return listActiveBy(sc, searchFilter); - } } diff --git a/core/src/com/cloud/serializer/SerializerHelper.java b/core/src/com/cloud/serializer/SerializerHelper.java index 375db652f2f..a66303b1894 100644 --- a/core/src/com/cloud/serializer/SerializerHelper.java +++ b/core/src/com/cloud/serializer/SerializerHelper.java @@ -69,7 +69,7 @@ public class SerializerHelper { } return null; } catch(RuntimeException e) { - s_logger.error("Caught runtime exception when doing GSON descrialization on: " + result); + s_logger.error("Caught runtime exception when doing GSON deserialization on: " + result); throw e; } } diff --git a/server/src/com/cloud/api/commands/DeleteDomainCmd.java b/server/src/com/cloud/api/commands/DeleteDomainCmd.java index 4f7b8ad4b32..9c973ba0a55 100644 --- a/server/src/com/cloud/api/commands/DeleteDomainCmd.java +++ b/server/src/com/cloud/api/commands/DeleteDomainCmd.java @@ -18,29 +18,18 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - import org.apache.log4j.Logger; -import com.cloud.api.BaseCmd; +import com.cloud.api.BaseAsyncCmd; +import com.cloud.api.Implementation; import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.domain.DomainVO; -import com.cloud.user.Account; -import com.cloud.utils.Pair; - -public class DeleteDomainCmd extends BaseCmd{ +import com.cloud.api.response.DeleteDomainResponse; +import com.cloud.serializer.SerializerHelper; + +@Implementation(method="deleteDomain") +public class DeleteDomainCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(DeleteDomainCmd.class.getName()); private static final String s_name = "deletedomainresponse"; - private static final List> s_properties = new ArrayList>(); - - static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.CLEANUP, Boolean.FALSE)); - } ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// @@ -73,43 +62,15 @@ public class DeleteDomainCmd extends BaseCmd{ @Override public String getName() { return s_name; - } - @Override - public List> getProperties() { - return s_properties; - } + } @Override - public List> execute(Map params) { - Long domainId = (Long)params.get(BaseCmd.Properties.ID.getName()); - Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); - Boolean cleanup = (Boolean)params.get(BaseCmd.Properties.CLEANUP.getName()); + public String getResponse() { + String deleteResult = (String)getResponseObject(); - // If account is null, consider System as an owner for this action - if (account == null) { - account = getManagementServer().findAccountById(Long.valueOf(1L)); - } - - if ((domainId.longValue() == DomainVO.ROOT_DOMAIN) || !getManagementServer().isChildDomain(account.getDomainId(), domainId)) { - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to delete domain " + domainId + ", permission denied."); - } - - // check if domain exists in the system - DomainVO domain = getManagementServer().findDomainIdById(domainId); - if (domain == null) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "unable to find domain " + domainId); - } - - long jobId = getManagementServer().deleteDomainAsync(domainId, account.getId(), cleanup); // default owner is 'system' - if (jobId == 0) { - s_logger.warn("Unable to schedule async-job for DeleteDomain comamnd"); - } else { - if (s_logger.isDebugEnabled()) - s_logger.debug("DeleteDomain command has been accepted, job id: " + jobId); - } + DeleteDomainResponse response = new DeleteDomainResponse(); + response.setResult(deleteResult); - List> returnValues = new ArrayList>(); - returnValues.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), Long.valueOf(jobId))); - return returnValues; + return SerializerHelper.toSerializedString(response); } } diff --git a/server/src/com/cloud/api/response/DeleteDomainResponse.java b/server/src/com/cloud/api/response/DeleteDomainResponse.java new file mode 100644 index 00000000000..d4c05763ec8 --- /dev/null +++ b/server/src/com/cloud/api/response/DeleteDomainResponse.java @@ -0,0 +1,17 @@ +package com.cloud.api.response; + +import com.cloud.api.ResponseObject; +import com.cloud.serializer.Param; + +public class DeleteDomainResponse implements ResponseObject { + @Param(name="result") + private String result; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } +} diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java index 0d4f8a4b3b5..afe9a7219d3 100644 --- a/server/src/com/cloud/configuration/ConfigurationManager.java +++ b/server/src/com/cloud/configuration/ConfigurationManager.java @@ -141,7 +141,18 @@ public interface ConfigurationManager extends Manager { * @return ID */ DiskOfferingVO createDiskOffering(CreateDiskOfferingCmd cmd) throws InvalidParameterValueException; - + + /** + * Creates a new disk offering + * @param domainId + * @param name + * @param description + * @param numGibibytes + * @param tags + * @return newly created disk offering + */ + DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException; + /** * Creates a new pod * @param userId @@ -193,7 +204,23 @@ public interface ConfigurationManager extends Manager { * @throws InternalErrorException */ DataCenterVO createZone(CreateZoneCmd cmd) throws InvalidParameterValueException, InternalErrorException; - + + /** + * Creates a new zone + * @param userId + * @param zoneName + * @param dns1 + * @param dns2 + * @param internalDns1 + * @param internalDns2 + * @param vnetRange + * @param guestCidr + * @return + * @throws InvalidParameterValueException + * @throws InternalErrorException + */ + DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String vnetRange, String guestCidr) throws InvalidParameterValueException, InternalErrorException; + /** * Edits a zone in the database. Will not allow you to edit DNS values if there are VMs in the specified zone. * @param UpdateZoneCmd diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index d36afec6193..98fa735dbbb 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -775,8 +775,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { } @Override - public DataCenterVO editZone(UpdateZoneCmd cmd) throws InvalidParameterValueException, InternalErrorException - { + public DataCenterVO editZone(UpdateZoneCmd cmd) throws InvalidParameterValueException, InternalErrorException { //Parameter validation as from execute() method in V1 Long zoneId = cmd.getId(); String zoneName = cmd.getZoneName(); @@ -885,8 +884,54 @@ public class ConfigurationManagerImpl implements ConfigurationManager { return zone; } - - @DB + + @Override @DB + public DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String vnetRange, String guestCidr) throws InvalidParameterValueException, InternalErrorException { + int vnetStart, vnetEnd; + if (vnetRange != null) { + String[] tokens = vnetRange.split("-"); + + try { + vnetStart = Integer.parseInt(tokens[0]); + if (tokens.length == 1) { + vnetEnd = vnetStart + 1; + } else { + vnetEnd = Integer.parseInt(tokens[1]); + } + } catch (NumberFormatException e) { + throw new InvalidParameterValueException("Please specify valid integers for the vlan range."); + } + } else { + String networkType = _configDao.getValue("network.type"); + if (networkType != null && networkType.equals("vnet")) { + vnetStart = 1000; + vnetEnd = 2000; + } else { + throw new InvalidParameterValueException("Please specify a vlan range."); + } + } + + //checking the following params outside checkzoneparams method as we do not use these params for updatezone + //hence the method below is generic to check for common params + if ((guestCidr != null) && !NetUtils.isValidCIDR(guestCidr)) { + throw new InvalidParameterValueException("Please enter a valid guest cidr"); + } + + checkZoneParameters(zoneName, dns1, dns2, internalDns1, internalDns2, true); + + // Create the new zone in the database + DataCenterVO zone = new DataCenterVO(null, zoneName, null, dns1, dns2, internalDns1, internalDns2, vnetRange, guestCidr); + zone = _zoneDao.persist(zone); + + // Add vnet entries for the new zone + _zoneDao.addVnet(zone.getId(), vnetStart, vnetEnd); + + saveConfigurationEvent(userId, null, EventTypes.EVENT_ZONE_CREATE, "Successfully created new zone with name: " + zoneName + ".", "dcId=" + zone.getId(), "dns1=" + dns1, "dns2=" + dns2, "internalDns1=" + internalDns1, "internalDns2=" + internalDns2, "vnetRange=" + vnetRange, "guestCidr=" + guestCidr); + + return zone; + } + + @Override public DataCenterVO createZone(CreateZoneCmd cmd) throws InvalidParameterValueException, InternalErrorException { // grab parameters from the command Long userId = UserContext.current().getUserId(); @@ -902,48 +947,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { userId = User.UID_SYSTEM; } - int vnetStart, vnetEnd; - if (vnetRange != null) { - String[] tokens = vnetRange.split("-"); - - try { - vnetStart = Integer.parseInt(tokens[0]); - if (tokens.length == 1) { - vnetEnd = vnetStart + 1; - } else { - vnetEnd = Integer.parseInt(tokens[1]); - } - } catch (NumberFormatException e) { - throw new InvalidParameterValueException("Please specify valid integers for the vlan range."); - } - } else { - String networkType = _configDao.getValue("network.type"); - if (networkType != null && networkType.equals("vnet")) { - vnetStart = 1000; - vnetEnd = 2000; - } else { - throw new InvalidParameterValueException("Please specify a vlan range."); - } - } - - //checking the following params outside checkzoneparams method as we do not use these params for updatezone - //hence the method below is generic to check for common params - if ((guestCidr != null) && !NetUtils.isValidCIDR(guestCidr)) { - throw new InvalidParameterValueException("Please enter a valid guest cidr"); - } - - checkZoneParameters(zoneName, dns1, dns2, internalDns1, internalDns2,true); - - // Create the new zone in the database - DataCenterVO zone = new DataCenterVO(null, zoneName, null, dns1, dns2, internalDns1, internalDns2, vnetRange, guestCidr); - zone = _zoneDao.persist(zone); - - // Add vnet entries for the new zone - _zoneDao.addVnet(zone.getId(), vnetStart, vnetEnd); - - saveConfigurationEvent(userId, null, EventTypes.EVENT_ZONE_CREATE, "Successfully created new zone with name: " + zoneName + ".", "dcId=" + zone.getId(), "dns1=" + dns1, "dns2=" + dns2, "internalDns1=" + internalDns1, "internalDns2=" + internalDns2, "vnetRange=" + vnetRange, "guestCidr=" + guestCidr); - - return zone; + return createZone(userId, zoneName, dns1, dns2, internalDns1, internalDns2, vnetRange, guestCidr); } @Override @@ -1084,8 +1088,21 @@ public class ConfigurationManagerImpl implements ConfigurationManager { return null; } } - - + + @Override + public DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException { + if ((numGibibytes != 0) && (numGibibytes < 1)) { + throw new InvalidParameterValueException("Please specify a disk size of at least 1 Gb."); + } else if (numGibibytes > _maxVolumeSizeInGb) { + throw new InvalidParameterValueException("The maximum size for a disk is " + _maxVolumeSizeInGb + " Gb."); + } + + long diskSize = numGibibytes * 1024; + tags = cleanupTags(tags); + DiskOfferingVO newDiskOffering = new DiskOfferingVO(domainId, name, description, diskSize,tags); + return _diskOfferingDao.persist(newDiskOffering); + } + @Override public DiskOfferingVO createDiskOffering(CreateDiskOfferingCmd cmd) throws InvalidParameterValueException { Long domainId = cmd.getDomainId(); @@ -1098,16 +1115,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { domainId = Long.valueOf(DomainVO.ROOT_DOMAIN); } - if ((numGibibytes != 0) && (numGibibytes < 1)) { - throw new InvalidParameterValueException("Please specify a disk size of at least 1 Gb."); - } else if (numGibibytes > _maxVolumeSizeInGb) { - throw new InvalidParameterValueException("The maximum size for a disk is " + _maxVolumeSizeInGb + " Gb."); - } - - long diskSize = numGibibytes * 1024; - tags = cleanupTags(tags); - DiskOfferingVO newDiskOffering = new DiskOfferingVO(domainId, name, description, diskSize,tags); - return _diskOfferingDao.persist(newDiskOffering); + return createDiskOffering(domainId, name, description, numGibibytes, tags); } public DiskOfferingVO updateDiskOffering(UpdateDiskOfferingCmd cmd) throws InvalidParameterValueException{ @@ -1321,13 +1329,12 @@ public class ConfigurationManagerImpl implements ConfigurationManager { if (!vlanId.equals(Vlan.UNTAGGED)) { throw new InvalidParameterValueException("Direct Attached IP ranges for a pod must be untagged."); } - + // Check that the pod ID is valid - HostPodVO pod = null; - if (podId != null && ((pod = _podDao.findById(podId)) == null)) { + if (podId != null && ((_podDao.findById(podId)) == null)) { throw new InvalidParameterValueException("Please specify a valid pod."); } - + // Make sure there aren't any account VLANs in this zone List accountVlanMaps = _accountVlanMapDao.listAll(); for (AccountVlanMapVO accountVlanMap : accountVlanMaps) { @@ -1336,7 +1343,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager { throw new InvalidParameterValueException("Zone " + zone.getName() + " already has account-wide IP ranges. A zone may contain either pod-wide IP ranges or account-wide IP ranges, but not both."); } } - } } else { throw new InvalidParameterValueException("Please specify a valid IP range type. Valid types are: " + VlanType.values().toString()); diff --git a/server/src/com/cloud/server/ManagementServer.java b/server/src/com/cloud/server/ManagementServer.java index 6d6e70bbf84..7326e2d1659 100644 --- a/server/src/com/cloud/server/ManagementServer.java +++ b/server/src/com/cloud/server/ManagementServer.java @@ -28,6 +28,7 @@ import com.cloud.api.commands.CreateDomainCmd; import com.cloud.api.commands.CreatePortForwardingServiceCmd; import com.cloud.api.commands.CreatePortForwardingServiceRuleCmd; import com.cloud.api.commands.CreateUserCmd; +import com.cloud.api.commands.DeleteDomainCmd; import com.cloud.api.commands.DeletePortForwardingServiceCmd; import com.cloud.api.commands.DeleteUserCmd; import com.cloud.api.commands.DeployVMCmd; @@ -958,12 +959,13 @@ public interface ManagementServer { /** * delete a domain with the given domainId - * @param domainId - * @param ownerId - * @param cleanup - whether or not to delete all accounts/VMs/sub-domains when deleting the domain + * @param cmd the command wrapping the delete parameters + * - domainId + * - ownerId + * - cleanup: whether or not to delete all accounts/VMs/sub-domains when deleting the domain */ - String deleteDomain(Long domainId, Long ownerId, Boolean cleanup); - long deleteDomainAsync(Long domainId, Long ownerId, Boolean cleanup); + String deleteDomain(DeleteDomainCmd cmd) throws InvalidParameterValueException, PermissionDeniedException; + /** * update an existing domain * @param domainId the id of the domain to be updated @@ -1379,7 +1381,7 @@ public interface ManagementServer { * @return comma separated list of tags */ String getStoragePoolTags(long poolId); - + /** * Checks if a host has running VMs that are using its local storage pool. * @return true if local storage is active on the host @@ -1387,9 +1389,7 @@ public interface ManagementServer { boolean isLocalStorageActiveOnHost(HostVO host); public List getPreAllocatedLuns(ListPreallocatedLunsCmd cmd); - - public String getNetworkGroupsNamesForVm(long vmId); - + boolean checkLocalStorageConfigVal(); boolean updateUser(UpdateUserCmd cmd) throws InvalidParameterValueException; diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index e0c50087c7d..b1844ec9241 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -59,6 +59,7 @@ import com.cloud.api.commands.CreateDomainCmd; import com.cloud.api.commands.CreatePortForwardingServiceCmd; import com.cloud.api.commands.CreatePortForwardingServiceRuleCmd; import com.cloud.api.commands.CreateUserCmd; +import com.cloud.api.commands.DeleteDomainCmd; import com.cloud.api.commands.DeletePortForwardingServiceCmd; import com.cloud.api.commands.DeleteUserCmd; import com.cloud.api.commands.DeployVMCmd; @@ -123,7 +124,6 @@ import com.cloud.async.AsyncJobResult; import com.cloud.async.AsyncJobVO; import com.cloud.async.BaseAsyncJobExecutor; import com.cloud.async.dao.AsyncJobDao; -import com.cloud.async.executor.DeleteDomainParam; import com.cloud.async.executor.NetworkGroupIngressParam; import com.cloud.async.executor.SecurityGroupParam; import com.cloud.async.executor.VMOperationParam; @@ -4965,24 +4965,19 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public long deleteDomainAsync(Long domainId, Long ownerId, Boolean cleanup) { - DeleteDomainParam param = new DeleteDomainParam(domainId, ownerId, cleanup); - Gson gson = GsonHelper.getBuilder().create(); + public String deleteDomain(DeleteDomainCmd cmd) throws InvalidParameterValueException, PermissionDeniedException { + Account account = (Account)UserContext.current().getAccountObject(); + Long domainId = cmd.getId(); + Boolean cleanup = cmd.getCleanup(); - AsyncJobVO job = new AsyncJobVO(); - job.setUserId(UserContext.current().getUserId()); - job.setAccountId(UserContext.current().getAccountId()); - job.setCmd("DeleteDomain"); - job.setCmdInfo(gson.toJson(param)); - return _asyncMgr.submitAsyncJob(job); - } + if ((domainId == DomainVO.ROOT_DOMAIN) || ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId))) { + throw new PermissionDeniedException("Unable to delete domain " + domainId + ", permission denied."); + } - // FIXME: need userId so the event can be saved with proper id - @Override - public String deleteDomain(Long domainId, Long ownerId, Boolean cleanup) { try { DomainVO domain = _domainDao.findById(domainId); if (domain != null) { + long ownerId = domain.getOwner(); if ((cleanup != null) && cleanup.booleanValue()) { boolean success = cleanupDomain(domainId, ownerId); if (!success) { @@ -4997,8 +4992,12 @@ public class ManagementServerImpl implements ManagementServer { EventUtils.saveEvent(new Long(1), ownerId, EventVO.LEVEL_INFO, EventTypes.EVENT_DOMAIN_DELETE, "Domain with id " + domainId + " was deleted"); } } + } else { + throw new InvalidParameterValueException("Failed to delete domain nable " + domainId + ", domain not found"); } - return null; + return "success"; + } catch (InvalidParameterValueException ex) { + throw ex; } catch (Exception ex) { s_logger.error("Exception deleting domain with id " + domainId, ex); return "Delete failed on domain with id " + domainId + " due to an internal server error.";