From 931706ad870ad60df59d538c4b5c9d9728a176db Mon Sep 17 00:00:00 2001 From: Kris McQueen Date: Wed, 1 Sep 2010 15:00:22 -0700 Subject: [PATCH] Refactor listPortForwardingRules to new API framework. Clean up imports. --- .../commands/ListPortForwardingRulesCmd.java | 162 +++++------------- .../src/com/cloud/network/NetworkManager.java | 8 + .../com/cloud/network/NetworkManagerImpl.java | 33 ++++ .../com/cloud/server/ManagementServer.java | 8 - .../cloud/server/ManagementServerImpl.java | 5 - .../src/com/cloud/vm/UserVmManagerImpl.java | 3 - 6 files changed, 87 insertions(+), 132 deletions(-) diff --git a/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java b/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java index 9c5db89b419..8c484234d14 100644 --- a/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java +++ b/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java @@ -25,26 +25,21 @@ import java.util.Map; import org.apache.log4j.Logger; -import com.cloud.api.BaseCmd; +import com.cloud.api.BaseCmd.Manager; +import com.cloud.api.BaseListCmd; +import com.cloud.api.Implementation; import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; +import com.cloud.api.response.FirewallRuleResponse; import com.cloud.network.FirewallRuleVO; -import com.cloud.network.IPAddressVO; +import com.cloud.serializer.SerializerHelper; import com.cloud.server.Criteria; -import com.cloud.user.Account; -import com.cloud.utils.Pair; import com.cloud.vm.UserVmVO; - -public class ListPortForwardingRulesCmd extends BaseCmd { + +@Implementation(method="listPortForwardingRules", manager=Manager.NetworkManager) +public class ListPortForwardingRulesCmd extends BaseListCmd { public static final Logger s_logger = Logger.getLogger(ListPortForwardingRulesCmd.class.getName()); private static final String s_name = "listportforwardingrulesresponse"; - 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.IP_ADDRESS, Boolean.TRUE)); - } ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// @@ -69,109 +64,44 @@ public class ListPortForwardingRulesCmd extends BaseCmd { @Override public String getName() { return s_name; - } - @Override - public List> getProperties() { - return s_properties; - } + } - @Override - public List> execute(Map params) { - Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); - String ipAddress = (String)params.get(BaseCmd.Properties.IP_ADDRESS.getName()); - - IPAddressVO ipAddressVO = getManagementServer().findIPAddressById(ipAddress); - if (ipAddressVO == null) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find IP address " + ipAddress); - } - - Account addrOwner = getManagementServer().findAccountById(ipAddressVO.getAccountId()); - - // if an admin account was passed in, or no account was passed in, make sure we honor the accountName/domainId parameters - if ((account != null) && isAdmin(account.getType())) { - if (ipAddressVO.getAccountId() != null) { - if ((addrOwner != null) && !getManagementServer().isChildDomain(account.getDomainId(), addrOwner.getDomainId())) { - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to list port forwarding rules for address " + ipAddress + ", permission denied for account " + account.getId()); - } - } else { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to list port forwarding rules for address " + ipAddress + ", address not in use."); - } - } else { - if (account != null) { - if ((ipAddressVO.getAccountId() == null) || (account.getId().longValue() != ipAddressVO.getAccountId().longValue())) { - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to list port forwarding rules for address " + ipAddress + ", permission denied for account " + account.getId()); - } - addrOwner = account; - } - } - - List firewallRules = getManagementServer().listIPForwarding(ipAddress, true); - - if (firewallRules == null) { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error searching port forwarding rules for address " + ipAddress); - } - /* - Criteria lbCriteria = new Criteria(); - lbCriteria.addCriteria(Criteria.IPADDRESS, ipAddress); - List loadBalancers = getManagementServer().searchForLoadBalancers(lbCriteria); - if (loadBalancers == null) { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error searching load balancer rules for address " + ipAddress); - } - */ - - Map userVmCache = new HashMap(); - - List> groupsTags = new ArrayList>(); - Object[] forwardingTag = new Object[firewallRules.size()]; - int i = 0; - for (FirewallRuleVO fwRule : firewallRules) { - List> ruleData = new ArrayList>(); - - ruleData.add(new Pair(BaseCmd.Properties.ID.getName(), fwRule.getId().toString())); - ruleData.add(new Pair(BaseCmd.Properties.PUBLIC_PORT.getName(), fwRule.getPublicPort())); - ruleData.add(new Pair(BaseCmd.Properties.PRIVATE_PORT.getName(), fwRule.getPrivatePort())); - ruleData.add(new Pair(BaseCmd.Properties.PROTOCOL.getName(), fwRule.getProtocol())); - - UserVmVO userVM = userVmCache.get(fwRule.getPrivateIpAddress()); - if (userVM == null) { - Criteria c = new Criteria(); - c.addCriteria(Criteria.ACCOUNTID, new Object[] {addrOwner.getId()}); - c.addCriteria(Criteria.DATACENTERID, ipAddressVO.getDataCenterId()); - c.addCriteria(Criteria.IPADDRESS, fwRule.getPrivateIpAddress()); - List userVMs = getManagementServer().searchForUserVMs(c); - - if ((userVMs != null) && (userVMs.size() > 0)) { - userVM = userVMs.get(0); - userVmCache.put(fwRule.getPrivateIpAddress(), userVM); - } - } - - if (userVM != null) { - ruleData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID.getName(), Long.toString(userVM.getId()))); - ruleData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_NAME.getName(), userVM.getName())); - } - - forwardingTag[i++] = ruleData; - } - Pair forwardingTags = new Pair("portforwardingrule", forwardingTag); - groupsTags.add(forwardingTags); - - /* - Object[] lbTag = new Object[loadBalancers.size()]; - i = 0; - for (LoadBalancerVO loadBalancer : loadBalancers) { - List> lbData = new ArrayList>(); - - lbData.add(new Pair(BaseCmd.Properties.ID.getName(), loadBalancer.getId().toString())); - lbData.add(new Pair(BaseCmd.Properties.PUBLIC_PORT.getName(), loadBalancer.getPublicPort())); - lbData.add(new Pair(BaseCmd.Properties.PRIVATE_PORT.getName(), loadBalancer.getPrivatePort())); - lbData.add(new Pair(BaseCmd.Properties.ALGORITHM.getName(), loadBalancer.getAlgorithm())); - - lbTag[i++] = lbData; - } - Pair lbTags = new Pair("loadbalancer", lbTag); - groupsTags.add(lbTags); - */ - return groupsTags; + @Override @SuppressWarnings("unchecked") + public String getResponse() { + List firewallRules = (List)getResponseObject(); + Map userVmCache = new HashMap(); + + List response = new ArrayList(); + for (FirewallRuleVO fwRule : firewallRules) { + FirewallRuleResponse ruleData = new FirewallRuleResponse(); + + ruleData.setId(fwRule.getId()); + ruleData.setPublicPort(fwRule.getPublicPort()); + ruleData.setPrivatePort(fwRule.getPrivatePort()); + ruleData.setProtocol(fwRule.getProtocol()); + + UserVmVO userVM = userVmCache.get(fwRule.getPrivateIpAddress()); + if (userVM == null) { + Criteria c = new Criteria(); + c.addCriteria(Criteria.ACCOUNTID, new Object[] {addrOwner.getId()}); + c.addCriteria(Criteria.DATACENTERID, ipAddressVO.getDataCenterId()); + c.addCriteria(Criteria.IPADDRESS, fwRule.getPrivateIpAddress()); + List userVMs = getManagementServer().searchForUserVMs(c); + + if ((userVMs != null) && (userVMs.size() > 0)) { + userVM = userVMs.get(0); + userVmCache.put(fwRule.getPrivateIpAddress(), userVM); + } + } + + if (userVM != null) { + ruleData.setVirtualMachineId(userVM.getId()); + ruleData.setVirtualMachineName(userVM.getName()); + } + + response.add(ruleData); + } + + return SerializerHelper.toSerializedString(response); } } diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 2e7044b5d0d..178aa978857 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -26,6 +26,7 @@ import com.cloud.api.commands.CreateIPForwardingRuleCmd; import com.cloud.api.commands.CreateLoadBalancerRuleCmd; import com.cloud.api.commands.DeletePortForwardingServiceRuleCmd; import com.cloud.api.commands.DisassociateIPAddrCmd; +import com.cloud.api.commands.ListPortForwardingRulesCmd; import com.cloud.api.commands.RemoveFromLoadBalancerRuleCmd; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; @@ -177,6 +178,13 @@ public interface NetworkManager extends Manager { */ public FirewallRuleVO createPortForwardingRule(CreateIPForwardingRuleCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, NetworkRuleConflictException; + /** + * List port forwarding rules assigned to an ip address + * @param cmd the command object holding the criteria for listing port forwarding rules (the ipAddress) + * @return list of port forwarding rules on the given address, empty list if no rules exist + */ + public List listPortForwardingRules(ListPortForwardingRulesCmd cmd) throws InvalidParameterValueException, PermissionDeniedException; + /** * Create a load balancer rule from the given ipAddress/port to the given private port * @param cmd the command specifying the ip address, public port, protocol, private port, and algorithm diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 1645466ecb0..93d99806315 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -64,6 +64,7 @@ import com.cloud.api.commands.CreateIPForwardingRuleCmd; import com.cloud.api.commands.CreateLoadBalancerRuleCmd; import com.cloud.api.commands.DeletePortForwardingServiceRuleCmd; import com.cloud.api.commands.DisassociateIPAddrCmd; +import com.cloud.api.commands.ListPortForwardingRulesCmd; import com.cloud.api.commands.RemoveFromLoadBalancerRuleCmd; import com.cloud.async.AsyncJobExecutor; import com.cloud.async.AsyncJobManager; @@ -1813,6 +1814,38 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager return newFwRule; } + @Override + public List listPortForwardingRules(ListPortForwardingRulesCmd cmd) throws InvalidParameterValueException, PermissionDeniedException { + String ipAddress = cmd.getIpAddress(); + Account account = (Account)UserContext.current().getAccountObject(); + + IPAddressVO ipAddressVO = _ipAddressDao.findById(ipAddress); + if (ipAddressVO == null) { + throw new InvalidParameterValueException("Unable to find IP address " + ipAddress); + } + + Account addrOwner = _accountDao.findById(ipAddressVO.getAccountId()); + + // if an admin account was passed in, or no account was passed in, make sure we honor the accountName/domainId parameters + if ((account != null) && isAdmin(account.getType())) { + if (ipAddressVO.getAccountId() != null) { + if ((addrOwner != null) && !_domainDao.isChildDomain(account.getDomainId(), addrOwner.getDomainId())) { + throw new PermissionDeniedException("Unable to list port forwarding rules for address " + ipAddress + ", permission denied for account " + account.getId()); + } + } else { + throw new InvalidParameterValueException("Unable to list port forwarding rules for address " + ipAddress + ", address not in use."); + } + } else { + if (account != null) { + if ((ipAddressVO.getAccountId() == null) || (account.getId().longValue() != ipAddressVO.getAccountId().longValue())) { + throw new PermissionDeniedException("Unable to list port forwarding rules for address " + ipAddress + ", permission denied for account " + account.getId()); + } + } + } + + return _rulesDao.listIPForwarding(cmd.getIpAddress(), true); + } + @Override public void assignToLoadBalancer(AssignToLoadBalancerRuleCmd cmd) throws NetworkRuleConflictException, InternalErrorException, PermissionDeniedException, InvalidParameterValueException { diff --git a/server/src/com/cloud/server/ManagementServer.java b/server/src/com/cloud/server/ManagementServer.java index 25967628f15..ff7f6f1d3c6 100644 --- a/server/src/com/cloud/server/ManagementServer.java +++ b/server/src/com/cloud/server/ManagementServer.java @@ -1121,14 +1121,6 @@ public interface ManagementServer { * @return List of UserVMs. */ List searchForUserVMs(Criteria c); - - /** - * Obtains a list of firewall rules by the specified IP address and forwarding flag. - * @param publicIPAddress - * @param forwarding - * @return - */ - List listIPForwarding(String publicIPAddress, boolean forwarding); /** * Update an existing port forwarding rule on the given public IP / public port for the given protocol diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 5ae9930e630..9801ce6066f 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -4996,11 +4996,6 @@ public class ManagementServerImpl implements ManagementServer { return _userVmDao.search(sc, searchFilter); } - @Override - public List listIPForwarding(String publicIPAddress, boolean forwarding) { - return _firewallRulesDao.listIPForwarding(publicIPAddress, forwarding); - } - @Override public FirewallRuleVO updatePortForwardingRule(long userId, String publicIp, String privateIp, String publicPort, String privatePort, String protocol) { List fwRules = _firewallRulesDao.listIPForwardingForUpdate(publicIp, publicPort, protocol); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 23dd6d16f4a..007c75b44a0 100644 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -79,7 +79,6 @@ import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobResult; import com.cloud.async.AsyncJobVO; import com.cloud.async.BaseAsyncJobExecutor; -import com.cloud.async.executor.DestroyVMExecutor; import com.cloud.async.executor.OperationResponse; import com.cloud.async.executor.RebootVMExecutor; import com.cloud.async.executor.StartVMExecutor; @@ -87,8 +86,6 @@ import com.cloud.async.executor.StopVMExecutor; import com.cloud.async.executor.VMExecutorHelper; import com.cloud.async.executor.VMOperationListener; import com.cloud.async.executor.VMOperationParam; -import com.cloud.async.executor.VolumeOperationParam; -import com.cloud.async.executor.VolumeOperationParam.VolumeOp; import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ResourceCount.ResourceType;