You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bh...@apache.org on 2012/12/04 11:02:55 UTC
[15/55] [abbrv] git commit: api_refactor: refactor nat apis
api_refactor: refactor nat apis
- Fix refactored apis, fix mappings in commands*.in
- Fix comments etc.
Signed-off-by: Rohit Yadav <bh...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/13aa4d85
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/13aa4d85
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/13aa4d85
Branch: refs/heads/api_refactoring
Commit: 13aa4d8530340e69f2a621a9ea813548195843a5
Parents: a033cf1
Author: Rohit Yadav <bh...@apache.org>
Authored: Mon Dec 3 23:30:54 2012 -0800
Committer: Rohit Yadav <bh...@apache.org>
Committed: Mon Dec 3 23:30:54 2012 -0800
----------------------------------------------------------------------
.../api/commands/CreateIpForwardingRuleCmd.java | 311 ---------------
.../api/commands/DeleteIpForwardingRuleCmd.java | 123 ------
.../cloud/api/commands/DisableStaticNatCmd.java | 110 -----
.../com/cloud/api/commands/EnableStaticNatCmd.java | 125 ------
.../api/commands/ListIpForwardingRulesCmd.java | 101 -----
.../nat/command/CreateIpForwardingRuleCmd.java | 311 +++++++++++++++
.../nat/command/DeleteIpForwardingRuleCmd.java | 123 ++++++
.../api/user/nat/command/DisableStaticNatCmd.java | 111 +++++
.../api/user/nat/command/EnableStaticNatCmd.java | 126 ++++++
.../user/nat/command/ListIpForwardingRulesCmd.java | 101 +++++
client/tomcatconf/commands.properties.in | 10 +-
11 files changed, 777 insertions(+), 775 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/13aa4d85/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java b/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java
deleted file mode 100644
index 9d79fdb..0000000
--- a/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java
+++ /dev/null
@@ -1,311 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.api.commands;
-
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseAsyncCmd;
-import org.apache.cloudstack.api.BaseAsyncCreateCmd;
-import org.apache.cloudstack.api.BaseCmd;
-import org.apache.cloudstack.api.IdentityMapper;
-import org.apache.cloudstack.api.Implementation;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.ServerApiException;
-import com.cloud.api.response.FirewallRuleResponse;
-import com.cloud.api.response.IpForwardingRuleResponse;
-import com.cloud.async.AsyncJob;
-import com.cloud.event.EventTypes;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.NetworkRuleConflictException;
-import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.network.IpAddress;
-import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.StaticNatRule;
-import com.cloud.user.Account;
-import com.cloud.user.UserContext;
-
-@Implementation(description="Creates an ip forwarding rule", responseObject=FirewallRuleResponse.class)
-public class CreateIpForwardingRuleCmd extends BaseAsyncCreateCmd implements StaticNatRule {
- public static final Logger s_logger = Logger.getLogger(CreateIpForwardingRuleCmd.class.getName());
-
- private static final String s_name = "createipforwardingruleresponse";
-
- /////////////////////////////////////////////////////
- //////////////// API parameters /////////////////////
- /////////////////////////////////////////////////////
-
- @IdentityMapper(entityTableName="user_ip_address")
- @Parameter(name=ApiConstants.IP_ADDRESS_ID, type=CommandType.LONG, required=true, description="the public IP address id of the forwarding rule, already associated via associateIp")
- private Long ipAddressId;
-
- @Parameter(name=ApiConstants.START_PORT, type=CommandType.INTEGER, required=true, description="the start port for the rule")
- private Integer startPort;
-
- @Parameter(name=ApiConstants.END_PORT, type=CommandType.INTEGER, description="the end port for the rule")
- private Integer endPort;
-
- @Parameter(name=ApiConstants.PROTOCOL, type=CommandType.STRING, required=true, description="the protocol for the rule. Valid values are TCP or UDP.")
- private String protocol;
-
- @Parameter(name = ApiConstants.OPEN_FIREWALL, type = CommandType.BOOLEAN, description = "if true, firewall rule for source/end pubic port is automatically created; if false - firewall rule has to be created explicitely. Has value true by default")
- private Boolean openFirewall;
-
- @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic from")
- private List<String> cidrlist;
-
-
- /////////////////////////////////////////////////////
- /////////////////// Accessors ///////////////////////
- /////////////////////////////////////////////////////
-
- public String getEntityTable() {
- return "firewall_rules";
- }
-
- public Long getIpAddressId() {
- return ipAddressId;
- }
-
- public int getStartPort() {
- return startPort;
- }
-
- public int getEndPort() {
- return endPort;
- }
-
- public Boolean getOpenFirewall() {
- if (openFirewall != null) {
- return openFirewall;
- } else {
- return true;
- }
- }
-
- /////////////////////////////////////////////////////
- /////////////// API Implementation///////////////////
- /////////////////////////////////////////////////////
-
- @Override
- public String getCommandName() {
- return s_name;
- }
-
- @Override
- public void execute() throws ResourceUnavailableException{
-
- boolean result = true;
- FirewallRule rule = null;
- try {
- UserContext.current().setEventDetails("Rule Id: "+ getEntityId());
-
- if (getOpenFirewall()) {
- result = result && _firewallService.applyFirewallRules(ipAddressId, UserContext.current().getCaller());
- }
-
- result = result && _rulesService.applyStaticNatRules(ipAddressId, UserContext.current().getCaller());
- rule = _entityMgr.findById(FirewallRule.class, getEntityId());
- StaticNatRule staticNatRule = _rulesService.buildStaticNatRule(rule, false);
- IpForwardingRuleResponse fwResponse = _responseGenerator.createIpForwardingRuleResponse(staticNatRule);
- fwResponse.setResponseName(getCommandName());
- this.setResponseObject(fwResponse);
- } finally {
- if (!result || rule == null) {
-
- if (getOpenFirewall()) {
- _firewallService.revokeRelatedFirewallRule(getEntityId(), true);
- }
-
- _rulesService.revokeStaticNatRule(getEntityId(), true);
-
- throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Error in creating ip forwarding rule on the domr");
- }
- }
- }
-
- @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 {
- StaticNatRule rule = _rulesService.createStaticNatRule(this, getOpenFirewall());
- this.setEntityId(rule.getId());
- } catch (NetworkRuleConflictException e) {
- s_logger.info("Unable to create Static Nat Rule due to ", e);
- throw new ServerApiException(BaseCmd.NETWORK_RULE_CONFLICT_ERROR, e.getMessage());
- }
- }
-
- @Override
- public long getEntityOwnerId() {
- Account account = UserContext.current().getCaller();
-
- if (account != null) {
- return account.getId();
- }
-
- return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked
- }
-
- @Override
- public String getEventType() {
- return EventTypes.EVENT_NET_RULE_ADD;
- }
-
- @Override
- public String getEventDescription() {
- IpAddress ip = _networkService.getIp(ipAddressId);
- return ("Applying an ipforwarding 1:1 NAT rule for Ip: "+ip.getAddress()+" with virtual machine:"+ this.getVirtualMachineId());
- }
-
- private long getVirtualMachineId() {
- Long vmId = _networkService.getIp(ipAddressId).getAssociatedWithVmId();
-
- if (vmId == null) {
- throw new InvalidParameterValueException("Ip address is not associated with any network, unable to create static nat rule");
- }
- return vmId;
- }
-
- @Override
- public String getDestIpAddress(){
- return null;
- }
-
- @Override
- public long getId() {
- throw new UnsupportedOperationException("Don't call me");
- }
-
- @Override
- public Long getSourceIpAddressId() {
- return ipAddressId;
- }
-
- @Override
- public Integer getSourcePortStart() {
- return startPort;
- }
-
- @Override
- public Integer getSourcePortEnd() {
- if (endPort == null) {
- return startPort;
- } else {
- return endPort;
- }
- }
-
- @Override
- public String getProtocol() {
- return protocol;
- }
-
- @Override
- public FirewallRule.Purpose getPurpose() {
- return FirewallRule.Purpose.StaticNat;
- }
-
- @Override
- public FirewallRule.State getState() {
- throw new UnsupportedOperationException("Don't call me");
- }
-
- @Override
- public long getNetworkId() {
- return -1;
- }
-
- @Override
- public long getDomainId() {
- IpAddress ip = _networkService.getIp(ipAddressId);
- return ip.getDomainId();
- }
-
- @Override
- public long getAccountId() {
- IpAddress ip = _networkService.getIp(ipAddressId);
- return ip.getAccountId();
- }
-
- @Override
- public String getXid() {
- // FIXME: We should allow for end user to specify Xid.
- return null;
- }
-
- @Override
- public String getSyncObjType() {
- return BaseAsyncCmd.networkSyncObject;
- }
-
- @Override
- public Long getSyncObjId() {
- return getIp().getAssociatedWithNetworkId();
- }
-
- private IpAddress getIp() {
- IpAddress ip = _networkService.getIp(ipAddressId);
- if (ip == null) {
- throw new InvalidParameterValueException("Unable to find ip address by id " + ipAddressId);
- }
- return ip;
- }
-
- @Override
- public Integer getIcmpCode() {
- return null;
- }
-
- @Override
- public Integer getIcmpType() {
- return null;
- }
-
- @Override
- public List<String> getSourceCidrList() {
- return null;
- }
-
- @Override
- public Long getRelated() {
- return null;
- }
-
- @Override
- public FirewallRuleType getType() {
- return FirewallRuleType.User;
- }
-
- @Override
- public AsyncJob.Type getInstanceType() {
- return AsyncJob.Type.FirewallRule;
- }
-
- @Override
- public TrafficType getTrafficType() {
- return null;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/13aa4d85/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java b/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java
deleted file mode 100644
index 78c3892..0000000
--- a/api/src/com/cloud/api/commands/DeleteIpForwardingRuleCmd.java
+++ /dev/null
@@ -1,123 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.api.commands;
-
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseAsyncCmd;
-import org.apache.cloudstack.api.BaseCmd;
-import org.apache.cloudstack.api.IdentityMapper;
-import org.apache.cloudstack.api.Implementation;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.ServerApiException;
-import com.cloud.api.response.SuccessResponse;
-import com.cloud.async.AsyncJob;
-import com.cloud.event.EventTypes;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.network.rules.FirewallRule;
-import com.cloud.user.UserContext;
-
-@Implementation(description="Deletes an ip forwarding rule", responseObject=SuccessResponse.class)
-public class DeleteIpForwardingRuleCmd extends BaseAsyncCmd {
- public static final Logger s_logger = Logger.getLogger(DeleteIpForwardingRuleCmd.class.getName());
-
- private static final String s_name = "deleteipforwardingruleresponse";
-
- /////////////////////////////////////////////////////
- //////////////// API parameters /////////////////////
- /////////////////////////////////////////////////////
-
- @IdentityMapper(entityTableName="firewall_rules")
- @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the id of the forwarding rule")
- private Long id;
-
-
- // unexposed parameter needed for events logging
- @IdentityMapper(entityTableName="account")
- @Parameter(name=ApiConstants.ACCOUNT_ID, type=CommandType.LONG, expose=false)
- private Long ownerId;
- /////////////////////////////////////////////////////
- /////////////////// Accessors ///////////////////////
- /////////////////////////////////////////////////////
-
- public Long getId() {
- return id;
- }
-
- /////////////////////////////////////////////////////
- /////////////// API Implementation///////////////////
- /////////////////////////////////////////////////////
-
- @Override
- public String getCommandName() {
- return s_name;
- }
-
- @Override
- public void execute(){
- UserContext.current().setEventDetails("Rule Id: "+id);
- boolean result = _firewallService.revokeRelatedFirewallRule(id, true);
- result = result && _rulesService.revokeStaticNatRule(id, true);
-
- if (result) {
- SuccessResponse response = new SuccessResponse(getCommandName());
- this.setResponseObject(response);
- } else {
- throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete ip forwarding rule");
- }
- }
-
- @Override
- public long getEntityOwnerId() {
- if (ownerId == null) {
- FirewallRule rule = _entityMgr.findById(FirewallRule.class, id);
- if (rule == null) {
- throw new InvalidParameterValueException("Unable to find static nat rule by id: " + id);
- } else {
- ownerId = rule.getAccountId();
- }
- }
- return ownerId;
- }
-
- @Override
- public String getEventType() {
- return EventTypes.EVENT_NET_RULE_DELETE;
- }
-
- @Override
- public String getEventDescription() {
- return ("Deleting an ipforwarding 1:1 NAT rule id:"+id);
- }
-
- @Override
- public String getSyncObjType() {
- return BaseAsyncCmd.networkSyncObject;
- }
-
- @Override
- public Long getSyncObjId() {
- return _rulesService.getFirewallRule(id).getNetworkId();
- }
-
- @Override
- public AsyncJob.Type getInstanceType() {
- return AsyncJob.Type.FirewallRule;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/13aa4d85/api/src/com/cloud/api/commands/DisableStaticNatCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/DisableStaticNatCmd.java b/api/src/com/cloud/api/commands/DisableStaticNatCmd.java
deleted file mode 100644
index 10c77c6..0000000
--- a/api/src/com/cloud/api/commands/DisableStaticNatCmd.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.api.commands;
-
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseAsyncCmd;
-import org.apache.cloudstack.api.BaseCmd;
-import org.apache.cloudstack.api.IdentityMapper;
-import org.apache.cloudstack.api.Implementation;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.ServerApiException;
-import com.cloud.api.response.SuccessResponse;
-import com.cloud.event.EventTypes;
-import com.cloud.exception.InsufficientAddressCapacityException;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.NetworkRuleConflictException;
-import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.network.IpAddress;
-
-@Implementation(description="Disables static rule for given ip address", responseObject=SuccessResponse.class)
-public class DisableStaticNatCmd extends BaseAsyncCmd {
- public static final Logger s_logger = Logger.getLogger(DeletePortForwardingRuleCmd.class.getName());
- private static final String s_name = "disablestaticnatresponse";
-
- /////////////////////////////////////////////////////
- //////////////// API parameters /////////////////////
- /////////////////////////////////////////////////////
-
- @IdentityMapper(entityTableName="user_ip_address")
- @Parameter(name=ApiConstants.IP_ADDRESS_ID, type=CommandType.LONG, required=true, description="the public IP address id for which static nat feature is being disableed")
- private Long ipAddressId;
-
- /////////////////////////////////////////////////////
- /////////////////// Accessors ///////////////////////
- /////////////////////////////////////////////////////
-
- public Long getIpAddress() {
- return ipAddressId;
- }
-
- /////////////////////////////////////////////////////
- /////////////// API Implementation///////////////////
- /////////////////////////////////////////////////////
- @Override
- public String getCommandName() {
- return s_name;
- }
-
- @Override
- public String getEventType() {
- return EventTypes.EVENT_DISABLE_STATIC_NAT;
- }
-
- @Override
- public String getEventDescription() {
- return ("Disabling static nat for ip id=" + ipAddressId);
- }
-
- @Override
- public long getEntityOwnerId() {
- return _entityMgr.findById(IpAddress.class, ipAddressId).getAccountId();
- }
-
- @Override
- public void execute() throws ResourceUnavailableException, NetworkRuleConflictException, InsufficientAddressCapacityException {
- boolean result = _rulesService.disableStaticNat(ipAddressId);
-
- if (result) {
- SuccessResponse response = new SuccessResponse(getCommandName());
- this.setResponseObject(response);
- } else {
- throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to disable static nat");
- }
- }
-
-
- @Override
- public String getSyncObjType() {
- return BaseAsyncCmd.networkSyncObject;
- }
-
- @Override
- public Long getSyncObjId() {
- return getIp().getAssociatedWithNetworkId();
- }
-
- private IpAddress getIp() {
- IpAddress ip = _networkService.getIp(ipAddressId);
- if (ip == null) {
- throw new InvalidParameterValueException("Unable to find ip address by id " + ipAddressId);
- }
- return ip;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/13aa4d85/api/src/com/cloud/api/commands/EnableStaticNatCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/EnableStaticNatCmd.java b/api/src/com/cloud/api/commands/EnableStaticNatCmd.java
deleted file mode 100644
index b27566c..0000000
--- a/api/src/com/cloud/api/commands/EnableStaticNatCmd.java
+++ /dev/null
@@ -1,125 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.api.commands;
-
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseCmd;
-import org.apache.cloudstack.api.IdentityMapper;
-import org.apache.cloudstack.api.Implementation;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.ServerApiException;
-import com.cloud.api.response.SuccessResponse;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.NetworkRuleConflictException;
-import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.network.IpAddress;
-import com.cloud.user.Account;
-import com.cloud.uservm.UserVm;
-
-@Implementation(description="Enables static nat for given ip address", responseObject=SuccessResponse.class)
-public class EnableStaticNatCmd extends BaseCmd{
- public static final Logger s_logger = Logger.getLogger(CreateIpForwardingRuleCmd.class.getName());
-
- private static final String s_name = "enablestaticnatresponse";
-
- /////////////////////////////////////////////////////
- //////////////// API parameters /////////////////////
- /////////////////////////////////////////////////////
-
- @IdentityMapper(entityTableName="user_ip_address")
- @Parameter(name=ApiConstants.IP_ADDRESS_ID, type=CommandType.LONG, required=true, description="the public IP " +
- "address id for which static nat feature is being enabled")
- private Long ipAddressId;
-
- @IdentityMapper(entityTableName="vm_instance")
- @Parameter(name=ApiConstants.VIRTUAL_MACHINE_ID, type=CommandType.LONG, required=true, description="the ID of " +
- "the virtual machine for enabling static nat feature")
- private Long virtualMachineId;
-
- @IdentityMapper(entityTableName="networks")
- @Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.LONG,
- description="The network of the vm the static nat will be enabled for." +
- " Required when public Ip address is not associated with any Guest network yet (VPC case)")
- private Long networkId;
-
- /////////////////////////////////////////////////////
- /////////////////// Accessors ///////////////////////
- /////////////////////////////////////////////////////
-
- public Long getIpAddressId() {
- return ipAddressId;
- }
-
- public Long getVirtualMachineId() {
- return virtualMachineId;
- }
-
- public long getNetworkId() {
- IpAddress ip = _entityMgr.findById(IpAddress.class, getIpAddressId());
- Long ntwkId = null;
-
- if (ip.getAssociatedWithNetworkId() != null) {
- ntwkId = ip.getAssociatedWithNetworkId();
- } else {
- ntwkId = networkId;
- }
- if (ntwkId == null) {
- throw new InvalidParameterValueException("Unable to enable static nat for the ipAddress id=" + ipAddressId +
- " as ip is not associated with any network and no networkId is passed in");
- }
- return ntwkId;
- }
-
- /////////////////////////////////////////////////////
- /////////////// API Implementation///////////////////
- /////////////////////////////////////////////////////
-
- @Override
- public String getCommandName() {
- return s_name;
- }
-
- @Override
- public long getEntityOwnerId() {
- UserVm userVm = _entityMgr.findById(UserVm.class, getVirtualMachineId());
- if (userVm != null) {
- return userVm.getAccountId();
- }
-
- return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked
- }
-
- @Override
- public void execute() throws ResourceUnavailableException{
- try {
- boolean result = _rulesService.enableStaticNat(ipAddressId, virtualMachineId, getNetworkId(), false);
- if (result) {
- SuccessResponse response = new SuccessResponse(getCommandName());
- this.setResponseObject(response);
- } else {
- throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to enable static nat");
- }
- } catch (NetworkRuleConflictException ex) {
- s_logger.info("Network rule conflict: " + ex.getMessage());
- s_logger.trace("Network Rule Conflict: ", ex);
- throw new ServerApiException(BaseCmd.NETWORK_RULE_CONFLICT_ERROR, ex.getMessage());
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/13aa4d85/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java b/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java
deleted file mode 100644
index 9551579..0000000
--- a/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java
+++ /dev/null
@@ -1,101 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.api.commands;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
-import org.apache.cloudstack.api.IdentityMapper;
-import org.apache.cloudstack.api.Implementation;
-import org.apache.cloudstack.api.Parameter;
-import com.cloud.api.response.FirewallRuleResponse;
-import com.cloud.api.response.IpForwardingRuleResponse;
-import com.cloud.api.response.ListResponse;
-import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.StaticNatRule;
-import com.cloud.utils.Pair;
-
-@Implementation(description="List the ip forwarding rules", responseObject=FirewallRuleResponse.class)
-public class ListIpForwardingRulesCmd extends BaseListProjectAndAccountResourcesCmd {
- public static final Logger s_logger = Logger.getLogger(ListIpForwardingRulesCmd.class.getName());
-
- private static final String s_name = "listipforwardingrulesresponse";
-
- /////////////////////////////////////////////////////
- //////////////// API parameters /////////////////////
- /////////////////////////////////////////////////////
-
- @IdentityMapper(entityTableName="user_ip_address")
- @Parameter(name=ApiConstants.IP_ADDRESS_ID, type=CommandType.LONG, description="list the rule belonging to this public ip address")
- private Long publicIpAddressId;
-
- @IdentityMapper(entityTableName="firewall_rules")
- @Parameter(name=ApiConstants.ID, type=CommandType.LONG, description="Lists rule with the specified ID.")
- private Long id;
-
- @IdentityMapper(entityTableName="vm_instance")
- @Parameter(name=ApiConstants.VIRTUAL_MACHINE_ID, type=CommandType.LONG, description="Lists all rules applied to the specified Vm.")
- private Long vmId;
-
- /////////////////////////////////////////////////////
- /////////////////// Accessors ///////////////////////
- /////////////////////////////////////////////////////
-
-
- /////////////////////////////////////////////////////
- /////////////// API Implementation///////////////////
- /////////////////////////////////////////////////////
- @Override
- public String getCommandName() {
- return s_name;
- }
-
- public Long getPublicIpAddressId() {
- return publicIpAddressId;
- }
-
- public Long getId() {
- return id;
- }
-
- public Long getVmId() {
- return vmId;
- }
-
- @Override
- public void execute(){
- Pair<List<? extends FirewallRule>, Integer> result = _rulesService.searchStaticNatRules(publicIpAddressId, id, vmId,
- this.getStartIndex(), this.getPageSizeVal(), this.getAccountName(), this.getDomainId(), this.getProjectId(), this.isRecursive(), this.listAll());
- ListResponse<IpForwardingRuleResponse> response = new ListResponse<IpForwardingRuleResponse>();
- List<IpForwardingRuleResponse> ipForwardingResponses = new ArrayList<IpForwardingRuleResponse>();
- for (FirewallRule rule : result.first()) {
- StaticNatRule staticNatRule = _rulesService.buildStaticNatRule(rule, false);
- IpForwardingRuleResponse resp = _responseGenerator.createIpForwardingRuleResponse(staticNatRule);
- if (resp != null) {
- ipForwardingResponses.add(resp);
- }
- }
- response.setResponses(ipForwardingResponses, result.second());
- response.setResponseName(getCommandName());
- this.setResponseObject(response);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/13aa4d85/api/src/org/apache/cloudstack/api/user/nat/command/CreateIpForwardingRuleCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/user/nat/command/CreateIpForwardingRuleCmd.java b/api/src/org/apache/cloudstack/api/user/nat/command/CreateIpForwardingRuleCmd.java
new file mode 100644
index 0000000..8f4dff7
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/user/nat/command/CreateIpForwardingRuleCmd.java
@@ -0,0 +1,311 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.user.nat.command;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.BaseAsyncCreateCmd;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.IdentityMapper;
+import org.apache.cloudstack.api.Implementation;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import com.cloud.api.response.FirewallRuleResponse;
+import com.cloud.api.response.IpForwardingRuleResponse;
+import com.cloud.async.AsyncJob;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.IpAddress;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.StaticNatRule;
+import com.cloud.user.Account;
+import com.cloud.user.UserContext;
+
+@Implementation(description="Creates an ip forwarding rule", responseObject=FirewallRuleResponse.class)
+public class CreateIpForwardingRuleCmd extends BaseAsyncCreateCmd implements StaticNatRule {
+ public static final Logger s_logger = Logger.getLogger(CreateIpForwardingRuleCmd.class.getName());
+
+ private static final String s_name = "createipforwardingruleresponse";
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @IdentityMapper(entityTableName="user_ip_address")
+ @Parameter(name=ApiConstants.IP_ADDRESS_ID, type=CommandType.LONG, required=true, description="the public IP address id of the forwarding rule, already associated via associateIp")
+ private Long ipAddressId;
+
+ @Parameter(name=ApiConstants.START_PORT, type=CommandType.INTEGER, required=true, description="the start port for the rule")
+ private Integer startPort;
+
+ @Parameter(name=ApiConstants.END_PORT, type=CommandType.INTEGER, description="the end port for the rule")
+ private Integer endPort;
+
+ @Parameter(name=ApiConstants.PROTOCOL, type=CommandType.STRING, required=true, description="the protocol for the rule. Valid values are TCP or UDP.")
+ private String protocol;
+
+ @Parameter(name = ApiConstants.OPEN_FIREWALL, type = CommandType.BOOLEAN, description = "if true, firewall rule for source/end pubic port is automatically created; if false - firewall rule has to be created explicitely. Has value true by default")
+ private Boolean openFirewall;
+
+ @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic from")
+ private List<String> cidrlist;
+
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public String getEntityTable() {
+ return "firewall_rules";
+ }
+
+ public Long getIpAddressId() {
+ return ipAddressId;
+ }
+
+ public int getStartPort() {
+ return startPort;
+ }
+
+ public int getEndPort() {
+ return endPort;
+ }
+
+ public Boolean getOpenFirewall() {
+ if (openFirewall != null) {
+ return openFirewall;
+ } else {
+ return true;
+ }
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ @Override
+ public void execute() throws ResourceUnavailableException{
+
+ boolean result = true;
+ FirewallRule rule = null;
+ try {
+ UserContext.current().setEventDetails("Rule Id: "+ getEntityId());
+
+ if (getOpenFirewall()) {
+ result = result && _firewallService.applyFirewallRules(ipAddressId, UserContext.current().getCaller());
+ }
+
+ result = result && _rulesService.applyStaticNatRules(ipAddressId, UserContext.current().getCaller());
+ rule = _entityMgr.findById(FirewallRule.class, getEntityId());
+ StaticNatRule staticNatRule = _rulesService.buildStaticNatRule(rule, false);
+ IpForwardingRuleResponse fwResponse = _responseGenerator.createIpForwardingRuleResponse(staticNatRule);
+ fwResponse.setResponseName(getCommandName());
+ this.setResponseObject(fwResponse);
+ } finally {
+ if (!result || rule == null) {
+
+ if (getOpenFirewall()) {
+ _firewallService.revokeRelatedFirewallRule(getEntityId(), true);
+ }
+
+ _rulesService.revokeStaticNatRule(getEntityId(), true);
+
+ throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Error in creating ip forwarding rule on the domr");
+ }
+ }
+ }
+
+ @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 {
+ StaticNatRule rule = _rulesService.createStaticNatRule(this, getOpenFirewall());
+ this.setEntityId(rule.getId());
+ } catch (NetworkRuleConflictException e) {
+ s_logger.info("Unable to create Static Nat Rule due to ", e);
+ throw new ServerApiException(BaseCmd.NETWORK_RULE_CONFLICT_ERROR, e.getMessage());
+ }
+ }
+
+ @Override
+ public long getEntityOwnerId() {
+ Account account = UserContext.current().getCaller();
+
+ if (account != null) {
+ return account.getId();
+ }
+
+ return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked
+ }
+
+ @Override
+ public String getEventType() {
+ return EventTypes.EVENT_NET_RULE_ADD;
+ }
+
+ @Override
+ public String getEventDescription() {
+ IpAddress ip = _networkService.getIp(ipAddressId);
+ return ("Applying an ipforwarding 1:1 NAT rule for Ip: "+ip.getAddress()+" with virtual machine:"+ this.getVirtualMachineId());
+ }
+
+ private long getVirtualMachineId() {
+ Long vmId = _networkService.getIp(ipAddressId).getAssociatedWithVmId();
+
+ if (vmId == null) {
+ throw new InvalidParameterValueException("Ip address is not associated with any network, unable to create static nat rule");
+ }
+ return vmId;
+ }
+
+ @Override
+ public String getDestIpAddress(){
+ return null;
+ }
+
+ @Override
+ public long getId() {
+ throw new UnsupportedOperationException("Don't call me");
+ }
+
+ @Override
+ public Long getSourceIpAddressId() {
+ return ipAddressId;
+ }
+
+ @Override
+ public Integer getSourcePortStart() {
+ return startPort;
+ }
+
+ @Override
+ public Integer getSourcePortEnd() {
+ if (endPort == null) {
+ return startPort;
+ } else {
+ return endPort;
+ }
+ }
+
+ @Override
+ public String getProtocol() {
+ return protocol;
+ }
+
+ @Override
+ public FirewallRule.Purpose getPurpose() {
+ return FirewallRule.Purpose.StaticNat;
+ }
+
+ @Override
+ public FirewallRule.State getState() {
+ throw new UnsupportedOperationException("Don't call me");
+ }
+
+ @Override
+ public long getNetworkId() {
+ return -1;
+ }
+
+ @Override
+ public long getDomainId() {
+ IpAddress ip = _networkService.getIp(ipAddressId);
+ return ip.getDomainId();
+ }
+
+ @Override
+ public long getAccountId() {
+ IpAddress ip = _networkService.getIp(ipAddressId);
+ return ip.getAccountId();
+ }
+
+ @Override
+ public String getXid() {
+ // FIXME: We should allow for end user to specify Xid.
+ return null;
+ }
+
+ @Override
+ public String getSyncObjType() {
+ return BaseAsyncCmd.networkSyncObject;
+ }
+
+ @Override
+ public Long getSyncObjId() {
+ return getIp().getAssociatedWithNetworkId();
+ }
+
+ private IpAddress getIp() {
+ IpAddress ip = _networkService.getIp(ipAddressId);
+ if (ip == null) {
+ throw new InvalidParameterValueException("Unable to find ip address by id " + ipAddressId);
+ }
+ return ip;
+ }
+
+ @Override
+ public Integer getIcmpCode() {
+ return null;
+ }
+
+ @Override
+ public Integer getIcmpType() {
+ return null;
+ }
+
+ @Override
+ public List<String> getSourceCidrList() {
+ return null;
+ }
+
+ @Override
+ public Long getRelated() {
+ return null;
+ }
+
+ @Override
+ public FirewallRuleType getType() {
+ return FirewallRuleType.User;
+ }
+
+ @Override
+ public AsyncJob.Type getInstanceType() {
+ return AsyncJob.Type.FirewallRule;
+ }
+
+ @Override
+ public TrafficType getTrafficType() {
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/13aa4d85/api/src/org/apache/cloudstack/api/user/nat/command/DeleteIpForwardingRuleCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/user/nat/command/DeleteIpForwardingRuleCmd.java b/api/src/org/apache/cloudstack/api/user/nat/command/DeleteIpForwardingRuleCmd.java
new file mode 100644
index 0000000..aa0d87f
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/user/nat/command/DeleteIpForwardingRuleCmd.java
@@ -0,0 +1,123 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.user.nat.command;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.IdentityMapper;
+import org.apache.cloudstack.api.Implementation;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import com.cloud.api.response.SuccessResponse;
+import com.cloud.async.AsyncJob;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.user.UserContext;
+
+@Implementation(description="Deletes an ip forwarding rule", responseObject=SuccessResponse.class)
+public class DeleteIpForwardingRuleCmd extends BaseAsyncCmd {
+ public static final Logger s_logger = Logger.getLogger(DeleteIpForwardingRuleCmd.class.getName());
+
+ private static final String s_name = "deleteipforwardingruleresponse";
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @IdentityMapper(entityTableName="firewall_rules")
+ @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the id of the forwarding rule")
+ private Long id;
+
+
+ // unexposed parameter needed for events logging
+ @IdentityMapper(entityTableName="account")
+ @Parameter(name=ApiConstants.ACCOUNT_ID, type=CommandType.LONG, expose=false)
+ private Long ownerId;
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getId() {
+ return id;
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ @Override
+ public void execute(){
+ UserContext.current().setEventDetails("Rule Id: "+id);
+ boolean result = _firewallService.revokeRelatedFirewallRule(id, true);
+ result = result && _rulesService.revokeStaticNatRule(id, true);
+
+ if (result) {
+ SuccessResponse response = new SuccessResponse(getCommandName());
+ this.setResponseObject(response);
+ } else {
+ throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete ip forwarding rule");
+ }
+ }
+
+ @Override
+ public long getEntityOwnerId() {
+ if (ownerId == null) {
+ FirewallRule rule = _entityMgr.findById(FirewallRule.class, id);
+ if (rule == null) {
+ throw new InvalidParameterValueException("Unable to find static nat rule by id: " + id);
+ } else {
+ ownerId = rule.getAccountId();
+ }
+ }
+ return ownerId;
+ }
+
+ @Override
+ public String getEventType() {
+ return EventTypes.EVENT_NET_RULE_DELETE;
+ }
+
+ @Override
+ public String getEventDescription() {
+ return ("Deleting an ipforwarding 1:1 NAT rule id:"+id);
+ }
+
+ @Override
+ public String getSyncObjType() {
+ return BaseAsyncCmd.networkSyncObject;
+ }
+
+ @Override
+ public Long getSyncObjId() {
+ return _rulesService.getFirewallRule(id).getNetworkId();
+ }
+
+ @Override
+ public AsyncJob.Type getInstanceType() {
+ return AsyncJob.Type.FirewallRule;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/13aa4d85/api/src/org/apache/cloudstack/api/user/nat/command/DisableStaticNatCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/user/nat/command/DisableStaticNatCmd.java b/api/src/org/apache/cloudstack/api/user/nat/command/DisableStaticNatCmd.java
new file mode 100644
index 0000000..912ad99
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/user/nat/command/DisableStaticNatCmd.java
@@ -0,0 +1,111 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.user.nat.command;
+
+import com.cloud.api.commands.DeletePortForwardingRuleCmd;
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.IdentityMapper;
+import org.apache.cloudstack.api.Implementation;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import com.cloud.api.response.SuccessResponse;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.IpAddress;
+
+@Implementation(description="Disables static rule for given ip address", responseObject=SuccessResponse.class)
+public class DisableStaticNatCmd extends BaseAsyncCmd {
+ public static final Logger s_logger = Logger.getLogger(DeletePortForwardingRuleCmd.class.getName());
+ private static final String s_name = "disablestaticnatresponse";
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @IdentityMapper(entityTableName="user_ip_address")
+ @Parameter(name=ApiConstants.IP_ADDRESS_ID, type=CommandType.LONG, required=true, description="the public IP address id for which static nat feature is being disableed")
+ private Long ipAddressId;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getIpAddress() {
+ return ipAddressId;
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ @Override
+ public String getEventType() {
+ return EventTypes.EVENT_DISABLE_STATIC_NAT;
+ }
+
+ @Override
+ public String getEventDescription() {
+ return ("Disabling static nat for ip id=" + ipAddressId);
+ }
+
+ @Override
+ public long getEntityOwnerId() {
+ return _entityMgr.findById(IpAddress.class, ipAddressId).getAccountId();
+ }
+
+ @Override
+ public void execute() throws ResourceUnavailableException, NetworkRuleConflictException, InsufficientAddressCapacityException {
+ boolean result = _rulesService.disableStaticNat(ipAddressId);
+
+ if (result) {
+ SuccessResponse response = new SuccessResponse(getCommandName());
+ this.setResponseObject(response);
+ } else {
+ throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to disable static nat");
+ }
+ }
+
+
+ @Override
+ public String getSyncObjType() {
+ return BaseAsyncCmd.networkSyncObject;
+ }
+
+ @Override
+ public Long getSyncObjId() {
+ return getIp().getAssociatedWithNetworkId();
+ }
+
+ private IpAddress getIp() {
+ IpAddress ip = _networkService.getIp(ipAddressId);
+ if (ip == null) {
+ throw new InvalidParameterValueException("Unable to find ip address by id " + ipAddressId);
+ }
+ return ip;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/13aa4d85/api/src/org/apache/cloudstack/api/user/nat/command/EnableStaticNatCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/user/nat/command/EnableStaticNatCmd.java b/api/src/org/apache/cloudstack/api/user/nat/command/EnableStaticNatCmd.java
new file mode 100644
index 0000000..3398077
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/user/nat/command/EnableStaticNatCmd.java
@@ -0,0 +1,126 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.user.nat.command;
+
+import org.apache.cloudstack.api.user.nat.command.CreateIpForwardingRuleCmd;
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.IdentityMapper;
+import org.apache.cloudstack.api.Implementation;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import com.cloud.api.response.SuccessResponse;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.IpAddress;
+import com.cloud.user.Account;
+import com.cloud.uservm.UserVm;
+
+@Implementation(description="Enables static nat for given ip address", responseObject=SuccessResponse.class)
+public class EnableStaticNatCmd extends BaseCmd{
+ public static final Logger s_logger = Logger.getLogger(CreateIpForwardingRuleCmd.class.getName());
+
+ private static final String s_name = "enablestaticnatresponse";
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @IdentityMapper(entityTableName="user_ip_address")
+ @Parameter(name=ApiConstants.IP_ADDRESS_ID, type=CommandType.LONG, required=true, description="the public IP " +
+ "address id for which static nat feature is being enabled")
+ private Long ipAddressId;
+
+ @IdentityMapper(entityTableName="vm_instance")
+ @Parameter(name=ApiConstants.VIRTUAL_MACHINE_ID, type=CommandType.LONG, required=true, description="the ID of " +
+ "the virtual machine for enabling static nat feature")
+ private Long virtualMachineId;
+
+ @IdentityMapper(entityTableName="networks")
+ @Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.LONG,
+ description="The network of the vm the static nat will be enabled for." +
+ " Required when public Ip address is not associated with any Guest network yet (VPC case)")
+ private Long networkId;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+ public Long getIpAddressId() {
+ return ipAddressId;
+ }
+
+ public Long getVirtualMachineId() {
+ return virtualMachineId;
+ }
+
+ public long getNetworkId() {
+ IpAddress ip = _entityMgr.findById(IpAddress.class, getIpAddressId());
+ Long ntwkId = null;
+
+ if (ip.getAssociatedWithNetworkId() != null) {
+ ntwkId = ip.getAssociatedWithNetworkId();
+ } else {
+ ntwkId = networkId;
+ }
+ if (ntwkId == null) {
+ throw new InvalidParameterValueException("Unable to enable static nat for the ipAddress id=" + ipAddressId +
+ " as ip is not associated with any network and no networkId is passed in");
+ }
+ return ntwkId;
+ }
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ @Override
+ public long getEntityOwnerId() {
+ UserVm userVm = _entityMgr.findById(UserVm.class, getVirtualMachineId());
+ if (userVm != null) {
+ return userVm.getAccountId();
+ }
+
+ return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked
+ }
+
+ @Override
+ public void execute() throws ResourceUnavailableException{
+ try {
+ boolean result = _rulesService.enableStaticNat(ipAddressId, virtualMachineId, getNetworkId(), false);
+ if (result) {
+ SuccessResponse response = new SuccessResponse(getCommandName());
+ this.setResponseObject(response);
+ } else {
+ throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to enable static nat");
+ }
+ } catch (NetworkRuleConflictException ex) {
+ s_logger.info("Network rule conflict: " + ex.getMessage());
+ s_logger.trace("Network Rule Conflict: ", ex);
+ throw new ServerApiException(BaseCmd.NETWORK_RULE_CONFLICT_ERROR, ex.getMessage());
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/13aa4d85/api/src/org/apache/cloudstack/api/user/nat/command/ListIpForwardingRulesCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/user/nat/command/ListIpForwardingRulesCmd.java b/api/src/org/apache/cloudstack/api/user/nat/command/ListIpForwardingRulesCmd.java
new file mode 100644
index 0000000..50c2408
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/user/nat/command/ListIpForwardingRulesCmd.java
@@ -0,0 +1,101 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.user.nat.command;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
+import org.apache.cloudstack.api.IdentityMapper;
+import org.apache.cloudstack.api.Implementation;
+import org.apache.cloudstack.api.Parameter;
+import com.cloud.api.response.FirewallRuleResponse;
+import com.cloud.api.response.IpForwardingRuleResponse;
+import com.cloud.api.response.ListResponse;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.StaticNatRule;
+import com.cloud.utils.Pair;
+
+@Implementation(description="List the ip forwarding rules", responseObject=FirewallRuleResponse.class)
+public class ListIpForwardingRulesCmd extends BaseListProjectAndAccountResourcesCmd {
+ public static final Logger s_logger = Logger.getLogger(ListIpForwardingRulesCmd.class.getName());
+
+ private static final String s_name = "listipforwardingrulesresponse";
+
+ /////////////////////////////////////////////////////
+ //////////////// API parameters /////////////////////
+ /////////////////////////////////////////////////////
+
+ @IdentityMapper(entityTableName="user_ip_address")
+ @Parameter(name=ApiConstants.IP_ADDRESS_ID, type=CommandType.LONG, description="list the rule belonging to this public ip address")
+ private Long publicIpAddressId;
+
+ @IdentityMapper(entityTableName="firewall_rules")
+ @Parameter(name=ApiConstants.ID, type=CommandType.LONG, description="Lists rule with the specified ID.")
+ private Long id;
+
+ @IdentityMapper(entityTableName="vm_instance")
+ @Parameter(name=ApiConstants.VIRTUAL_MACHINE_ID, type=CommandType.LONG, description="Lists all rules applied to the specified Vm.")
+ private Long vmId;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+
+ /////////////////////////////////////////////////////
+ /////////////// API Implementation///////////////////
+ /////////////////////////////////////////////////////
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ public Long getPublicIpAddressId() {
+ return publicIpAddressId;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public Long getVmId() {
+ return vmId;
+ }
+
+ @Override
+ public void execute(){
+ Pair<List<? extends FirewallRule>, Integer> result = _rulesService.searchStaticNatRules(publicIpAddressId, id, vmId,
+ this.getStartIndex(), this.getPageSizeVal(), this.getAccountName(), this.getDomainId(), this.getProjectId(), this.isRecursive(), this.listAll());
+ ListResponse<IpForwardingRuleResponse> response = new ListResponse<IpForwardingRuleResponse>();
+ List<IpForwardingRuleResponse> ipForwardingResponses = new ArrayList<IpForwardingRuleResponse>();
+ for (FirewallRule rule : result.first()) {
+ StaticNatRule staticNatRule = _rulesService.buildStaticNatRule(rule, false);
+ IpForwardingRuleResponse resp = _responseGenerator.createIpForwardingRuleResponse(staticNatRule);
+ if (resp != null) {
+ ipForwardingResponses.add(resp);
+ }
+ }
+ response.setResponses(ipForwardingResponses, result.second());
+ response.setResponseName(getCommandName());
+ this.setResponseObject(response);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/13aa4d85/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in
index bd59f0c..2a13d32 100755
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -135,11 +135,11 @@ deletePortForwardingRule=com.cloud.api.commands.DeletePortForwardingRuleCmd;15
#### updatePortForwardingRule=com.cloud.api.commands.UpdatePortForwardingRuleCmd;15
#### NAT commands
-enableStaticNat=com.cloud.api.commands.EnableStaticNatCmd;15
-createIpForwardingRule=com.cloud.api.commands.CreateIpForwardingRuleCmd;15
-deleteIpForwardingRule=com.cloud.api.commands.DeleteIpForwardingRuleCmd;15
-listIpForwardingRules=com.cloud.api.commands.ListIpForwardingRulesCmd;15
-disableStaticNat=com.cloud.api.commands.DisableStaticNatCmd;15
+enableStaticNat=org.apache.cloudstack.api.user.nat.command.EnableStaticNatCmd;15
+createIpForwardingRule=org.apache.cloudstack.api.user.nat.command.CreateIpForwardingRuleCmd;15
+deleteIpForwardingRule=org.apache.cloudstack.api.user.nat.command.DeleteIpForwardingRuleCmd;15
+listIpForwardingRules=org.apache.cloudstack.api.user.nat.command.ListIpForwardingRulesCmd;15
+disableStaticNat=org.apache.cloudstack.api.user.nat.command.DisableStaticNatCmd;15
#### load balancer commands
createLoadBalancerRule=com.cloud.api.commands.CreateLoadBalancerRuleCmd;15