diff --git a/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java b/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java index 00d5c97e8e3..16a398f459d 100644 --- a/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java @@ -59,7 +59,7 @@ public class CreateIpForwardingRuleCmd extends BaseAsyncCreateCmd implements Por return ipAddress; } - public Long getVirtualMachineId() { + public long getVirtualMachineId() { return virtualMachineId; } diff --git a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java index 60b18b98432..6cc1fd8e519 100644 --- a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java @@ -80,12 +80,12 @@ public class CreatePortForwardingRuleCmd extends BaseAsyncCreateCmd implements public String getPublicPort() { return publicPort; } - - public Long getVirtualMachineId() { + + @Override + public long getVirtualMachineId() { return virtualMachineId; } - ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/com/cloud/api/response/FirewallRuleResponse.java b/api/src/com/cloud/api/response/FirewallRuleResponse.java index 96e02f12976..62c7c938218 100644 --- a/api/src/com/cloud/api/response/FirewallRuleResponse.java +++ b/api/src/com/cloud/api/response/FirewallRuleResponse.java @@ -46,6 +46,9 @@ public class FirewallRuleResponse extends BaseResponse { @SerializedName("ipaddress") @Param(description="the public ip address for the port forwarding rule") private String publicIpAddress; + @SerializedName("state") @Param(description="the state of the rule") + private String state; + public Long getId() { return id; } @@ -109,4 +112,12 @@ public class FirewallRuleResponse extends BaseResponse { public void setPublicIpAddress(String publicIpAddress) { this.publicIpAddress = publicIpAddress; } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } } diff --git a/api/src/com/cloud/network/rules/PortForwardingRule.java b/api/src/com/cloud/network/rules/PortForwardingRule.java index 7ba685c6d46..c7d4febd848 100644 --- a/api/src/com/cloud/network/rules/PortForwardingRule.java +++ b/api/src/com/cloud/network/rules/PortForwardingRule.java @@ -37,4 +37,9 @@ public interface PortForwardingRule extends FirewallRule { * @return end of destination port range */ int getDestinationPortEnd(); + + /** + * @return destination ip address. + */ + long getVirtualMachineId(); } diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index a8f1371a9db..5011277d6ed 100755 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -106,7 +106,7 @@ listPublicIpAddresses=com.cloud.api.commands.ListPublicIpAddressesCmd;15 listPortForwardingRules=com.cloud.api.commands.ListPortForwardingRulesCmd;15 createPortForwardingRule=com.cloud.api.commands.CreatePortForwardingRuleCmd;15 deletePortForwardingRule=com.cloud.api.commands.DeletePortForwardingRuleCmd;15 -updatePortForwardingRule=com.cloud.api.commands.UpdatePortForwardingRuleCmd;15 +#### updatePortForwardingRule=com.cloud.api.commands.UpdatePortForwardingRuleCmd;15 #### NAT commands createIpForwardingRule=com.cloud.api.commands.CreateIpForwardingRuleCmd;15 diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index b8275836544..f15704d46e8 100644 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -100,6 +100,7 @@ import com.cloud.network.Network; import com.cloud.network.RemoteAccessVpn; import com.cloud.network.VpnUser; import com.cloud.network.router.VirtualRouter; +import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.LoadBalancer; import com.cloud.network.rules.PortForwardingRule; import com.cloud.network.security.IngressRule; @@ -138,8 +139,8 @@ import com.cloud.user.UserAccount; import com.cloud.user.UserContext; import com.cloud.user.UserStatisticsVO; import com.cloud.uservm.UserVm; -import com.cloud.utils.net.NetUtils; import com.cloud.utils.Pair; +import com.cloud.utils.net.NetUtils; import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.InstanceGroup; import com.cloud.vm.InstanceGroupVO; @@ -1065,13 +1066,20 @@ public class ApiResponseHelper implements ResponseGenerator { response.setPublicPort(Integer.toString(fwRule.getSourcePortStart())); response.setPublicIpAddress(fwRule.getSourceIpAddress().toString()); if (fwRule.getSourceIpAddress() != null && fwRule.getDestinationIpAddress() != null) { - UserVm vm = ApiDBUtils.findUserVmByPublicIpAndGuestIp(fwRule.getSourceIpAddress().toString(), fwRule.getDestinationIpAddress().toString()); + //UserVm vm = ApiDBUtils.findUserVmByPublicIpAndGuestIp(fwRule.getSourceIpAddress().toString(), fwRule.getDestinationIpAddress().toString()); + UserVm vm = ApiDBUtils.findUserVmById(fwRule.getVirtualMachineId()); if(vm != null){ response.setVirtualMachineId(vm.getId()); response.setVirtualMachineName(vm.getHostName()); response.setVirtualMachineDisplayName(vm.getDisplayName()); } } + FirewallRule.State state = fwRule.getState(); + String stateToSet = state.toString(); + if (state.equals(FirewallRule.State.Revoke)) { + stateToSet = "Deleting"; + } + response.setState(stateToSet); response.setObjectName("portforwardingrule"); return response; } diff --git a/server/src/com/cloud/network/rules/PortForwardingRuleVO.java b/server/src/com/cloud/network/rules/PortForwardingRuleVO.java index 80344b04e3d..6a70cf9d61e 100644 --- a/server/src/com/cloud/network/rules/PortForwardingRuleVO.java +++ b/server/src/com/cloud/network/rules/PortForwardingRuleVO.java @@ -42,20 +42,24 @@ public class PortForwardingRuleVO extends FirewallRuleVO implements PortForwardi private int destinationPortStart; @Column(name="dest_port_end") - private int destinationPortEnd; + private int destinationPortEnd; + + @Column(name="instance_id") + private long instanceId; public PortForwardingRuleVO() { } - public PortForwardingRuleVO(String xId, Ip srcIp, int srcPortStart, int srcPortEnd, Ip dstIp, int dstPortStart, int dstPortEnd, String protocol, long networkId, long accountId, long domainId) { + public PortForwardingRuleVO(String xId, Ip srcIp, int srcPortStart, int srcPortEnd, Ip dstIp, int dstPortStart, int dstPortEnd, String protocol, long networkId, long accountId, long domainId, long instanceId) { super(xId, srcIp, srcPortStart, srcPortEnd, protocol, networkId, accountId, domainId, Purpose.PortForwarding); this.destinationIpAddress = dstIp; + this.instanceId = instanceId; this.destinationPortStart = dstPortStart; this.destinationPortEnd = dstPortEnd; } - public PortForwardingRuleVO(String xId, Ip srcIp, int srcPort, Ip dstIp, int dstPort, String protocol, long networkId, long accountId, long domainId) { - this(xId, srcIp, srcPort, srcPort, dstIp, dstPort, dstPort, protocol, networkId, accountId, domainId); + public PortForwardingRuleVO(String xId, Ip srcIp, int srcPort, Ip dstIp, int dstPort, String protocol, long networkId, long accountId, long domainId, long instanceId) { + this(xId, srcIp, srcPort, srcPort, dstIp, dstPort, dstPort, protocol, networkId, accountId, domainId, instanceId); } @Override @@ -71,6 +75,11 @@ public class PortForwardingRuleVO extends FirewallRuleVO implements PortForwardi @Override public int getDestinationPortEnd() { return destinationPortEnd; + } + + @Override + public long getVirtualMachineId() { + return instanceId; } } diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index 68bbe4209b6..1e25add295b 100644 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -147,6 +147,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { IPAddressVO ipAddress = _ipAddressDao.findById(ipAddr); Ip dstIp = rule.getDestinationIpAddress(); + Long instanceId = null; long networkId; UserVmVO vm = null; Network network = null; @@ -156,7 +157,6 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { if (vm == null) { throw new InvalidParameterValueException("Unable to create ip forwarding rule on address " + ipAddress + ", invalid virtual machine id specified (" + vmId + ")."); } - dstIp = null; List nics = _networkMgr.getNics(vm); for (Nic nic : nics) { @@ -203,7 +203,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { rule.getProtocol(), networkId, accountId, - domainId); + domainId, vmId); newRule = _forwardingDao.persist(newRule); if (isNat) { diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index d6fd69a39a7..2fd92c8d9a9 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -489,6 +489,7 @@ CREATE TABLE `cloud`.`load_balancer_vm_map` ( CREATE TABLE `cloud`.`port_forwarding_rules` ( `id` bigint unsigned NOT NULL COMMENT 'id', + `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance id', `dest_ip_address` bigint unsigned NOT NULL COMMENT 'id_address', `dest_port_start` int(10) NOT NULL COMMENT 'starting port of the port range to map to', `dest_port_end` int(10) NOT NULL COMMENT 'end port of the the port range to map to',