diff --git a/api/src/com/cloud/api/ResponseGenerator.java b/api/src/com/cloud/api/ResponseGenerator.java index 37ec55bb2c3..5879fcc727b 100755 --- a/api/src/com/cloud/api/ResponseGenerator.java +++ b/api/src/com/cloud/api/ResponseGenerator.java @@ -151,7 +151,7 @@ public interface ResponseGenerator { ClusterResponse createClusterResponse(Cluster cluster); - FirewallRuleResponse createFirewallRuleResponse(PortForwardingRule fwRule); + FirewallRuleResponse createPortForwardingRuleResponse(PortForwardingRule fwRule); IpForwardingRuleResponse createIpForwardingRuleResponse(StaticNatRule fwRule); diff --git a/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java b/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java index 645675472c7..ba929e24698 100644 --- a/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java @@ -24,7 +24,7 @@ import java.util.List; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; -import com.cloud.api.BaseAsyncCmd; +import com.cloud.api.BaseAsyncCreateCmd; import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; @@ -37,13 +37,14 @@ import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.IpAddress; +import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.rules.LoadBalancer; import com.cloud.user.Account; import com.cloud.user.UserContext; import com.cloud.utils.net.NetUtils; @Implementation(description="Creates a load balancer rule", responseObject=LoadBalancerResponse.class) -public class CreateLoadBalancerRuleCmd extends BaseAsyncCmd /*implements LoadBalancer */{ +public class CreateLoadBalancerRuleCmd extends BaseAsyncCreateCmd /*implements LoadBalancer */{ public static final Logger s_logger = Logger.getLogger(CreateLoadBalancerRuleCmd.class.getName()); private static final String s_name = "createloadbalancerruleresponse"; @@ -149,16 +150,48 @@ public class CreateLoadBalancerRuleCmd extends BaseAsyncCmd /*implements LoadBa @Override public void execute() throws ResourceAllocationException, ResourceUnavailableException { + UserContext callerContext = UserContext.current(); + boolean success = true; + LoadBalancer rule = null; + try { + UserContext.current().setEventDetails("Rule Id: " + getEntityId()); + + if (getOpenFirewall()) { + success = success && _firewallService.applyFirewallRules(publicIpId, callerContext.getCaller()); + } + + // State might be different after the rule is applied, so get new object here + rule = _entityMgr.findById(LoadBalancer.class, getEntityId()); + LoadBalancerResponse lbResponse = new LoadBalancerResponse(); + if (rule != null) { + lbResponse = _responseGenerator.createLoadBalancerResponse(rule); + setResponseObject(lbResponse); + } + lbResponse.setResponseName(getCommandName()); + } finally { + if (!success || rule == null) { + // no need to apply the rule on the backend as it exists in the db only + _lbService.deleteLoadBalancerRule(getEntityId(), false); + + if (getOpenFirewall()) { + _firewallService.revokeRelatedFirewallRule(getEntityId(), true); + } + + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create load balancer rule"); + } + } + } + + + @Override + public void create() { //cidr list parameter is deprecated if (cidrlist != null) { throw new InvalidParameterValueException("Parameter cidrList is deprecated; if you need to open firewall rule for the specific cidr, please refer to createFirewallRule command"); } - try { LoadBalancer result = _lbService.createLoadBalancerRule(this, getOpenFirewall()); - LoadBalancerResponse response = _responseGenerator.createLoadBalancerResponse(result); - response.setResponseName(getCommandName()); - this.setResponseObject(response); + this.setEntityId(result.getId()); } catch (NetworkRuleConflictException e) { s_logger.warn("Exception: ", e); throw new ServerApiException(BaseCmd.NETWORK_RULE_CONFLICT_ERROR, e.getMessage()); diff --git a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java index a4c268c9acd..7bb33572621 100644 --- a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java @@ -139,7 +139,7 @@ public class CreatePortForwardingRuleCmd extends BaseAsyncCreateCmd implements P rule = _entityMgr.findById(PortForwardingRule.class, getEntityId()); FirewallRuleResponse fwResponse = new FirewallRuleResponse(); if (rule != null) { - fwResponse = _responseGenerator.createFirewallRuleResponse(rule); + fwResponse = _responseGenerator.createPortForwardingRuleResponse(rule); setResponseObject(fwResponse); } fwResponse.setResponseName(getCommandName()); diff --git a/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java b/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java index ac3eab837c0..098910b4e8e 100644 --- a/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java +++ b/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java @@ -87,7 +87,7 @@ public class ListPortForwardingRulesCmd extends BaseListCmd { List fwResponses = new ArrayList(); for (PortForwardingRule fwRule : result) { - FirewallRuleResponse ruleData = _responseGenerator.createFirewallRuleResponse(fwRule); + FirewallRuleResponse ruleData = _responseGenerator.createPortForwardingRuleResponse(fwRule); ruleData.setObjectName("portforwardingrule"); fwResponses.add(ruleData); } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index a471a0432f3..dfdafdacf2c 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -981,7 +981,7 @@ public class ApiResponseHelper implements ResponseGenerator { } @Override - public FirewallRuleResponse createFirewallRuleResponse(PortForwardingRule fwRule) { + public FirewallRuleResponse createPortForwardingRuleResponse(PortForwardingRule fwRule) { FirewallRuleResponse response = new FirewallRuleResponse(); response.setId(fwRule.getId()); response.setPrivateStartPort(Integer.toString(fwRule.getDestinationPortStart())); diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 8c200027584..a7088098192 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -439,11 +439,6 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, _usageEventDao.persist(usageEvent); txn.commit(); - // send firewallRule to the backend - if (openFirewall) { - success = success && _firewallMgr.applyFirewallRules(lb.getSourceIpAddressId(), caller.getCaller()); - } - return newRule; } catch (Exception e) { success = false;