mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Merge branch 'master' of ssh://git.cloud.com/var/lib/git/cloudstack-oss
This commit is contained in:
commit
d6c22c42fe
@ -63,8 +63,8 @@ import com.cloud.agent.api.ReadyAnswer;
|
|||||||
import com.cloud.agent.api.ReadyCommand;
|
import com.cloud.agent.api.ReadyCommand;
|
||||||
import com.cloud.agent.api.RebootAnswer;
|
import com.cloud.agent.api.RebootAnswer;
|
||||||
import com.cloud.agent.api.RebootCommand;
|
import com.cloud.agent.api.RebootCommand;
|
||||||
import com.cloud.agent.api.SecurityIngressRuleAnswer;
|
import com.cloud.agent.api.SecurityGroupRuleAnswer;
|
||||||
import com.cloud.agent.api.SecurityIngressRulesCmd;
|
import com.cloud.agent.api.SecurityGroupRulesCmd;
|
||||||
import com.cloud.agent.api.StartAnswer;
|
import com.cloud.agent.api.StartAnswer;
|
||||||
import com.cloud.agent.api.StartCommand;
|
import com.cloud.agent.api.StartCommand;
|
||||||
import com.cloud.agent.api.StartupCommand;
|
import com.cloud.agent.api.StartupCommand;
|
||||||
@ -234,8 +234,8 @@ public class FakeComputingResource extends ServerResourceBase implements ServerR
|
|||||||
return execute((GetStorageStatsCommand) cmd);
|
return execute((GetStorageStatsCommand) cmd);
|
||||||
} else if (cmd instanceof ModifyStoragePoolCommand) {
|
} else if (cmd instanceof ModifyStoragePoolCommand) {
|
||||||
return execute((ModifyStoragePoolCommand) cmd);
|
return execute((ModifyStoragePoolCommand) cmd);
|
||||||
} else if (cmd instanceof SecurityIngressRulesCmd) {
|
} else if (cmd instanceof SecurityGroupRulesCmd) {
|
||||||
return execute((SecurityIngressRulesCmd) cmd);
|
return execute((SecurityGroupRulesCmd) cmd);
|
||||||
} else if (cmd instanceof StartCommand ) {
|
} else if (cmd instanceof StartCommand ) {
|
||||||
return execute((StartCommand) cmd);
|
return execute((StartCommand) cmd);
|
||||||
} else if (cmd instanceof CleanupNetworkRulesCmd) {
|
} else if (cmd instanceof CleanupNetworkRulesCmd) {
|
||||||
@ -257,9 +257,9 @@ public class FakeComputingResource extends ServerResourceBase implements ServerR
|
|||||||
return new Answer(cmd);
|
return new Answer(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Answer execute(SecurityIngressRulesCmd cmd) {
|
private Answer execute(SecurityGroupRulesCmd cmd) {
|
||||||
s_logger.info("Programmed network rules for vm " + cmd.getVmName() + " guestIp=" + cmd.getGuestIp() + ", numrules=" + cmd.getRuleSet().length);
|
s_logger.info("Programmed network rules for vm " + cmd.getVmName() + " guestIp=" + cmd.getGuestIp() + ", numrules=" + cmd.getRuleSet().length);
|
||||||
return new SecurityIngressRuleAnswer(cmd);
|
return new SecurityGroupRuleAnswer(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Answer execute(ModifyStoragePoolCommand cmd) {
|
private Answer execute(ModifyStoragePoolCommand cmd) {
|
||||||
|
|||||||
@ -120,8 +120,8 @@ import com.cloud.agent.api.ReadyCommand;
|
|||||||
import com.cloud.agent.api.RebootAnswer;
|
import com.cloud.agent.api.RebootAnswer;
|
||||||
import com.cloud.agent.api.RebootCommand;
|
import com.cloud.agent.api.RebootCommand;
|
||||||
import com.cloud.agent.api.RebootRouterCommand;
|
import com.cloud.agent.api.RebootRouterCommand;
|
||||||
import com.cloud.agent.api.SecurityIngressRuleAnswer;
|
import com.cloud.agent.api.SecurityGroupRuleAnswer;
|
||||||
import com.cloud.agent.api.SecurityIngressRulesCmd;
|
import com.cloud.agent.api.SecurityGroupRulesCmd;
|
||||||
import com.cloud.agent.api.StartAnswer;
|
import com.cloud.agent.api.StartAnswer;
|
||||||
import com.cloud.agent.api.StartCommand;
|
import com.cloud.agent.api.StartCommand;
|
||||||
import com.cloud.agent.api.StartupCommand;
|
import com.cloud.agent.api.StartupCommand;
|
||||||
@ -913,8 +913,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
|
|||||||
return execute((CreateStoragePoolCommand) cmd);
|
return execute((CreateStoragePoolCommand) cmd);
|
||||||
} else if (cmd instanceof ModifyStoragePoolCommand) {
|
} else if (cmd instanceof ModifyStoragePoolCommand) {
|
||||||
return execute((ModifyStoragePoolCommand) cmd);
|
return execute((ModifyStoragePoolCommand) cmd);
|
||||||
} else if (cmd instanceof SecurityIngressRulesCmd) {
|
} else if (cmd instanceof SecurityGroupRulesCmd) {
|
||||||
return execute((SecurityIngressRulesCmd) cmd);
|
return execute((SecurityGroupRulesCmd) cmd);
|
||||||
} else if (cmd instanceof DeleteStoragePoolCommand) {
|
} else if (cmd instanceof DeleteStoragePoolCommand) {
|
||||||
return execute((DeleteStoragePoolCommand) cmd);
|
return execute((DeleteStoragePoolCommand) cmd);
|
||||||
} else if (cmd instanceof FenceCommand ) {
|
} else if (cmd instanceof FenceCommand ) {
|
||||||
@ -1568,7 +1568,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
|
|||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Answer execute(SecurityIngressRulesCmd cmd) {
|
private Answer execute(SecurityGroupRulesCmd cmd) {
|
||||||
String vif = null;
|
String vif = null;
|
||||||
String brname = null;
|
String brname = null;
|
||||||
try {
|
try {
|
||||||
@ -1577,10 +1577,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
|
|||||||
vif = nics.get(0).getDevName();
|
vif = nics.get(0).getDevName();
|
||||||
brname = nics.get(0).getBrName();
|
brname = nics.get(0).getBrName();
|
||||||
} catch (LibvirtException e) {
|
} catch (LibvirtException e) {
|
||||||
return new SecurityIngressRuleAnswer(cmd, false, e.toString());
|
return new SecurityGroupRuleAnswer(cmd, false, e.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean result = add_network_rules(cmd.getVmName(),
|
boolean result = add_network_rules(cmd.getRuleType(), cmd.getVmName(),
|
||||||
Long.toString(cmd.getVmId()),
|
Long.toString(cmd.getVmId()),
|
||||||
cmd.getGuestIp(),cmd.getSignature(),
|
cmd.getGuestIp(),cmd.getSignature(),
|
||||||
Long.toString(cmd.getSeqNum()),
|
Long.toString(cmd.getSeqNum()),
|
||||||
@ -1589,10 +1589,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
|
|||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
s_logger.warn("Failed to program network rules for vm " + cmd.getVmName());
|
s_logger.warn("Failed to program network rules for vm " + cmd.getVmName());
|
||||||
return new SecurityIngressRuleAnswer(cmd, false, "programming network rules failed");
|
return new SecurityGroupRuleAnswer(cmd, false, "programming network rules failed");
|
||||||
} else {
|
} else {
|
||||||
s_logger.debug("Programmed network rules for vm " + cmd.getVmName() + " guestIp=" + cmd.getGuestIp() + ", numrules=" + cmd.getRuleSet().length);
|
s_logger.debug("Programmed network rules for vm " + cmd.getVmName() + " guestIp=" + cmd.getGuestIp() + ", numrules=" + cmd.getRuleSet().length);
|
||||||
return new SecurityIngressRuleAnswer(cmd);
|
return new SecurityGroupRuleAnswer(cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3540,7 +3540,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean add_network_rules(String vmName, String vmId, String guestIP, String sig, String seq, String mac, String rules, String vif, String brname) {
|
private boolean add_network_rules(String ruleType, String vmName, String vmId, String guestIP, String sig, String seq, String mac, String rules, String vif, String brname) {
|
||||||
if (!_can_bridge_firewall) {
|
if (!_can_bridge_firewall) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -3551,6 +3551,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
|
|||||||
cmd.add("--vmname", vmName);
|
cmd.add("--vmname", vmName);
|
||||||
cmd.add("--vmid", vmId);
|
cmd.add("--vmid", vmId);
|
||||||
cmd.add("--vmip", guestIP);
|
cmd.add("--vmip", guestIP);
|
||||||
|
cmd.add("--ruletype", ruleType);
|
||||||
cmd.add("--sig", sig);
|
cmd.add("--sig", sig);
|
||||||
cmd.add("--seq", seq);
|
cmd.add("--seq", seq);
|
||||||
cmd.add("--vmmac", mac);
|
cmd.add("--vmmac", mac);
|
||||||
|
|||||||
@ -1,47 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
|
||||||
*
|
|
||||||
* This software is licensed under the GNU General Public License v3 or later.
|
|
||||||
*
|
|
||||||
* It is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package com.cloud.agent.api;
|
|
||||||
|
|
||||||
public class SecurityEgressRuleAnswer extends Answer {
|
|
||||||
Long logSequenceNumber = null;
|
|
||||||
Long vmId = null;
|
|
||||||
|
|
||||||
protected SecurityEgressRuleAnswer() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public SecurityEgressRuleAnswer(SecurityEgressRulesCmd cmd) {
|
|
||||||
super(cmd);
|
|
||||||
this.logSequenceNumber = cmd.getSeqNum();
|
|
||||||
this.vmId = cmd.getVmId();
|
|
||||||
}
|
|
||||||
|
|
||||||
public SecurityEgressRuleAnswer(SecurityEgressRulesCmd cmd, boolean result, String detail) {
|
|
||||||
super(cmd, result, detail);
|
|
||||||
this.logSequenceNumber = cmd.getSeqNum();
|
|
||||||
this.vmId = cmd.getVmId();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getLogSequenceNumber() {
|
|
||||||
return logSequenceNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getVmId() {
|
|
||||||
return vmId;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,144 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
|
||||||
*
|
|
||||||
* This software is licensed under the GNU General Public License v3 or later.
|
|
||||||
*
|
|
||||||
* It is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package com.cloud.agent.api;
|
|
||||||
|
|
||||||
|
|
||||||
public class SecurityEgressRulesCmd extends Command {
|
|
||||||
public static class EgressIpPortAndProto {
|
|
||||||
String proto;
|
|
||||||
int startPort;
|
|
||||||
int endPort;
|
|
||||||
String [] allowedCidrs;
|
|
||||||
|
|
||||||
public EgressIpPortAndProto() { }
|
|
||||||
|
|
||||||
public EgressIpPortAndProto(String proto, int startPort, int endPort,
|
|
||||||
String[] allowedCidrs) {
|
|
||||||
super();
|
|
||||||
this.proto = proto;
|
|
||||||
this.startPort = startPort;
|
|
||||||
this.endPort = endPort;
|
|
||||||
this.allowedCidrs = allowedCidrs;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String[] getAllowedCidrs() {
|
|
||||||
return allowedCidrs;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAllowedCidrs(String[] allowedCidrs) {
|
|
||||||
this.allowedCidrs = allowedCidrs;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProto() {
|
|
||||||
return proto;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getStartPort() {
|
|
||||||
return startPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getEndPort() {
|
|
||||||
return endPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
String guestIp;
|
|
||||||
String vmName;
|
|
||||||
String guestMac;
|
|
||||||
String signature;
|
|
||||||
Long seqNum;
|
|
||||||
Long vmId;
|
|
||||||
EgressIpPortAndProto [] ruleSet;
|
|
||||||
|
|
||||||
public SecurityEgressRulesCmd() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public SecurityEgressRulesCmd(String guestIp, String guestMac, String vmName, Long vmId, String signature, Long seqNum, EgressIpPortAndProto[] ruleSet) {
|
|
||||||
super();
|
|
||||||
this.guestIp = guestIp;
|
|
||||||
this.vmName = vmName;
|
|
||||||
this.ruleSet = ruleSet;
|
|
||||||
this.guestMac = guestMac;
|
|
||||||
this.signature = signature;
|
|
||||||
this.seqNum = seqNum;
|
|
||||||
this.vmId = vmId;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean executeInSequence() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public EgressIpPortAndProto[] getRuleSet() {
|
|
||||||
return ruleSet;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void setRuleSet(EgressIpPortAndProto[] ruleSet) {
|
|
||||||
this.ruleSet = ruleSet;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String getGuestIp() {
|
|
||||||
return guestIp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String getVmName() {
|
|
||||||
return vmName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String stringifyRules() {
|
|
||||||
StringBuilder ruleBuilder = new StringBuilder();
|
|
||||||
for (SecurityEgressRulesCmd.EgressIpPortAndProto ipPandP: getRuleSet()) {
|
|
||||||
ruleBuilder.append(ipPandP.getProto()).append(":").append(ipPandP.getStartPort()).append(":").append(ipPandP.getEndPort()).append(":");
|
|
||||||
for (String cidr: ipPandP.getAllowedCidrs()) {
|
|
||||||
ruleBuilder.append(cidr).append(",");
|
|
||||||
}
|
|
||||||
ruleBuilder.append("NEXT");
|
|
||||||
ruleBuilder.append(" ");
|
|
||||||
}
|
|
||||||
return ruleBuilder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSignature() {
|
|
||||||
return signature;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String getGuestMac() {
|
|
||||||
return guestMac;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Long getSeqNum() {
|
|
||||||
return seqNum;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Long getVmId() {
|
|
||||||
return vmId;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.cloud.agent.api;
|
package com.cloud.agent.api;
|
||||||
|
|
||||||
public class SecurityIngressRuleAnswer extends Answer {
|
public class SecurityGroupRuleAnswer extends Answer {
|
||||||
public static enum FailureReason {
|
public static enum FailureReason {
|
||||||
NONE,
|
NONE,
|
||||||
UNKNOWN,
|
UNKNOWN,
|
||||||
@ -29,23 +29,23 @@ public class SecurityIngressRuleAnswer extends Answer {
|
|||||||
FailureReason reason = FailureReason.NONE;
|
FailureReason reason = FailureReason.NONE;
|
||||||
|
|
||||||
|
|
||||||
protected SecurityIngressRuleAnswer() {
|
protected SecurityGroupRuleAnswer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public SecurityIngressRuleAnswer(SecurityIngressRulesCmd cmd) {
|
public SecurityGroupRuleAnswer(SecurityGroupRulesCmd cmd) {
|
||||||
super(cmd);
|
super(cmd);
|
||||||
this.logSequenceNumber = cmd.getSeqNum();
|
this.logSequenceNumber = cmd.getSeqNum();
|
||||||
this.vmId = cmd.getVmId();
|
this.vmId = cmd.getVmId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SecurityIngressRuleAnswer(SecurityIngressRulesCmd cmd, boolean result, String detail) {
|
public SecurityGroupRuleAnswer(SecurityGroupRulesCmd cmd, boolean result, String detail) {
|
||||||
super(cmd, result, detail);
|
super(cmd, result, detail);
|
||||||
this.logSequenceNumber = cmd.getSeqNum();
|
this.logSequenceNumber = cmd.getSeqNum();
|
||||||
this.vmId = cmd.getVmId();
|
this.vmId = cmd.getVmId();
|
||||||
reason = FailureReason.PROGRAMMING_FAILED;
|
reason = FailureReason.PROGRAMMING_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SecurityIngressRuleAnswer(SecurityIngressRulesCmd cmd, boolean result, String detail, FailureReason r) {
|
public SecurityGroupRuleAnswer(SecurityGroupRulesCmd cmd, boolean result, String detail, FailureReason r) {
|
||||||
super(cmd, result, detail);
|
super(cmd, result, detail);
|
||||||
this.logSequenceNumber = cmd.getSeqNum();
|
this.logSequenceNumber = cmd.getSeqNum();
|
||||||
this.vmId = cmd.getVmId();
|
this.vmId = cmd.getVmId();
|
||||||
@ -26,11 +26,12 @@ import org.apache.commons.codec.digest.DigestUtils;
|
|||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.agent.api.LogLevel.Log4jLevel;
|
import com.cloud.agent.api.LogLevel.Log4jLevel;
|
||||||
|
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
||||||
import com.cloud.utils.net.NetUtils;
|
import com.cloud.utils.net.NetUtils;
|
||||||
|
|
||||||
|
|
||||||
public class SecurityIngressRulesCmd extends Command {
|
public class SecurityGroupRulesCmd extends Command {
|
||||||
private static Logger s_logger = Logger.getLogger(SecurityIngressRulesCmd.class);
|
private static Logger s_logger = Logger.getLogger(SecurityGroupRulesCmd.class);
|
||||||
public static class IpPortAndProto {
|
public static class IpPortAndProto {
|
||||||
String proto;
|
String proto;
|
||||||
int startPort;
|
int startPort;
|
||||||
@ -80,13 +81,14 @@ public class SecurityIngressRulesCmd extends Command {
|
|||||||
Long vmId;
|
Long vmId;
|
||||||
Long msId;
|
Long msId;
|
||||||
IpPortAndProto [] ruleSet;
|
IpPortAndProto [] ruleSet;
|
||||||
|
SecurityRuleType ruleType;
|
||||||
|
|
||||||
public SecurityIngressRulesCmd() {
|
public SecurityGroupRulesCmd() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public SecurityIngressRulesCmd(String guestIp, String guestMac, String vmName, Long vmId, String signature, Long seqNum, IpPortAndProto[] ruleSet) {
|
public SecurityGroupRulesCmd(SecurityRuleType ruleType, String guestIp, String guestMac, String vmName, Long vmId, String signature, Long seqNum, IpPortAndProto[] ruleSet) {
|
||||||
super();
|
super();
|
||||||
this.guestIp = guestIp;
|
this.guestIp = guestIp;
|
||||||
this.vmName = vmName;
|
this.vmName = vmName;
|
||||||
@ -95,12 +97,17 @@ public class SecurityIngressRulesCmd extends Command {
|
|||||||
this.signature = signature;
|
this.signature = signature;
|
||||||
this.seqNum = seqNum;
|
this.seqNum = seqNum;
|
||||||
this.vmId = vmId;
|
this.vmId = vmId;
|
||||||
|
this.ruleType = ruleType;
|
||||||
if (signature == null) {
|
if (signature == null) {
|
||||||
String stringified = stringifyRules();
|
String stringified = stringifyRules();
|
||||||
this.signature = DigestUtils.md5Hex(stringified);
|
this.signature = DigestUtils.md5Hex(stringified);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getRuleType(){
|
||||||
|
if (this.ruleType == SecurityRuleType.EgressRule) return SecurityRuleType.EgressRule.getType();
|
||||||
|
return SecurityRuleType.IngressRule.getType();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean executeInSequence() {
|
public boolean executeInSequence() {
|
||||||
@ -129,7 +136,7 @@ public class SecurityIngressRulesCmd extends Command {
|
|||||||
|
|
||||||
public String stringifyRules() {
|
public String stringifyRules() {
|
||||||
StringBuilder ruleBuilder = new StringBuilder();
|
StringBuilder ruleBuilder = new StringBuilder();
|
||||||
for (SecurityIngressRulesCmd.IpPortAndProto ipPandP: getRuleSet()) {
|
for (SecurityGroupRulesCmd.IpPortAndProto ipPandP: getRuleSet()) {
|
||||||
ruleBuilder.append(ipPandP.getProto()).append(":").append(ipPandP.getStartPort()).append(":").append(ipPandP.getEndPort()).append(":");
|
ruleBuilder.append(ipPandP.getProto()).append(":").append(ipPandP.getStartPort()).append(":").append(ipPandP.getEndPort()).append(":");
|
||||||
for (String cidr: ipPandP.getAllowedCidrs()) {
|
for (String cidr: ipPandP.getAllowedCidrs()) {
|
||||||
ruleBuilder.append(cidr).append(",");
|
ruleBuilder.append(cidr).append(",");
|
||||||
@ -150,7 +157,7 @@ public class SecurityIngressRulesCmd extends Command {
|
|||||||
|
|
||||||
public String stringifyCompressedRules() {
|
public String stringifyCompressedRules() {
|
||||||
StringBuilder ruleBuilder = new StringBuilder();
|
StringBuilder ruleBuilder = new StringBuilder();
|
||||||
for (SecurityIngressRulesCmd.IpPortAndProto ipPandP: getRuleSet()) {
|
for (SecurityGroupRulesCmd.IpPortAndProto ipPandP: getRuleSet()) {
|
||||||
ruleBuilder.append(ipPandP.getProto()).append(":").append(ipPandP.getStartPort()).append(":").append(ipPandP.getEndPort()).append(":");
|
ruleBuilder.append(ipPandP.getProto()).append(":").append(ipPandP.getStartPort()).append(":").append(ipPandP.getEndPort()).append(":");
|
||||||
for (String cidr: ipPandP.getAllowedCidrs()) {
|
for (String cidr: ipPandP.getAllowedCidrs()) {
|
||||||
//convert cidrs in the form "a.b.c.d/e" to "hexvalue of 32bit ip/e"
|
//convert cidrs in the form "a.b.c.d/e" to "hexvalue of 32bit ip/e"
|
||||||
@ -162,12 +169,12 @@ public class SecurityIngressRulesCmd extends Command {
|
|||||||
return ruleBuilder.toString();
|
return ruleBuilder.toString();
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Compress the ingress rules using zlib compression to allow the call to the hypervisor
|
* Compress the security group rules using zlib compression to allow the call to the hypervisor
|
||||||
* to scale beyond 8k cidrs.
|
* to scale beyond 8k cidrs.
|
||||||
*/
|
*/
|
||||||
public String compressStringifiedRules() {
|
public String compressStringifiedRules() {
|
||||||
StringBuilder ruleBuilder = new StringBuilder();
|
StringBuilder ruleBuilder = new StringBuilder();
|
||||||
for (SecurityIngressRulesCmd.IpPortAndProto ipPandP: getRuleSet()) {
|
for (SecurityGroupRulesCmd.IpPortAndProto ipPandP: getRuleSet()) {
|
||||||
ruleBuilder.append(ipPandP.getProto()).append(":").append(ipPandP.getStartPort()).append(":").append(ipPandP.getEndPort()).append(":");
|
ruleBuilder.append(ipPandP.getProto()).append(":").append(ipPandP.getStartPort()).append(":").append(ipPandP.getEndPort()).append(":");
|
||||||
for (String cidr: ipPandP.getAllowedCidrs()) {
|
for (String cidr: ipPandP.getAllowedCidrs()) {
|
||||||
ruleBuilder.append(cidr).append(",");
|
ruleBuilder.append(cidr).append(",");
|
||||||
@ -184,7 +191,7 @@ public class SecurityIngressRulesCmd extends Command {
|
|||||||
dzip.write(stringified.getBytes());
|
dzip.write(stringified.getBytes());
|
||||||
dzip.close();
|
dzip.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
s_logger.warn("Exception while compressing ingress rules");
|
s_logger.warn("Exception while compressing security group rules");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return Base64.encodeBase64String(out.toByteArray());
|
return Base64.encodeBase64String(out.toByteArray());
|
||||||
@ -96,8 +96,7 @@ import com.cloud.network.rules.FirewallRule;
|
|||||||
import com.cloud.network.rules.LoadBalancer;
|
import com.cloud.network.rules.LoadBalancer;
|
||||||
import com.cloud.network.rules.PortForwardingRule;
|
import com.cloud.network.rules.PortForwardingRule;
|
||||||
import com.cloud.network.rules.StaticNatRule;
|
import com.cloud.network.rules.StaticNatRule;
|
||||||
import com.cloud.network.security.EgressRule;
|
import com.cloud.network.security.SecurityRule;
|
||||||
import com.cloud.network.security.IngressRule;
|
|
||||||
import com.cloud.network.security.SecurityGroup;
|
import com.cloud.network.security.SecurityGroup;
|
||||||
import com.cloud.network.security.SecurityGroupRules;
|
import com.cloud.network.security.SecurityGroupRules;
|
||||||
import com.cloud.offering.DiskOffering;
|
import com.cloud.offering.DiskOffering;
|
||||||
@ -196,9 +195,7 @@ public interface ResponseGenerator {
|
|||||||
|
|
||||||
ListResponse<SecurityGroupResponse> createSecurityGroupResponses(List<? extends SecurityGroupRules> networkGroups);
|
ListResponse<SecurityGroupResponse> createSecurityGroupResponses(List<? extends SecurityGroupRules> networkGroups);
|
||||||
|
|
||||||
SecurityGroupResponse createSecurityGroupResponseFromIngressRule(List<? extends IngressRule> ingressRules);
|
SecurityGroupResponse createSecurityGroupResponseFromSecurityGroupRule(List<? extends SecurityRule> SecurityRules);
|
||||||
|
|
||||||
SecurityGroupResponse createSecurityGroupResponseFromEgressRule(List<? extends EgressRule> egressRules);
|
|
||||||
|
|
||||||
SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group);
|
SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group);
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,233 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under the GNU General Public License v3 or later.
|
||||||
|
*
|
||||||
|
* It is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cloud.api.commands;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cloud.api.ApiConstants;
|
||||||
|
import com.cloud.api.BaseAsyncCmd;
|
||||||
|
import com.cloud.api.BaseCmd;
|
||||||
|
import com.cloud.api.IdentityMapper;
|
||||||
|
import com.cloud.api.Implementation;
|
||||||
|
import com.cloud.api.Parameter;
|
||||||
|
import com.cloud.api.ServerApiException;
|
||||||
|
|
||||||
|
import com.cloud.api.response.SecurityGroupRuleResponse;
|
||||||
|
import com.cloud.api.response.SecurityGroupResponse;
|
||||||
|
import com.cloud.async.AsyncJob;
|
||||||
|
import com.cloud.event.EventTypes;
|
||||||
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
|
import com.cloud.network.security.SecurityRule;
|
||||||
|
import com.cloud.user.Account;
|
||||||
|
import com.cloud.user.UserContext;
|
||||||
|
import com.cloud.utils.StringUtils;
|
||||||
|
|
||||||
|
@Implementation(responseObject = SecurityGroupRuleResponse.class, description = "Authorizes a particular egress rule for this security group")
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
public class AuthorizeSecurityGroupEgressCmd extends BaseAsyncCmd {
|
||||||
|
public static final Logger s_logger = Logger.getLogger(AuthorizeSecurityGroupIngressCmd.class.getName());
|
||||||
|
|
||||||
|
private static final String s_name = "authorizesecuritygroupegressresponse";
|
||||||
|
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
// ////////////// API parameters /////////////////////
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Parameter(name = ApiConstants.PROTOCOL, type = CommandType.STRING, description = "TCP is default. UDP is the other supported protocol")
|
||||||
|
private String protocol;
|
||||||
|
|
||||||
|
@Parameter(name = ApiConstants.START_PORT, type = CommandType.INTEGER, description = "start port for this egress rule")
|
||||||
|
private Integer startPort;
|
||||||
|
|
||||||
|
@Parameter(name = ApiConstants.END_PORT, type = CommandType.INTEGER, description = "end port for this egress rule")
|
||||||
|
private Integer endPort;
|
||||||
|
|
||||||
|
@Parameter(name = ApiConstants.ICMP_TYPE, type = CommandType.INTEGER, description = "type of the icmp message being sent")
|
||||||
|
private Integer icmpType;
|
||||||
|
|
||||||
|
@Parameter(name = ApiConstants.ICMP_CODE, type = CommandType.INTEGER, description = "error code for this icmp message")
|
||||||
|
private Integer icmpCode;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.CIDR_LIST, type=CommandType.LIST, collectionType=CommandType.STRING, description="the cidr list associated")
|
||||||
|
private List cidrList;
|
||||||
|
|
||||||
|
@Parameter(name = ApiConstants.USER_SECURITY_GROUP_LIST, type = CommandType.MAP, description = "user to security group mapping")
|
||||||
|
private Map userSecurityGroupList;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.LONG, description="an optional domainId for the security group. If the account parameter is used, domainId must also be used.")
|
||||||
|
private Long domainId;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.ACCOUNT, type=CommandType.STRING, description="an optional account for the security group. Must be used with domainId.")
|
||||||
|
private String accountName;
|
||||||
|
|
||||||
|
@IdentityMapper(entityTableName="projects")
|
||||||
|
@Parameter(name=ApiConstants.PROJECT_ID, type=CommandType.LONG, description="an optional project of the security group")
|
||||||
|
private Long projectId;
|
||||||
|
|
||||||
|
@IdentityMapper(entityTableName="security_group")
|
||||||
|
@Parameter(name=ApiConstants.SECURITY_GROUP_ID, type=CommandType.LONG, description="The ID of the security group. Mutually exclusive with securityGroupName parameter")
|
||||||
|
private Long securityGroupId;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.SECURITY_GROUP_NAME, type=CommandType.STRING, description="The name of the security group. Mutually exclusive with securityGroupName parameter")
|
||||||
|
private String securityGroupName;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/////////////////// Accessors ///////////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
public String getAccountName() {
|
||||||
|
return accountName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getCidrList() {
|
||||||
|
return cidrList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getEndPort() {
|
||||||
|
return endPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getIcmpCode() {
|
||||||
|
return icmpCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getIcmpType() {
|
||||||
|
return icmpType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getSecurityGroupId() {
|
||||||
|
if (securityGroupId != null && securityGroupName != null) {
|
||||||
|
throw new InvalidParameterValueException("securityGroupId and securityGroupName parameters are mutually exclusive");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (securityGroupName != null) {
|
||||||
|
securityGroupId = _responseGenerator.getSecurityGroupId(securityGroupName, getEntityOwnerId());
|
||||||
|
if (securityGroupId == null) {
|
||||||
|
throw new InvalidParameterValueException("Unable to find security group " + securityGroupName + " for account id=" + getEntityOwnerId());
|
||||||
|
}
|
||||||
|
securityGroupName = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (securityGroupId == null) {
|
||||||
|
throw new InvalidParameterValueException("Either securityGroupId or securityGroupName is required by authorizeSecurityGroupIngress command");
|
||||||
|
}
|
||||||
|
|
||||||
|
return securityGroupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProtocol() {
|
||||||
|
if (protocol == null) {
|
||||||
|
return "all";
|
||||||
|
}
|
||||||
|
return protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getStartPort() {
|
||||||
|
return startPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map getUserSecurityGroupList() {
|
||||||
|
return userSecurityGroupList;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
// ///////////// API Implementation///////////////////
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCommandName() {
|
||||||
|
return s_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getResultObjectName() {
|
||||||
|
return "securitygroup";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEntityOwnerId() {
|
||||||
|
Long accountId = getAccountId(accountName, domainId, projectId);
|
||||||
|
if (accountId == null) {
|
||||||
|
return UserContext.current().getCaller().getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
return accountId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getEventType() {
|
||||||
|
return EventTypes.EVENT_SECURITY_GROUP_AUTHORIZE_EGRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getEventDescription() {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (getUserSecurityGroupList() != null) {
|
||||||
|
sb.append("group list(group/account): ");
|
||||||
|
Collection userGroupCollection = getUserSecurityGroupList().values();
|
||||||
|
Iterator iter = userGroupCollection.iterator();
|
||||||
|
|
||||||
|
HashMap userGroup = (HashMap) iter.next();
|
||||||
|
String group = (String) userGroup.get("group");
|
||||||
|
String authorizedAccountName = (String) userGroup.get("account");
|
||||||
|
sb.append(group + "/" + authorizedAccountName);
|
||||||
|
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
userGroup = (HashMap) iter.next();
|
||||||
|
group = (String) userGroup.get("group");
|
||||||
|
authorizedAccountName = (String) userGroup.get("account");
|
||||||
|
sb.append(", " + group + "/" + authorizedAccountName);
|
||||||
|
}
|
||||||
|
} else if (getCidrList() != null) {
|
||||||
|
sb.append("cidr list: ");
|
||||||
|
sb.append(StringUtils.join(getCidrList(), ", "));
|
||||||
|
} else {
|
||||||
|
sb.append("<error: no egress parameters>");
|
||||||
|
}
|
||||||
|
|
||||||
|
return "authorizing egress to group: " + getSecurityGroupId() + " to " + sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute() {
|
||||||
|
List<? extends SecurityRule> egressRules = _securityGroupService.authorizeSecurityGroupEgress(this);
|
||||||
|
if (egressRules != null && !egressRules.isEmpty()) {
|
||||||
|
SecurityGroupResponse response = _responseGenerator.createSecurityGroupResponseFromSecurityGroupRule(egressRules);
|
||||||
|
this.setResponseObject(response);
|
||||||
|
} else {
|
||||||
|
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to authorize security group egress rule(s)");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AsyncJob.Type getInstanceType() {
|
||||||
|
return AsyncJob.Type.SecurityGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getInstanceId() {
|
||||||
|
return getSecurityGroupId();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -33,18 +33,16 @@ import com.cloud.api.IdentityMapper;
|
|||||||
import com.cloud.api.Implementation;
|
import com.cloud.api.Implementation;
|
||||||
import com.cloud.api.Parameter;
|
import com.cloud.api.Parameter;
|
||||||
import com.cloud.api.ServerApiException;
|
import com.cloud.api.ServerApiException;
|
||||||
import com.cloud.api.BaseCmd.CommandType;
|
import com.cloud.api.response.SecurityGroupRuleResponse;
|
||||||
import com.cloud.api.response.IngressRuleResponse;
|
|
||||||
import com.cloud.api.response.SecurityGroupResponse;
|
import com.cloud.api.response.SecurityGroupResponse;
|
||||||
import com.cloud.async.AsyncJob;
|
import com.cloud.async.AsyncJob;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
import com.cloud.network.security.IngressRule;
|
import com.cloud.network.security.SecurityRule;
|
||||||
import com.cloud.user.Account;
|
|
||||||
import com.cloud.user.UserContext;
|
import com.cloud.user.UserContext;
|
||||||
import com.cloud.utils.StringUtils;
|
import com.cloud.utils.StringUtils;
|
||||||
|
|
||||||
@Implementation(responseObject = IngressRuleResponse.class, description = "Authorizes a particular ingress rule for this security group")
|
@Implementation(responseObject = SecurityGroupRuleResponse.class, description = "Authorizes a particular ingress rule for this security group")
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public class AuthorizeSecurityGroupIngressCmd extends BaseAsyncCmd {
|
public class AuthorizeSecurityGroupIngressCmd extends BaseAsyncCmd {
|
||||||
public static final Logger s_logger = Logger.getLogger(AuthorizeSecurityGroupIngressCmd.class.getName());
|
public static final Logger s_logger = Logger.getLogger(AuthorizeSecurityGroupIngressCmd.class.getName());
|
||||||
@ -212,9 +210,9 @@ public class AuthorizeSecurityGroupIngressCmd extends BaseAsyncCmd {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute() {
|
||||||
List<? extends IngressRule> ingressRules = _securityGroupService.authorizeSecurityGroupIngress(this);
|
List<? extends SecurityRule> ingressRules = _securityGroupService.authorizeSecurityGroupIngress(this);
|
||||||
if (ingressRules != null && !ingressRules.isEmpty()) {
|
if (ingressRules != null && !ingressRules.isEmpty()) {
|
||||||
SecurityGroupResponse response = _responseGenerator.createSecurityGroupResponseFromIngressRule(ingressRules);
|
SecurityGroupResponse response = _responseGenerator.createSecurityGroupResponseFromSecurityGroupRule(ingressRules);
|
||||||
this.setResponseObject(response);
|
this.setResponseObject(response);
|
||||||
} else {
|
} else {
|
||||||
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to authorize security group ingress rule(s)");
|
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to authorize security group ingress rule(s)");
|
||||||
|
|||||||
111
api/src/com/cloud/api/commands/RevokeSecurityGroupEgressCmd.java
Normal file
111
api/src/com/cloud/api/commands/RevokeSecurityGroupEgressCmd.java
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under the GNU General Public License v3 or later.
|
||||||
|
*
|
||||||
|
* It is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cloud.api.commands;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cloud.api.ApiConstants;
|
||||||
|
import com.cloud.api.BaseAsyncCmd;
|
||||||
|
import com.cloud.api.BaseCmd;
|
||||||
|
import com.cloud.api.IdentityMapper;
|
||||||
|
import com.cloud.api.Implementation;
|
||||||
|
import com.cloud.api.Parameter;
|
||||||
|
import com.cloud.api.ServerApiException;
|
||||||
|
import com.cloud.api.response.SuccessResponse;
|
||||||
|
import com.cloud.async.AsyncJob;
|
||||||
|
import com.cloud.event.EventTypes;
|
||||||
|
import com.cloud.network.security.SecurityGroup;
|
||||||
|
import com.cloud.user.Account;
|
||||||
|
|
||||||
|
@Implementation(responseObject = SuccessResponse.class, description = "Deletes a particular egress rule from this security group")
|
||||||
|
public class RevokeSecurityGroupEgressCmd extends BaseAsyncCmd {
|
||||||
|
public static final Logger s_logger = Logger.getLogger(RevokeSecurityGroupEgressCmd.class.getName());
|
||||||
|
|
||||||
|
private static final String s_name = "revokesecuritygroupegress";
|
||||||
|
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
// ////////////// API parameters /////////////////////
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@IdentityMapper(entityTableName="security_group_rule")
|
||||||
|
@Parameter(name = ApiConstants.ID, type = CommandType.LONG, required = true, description = "The ID of the egress rule")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
// ///////////////// Accessors ///////////////////////
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
// ///////////// API Implementation///////////////////
|
||||||
|
// ///////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCommandName() {
|
||||||
|
return s_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getResultObjectName() {
|
||||||
|
return "revokesecuritygroupegress";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEntityOwnerId() {
|
||||||
|
SecurityGroup group = _entityMgr.findById(SecurityGroup.class, getId());
|
||||||
|
if (group != null) {
|
||||||
|
return group.getAccountId();
|
||||||
|
}
|
||||||
|
|
||||||
|
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_SECURITY_GROUP_REVOKE_EGRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getEventDescription() {
|
||||||
|
return "revoking egress rule id: " + getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute() {
|
||||||
|
boolean result = _securityGroupService.revokeSecurityGroupEgress(this);
|
||||||
|
if (result) {
|
||||||
|
SuccessResponse response = new SuccessResponse(getCommandName());
|
||||||
|
this.setResponseObject(response);
|
||||||
|
} else {
|
||||||
|
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to revoke security group egress rule");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AsyncJob.Type getInstanceType() {
|
||||||
|
return AsyncJob.Type.SecurityGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getInstanceId() {
|
||||||
|
return getId();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -43,7 +43,7 @@ public class RevokeSecurityGroupIngressCmd extends BaseAsyncCmd {
|
|||||||
// ////////////// API parameters /////////////////////
|
// ////////////// API parameters /////////////////////
|
||||||
// ///////////////////////////////////////////////////
|
// ///////////////////////////////////////////////////
|
||||||
|
|
||||||
@IdentityMapper(entityTableName="security_ingress_rule")
|
@IdentityMapper(entityTableName="security_group_rule")
|
||||||
@Parameter(name = ApiConstants.ID, type = CommandType.LONG, required = true, description = "The ID of the ingress rule")
|
@Parameter(name = ApiConstants.ID, type = CommandType.LONG, required = true, description = "The ID of the ingress rule")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
|
|||||||
@ -1,124 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
|
||||||
*
|
|
||||||
* This software is licensed under the GNU General Public License v3 or later.
|
|
||||||
*
|
|
||||||
* It is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package com.cloud.api.response;
|
|
||||||
|
|
||||||
import com.cloud.api.ApiConstants;
|
|
||||||
import com.cloud.api.IdentityProxy;
|
|
||||||
import com.cloud.serializer.Param;
|
|
||||||
import com.google.gson.annotations.SerializedName;
|
|
||||||
|
|
||||||
public class IngressRuleResponse extends BaseResponse {
|
|
||||||
@SerializedName("ruleid") @Param(description="the id of the ingress rule")
|
|
||||||
private IdentityProxy ruleId = new IdentityProxy("security_ingress_rule");
|
|
||||||
|
|
||||||
@SerializedName("protocol") @Param(description="the protocol of the ingress rule")
|
|
||||||
private String protocol;
|
|
||||||
|
|
||||||
@SerializedName(ApiConstants.ICMP_TYPE) @Param(description="the type of the ICMP message response")
|
|
||||||
private Integer icmpType;
|
|
||||||
|
|
||||||
@SerializedName(ApiConstants.ICMP_CODE) @Param(description="the code for the ICMP message response")
|
|
||||||
private Integer icmpCode;
|
|
||||||
|
|
||||||
@SerializedName(ApiConstants.START_PORT) @Param(description="the starting IP of the ingress rule")
|
|
||||||
private Integer startPort;
|
|
||||||
|
|
||||||
@SerializedName(ApiConstants.END_PORT) @Param(description="the ending IP of the ingress rule ")
|
|
||||||
private Integer endPort;
|
|
||||||
|
|
||||||
@SerializedName(ApiConstants.SECURITY_GROUP_NAME) @Param(description="security group name")
|
|
||||||
private String securityGroupName;
|
|
||||||
|
|
||||||
@SerializedName(ApiConstants.ACCOUNT) @Param(description="account owning the ingress rule")
|
|
||||||
private String accountName;
|
|
||||||
|
|
||||||
@SerializedName(ApiConstants.CIDR) @Param(description="the CIDR notation for the base IP address of the ingress rule")
|
|
||||||
private String cidr;
|
|
||||||
|
|
||||||
public Long getRuleId() {
|
|
||||||
return ruleId.getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRuleId(Long ruleId) {
|
|
||||||
this.ruleId.setValue(ruleId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProtocol() {
|
|
||||||
return protocol;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProtocol(String protocol) {
|
|
||||||
this.protocol = protocol;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getIcmpType() {
|
|
||||||
return icmpType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIcmpType(Integer icmpType) {
|
|
||||||
this.icmpType = icmpType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getIcmpCode() {
|
|
||||||
return icmpCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIcmpCode(Integer icmpCode) {
|
|
||||||
this.icmpCode = icmpCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getStartPort() {
|
|
||||||
return startPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStartPort(Integer startPort) {
|
|
||||||
this.startPort = startPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getEndPort() {
|
|
||||||
return endPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setEndPort(Integer endPort) {
|
|
||||||
this.endPort = endPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSecurityGroupName() {
|
|
||||||
return securityGroupName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSecurityGroupName(String securityGroupName) {
|
|
||||||
this.securityGroupName = securityGroupName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAccountName() {
|
|
||||||
return accountName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAccountName(String accountName) {
|
|
||||||
this.accountName = accountName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCidr() {
|
|
||||||
return cidr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCidr(String cidr) {
|
|
||||||
this.cidr = cidr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -50,11 +50,11 @@ public class SecurityGroupResponse extends BaseResponse implements ControlledEnt
|
|||||||
@SerializedName(ApiConstants.DOMAIN) @Param(description="the domain name of the security group")
|
@SerializedName(ApiConstants.DOMAIN) @Param(description="the domain name of the security group")
|
||||||
private String domainName;
|
private String domainName;
|
||||||
|
|
||||||
@SerializedName("ingressrule") @Param(description="the list of ingress rules associated with the security group", responseObject = IngressRuleResponse.class)
|
@SerializedName("ingressrule") @Param(description="the list of ingress rules associated with the security group", responseObject = SecurityGroupRuleResponse.class)
|
||||||
private List<IngressRuleResponse> ingressRules;
|
private List<SecurityGroupRuleResponse> ingressRules;
|
||||||
|
|
||||||
@SerializedName("egressrule") @Param(description="the list of ingress rules associated with the security group", responseObject = EgressRuleResponse.class)
|
@SerializedName("egressrule") @Param(description="the list of egress rules associated with the security group", responseObject = SecurityGroupRuleResponse.class)
|
||||||
private List<EgressRuleResponse> egressRules;
|
private List<SecurityGroupRuleResponse> egressRules;
|
||||||
|
|
||||||
public void setId(Long id) {
|
public void setId(Long id) {
|
||||||
this.id.setValue(id);
|
this.id.setValue(id);
|
||||||
@ -84,12 +84,12 @@ public class SecurityGroupResponse extends BaseResponse implements ControlledEnt
|
|||||||
this.domainName = domainName;
|
this.domainName = domainName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIngressRules(List<IngressRuleResponse> ingressRules) {
|
public void setSecurityGroupIngressRules(List<SecurityGroupRuleResponse> securityGroupRules) {
|
||||||
this.ingressRules = ingressRules;
|
this.ingressRules = securityGroupRules;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setEgressRules(List<EgressRuleResponse> egressRules) {
|
public void setSecurityGroupEgressRules(List<SecurityGroupRuleResponse> securityGroupRules) {
|
||||||
this.egressRules = egressRules;
|
this.egressRules = securityGroupRules;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -22,11 +22,11 @@ import com.cloud.api.IdentityProxy;
|
|||||||
import com.cloud.serializer.Param;
|
import com.cloud.serializer.Param;
|
||||||
import com.google.gson.annotations.SerializedName;
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
|
||||||
public class EgressRuleResponse extends BaseResponse {
|
public class SecurityGroupRuleResponse extends BaseResponse {
|
||||||
@SerializedName("ruleid") @Param(description="the id of the ingress rule")
|
@SerializedName("ruleid") @Param(description="the id of the security group rule")
|
||||||
private IdentityProxy ruleId = new IdentityProxy("security_egress_rule");
|
private IdentityProxy ruleId = new IdentityProxy("security_group_rule");
|
||||||
|
|
||||||
@SerializedName("protocol") @Param(description="the protocol of the ingress rule")
|
@SerializedName("protocol") @Param(description="the protocol of the security group rule")
|
||||||
private String protocol;
|
private String protocol;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.ICMP_TYPE) @Param(description="the type of the ICMP message response")
|
@SerializedName(ApiConstants.ICMP_TYPE) @Param(description="the type of the ICMP message response")
|
||||||
@ -35,19 +35,19 @@ public class EgressRuleResponse extends BaseResponse {
|
|||||||
@SerializedName(ApiConstants.ICMP_CODE) @Param(description="the code for the ICMP message response")
|
@SerializedName(ApiConstants.ICMP_CODE) @Param(description="the code for the ICMP message response")
|
||||||
private Integer icmpCode;
|
private Integer icmpCode;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.START_PORT) @Param(description="the starting IP of the ingress rule")
|
@SerializedName(ApiConstants.START_PORT) @Param(description="the starting IP of the security group rule")
|
||||||
private Integer startPort;
|
private Integer startPort;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.END_PORT) @Param(description="the ending IP of the ingress rule ")
|
@SerializedName(ApiConstants.END_PORT) @Param(description="the ending IP of the security group rule ")
|
||||||
private Integer endPort;
|
private Integer endPort;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.SECURITY_GROUP_NAME) @Param(description="security group name")
|
@SerializedName(ApiConstants.SECURITY_GROUP_NAME) @Param(description="security group name")
|
||||||
private String securityGroupName;
|
private String securityGroupName;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.ACCOUNT) @Param(description="account owning the ingress rule")
|
@SerializedName(ApiConstants.ACCOUNT) @Param(description="account owning the security group rule")
|
||||||
private String accountName;
|
private String accountName;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.CIDR) @Param(description="the CIDR notation for the base IP address of the ingress rule")
|
@SerializedName(ApiConstants.CIDR) @Param(description="the CIDR notation for the base IP address of the security group rule")
|
||||||
private String cidr;
|
private String cidr;
|
||||||
|
|
||||||
public Long getRuleId() {
|
public Long getRuleId() {
|
||||||
@ -174,6 +174,8 @@ public class EventTypes {
|
|||||||
// Security Groups
|
// Security Groups
|
||||||
public static final String EVENT_SECURITY_GROUP_AUTHORIZE_INGRESS = "SG.AUTH.INGRESS";
|
public static final String EVENT_SECURITY_GROUP_AUTHORIZE_INGRESS = "SG.AUTH.INGRESS";
|
||||||
public static final String EVENT_SECURITY_GROUP_REVOKE_INGRESS = "SG.REVOKE.INGRESS";
|
public static final String EVENT_SECURITY_GROUP_REVOKE_INGRESS = "SG.REVOKE.INGRESS";
|
||||||
|
public static final String EVENT_SECURITY_GROUP_AUTHORIZE_EGRESS = "SG.AUTH.EGRESS";
|
||||||
|
public static final String EVENT_SECURITY_GROUP_REVOKE_EGRESS = "SG.REVOKE.EGRESS";
|
||||||
public static final String EVENT_SECURITY_GROUP_CREATE = "SG.CREATE";
|
public static final String EVENT_SECURITY_GROUP_CREATE = "SG.CREATE";
|
||||||
public static final String EVENT_SECURITY_GROUP_DELETE = "SG.DELETE";
|
public static final String EVENT_SECURITY_GROUP_DELETE = "SG.DELETE";
|
||||||
|
|
||||||
|
|||||||
@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
|
||||||
*
|
|
||||||
* This software is licensed under the GNU General Public License v3 or later.
|
|
||||||
*
|
|
||||||
* It is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package com.cloud.network.security;
|
|
||||||
|
|
||||||
import com.cloud.async.AsyncInstanceCreateStatus;
|
|
||||||
|
|
||||||
public interface EgressRule {
|
|
||||||
long getId();
|
|
||||||
|
|
||||||
long getSecurityGroupId();
|
|
||||||
|
|
||||||
int getStartPort();
|
|
||||||
|
|
||||||
int getEndPort();
|
|
||||||
|
|
||||||
String getProtocol();
|
|
||||||
|
|
||||||
AsyncInstanceCreateStatus getCreateStatus();
|
|
||||||
|
|
||||||
Long getAllowedNetworkId();
|
|
||||||
|
|
||||||
String getAllowedDestinationIpCidr();
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -16,6 +16,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
package com.cloud.network.security;
|
package com.cloud.network.security;
|
||||||
|
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
||||||
|
|
||||||
public interface SecurityGroupRules {
|
public interface SecurityGroupRules {
|
||||||
long getId();
|
long getId();
|
||||||
@ -39,4 +40,6 @@ public interface SecurityGroupRules {
|
|||||||
Long getAllowedNetworkId();
|
Long getAllowedNetworkId();
|
||||||
|
|
||||||
String getAllowedSourceIpCidr();
|
String getAllowedSourceIpCidr();
|
||||||
|
|
||||||
|
SecurityRuleType getRuleType();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,10 +20,12 @@ package com.cloud.network.security;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.cloud.api.commands.AuthorizeSecurityGroupIngressCmd;
|
import com.cloud.api.commands.AuthorizeSecurityGroupIngressCmd;
|
||||||
|
import com.cloud.api.commands.AuthorizeSecurityGroupEgressCmd;
|
||||||
import com.cloud.api.commands.CreateSecurityGroupCmd;
|
import com.cloud.api.commands.CreateSecurityGroupCmd;
|
||||||
import com.cloud.api.commands.DeleteSecurityGroupCmd;
|
import com.cloud.api.commands.DeleteSecurityGroupCmd;
|
||||||
import com.cloud.api.commands.ListSecurityGroupsCmd;
|
import com.cloud.api.commands.ListSecurityGroupsCmd;
|
||||||
import com.cloud.api.commands.RevokeSecurityGroupIngressCmd;
|
import com.cloud.api.commands.RevokeSecurityGroupIngressCmd;
|
||||||
|
import com.cloud.api.commands.RevokeSecurityGroupEgressCmd;
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
import com.cloud.exception.PermissionDeniedException;
|
import com.cloud.exception.PermissionDeniedException;
|
||||||
import com.cloud.exception.ResourceInUseException;
|
import com.cloud.exception.ResourceInUseException;
|
||||||
@ -36,6 +38,7 @@ public interface SecurityGroupService {
|
|||||||
*/
|
*/
|
||||||
public SecurityGroup createSecurityGroup(CreateSecurityGroupCmd command) throws PermissionDeniedException, InvalidParameterValueException;
|
public SecurityGroup createSecurityGroup(CreateSecurityGroupCmd command) throws PermissionDeniedException, InvalidParameterValueException;
|
||||||
boolean revokeSecurityGroupIngress(RevokeSecurityGroupIngressCmd cmd);
|
boolean revokeSecurityGroupIngress(RevokeSecurityGroupIngressCmd cmd);
|
||||||
|
boolean revokeSecurityGroupEgress(RevokeSecurityGroupEgressCmd cmd);
|
||||||
|
|
||||||
boolean deleteSecurityGroup(DeleteSecurityGroupCmd cmd) throws ResourceInUseException;
|
boolean deleteSecurityGroup(DeleteSecurityGroupCmd cmd) throws ResourceInUseException;
|
||||||
|
|
||||||
@ -46,6 +49,8 @@ public interface SecurityGroupService {
|
|||||||
*/
|
*/
|
||||||
public List<? extends SecurityGroupRules> searchForSecurityGroupRules(ListSecurityGroupsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException;
|
public List<? extends SecurityGroupRules> searchForSecurityGroupRules(ListSecurityGroupsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException;
|
||||||
|
|
||||||
public List<? extends IngressRule> authorizeSecurityGroupIngress(AuthorizeSecurityGroupIngressCmd cmd);
|
public List<? extends SecurityRule> authorizeSecurityGroupIngress(AuthorizeSecurityGroupIngressCmd cmd);
|
||||||
|
|
||||||
|
public List<? extends SecurityRule> authorizeSecurityGroupEgress(AuthorizeSecurityGroupEgressCmd cmd);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,7 +23,21 @@ import com.cloud.async.AsyncInstanceCreateStatus;
|
|||||||
* @author ahuang
|
* @author ahuang
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public interface IngressRule {
|
public interface SecurityRule {
|
||||||
|
|
||||||
|
public static class SecurityRuleType {
|
||||||
|
public static final SecurityRuleType IngressRule = new SecurityRuleType("ingress");
|
||||||
|
public static final SecurityRuleType EgressRule = new SecurityRuleType("egress");
|
||||||
|
|
||||||
|
public SecurityRuleType(String type) {
|
||||||
|
this._type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType(){
|
||||||
|
return _type;
|
||||||
|
}
|
||||||
|
private String _type;
|
||||||
|
}
|
||||||
long getId();
|
long getId();
|
||||||
|
|
||||||
long getSecurityGroupId();
|
long getSecurityGroupId();
|
||||||
@ -32,8 +46,14 @@ public interface IngressRule {
|
|||||||
|
|
||||||
int getEndPort();
|
int getEndPort();
|
||||||
|
|
||||||
|
String getType();
|
||||||
|
|
||||||
|
SecurityRuleType getRuleType();
|
||||||
|
|
||||||
String getProtocol();
|
String getProtocol();
|
||||||
|
|
||||||
|
String getUuid();
|
||||||
|
|
||||||
AsyncInstanceCreateStatus getCreateStatus();
|
AsyncInstanceCreateStatus getCreateStatus();
|
||||||
|
|
||||||
Long getAllowedNetworkId();
|
Long getAllowedNetworkId();
|
||||||
@ -224,6 +224,8 @@ createSecurityGroup=com.cloud.api.commands.CreateSecurityGroupCmd;15
|
|||||||
deleteSecurityGroup=com.cloud.api.commands.DeleteSecurityGroupCmd;15
|
deleteSecurityGroup=com.cloud.api.commands.DeleteSecurityGroupCmd;15
|
||||||
authorizeSecurityGroupIngress=com.cloud.api.commands.AuthorizeSecurityGroupIngressCmd;15
|
authorizeSecurityGroupIngress=com.cloud.api.commands.AuthorizeSecurityGroupIngressCmd;15
|
||||||
revokeSecurityGroupIngress=com.cloud.api.commands.RevokeSecurityGroupIngressCmd;15
|
revokeSecurityGroupIngress=com.cloud.api.commands.RevokeSecurityGroupIngressCmd;15
|
||||||
|
authorizeSecurityGroupEgress=com.cloud.api.commands.AuthorizeSecurityGroupEgressCmd;15
|
||||||
|
revokeSecurityGroupEgress=com.cloud.api.commands.RevokeSecurityGroupEgressCmd;15
|
||||||
listSecurityGroups=com.cloud.api.commands.ListSecurityGroupsCmd;15
|
listSecurityGroups=com.cloud.api.commands.ListSecurityGroupsCmd;15
|
||||||
|
|
||||||
#### vm group commands
|
#### vm group commands
|
||||||
|
|||||||
@ -115,10 +115,8 @@ import com.cloud.agent.api.ReadyCommand;
|
|||||||
import com.cloud.agent.api.RebootAnswer;
|
import com.cloud.agent.api.RebootAnswer;
|
||||||
import com.cloud.agent.api.RebootCommand;
|
import com.cloud.agent.api.RebootCommand;
|
||||||
import com.cloud.agent.api.RebootRouterCommand;
|
import com.cloud.agent.api.RebootRouterCommand;
|
||||||
import com.cloud.agent.api.SecurityEgressRuleAnswer;
|
import com.cloud.agent.api.SecurityGroupRuleAnswer;
|
||||||
import com.cloud.agent.api.SecurityEgressRulesCmd;
|
import com.cloud.agent.api.SecurityGroupRulesCmd;
|
||||||
import com.cloud.agent.api.SecurityIngressRuleAnswer;
|
|
||||||
import com.cloud.agent.api.SecurityIngressRulesCmd;
|
|
||||||
import com.cloud.agent.api.SetupAnswer;
|
import com.cloud.agent.api.SetupAnswer;
|
||||||
import com.cloud.agent.api.SetupCommand;
|
import com.cloud.agent.api.SetupCommand;
|
||||||
import com.cloud.agent.api.StartAnswer;
|
import com.cloud.agent.api.StartAnswer;
|
||||||
@ -480,8 +478,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||||||
return execute((VpnUsersCfgCommand)cmd);
|
return execute((VpnUsersCfgCommand)cmd);
|
||||||
} else if (clazz == CheckSshCommand.class) {
|
} else if (clazz == CheckSshCommand.class) {
|
||||||
return execute((CheckSshCommand)cmd);
|
return execute((CheckSshCommand)cmd);
|
||||||
} else if (clazz == SecurityIngressRulesCmd.class) {
|
} else if (clazz == SecurityGroupRulesCmd.class) {
|
||||||
return execute((SecurityIngressRulesCmd) cmd);
|
return execute((SecurityGroupRulesCmd) cmd);
|
||||||
} else if (clazz == OvsCreateGreTunnelCommand.class) {
|
} else if (clazz == OvsCreateGreTunnelCommand.class) {
|
||||||
return execute((OvsCreateGreTunnelCommand)cmd);
|
return execute((OvsCreateGreTunnelCommand)cmd);
|
||||||
} else if (clazz == OvsSetTagAndFlowCommand.class) {
|
} else if (clazz == OvsSetTagAndFlowCommand.class) {
|
||||||
@ -4748,37 +4746,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||||||
return new OvsCreateGreTunnelAnswer(cmd, false, "EXCEPTION", _host.ip, bridge);
|
return new OvsCreateGreTunnelAnswer(cmd, false, "EXCEPTION", _host.ip, bridge);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Answer execute(SecurityEgressRulesCmd cmd) {
|
private Answer execute(SecurityGroupRulesCmd cmd) {
|
||||||
Connection conn = getConnection();
|
|
||||||
if (s_logger.isTraceEnabled()) {
|
|
||||||
s_logger.trace("Sending network rules command to " + _host.ip);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_canBridgeFirewall) {
|
|
||||||
s_logger.info("Host " + _host.ip + " cannot do bridge firewalling");
|
|
||||||
return new SecurityEgressRuleAnswer(cmd, false, "Host " + _host.ip + " cannot do bridge firewalling");
|
|
||||||
}
|
|
||||||
|
|
||||||
String result = callHostPlugin(conn, "vmops", "network_rules",
|
|
||||||
"vmName", cmd.getVmName(),
|
|
||||||
"vmIP", cmd.getGuestIp(),
|
|
||||||
"vmMAC", cmd.getGuestMac(),
|
|
||||||
"type", "egress",
|
|
||||||
"vmID", Long.toString(cmd.getVmId()),
|
|
||||||
"signature", cmd.getSignature(),
|
|
||||||
"seqno", Long.toString(cmd.getSeqNum()),
|
|
||||||
"rules", cmd.stringifyRules());
|
|
||||||
|
|
||||||
if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
|
|
||||||
s_logger.warn("Failed to program network rules for vm " + cmd.getVmName());
|
|
||||||
return new SecurityEgressRuleAnswer(cmd, false, "programming network rules failed");
|
|
||||||
} else {
|
|
||||||
s_logger.info("Programmed network rules for vm " + cmd.getVmName() + " guestIp=" + cmd.getGuestIp() + ", numrules=" + cmd.getRuleSet().length);
|
|
||||||
return new SecurityEgressRuleAnswer(cmd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Answer execute(SecurityIngressRulesCmd cmd) {
|
|
||||||
Connection conn = getConnection();
|
Connection conn = getConnection();
|
||||||
if (s_logger.isTraceEnabled()) {
|
if (s_logger.isTraceEnabled()) {
|
||||||
s_logger.trace("Sending network rules command to " + _host.ip);
|
s_logger.trace("Sending network rules command to " + _host.ip);
|
||||||
@ -4786,16 +4754,16 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||||||
|
|
||||||
if (!_canBridgeFirewall) {
|
if (!_canBridgeFirewall) {
|
||||||
s_logger.warn("Host " + _host.ip + " cannot do bridge firewalling");
|
s_logger.warn("Host " + _host.ip + " cannot do bridge firewalling");
|
||||||
return new SecurityIngressRuleAnswer(cmd, false,
|
return new SecurityGroupRuleAnswer(cmd, false,
|
||||||
"Host " + _host.ip + " cannot do bridge firewalling",
|
"Host " + _host.ip + " cannot do bridge firewalling",
|
||||||
SecurityIngressRuleAnswer.FailureReason.CANNOT_BRIDGE_FIREWALL);
|
SecurityGroupRuleAnswer.FailureReason.CANNOT_BRIDGE_FIREWALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
String result = callHostPlugin(conn, "vmops", "network_rules",
|
String result = callHostPlugin(conn, "vmops", "network_rules",
|
||||||
"vmName", cmd.getVmName(),
|
"vmName", cmd.getVmName(),
|
||||||
"vmIP", cmd.getGuestIp(),
|
"vmIP", cmd.getGuestIp(),
|
||||||
"vmMAC", cmd.getGuestMac(),
|
"vmMAC", cmd.getGuestMac(),
|
||||||
"type", "ingress",
|
"type", cmd.getRuleType(),
|
||||||
"vmID", Long.toString(cmd.getVmId()),
|
"vmID", Long.toString(cmd.getVmId()),
|
||||||
"signature", cmd.getSignature(),
|
"signature", cmd.getSignature(),
|
||||||
"seqno", Long.toString(cmd.getSeqNum()),
|
"seqno", Long.toString(cmd.getSeqNum()),
|
||||||
@ -4804,10 +4772,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||||||
|
|
||||||
if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
|
if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) {
|
||||||
s_logger.warn("Failed to program network rules for vm " + cmd.getVmName());
|
s_logger.warn("Failed to program network rules for vm " + cmd.getVmName());
|
||||||
return new SecurityIngressRuleAnswer(cmd, false, "programming network rules failed");
|
return new SecurityGroupRuleAnswer(cmd, false, "programming network rules failed");
|
||||||
} else {
|
} else {
|
||||||
s_logger.info("Programmed network rules for vm " + cmd.getVmName() + " guestIp=" + cmd.getGuestIp() + ", numrules=" + cmd.getRuleSet().length);
|
s_logger.info("Programmed network rules for vm " + cmd.getVmName() + " guestIp=" + cmd.getGuestIp() + ", numrules=" + cmd.getRuleSet().length);
|
||||||
return new SecurityIngressRuleAnswer(cmd);
|
return new SecurityGroupRuleAnswer(cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,141 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
|
||||||
*
|
|
||||||
* This software is licensed under the GNU General Public License v3 or later.
|
|
||||||
*
|
|
||||||
* It is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cloud.network.security;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import javax.persistence.Column;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.EnumType;
|
|
||||||
import javax.persistence.Enumerated;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.GenerationType;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.Table;
|
|
||||||
|
|
||||||
import com.cloud.api.Identity;
|
|
||||||
import com.cloud.async.AsyncInstanceCreateStatus;
|
|
||||||
import com.google.gson.annotations.Expose;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = ("security_egress_rule"))
|
|
||||||
public class EgressRuleVO implements EgressRule, Identity {
|
|
||||||
@Id
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
@Column(name = "id")
|
|
||||||
private long id;
|
|
||||||
|
|
||||||
@Column(name = "security_group_id")
|
|
||||||
private long securityGroupId;
|
|
||||||
|
|
||||||
@Column(name = "start_port")
|
|
||||||
private int startPort;
|
|
||||||
|
|
||||||
@Column(name = "end_port")
|
|
||||||
private int endPort;
|
|
||||||
|
|
||||||
@Column(name = "protocol")
|
|
||||||
private String protocol;
|
|
||||||
|
|
||||||
@Column(name = "allowed_network_id", nullable = true)
|
|
||||||
private Long allowedNetworkId = null;
|
|
||||||
|
|
||||||
@Column(name = "allowed_ip_cidr", nullable = true)
|
|
||||||
private String allowedDestinationIpCidr = null;
|
|
||||||
|
|
||||||
@Expose
|
|
||||||
@Column(name = "create_status", updatable = true, nullable = false)
|
|
||||||
@Enumerated(value = EnumType.STRING)
|
|
||||||
private AsyncInstanceCreateStatus createStatus;
|
|
||||||
|
|
||||||
@Column(name = "uuid")
|
|
||||||
private String uuid = UUID.randomUUID().toString();
|
|
||||||
|
|
||||||
public EgressRuleVO() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public EgressRuleVO(long securityGroupId, int fromPort, int toPort, String protocol, long allowedNetworkId) {
|
|
||||||
this.securityGroupId = securityGroupId;
|
|
||||||
this.startPort = fromPort;
|
|
||||||
this.endPort = toPort;
|
|
||||||
this.protocol = protocol;
|
|
||||||
this.allowedNetworkId = allowedNetworkId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public EgressRuleVO(long securityGroupId, int fromPort, int toPort, String protocol, String allowedIpCidr) {
|
|
||||||
this.securityGroupId = securityGroupId;
|
|
||||||
this.startPort = fromPort;
|
|
||||||
this.endPort = toPort;
|
|
||||||
this.protocol = protocol;
|
|
||||||
this.allowedDestinationIpCidr = allowedIpCidr;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getSecurityGroupId() {
|
|
||||||
return securityGroupId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getStartPort() {
|
|
||||||
return startPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getEndPort() {
|
|
||||||
return endPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getProtocol() {
|
|
||||||
return protocol;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AsyncInstanceCreateStatus getCreateStatus() {
|
|
||||||
return createStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCreateStatus(AsyncInstanceCreateStatus createStatus) {
|
|
||||||
this.createStatus = createStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Long getAllowedNetworkId() {
|
|
||||||
return allowedNetworkId;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getAllowedDestinationIpCidr() {
|
|
||||||
return allowedDestinationIpCidr;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getUuid() {
|
|
||||||
return this.uuid;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUuid(String uuid) {
|
|
||||||
this.uuid = uuid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -34,8 +34,8 @@ import com.cloud.async.AsyncInstanceCreateStatus;
|
|||||||
import com.google.gson.annotations.Expose;
|
import com.google.gson.annotations.Expose;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = ("security_ingress_rule"))
|
@Table(name = ("security_group_rule"))
|
||||||
public class IngressRuleVO implements IngressRule, Identity {
|
public class SecurityGroupRuleVO implements SecurityRule {
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
@Column(name = "id")
|
@Column(name = "id")
|
||||||
@ -50,6 +50,9 @@ public class IngressRuleVO implements IngressRule, Identity {
|
|||||||
@Column(name = "end_port")
|
@Column(name = "end_port")
|
||||||
private int endPort;
|
private int endPort;
|
||||||
|
|
||||||
|
@Column(name = "type")
|
||||||
|
private String type;
|
||||||
|
|
||||||
@Column(name = "protocol")
|
@Column(name = "protocol")
|
||||||
private String protocol;
|
private String protocol;
|
||||||
|
|
||||||
@ -67,26 +70,38 @@ public class IngressRuleVO implements IngressRule, Identity {
|
|||||||
@Column(name = "uuid")
|
@Column(name = "uuid")
|
||||||
private String uuid;
|
private String uuid;
|
||||||
|
|
||||||
public IngressRuleVO() {
|
public SecurityGroupRuleVO() {
|
||||||
this.uuid = UUID.randomUUID().toString();
|
this.uuid = UUID.randomUUID().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IngressRuleVO(long securityGroupId, int fromPort, int toPort, String protocol, long allowedNetworkId) {
|
public SecurityGroupRuleVO(SecurityRuleType type,long securityGroupId, int fromPort, int toPort, String protocol, long allowedNetworkId ) {
|
||||||
this.securityGroupId = securityGroupId;
|
this.securityGroupId = securityGroupId;
|
||||||
this.startPort = fromPort;
|
this.startPort = fromPort;
|
||||||
this.endPort = toPort;
|
this.endPort = toPort;
|
||||||
this.protocol = protocol;
|
this.protocol = protocol;
|
||||||
this.allowedNetworkId = allowedNetworkId;
|
this.allowedNetworkId = allowedNetworkId;
|
||||||
this.uuid = UUID.randomUUID().toString();
|
this.uuid = UUID.randomUUID().toString();
|
||||||
|
if (type == SecurityRuleType.IngressRule)
|
||||||
|
{
|
||||||
|
this.type = SecurityRuleType.IngressRule.getType();
|
||||||
|
}else{
|
||||||
|
this.type = SecurityRuleType.EgressRule.getType();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IngressRuleVO(long securityGroupId, int fromPort, int toPort, String protocol, String allowedIpCidr) {
|
public SecurityGroupRuleVO(SecurityRuleType type,long securityGroupId, int fromPort, int toPort, String protocol, String allowedIpCidr) {
|
||||||
this.securityGroupId = securityGroupId;
|
this.securityGroupId = securityGroupId;
|
||||||
this.startPort = fromPort;
|
this.startPort = fromPort;
|
||||||
this.endPort = toPort;
|
this.endPort = toPort;
|
||||||
this.protocol = protocol;
|
this.protocol = protocol;
|
||||||
this.allowedSourceIpCidr = allowedIpCidr;
|
this.allowedSourceIpCidr = allowedIpCidr;
|
||||||
this.uuid = UUID.randomUUID().toString();
|
this.uuid = UUID.randomUUID().toString();
|
||||||
|
if (type == SecurityRuleType.IngressRule)
|
||||||
|
{
|
||||||
|
this.type = SecurityRuleType.IngressRule.getType();
|
||||||
|
}else{
|
||||||
|
this.type = SecurityRuleType.EgressRule.getType();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -94,11 +109,23 @@ public class IngressRuleVO implements IngressRule, Identity {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getSecurityGroupId() {
|
public long getSecurityGroupId() {
|
||||||
return securityGroupId;
|
return securityGroupId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SecurityRuleType getRuleType() {
|
||||||
|
if ("ingress".equalsIgnoreCase(this.type))
|
||||||
|
return SecurityRuleType.IngressRule;
|
||||||
|
else
|
||||||
|
return SecurityRuleType.EgressRule;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getStartPort() {
|
public int getStartPort() {
|
||||||
return startPort;
|
return startPort;
|
||||||
@ -26,10 +26,11 @@ import javax.persistence.Id;
|
|||||||
import javax.persistence.PrimaryKeyJoinColumn;
|
import javax.persistence.PrimaryKeyJoinColumn;
|
||||||
import javax.persistence.SecondaryTable;
|
import javax.persistence.SecondaryTable;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = ("security_group"))
|
@Table(name = ("security_group"))
|
||||||
@SecondaryTable(name = "security_ingress_rule", join = "left", pkJoinColumns = { @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "security_group_id") })
|
@SecondaryTable(name = "security_group_rule", join = "left", pkJoinColumns = { @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "security_group_id") })
|
||||||
public class SecurityGroupRulesVO implements SecurityGroupRules {
|
public class SecurityGroupRulesVO implements SecurityGroupRules {
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
@ -48,22 +49,25 @@ public class SecurityGroupRulesVO implements SecurityGroupRules {
|
|||||||
@Column(name = "account_id")
|
@Column(name = "account_id")
|
||||||
private Long accountId;
|
private Long accountId;
|
||||||
|
|
||||||
@Column(name = "id", table = "security_ingress_rule", insertable = false, updatable = false)
|
@Column(name = "id", table = "security_group_rule", insertable = false, updatable = false)
|
||||||
private Long ruleId;
|
private Long ruleId;
|
||||||
|
|
||||||
@Column(name = "start_port", table = "security_ingress_rule", insertable = false, updatable = false)
|
@Column(name = "start_port", table = "security_group_rule", insertable = false, updatable = false)
|
||||||
private int startPort;
|
private int startPort;
|
||||||
|
|
||||||
@Column(name = "end_port", table = "security_ingress_rule", insertable = false, updatable = false)
|
@Column(name = "end_port", table = "security_group_rule", insertable = false, updatable = false)
|
||||||
private int endPort;
|
private int endPort;
|
||||||
|
|
||||||
@Column(name = "protocol", table = "security_ingress_rule", insertable = false, updatable = false)
|
@Column(name = "protocol", table = "security_group_rule", insertable = false, updatable = false)
|
||||||
private String protocol;
|
private String protocol;
|
||||||
|
|
||||||
@Column(name = "allowed_network_id", table = "security_ingress_rule", insertable = false, updatable = false, nullable = true)
|
@Column(name = "type", table = "security_group_rule", insertable = false, updatable = false)
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
@Column(name = "allowed_network_id", table = "security_group_rule", insertable = false, updatable = false, nullable = true)
|
||||||
private Long allowedNetworkId = null;
|
private Long allowedNetworkId = null;
|
||||||
|
|
||||||
@Column(name = "allowed_ip_cidr", table = "security_ingress_rule", insertable = false, updatable = false, nullable = true)
|
@Column(name = "allowed_ip_cidr", table = "security_group_rule", insertable = false, updatable = false, nullable = true)
|
||||||
private String allowedSourceIpCidr = null;
|
private String allowedSourceIpCidr = null;
|
||||||
|
|
||||||
public SecurityGroupRulesVO() {
|
public SecurityGroupRulesVO() {
|
||||||
@ -129,6 +133,15 @@ public class SecurityGroupRulesVO implements SecurityGroupRules {
|
|||||||
return protocol;
|
return protocol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SecurityRuleType getRuleType() {
|
||||||
|
if ("ingress".equalsIgnoreCase(this.type)) {
|
||||||
|
return SecurityRuleType.IngressRule;
|
||||||
|
} else {
|
||||||
|
return SecurityRuleType.EgressRule;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long getAllowedNetworkId() {
|
public Long getAllowedNetworkId() {
|
||||||
return allowedNetworkId;
|
return allowedNetworkId;
|
||||||
|
|||||||
@ -13,7 +13,8 @@ from OvmObjectModule import *
|
|||||||
import types
|
import types
|
||||||
import logging
|
import logging
|
||||||
import popen2
|
import popen2
|
||||||
from OvmFaultConstants import toErrCode, dispatchErrCode, NoVmFoundException
|
import subprocess
|
||||||
|
from OvmFaultConstants import toErrCode, dispatchErrCode, NoVmFoundException, ShellExceutedFailedException
|
||||||
from xmlrpclib import Fault as XmlRpcFault
|
from xmlrpclib import Fault as XmlRpcFault
|
||||||
from OVSCommons import *
|
from OVSCommons import *
|
||||||
from OvmLoggerModule import OvmLogger
|
from OvmLoggerModule import OvmLogger
|
||||||
@ -26,6 +27,7 @@ HEARTBEAT_DIR='heart_beat'
|
|||||||
ETC_HOSTS='/etc/hosts'
|
ETC_HOSTS='/etc/hosts'
|
||||||
HOSTNAME_FILE='/etc/sysconfig/network'
|
HOSTNAME_FILE='/etc/sysconfig/network'
|
||||||
OWNER_FILE_PREFIX='host_'
|
OWNER_FILE_PREFIX='host_'
|
||||||
|
OCFS2_CONF='/etc/ocfs2/cluster.conf'
|
||||||
|
|
||||||
logger = OvmLogger('OvmCommon')
|
logger = OvmLogger('OvmCommon')
|
||||||
|
|
||||||
@ -93,10 +95,18 @@ def BytesToM(bytes):
|
|||||||
def BytesToG(bytes):
|
def BytesToG(bytes):
|
||||||
return bytes/(1024*1024*1024)
|
return bytes/(1024*1024*1024)
|
||||||
|
|
||||||
|
def runCmd(cmds):
|
||||||
|
process = subprocess.Popen(cmds, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
stdout, stderr = process.communicate()
|
||||||
|
if process.returncode != 0:
|
||||||
|
raise ShellExceutedFailedException(stderr, process.returncode)
|
||||||
|
return stdout
|
||||||
|
|
||||||
def doCmd(lst):
|
def doCmd(lst):
|
||||||
cmds = [str(i) for i in lst]
|
cmds = [str(i) for i in lst]
|
||||||
logger.debug(doCmd, ' '.join(cmds))
|
cmdStr = ' '.join(cmds)
|
||||||
res = run_cmd(cmds)
|
logger.debug(doCmd, cmdStr)
|
||||||
|
res = runCmd(cmdStr)
|
||||||
logger.debug(doCmd, 'result:' + res)
|
logger.debug(doCmd, 'result:' + res)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|||||||
@ -4,10 +4,20 @@ OvmVmErrCodeStub = 2000
|
|||||||
OvmStoragePoolErrCodeStub = 3000
|
OvmStoragePoolErrCodeStub = 3000
|
||||||
OvmNetworkErrCodeStub = 4000
|
OvmNetworkErrCodeStub = 4000
|
||||||
OvmVolumeErrCodeStub = 5000
|
OvmVolumeErrCodeStub = 5000
|
||||||
|
OvmOCFS2ErrCodeStub = 6000
|
||||||
|
|
||||||
class NoVmFoundException(Exception):
|
class NoVmFoundException(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class ShellExceutedFailedException(Exception):
|
||||||
|
stderr = ''
|
||||||
|
errCode = -1000
|
||||||
|
|
||||||
|
def __init__(self, err, code):
|
||||||
|
Exception.__init__(self, "%s, return code:%s"%(err, code))
|
||||||
|
self.stderr = err
|
||||||
|
self.errCode = code
|
||||||
|
|
||||||
errCode = {
|
errCode = {
|
||||||
# OvmDispatch is not class, these error codes are reserved
|
# OvmDispatch is not class, these error codes are reserved
|
||||||
"OvmDispatch.InvalidCallMethodFormat":OvmDispatcherStub+1,
|
"OvmDispatch.InvalidCallMethodFormat":OvmDispatcherStub+1,
|
||||||
@ -55,6 +65,8 @@ errCode = {
|
|||||||
"OvmVolume.createDataDisk":OvmVolumeErrCodeStub+1,
|
"OvmVolume.createDataDisk":OvmVolumeErrCodeStub+1,
|
||||||
"OvmVolume.createFromTemplate":OvmVolumeErrCodeStub+2,
|
"OvmVolume.createFromTemplate":OvmVolumeErrCodeStub+2,
|
||||||
"OvmVolume.destroy":OvmVolumeErrCodeStub+3,
|
"OvmVolume.destroy":OvmVolumeErrCodeStub+3,
|
||||||
|
|
||||||
|
"OvmOCFS2._addNode":OvmOCFS2ErrCodeStub+1,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
62
ovm/scripts/vm/hypervisor/ovm/OvmOCFS2Module.py
Executable file
62
ovm/scripts/vm/hypervisor/ovm/OvmOCFS2Module.py
Executable file
@ -0,0 +1,62 @@
|
|||||||
|
from OvmCommonModule import *
|
||||||
|
|
||||||
|
logger = OvmLogger('OvmOCFS2')
|
||||||
|
class OvmOCFS2(OvmObject):
|
||||||
|
def _prepareConf(self, cluster):
|
||||||
|
conf = '''cluster:
|
||||||
|
node_count = 0
|
||||||
|
name = %s
|
||||||
|
'''%cluster
|
||||||
|
dir = dirname(OCFS2_CONF)
|
||||||
|
if not isdir(dir):
|
||||||
|
os.makedirs(dir)
|
||||||
|
|
||||||
|
fd = open(OCFS2_CONF, 'w')
|
||||||
|
fd.write(conf)
|
||||||
|
fd.close()
|
||||||
|
|
||||||
|
def _addNode(self, name, nodeNum, ip, port, cluster, isOnline=True):
|
||||||
|
nodePath = '/sys/kernel/config/cluster/%s/node/%s'%(cluster, name)
|
||||||
|
if exists(nodePath):
|
||||||
|
logger.debug(OvmOCFS2._addNode, "node %s already exists, skip it(%s)"%(name, nodePath))
|
||||||
|
return
|
||||||
|
|
||||||
|
if not isOnline:
|
||||||
|
cmds = ['o2cb_ctl -C -n', name, '-t node', '-a number=%s'%nodeNum, '-a ip_address=%s'%ip, '-a ip_port=%s'%port, '-a cluster=%s'%cluster]
|
||||||
|
else:
|
||||||
|
cmds = ['o2cb_ctl -C -i -n', name, '-t node', '-a number=%s'%nodeNum, '-a ip_address=%s'%ip, '-a ip_port=%s'%port, '-a cluster=%s'%cluster]
|
||||||
|
|
||||||
|
try:
|
||||||
|
doCmd(cmds)
|
||||||
|
except ShellExceutedFailedException, e:
|
||||||
|
if e.errCode == 239 or "already exists" in e.stderr:
|
||||||
|
logger.debug(OvmOCFS2._addNode, "node %s already exists, skip it(%s)"%(name, e.stderr))
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
def _isClusterOnline(self, cluster):
|
||||||
|
cmds = ['service o2cb status', cluster]
|
||||||
|
res = doCmd(cmds)
|
||||||
|
for line in res.split('\n'):
|
||||||
|
if not 'Checking O2CB cluster' in line: continue
|
||||||
|
return not 'Offline' in line
|
||||||
|
|
||||||
|
def _start(self, cluster):
|
||||||
|
#blank line are answer by clicking enter
|
||||||
|
cmd = ['service o2cb load']
|
||||||
|
doCmd(cmd)
|
||||||
|
config='''
|
||||||
|
y
|
||||||
|
o2cb
|
||||||
|
%s
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
'''%cluster
|
||||||
|
cmd = ['service o2cb configure', '<<EOF', config]
|
||||||
|
doCmd(cmd)
|
||||||
|
cmd = ['service o2cb start %s'%cluster]
|
||||||
|
doCmd(cmd)
|
||||||
|
|
||||||
@ -3,6 +3,7 @@ from OVSSiteSR import sp_create, sr_create, sr_do
|
|||||||
from OVSParser import parse_ocfs2_cluster_conf
|
from OVSParser import parse_ocfs2_cluster_conf
|
||||||
from OVSXCluster import clusterm_set_ocfs2_cluster_conf, clusterm_start_o2cb_service
|
from OVSXCluster import clusterm_set_ocfs2_cluster_conf, clusterm_start_o2cb_service
|
||||||
from OVSSiteRMServer import get_master_ip
|
from OVSSiteRMServer import get_master_ip
|
||||||
|
from OvmOCFS2Module import OvmOCFS2
|
||||||
import re
|
import re
|
||||||
|
|
||||||
class OvmStoragePoolDecoder(json.JSONDecoder):
|
class OvmStoragePoolDecoder(json.JSONDecoder):
|
||||||
@ -194,38 +195,6 @@ class OvmStoragePool(OvmObject):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def prepareOCFS2Nodes(clusterName, nodeString):
|
def prepareOCFS2Nodes(clusterName, nodeString):
|
||||||
def compareClusterConfig(nodes):
|
|
||||||
def sortNodes(nodes):
|
|
||||||
ns = []
|
|
||||||
for n in nodes:
|
|
||||||
ns.insert(int(n["number"]), n)
|
|
||||||
return ns
|
|
||||||
|
|
||||||
def compareNodes(ns1, ns2):
|
|
||||||
if len(ns1) != len(ns2):
|
|
||||||
return False
|
|
||||||
|
|
||||||
for i in range(0, len(ns1)):
|
|
||||||
n1 = ns1[i]
|
|
||||||
n2 = ns2[i]
|
|
||||||
if n1["ip_address"] != n2["ip_address"] or n1["number"] != n2["number"] \
|
|
||||||
or n1["name"] != n2["name"]:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
if exists(OCFS2_CLUSTER_CONF):
|
|
||||||
oldConf = parse_ocfs2_cluster_conf()
|
|
||||||
cluster = oldConf["cluster"]
|
|
||||||
nodesNum = cluster["node_count"]
|
|
||||||
if len(nodes) != nodesNum:
|
|
||||||
return False
|
|
||||||
|
|
||||||
new = sortNodes(nodes)
|
|
||||||
old = sortNodes(oldConf["nodes"])
|
|
||||||
return compareNodes(new, old)
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def configureEtcHosts(nodes):
|
def configureEtcHosts(nodes):
|
||||||
if not exists(ETC_HOSTS):
|
if not exists(ETC_HOSTS):
|
||||||
orignalConf = ""
|
orignalConf = ""
|
||||||
@ -276,6 +245,15 @@ class OvmStoragePool(OvmObject):
|
|||||||
fd.close()
|
fd.close()
|
||||||
doCmd(['hostname', nodeName])
|
doCmd(['hostname', nodeName])
|
||||||
|
|
||||||
|
def addNodes(nodes, clusterName):
|
||||||
|
ocfs2 = OvmOCFS2()
|
||||||
|
isOnline = ocfs2._isClusterOnline(clusterName)
|
||||||
|
if not isOnline:
|
||||||
|
ocfs2._prepareConf(clusterName)
|
||||||
|
|
||||||
|
for n in nodes:
|
||||||
|
ocfs2._addNode(n['name'], n['number'], n['ip_address'], 7777, clusterName, isOnline)
|
||||||
|
|
||||||
def checkStaleCluster(clusterName):
|
def checkStaleCluster(clusterName):
|
||||||
if exists('/sys/kernel/config/cluster/'):
|
if exists('/sys/kernel/config/cluster/'):
|
||||||
dirs = os.listdir('/sys/kernel/config/cluster/')
|
dirs = os.listdir('/sys/kernel/config/cluster/')
|
||||||
@ -287,7 +265,7 @@ class OvmStoragePool(OvmObject):
|
|||||||
3) /etc/init.d/o2cb offline %s
|
3) /etc/init.d/o2cb offline %s
|
||||||
4) /etc/init.d/o2cb restart
|
4) /etc/init.d/o2cb restart
|
||||||
if this doesn't resolve the problem, please check oracle manual to see how to offline a cluster
|
if this doesn't resolve the problem, please check oracle manual to see how to offline a cluster
|
||||||
''' % (dir, get_master_ip, dir)
|
''' % (dir, successToMap(get_master_ip())['ip'], dir)
|
||||||
raise Exception(errMsg)
|
raise Exception(errMsg)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -303,31 +281,14 @@ if this doesn't resolve the problem, please check oracle manual to see how to of
|
|||||||
if len(nodes) > 255:
|
if len(nodes) > 255:
|
||||||
raise Exception("%s nodes beyond maximum 255 allowed by OCFS2"%len(nodes))
|
raise Exception("%s nodes beyond maximum 255 allowed by OCFS2"%len(nodes))
|
||||||
|
|
||||||
if compareClusterConfig(nodes):
|
|
||||||
logger.debug(OvmStoragePool.prepareOCFS2Nodes, "Nodes configure are the same, return")
|
|
||||||
rs = SUCC()
|
|
||||||
return rs
|
|
||||||
|
|
||||||
lines = []
|
|
||||||
for n in nodes:
|
|
||||||
lines.append("node:\n")
|
|
||||||
lines.append("\tip_port = %s\n" % "7777")
|
|
||||||
lines.append("\tip_address = %s\n" % n["ip_address"])
|
|
||||||
lines.append("\tnumber = %s\n" % n["number"])
|
|
||||||
lines.append("\tname = %s\n" % n["name"])
|
|
||||||
lines.append("\tcluster = %s\n" % clusterName)
|
|
||||||
lines.append("\n")
|
|
||||||
lines.append("cluster:\n")
|
|
||||||
lines.append("\tnode_count = %d\n" % len(nodes))
|
|
||||||
lines.append("\tname = %s\n" % clusterName)
|
|
||||||
lines.append("\n")
|
|
||||||
conf = "".join(lines)
|
|
||||||
|
|
||||||
configureHostName(nodes)
|
configureHostName(nodes)
|
||||||
configureEtcHosts(nodes)
|
configureEtcHosts(nodes)
|
||||||
clusterm_set_ocfs2_cluster_conf(conf)
|
addNodes(nodes, clusterName)
|
||||||
clusterm_start_o2cb_service()
|
OvmOCFS2()._start(clusterName)
|
||||||
logger.debug(OvmStoragePool.prepareOCFS2Nodes, "Configure cluster.conf to:\n%s"%conf)
|
fd = open(OCFS2_CONF, 'r')
|
||||||
|
conf = fd.readlines()
|
||||||
|
fd.close()
|
||||||
|
logger.debug(OvmStoragePool.prepareOCFS2Nodes, "Configure cluster.conf to:\n%s"%' '.join(conf))
|
||||||
rs = SUCC()
|
rs = SUCC()
|
||||||
return rs
|
return rs
|
||||||
|
|
||||||
|
|||||||
@ -55,8 +55,8 @@ import com.cloud.agent.api.ReadyAnswer;
|
|||||||
import com.cloud.agent.api.ReadyCommand;
|
import com.cloud.agent.api.ReadyCommand;
|
||||||
import com.cloud.agent.api.RebootAnswer;
|
import com.cloud.agent.api.RebootAnswer;
|
||||||
import com.cloud.agent.api.RebootCommand;
|
import com.cloud.agent.api.RebootCommand;
|
||||||
import com.cloud.agent.api.SecurityIngressRuleAnswer;
|
import com.cloud.agent.api.SecurityGroupRuleAnswer;
|
||||||
import com.cloud.agent.api.SecurityIngressRulesCmd;
|
import com.cloud.agent.api.SecurityGroupRulesCmd;
|
||||||
import com.cloud.agent.api.StartAnswer;
|
import com.cloud.agent.api.StartAnswer;
|
||||||
import com.cloud.agent.api.StartCommand;
|
import com.cloud.agent.api.StartCommand;
|
||||||
import com.cloud.agent.api.StartupCommand;
|
import com.cloud.agent.api.StartupCommand;
|
||||||
@ -1045,7 +1045,7 @@ public class OvmResourceBase implements ServerResource, HypervisorResource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Answer execute(SecurityIngressRulesCmd cmd) {
|
private Answer execute(SecurityGroupRulesCmd cmd) {
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
try {
|
try {
|
||||||
OvmVif.Details vif = getVifFromVm(cmd.getVmName(), null);
|
OvmVif.Details vif = getVifFromVm(cmd.getVmName(), null);
|
||||||
@ -1059,10 +1059,10 @@ public class OvmResourceBase implements ServerResource, HypervisorResource {
|
|||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
s_logger.warn("Failed to program network rules for vm " + cmd.getVmName());
|
s_logger.warn("Failed to program network rules for vm " + cmd.getVmName());
|
||||||
return new SecurityIngressRuleAnswer(cmd, false, "programming network rules failed");
|
return new SecurityGroupRuleAnswer(cmd, false, "programming network rules failed");
|
||||||
} else {
|
} else {
|
||||||
s_logger.info("Programmed network rules for vm " + cmd.getVmName() + " guestIp=" + cmd.getGuestIp() + ", numrules=" + cmd.getRuleSet().length);
|
s_logger.info("Programmed network rules for vm " + cmd.getVmName() + " guestIp=" + cmd.getGuestIp() + ", numrules=" + cmd.getRuleSet().length);
|
||||||
return new SecurityIngressRuleAnswer(cmd);
|
return new SecurityGroupRuleAnswer(cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1270,8 +1270,8 @@ public class OvmResourceBase implements ServerResource, HypervisorResource {
|
|||||||
return execute((FenceCommand)cmd);
|
return execute((FenceCommand)cmd);
|
||||||
} else if (clazz == AttachIsoCommand.class) {
|
} else if (clazz == AttachIsoCommand.class) {
|
||||||
return execute((AttachIsoCommand)cmd);
|
return execute((AttachIsoCommand)cmd);
|
||||||
} else if (clazz == SecurityIngressRulesCmd.class) {
|
} else if (clazz == SecurityGroupRulesCmd.class) {
|
||||||
return execute((SecurityIngressRulesCmd) cmd);
|
return execute((SecurityGroupRulesCmd) cmd);
|
||||||
} else if (clazz == CleanupNetworkRulesCmd.class) {
|
} else if (clazz == CleanupNetworkRulesCmd.class) {
|
||||||
return execute((CleanupNetworkRulesCmd) cmd);
|
return execute((CleanupNetworkRulesCmd) cmd);
|
||||||
} else if (clazz == PrepareOCFS2NodesCommand.class) {
|
} else if (clazz == PrepareOCFS2NodesCommand.class) {
|
||||||
|
|||||||
@ -476,6 +476,7 @@ def ipset(ipsetname, proto, start, end, ips):
|
|||||||
def destroy_network_rules_for_vm(session, args):
|
def destroy_network_rules_for_vm(session, args):
|
||||||
vm_name = args.pop('vmName')
|
vm_name = args.pop('vmName')
|
||||||
vmchain = chain_name(vm_name)
|
vmchain = chain_name(vm_name)
|
||||||
|
vmchain_egress = chain_name(vm_name) + "-eg"
|
||||||
vmchain_default = chain_name_def(vm_name)
|
vmchain_default = chain_name_def(vm_name)
|
||||||
|
|
||||||
delete_rules_for_vm_in_bridge_firewall_chain(vm_name)
|
delete_rules_for_vm_in_bridge_firewall_chain(vm_name)
|
||||||
@ -492,9 +493,14 @@ def destroy_network_rules_for_vm(session, args):
|
|||||||
util.pread2(['iptables', '-F', vmchain])
|
util.pread2(['iptables', '-F', vmchain])
|
||||||
util.pread2(['iptables', '-X', vmchain])
|
util.pread2(['iptables', '-X', vmchain])
|
||||||
except:
|
except:
|
||||||
util.SMlog("Ignoring failure to delete chain " + vmchain)
|
util.SMlog("Ignoring failure to delete ingress chain " + vmchain)
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
util.pread2(['iptables', '-F', vmchain_egress])
|
||||||
|
util.pread2(['iptables', '-X', vmchain_egress])
|
||||||
|
except:
|
||||||
|
util.SMlog("Ignoring failure to delete egress chain " + vmchain_egress)
|
||||||
|
|
||||||
remove_rule_log_for_vm(vm_name)
|
remove_rule_log_for_vm(vm_name)
|
||||||
|
|
||||||
@ -671,6 +677,7 @@ def default_network_rules(session, args):
|
|||||||
|
|
||||||
|
|
||||||
vmchain = chain_name(vm_name)
|
vmchain = chain_name(vm_name)
|
||||||
|
vmchain_egress = chain_name(vm_name) +"-eg"
|
||||||
vmchain_default = chain_name_def(vm_name)
|
vmchain_default = chain_name_def(vm_name)
|
||||||
|
|
||||||
destroy_ebtables_rules(vmchain)
|
destroy_ebtables_rules(vmchain)
|
||||||
@ -681,6 +688,11 @@ def default_network_rules(session, args):
|
|||||||
except:
|
except:
|
||||||
util.pread2(['iptables', '-F', vmchain])
|
util.pread2(['iptables', '-F', vmchain])
|
||||||
|
|
||||||
|
try:
|
||||||
|
util.pread2(['iptables', '-N', vmchain_egress])
|
||||||
|
except:
|
||||||
|
util.pread2(['iptables', '-F', vmchain_egress])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
util.pread2(['iptables', '-N', vmchain_default])
|
util.pread2(['iptables', '-N', vmchain_default])
|
||||||
except:
|
except:
|
||||||
@ -698,7 +710,8 @@ def default_network_rules(session, args):
|
|||||||
|
|
||||||
#don't let vm spoof its ip address
|
#don't let vm spoof its ip address
|
||||||
for v in vifs:
|
for v in vifs:
|
||||||
util.pread2(['iptables', '-A', vmchain_default, '-m', 'physdev', '--physdev-is-bridged', '--physdev-in', v, '--source', vm_ip, '-j', 'RETURN'])
|
util.pread2(['iptables', '-A', vmchain_default, '-m', 'physdev', '--physdev-is-bridged', '--physdev-in', v, '--source', vm_ip,'-p', 'udp', '--dport', '53', '-j', 'RETURN'])
|
||||||
|
util.pread2(['iptables', '-A', vmchain_default, '-m', 'physdev', '--physdev-is-bridged', '--physdev-in', v, '--source', vm_ip, '-j', vmchain_egress])
|
||||||
util.pread2(['iptables', '-A', vmchain_default, '-j', vmchain])
|
util.pread2(['iptables', '-A', vmchain_default, '-j', vmchain])
|
||||||
except:
|
except:
|
||||||
util.SMlog("Failed to program default rules for vm " + vm_name)
|
util.SMlog("Failed to program default rules for vm " + vm_name)
|
||||||
@ -900,7 +913,7 @@ def cleanup_rules(session, args):
|
|||||||
instance = 'VM'
|
instance = 'VM'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
chainscmd = "iptables-save | grep '^:' | awk '{print $1}' | cut -d':' -f2 | sed 's/-def/-%s/'|sort|uniq" % instance
|
chainscmd = "iptables-save | grep '^:' | awk '{print $1}' | cut -d':' -f2 | sed 's/-def/-%s/' | sed 's/-eg//' |sort|uniq" % instance
|
||||||
chains = util.pread2(['/bin/bash', '-c', chainscmd]).split('\n')
|
chains = util.pread2(['/bin/bash', '-c', chainscmd]).split('\n')
|
||||||
cleaned = 0
|
cleaned = 0
|
||||||
cleanup = []
|
cleanup = []
|
||||||
@ -1026,6 +1039,7 @@ def network_rules(session, args):
|
|||||||
vm_name = args.get('vmName')
|
vm_name = args.get('vmName')
|
||||||
vm_ip = args.get('vmIP')
|
vm_ip = args.get('vmIP')
|
||||||
vm_id = args.get('vmID')
|
vm_id = args.get('vmID')
|
||||||
|
type = args.get('type')
|
||||||
signature = args.pop('signature')
|
signature = args.pop('signature')
|
||||||
seqno = args.pop('seqno')
|
seqno = args.pop('seqno')
|
||||||
deflated = 'false'
|
deflated = 'false'
|
||||||
@ -1055,7 +1069,14 @@ def network_rules(session, args):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
if type == 'egress':
|
||||||
|
vmchain = chain_name(vm_name) + "-eg"
|
||||||
|
direction = "dst"
|
||||||
|
action = "RETURN"
|
||||||
|
else:
|
||||||
vmchain = chain_name(vm_name)
|
vmchain = chain_name(vm_name)
|
||||||
|
direction = "src"
|
||||||
|
action = "ACCEPT"
|
||||||
reason = 'seqno_change_or_sig_change'
|
reason = 'seqno_change_or_sig_change'
|
||||||
[reprogramDefault, reprogramChain, rewriteLog] = \
|
[reprogramDefault, reprogramChain, rewriteLog] = \
|
||||||
check_rule_log_for_vm (vm_name, vm_id, vm_ip, domid, signature, seqno)
|
check_rule_log_for_vm (vm_name, vm_id, vm_ip, domid, signature, seqno)
|
||||||
@ -1114,31 +1135,38 @@ def network_rules(session, args):
|
|||||||
util.SMlog(" failed to create ipset for rule " + str(tokens))
|
util.SMlog(" failed to create ipset for rule " + str(tokens))
|
||||||
|
|
||||||
if protocol == 'all':
|
if protocol == 'all':
|
||||||
iptables = ['iptables', '-I', vmchain, '-m', 'state', '--state', 'NEW', '-m', 'set', '--match-set', ipsetname, 'src', '-j', 'ACCEPT']
|
iptables = ['iptables', '-I', vmchain, '-m', 'state', '--state', 'NEW', '-m', 'set', '--match-set', ipsetname, direction, '-j', action]
|
||||||
elif protocol != 'icmp':
|
elif protocol != 'icmp':
|
||||||
iptables = ['iptables', '-I', vmchain, '-p', protocol, '-m', protocol, '--dport', range, '-m', 'state', '--state', 'NEW', '-m', 'set', '--match-set', ipsetname, 'src', '-j', 'ACCEPT']
|
iptables = ['iptables', '-I', vmchain, '-p', protocol, '-m', protocol, '--dport', range, '-m', 'state', '--state', 'NEW', '-m', 'set', '--match-set', ipsetname, direction, '-j', action]
|
||||||
else:
|
else:
|
||||||
range = start + "/" + end
|
range = start + "/" + end
|
||||||
if start == "-1":
|
if start == "-1":
|
||||||
range = "any"
|
range = "any"
|
||||||
iptables = ['iptables', '-I', vmchain, '-p', 'icmp', '--icmp-type', range, '-m', 'set', '--match-set', ipsetname, 'src', '-j', 'ACCEPT']
|
iptables = ['iptables', '-I', vmchain, '-p', 'icmp', '--icmp-type', range, '-m', 'set', '--match-set', ipsetname, direction, '-j', action]
|
||||||
cmds.append(iptables)
|
cmds.append(iptables)
|
||||||
util.SMlog(iptables)
|
util.SMlog(iptables)
|
||||||
|
|
||||||
if allow_any and protocol != 'all':
|
if allow_any and protocol != 'all':
|
||||||
if protocol != 'icmp':
|
if protocol != 'icmp':
|
||||||
iptables = ['iptables', '-I', vmchain, '-p', protocol, '-m', protocol, '--dport', range, '-m', 'state', '--state', 'NEW', '-j', 'ACCEPT']
|
iptables = ['iptables', '-I', vmchain, '-p', protocol, '-m', protocol, '--dport', range, '-m', 'state', '--state', 'NEW', '-j', action]
|
||||||
else:
|
else:
|
||||||
range = start + "/" + end
|
range = start + "/" + end
|
||||||
if start == "-1":
|
if start == "-1":
|
||||||
range = "any"
|
range = "any"
|
||||||
iptables = ['iptables', '-I', vmchain, '-p', 'icmp', '--icmp-type', range, '-j', 'ACCEPT']
|
iptables = ['iptables', '-I', vmchain, '-p', 'icmp', '--icmp-type', range, '-j', action]
|
||||||
cmds.append(iptables)
|
cmds.append(iptables)
|
||||||
util.SMlog(iptables)
|
util.SMlog(iptables)
|
||||||
|
|
||||||
util.pread2(['iptables', '-F', vmchain])
|
util.pread2(['iptables', '-F', vmchain])
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
util.pread2(cmd)
|
util.pread2(cmd)
|
||||||
|
|
||||||
|
if type == 'egress':
|
||||||
|
if len(cmds) == 0 :
|
||||||
|
util.pread2(['iptables', '-A', vmchain, '-j', 'RETURN'])
|
||||||
|
else:
|
||||||
|
util.pread2(['iptables', '-A', vmchain, '-j', 'DROP'])
|
||||||
|
else:
|
||||||
util.pread2(['iptables', '-A', vmchain, '-j', 'DROP'])
|
util.pread2(['iptables', '-A', vmchain, '-j', 'DROP'])
|
||||||
|
|
||||||
if write_rule_log_for_vm(vm_name, vm_id, vm_ip, domid, signature, seqno) == False:
|
if write_rule_log_for_vm(vm_name, vm_id, vm_ip, domid, signature, seqno) == False:
|
||||||
|
|||||||
@ -82,6 +82,7 @@ def ipset(ipsetname, proto, start, end, ips):
|
|||||||
|
|
||||||
def destroy_network_rules_for_vm(vm_name, vif=None):
|
def destroy_network_rules_for_vm(vm_name, vif=None):
|
||||||
vmchain = vm_name
|
vmchain = vm_name
|
||||||
|
vmchain_egress = vm_name + "-eg"
|
||||||
vmchain_default = None
|
vmchain_default = None
|
||||||
|
|
||||||
delete_rules_for_vm_in_bridge_firewall_chain(vm_name)
|
delete_rules_for_vm_in_bridge_firewall_chain(vm_name)
|
||||||
@ -112,6 +113,18 @@ def destroy_network_rules_for_vm(vm_name, vif=None):
|
|||||||
except:
|
except:
|
||||||
logging.debug("Ignoring failure to delete chain " + vmchain)
|
logging.debug("Ignoring failure to delete chain " + vmchain)
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
execute("iptables -F " + vmchain_egress)
|
||||||
|
except:
|
||||||
|
logging.debug("Ignoring failure to delete chain " + vmchain_egress)
|
||||||
|
|
||||||
|
try:
|
||||||
|
execute("iptables -X " + vmchain_egress)
|
||||||
|
except:
|
||||||
|
logging.debug("Ignoring failure to delete chain " + vmchain_egress)
|
||||||
|
|
||||||
|
|
||||||
if vif is not None:
|
if vif is not None:
|
||||||
try:
|
try:
|
||||||
dnats = execute("iptables -t nat -S | grep " + vif + " | sed 's/-A/-D/'").split("\n")
|
dnats = execute("iptables -t nat -S | grep " + vif + " | sed 's/-A/-D/'").split("\n")
|
||||||
@ -246,6 +259,7 @@ def default_network_rules(vm_name, vm_id, vm_ip, vm_mac, vif, brname):
|
|||||||
domID = getvmId(vm_name)
|
domID = getvmId(vm_name)
|
||||||
delete_rules_for_vm_in_bridge_firewall_chain(vmName)
|
delete_rules_for_vm_in_bridge_firewall_chain(vmName)
|
||||||
vmchain = vm_name
|
vmchain = vm_name
|
||||||
|
vmchain_egress = vm_name +"-eg"
|
||||||
vmchain_default = '-'.join(vmchain.split('-')[:-1]) + "-def"
|
vmchain_default = '-'.join(vmchain.split('-')[:-1]) + "-def"
|
||||||
|
|
||||||
destroy_ebtables_rules(vmName, vif)
|
destroy_ebtables_rules(vmName, vif)
|
||||||
@ -255,6 +269,11 @@ def default_network_rules(vm_name, vm_id, vm_ip, vm_mac, vif, brname):
|
|||||||
except:
|
except:
|
||||||
execute("iptables -F " + vmchain)
|
execute("iptables -F " + vmchain)
|
||||||
|
|
||||||
|
try:
|
||||||
|
execute("iptables -N " + vmchain_egress)
|
||||||
|
except:
|
||||||
|
execute("iptables -F " + vmchain_egress)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
execute("iptables -N " + vmchain_default)
|
execute("iptables -N " + vmchain_default)
|
||||||
except:
|
except:
|
||||||
@ -270,7 +289,8 @@ def default_network_rules(vm_name, vm_id, vm_ip, vm_mac, vif, brname):
|
|||||||
|
|
||||||
#don't let vm spoof its ip address
|
#don't let vm spoof its ip address
|
||||||
if vm_ip is not None:
|
if vm_ip is not None:
|
||||||
execute("iptables -A " + vmchain_default + " -m physdev --physdev-is-bridged --physdev-in " + vif + " --source " + vm_ip + " -j ACCEPT")
|
execute("iptables -A " + vmchain_default + " -m physdev --physdev-is-bridged --physdev-in " + vif + " --source " + vm_ip + " -p udp --dport 57 -j RETURN ")
|
||||||
|
execute("iptables -A " + vmchain_default + " -m physdev --physdev-is-bridged --physdev-in " + vif + " --source " + vm_ip + " -j " + vmchain_egress)
|
||||||
execute("iptables -A " + vmchain_default + " -j " + vmchain)
|
execute("iptables -A " + vmchain_default + " -j " + vmchain)
|
||||||
execute("iptables -A " + vmchain + " -j DROP")
|
execute("iptables -A " + vmchain + " -j DROP")
|
||||||
except:
|
except:
|
||||||
@ -468,7 +488,7 @@ def cleanup_rules_for_dead_vms():
|
|||||||
def cleanup_rules():
|
def cleanup_rules():
|
||||||
try:
|
try:
|
||||||
|
|
||||||
chainscmd = "iptables-save | grep '^:' | grep -v '.*-def' | awk '{print $1}' | cut -d':' -f2"
|
chainscmd = "iptables-save | grep '^:' | grep -v '.*-def' | grep -v '.*-eg' | awk '{print $1}' | cut -d':' -f2"
|
||||||
chains = execute(chainscmd).split('\n')
|
chains = execute(chainscmd).split('\n')
|
||||||
cleaned = 0
|
cleaned = 0
|
||||||
cleanup = []
|
cleanup = []
|
||||||
@ -552,11 +572,20 @@ def remove_rule_log_for_vm(vmName):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def add_network_rules(vm_name, vm_id, vm_ip, signature, seqno, vmMac, rules, vif, brname):
|
def add_network_rules(vm_name, vm_id, vm_ip, signature, seqno, vmMac, rules, vif, brname,ruletype):
|
||||||
try:
|
try:
|
||||||
vmName = vm_name
|
vmName = vm_name
|
||||||
domId = getvmId(vmName)
|
domId = getvmId(vmName)
|
||||||
|
|
||||||
|
if ruletype == 'egress':
|
||||||
|
vmchain = vm_name + "-eg"
|
||||||
|
direction = "-d"
|
||||||
|
action = "RETURN"
|
||||||
|
else:
|
||||||
vmchain = vm_name
|
vmchain = vm_name
|
||||||
|
direction = "-s"
|
||||||
|
action = "ACCEPT"
|
||||||
|
|
||||||
|
|
||||||
changes = []
|
changes = []
|
||||||
changes = check_rule_log_for_vm(vmName, vm_id, vm_ip, domId, signature, seqno)
|
changes = check_rule_log_for_vm(vmName, vm_id, vm_ip, domId, signature, seqno)
|
||||||
@ -596,26 +625,33 @@ def add_network_rules(vm_name, vm_id, vm_ip, signature, seqno, vmMac, rules, vif
|
|||||||
if ips:
|
if ips:
|
||||||
if protocol == 'all':
|
if protocol == 'all':
|
||||||
for ip in ips:
|
for ip in ips:
|
||||||
execute("iptables -I " + vmchain + " -m state --state NEW -s " + ip + " -j ACCEPT")
|
execute("iptables -I " + vmchain + " -m state --state NEW " + direction + " " + ip + " -j "+action)
|
||||||
elif protocol != 'icmp':
|
elif protocol != 'icmp':
|
||||||
for ip in ips:
|
for ip in ips:
|
||||||
execute("iptables -I " + vmchain + " -p " + protocol + " -m " + protocol + " --dport " + range + " -m state --state NEW -s " + ip + " -j ACCEPT")
|
execute("iptables -I " + vmchain + " -p " + protocol + " -m " + protocol + " --dport " + range + " -m state --state NEW " + direction + " " + ip + " -j "+action)
|
||||||
else:
|
else:
|
||||||
range = start + "/" + end
|
range = start + "/" + end
|
||||||
if start == "-1":
|
if start == "-1":
|
||||||
range = "any"
|
range = "any"
|
||||||
for ip in ips:
|
for ip in ips:
|
||||||
execute("iptables -I " + vmchain + " -p icmp --icmp-type " + range + " -s " + ip + " -j ACCEPT")
|
execute("iptables -I " + vmchain + " -p icmp --icmp-type " + range + " " + direction + " " + ip + " -j "+action)
|
||||||
|
|
||||||
if allow_any and protocol != 'all':
|
if allow_any and protocol != 'all':
|
||||||
if protocol != 'icmp':
|
if protocol != 'icmp':
|
||||||
execute("iptables -I " + vmchain + " -p " + protocol + " -m " + protocol + " --dport " + range + " -m state --state NEW -j ACCEPT")
|
execute("iptables -I " + vmchain + " -p " + protocol + " -m " + protocol + " --dport " + range + " -m state --state NEW -j "+action)
|
||||||
else:
|
else:
|
||||||
range = start + "/" + end
|
range = start + "/" + end
|
||||||
if start == "-1":
|
if start == "-1":
|
||||||
range = "any"
|
range = "any"
|
||||||
execute("iptables -I " + vmchain + " -p icmp --icmp-type " + range + " -j ACCEPT")
|
execute("iptables -I " + vmchain + " -p icmp --icmp-type " + range + " -j "+action)
|
||||||
|
if ruletype == 'egress':
|
||||||
|
if len(lines) == 0 :
|
||||||
|
iptables = "iptables -A " + vmchain + " -j RETURN"
|
||||||
|
execute(iptables)
|
||||||
|
else:
|
||||||
|
iptables = "iptables -A " + vmchain + " -j DROP"
|
||||||
|
execute(iptables)
|
||||||
|
else:
|
||||||
iptables = "iptables -A " + vmchain + " -j DROP"
|
iptables = "iptables -A " + vmchain + " -j DROP"
|
||||||
execute(iptables)
|
execute(iptables)
|
||||||
if write_rule_log_for_vm(vmName, vm_id, vm_ip, domId, signature, seqno) == False:
|
if write_rule_log_for_vm(vmName, vm_id, vm_ip, domId, signature, seqno) == False:
|
||||||
@ -704,6 +740,7 @@ if __name__ == '__main__':
|
|||||||
parser.add_option("--vmid", dest="vmID")
|
parser.add_option("--vmid", dest="vmID")
|
||||||
parser.add_option("--vmmac", dest="vmMAC")
|
parser.add_option("--vmmac", dest="vmMAC")
|
||||||
parser.add_option("--vif", dest="vif")
|
parser.add_option("--vif", dest="vif")
|
||||||
|
parser.add_option("--ruletype", dest="ruletype")
|
||||||
parser.add_option("--sig", dest="sig")
|
parser.add_option("--sig", dest="sig")
|
||||||
parser.add_option("--seq", dest="seq")
|
parser.add_option("--seq", dest="seq")
|
||||||
parser.add_option("--rules", dest="rules")
|
parser.add_option("--rules", dest="rules")
|
||||||
@ -724,7 +761,7 @@ if __name__ == '__main__':
|
|||||||
elif cmd == "get_rule_logs_for_vms":
|
elif cmd == "get_rule_logs_for_vms":
|
||||||
get_rule_logs_for_vms()
|
get_rule_logs_for_vms()
|
||||||
elif cmd == "add_network_rules":
|
elif cmd == "add_network_rules":
|
||||||
add_network_rules(option.vmName, option.vmID, option.vmIP, option.sig, option.seq, option.vmMAC, option.rules, option.vif, option.brname)
|
add_network_rules(option.vmName, option.vmID, option.vmIP, option.sig, option.seq, option.vmMAC, option.rules, option.vif, option.brname,option.ruletype)
|
||||||
elif cmd == "cleanup_rules":
|
elif cmd == "cleanup_rules":
|
||||||
cleanup_rules()
|
cleanup_rules()
|
||||||
elif cmd == "post_default_network_rules":
|
elif cmd == "post_default_network_rules":
|
||||||
|
|||||||
@ -45,7 +45,6 @@ import com.cloud.api.response.CreateCmdResponse;
|
|||||||
import com.cloud.api.response.DiskOfferingResponse;
|
import com.cloud.api.response.DiskOfferingResponse;
|
||||||
import com.cloud.api.response.DomainResponse;
|
import com.cloud.api.response.DomainResponse;
|
||||||
import com.cloud.api.response.DomainRouterResponse;
|
import com.cloud.api.response.DomainRouterResponse;
|
||||||
import com.cloud.api.response.EgressRuleResponse;
|
|
||||||
import com.cloud.api.response.EventResponse;
|
import com.cloud.api.response.EventResponse;
|
||||||
import com.cloud.api.response.ExtractResponse;
|
import com.cloud.api.response.ExtractResponse;
|
||||||
import com.cloud.api.response.FirewallResponse;
|
import com.cloud.api.response.FirewallResponse;
|
||||||
@ -53,8 +52,8 @@ import com.cloud.api.response.FirewallRuleResponse;
|
|||||||
import com.cloud.api.response.HostResponse;
|
import com.cloud.api.response.HostResponse;
|
||||||
import com.cloud.api.response.HypervisorCapabilitiesResponse;
|
import com.cloud.api.response.HypervisorCapabilitiesResponse;
|
||||||
import com.cloud.api.response.IPAddressResponse;
|
import com.cloud.api.response.IPAddressResponse;
|
||||||
import com.cloud.api.response.IngressRuleResponse;
|
import com.cloud.api.response.SecurityGroupResponse;
|
||||||
import com.cloud.api.response.IngressRuleResultObject;
|
import com.cloud.api.response.SecurityGroupResultObject;
|
||||||
import com.cloud.api.response.InstanceGroupResponse;
|
import com.cloud.api.response.InstanceGroupResponse;
|
||||||
import com.cloud.api.response.IpForwardingRuleResponse;
|
import com.cloud.api.response.IpForwardingRuleResponse;
|
||||||
import com.cloud.api.response.ListResponse;
|
import com.cloud.api.response.ListResponse;
|
||||||
@ -133,8 +132,8 @@ import com.cloud.network.rules.FirewallRule;
|
|||||||
import com.cloud.network.rules.LoadBalancer;
|
import com.cloud.network.rules.LoadBalancer;
|
||||||
import com.cloud.network.rules.PortForwardingRule;
|
import com.cloud.network.rules.PortForwardingRule;
|
||||||
import com.cloud.network.rules.StaticNatRule;
|
import com.cloud.network.rules.StaticNatRule;
|
||||||
import com.cloud.network.security.EgressRule;
|
import com.cloud.network.security.SecurityRule;
|
||||||
import com.cloud.network.security.IngressRule;
|
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
||||||
import com.cloud.network.security.SecurityGroup;
|
import com.cloud.network.security.SecurityGroup;
|
||||||
import com.cloud.network.security.SecurityGroupRules;
|
import com.cloud.network.security.SecurityGroupRules;
|
||||||
import com.cloud.offering.DiskOffering;
|
import com.cloud.offering.DiskOffering;
|
||||||
@ -186,6 +185,8 @@ import com.cloud.vm.VmStats;
|
|||||||
import com.cloud.vm.dao.UserVmData;
|
import com.cloud.vm.dao.UserVmData;
|
||||||
import com.cloud.vm.dao.UserVmData.NicData;
|
import com.cloud.vm.dao.UserVmData.NicData;
|
||||||
import com.cloud.vm.dao.UserVmData.SecurityGroupData;
|
import com.cloud.vm.dao.UserVmData.SecurityGroupData;
|
||||||
|
import com.cloud.api.response.SecurityGroupRuleResponse;
|
||||||
|
import com.cloud.api.response.SecurityGroupRuleResultObject;
|
||||||
|
|
||||||
public class ApiResponseHelper implements ResponseGenerator {
|
public class ApiResponseHelper implements ResponseGenerator {
|
||||||
|
|
||||||
@ -1775,8 +1776,10 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListResponse<SecurityGroupResponse> createSecurityGroupResponses(List<? extends SecurityGroupRules> networkGroups) {
|
public ListResponse<SecurityGroupResponse> createSecurityGroupResponses(
|
||||||
List<SecurityGroupResultObject> groupResultObjs = SecurityGroupResultObject.transposeNetworkGroups(networkGroups);
|
List<? extends SecurityGroupRules> networkGroups) {
|
||||||
|
List<SecurityGroupResultObject> groupResultObjs = SecurityGroupResultObject
|
||||||
|
.transposeNetworkGroups(networkGroups);
|
||||||
|
|
||||||
ListResponse<SecurityGroupResponse> response = new ListResponse<SecurityGroupResponse>();
|
ListResponse<SecurityGroupResponse> response = new ListResponse<SecurityGroupResponse>();
|
||||||
List<SecurityGroupResponse> netGrpResponses = new ArrayList<SecurityGroupResponse>();
|
List<SecurityGroupResponse> netGrpResponses = new ArrayList<SecurityGroupResponse>();
|
||||||
@ -1788,34 +1791,46 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
|
|
||||||
populateOwner(netGrpResponse, networkGroup);
|
populateOwner(netGrpResponse, networkGroup);
|
||||||
|
|
||||||
List<IngressRuleResultObject> ingressRules = networkGroup.getIngressRules();
|
List<SecurityGroupRuleResultObject> securityGroupRules = networkGroup
|
||||||
if ((ingressRules != null) && !ingressRules.isEmpty()) {
|
.getSecurityGroupRules();
|
||||||
List<IngressRuleResponse> ingressRulesResponse = new ArrayList<IngressRuleResponse>();
|
if ((securityGroupRules != null) && !securityGroupRules.isEmpty()) {
|
||||||
|
List<SecurityGroupRuleResponse> ingressRulesResponse = new ArrayList<SecurityGroupRuleResponse>();
|
||||||
|
List<SecurityGroupRuleResponse> egressRulesResponse = new ArrayList<SecurityGroupRuleResponse>();
|
||||||
|
for (SecurityGroupRuleResultObject securityGroupRule : securityGroupRules) {
|
||||||
|
SecurityGroupRuleResponse ruleData = new SecurityGroupRuleResponse();
|
||||||
|
ruleData.setRuleId(securityGroupRule.getId());
|
||||||
|
ruleData.setProtocol(securityGroupRule.getProtocol());
|
||||||
|
|
||||||
for (IngressRuleResultObject ingressRule : ingressRules) {
|
if ("icmp"
|
||||||
IngressRuleResponse ingressData = new IngressRuleResponse();
|
.equalsIgnoreCase(securityGroupRule.getProtocol())) {
|
||||||
|
ruleData.setIcmpType(securityGroupRule.getStartPort());
|
||||||
ingressData.setRuleId(ingressRule.getId());
|
ruleData.setIcmpCode(securityGroupRule.getEndPort());
|
||||||
ingressData.setProtocol(ingressRule.getProtocol());
|
|
||||||
if ("icmp".equalsIgnoreCase(ingressRule.getProtocol())) {
|
|
||||||
ingressData.setIcmpType(ingressRule.getStartPort());
|
|
||||||
ingressData.setIcmpCode(ingressRule.getEndPort());
|
|
||||||
} else {
|
} else {
|
||||||
ingressData.setStartPort(ingressRule.getStartPort());
|
ruleData.setStartPort(securityGroupRule.getStartPort());
|
||||||
ingressData.setEndPort(ingressRule.getEndPort());
|
ruleData.setEndPort(securityGroupRule.getEndPort());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ingressRule.getAllowedSecurityGroup() != null) {
|
if (securityGroupRule.getAllowedSecurityGroup() != null) {
|
||||||
ingressData.setSecurityGroupName(ingressRule.getAllowedSecurityGroup());
|
ruleData.setSecurityGroupName(securityGroupRule
|
||||||
ingressData.setAccountName(ingressRule.getAllowedSecGroupAcct());
|
.getAllowedSecurityGroup());
|
||||||
|
ruleData.setAccountName(securityGroupRule
|
||||||
|
.getAllowedSecGroupAcct());
|
||||||
} else {
|
} else {
|
||||||
ingressData.setCidr(ingressRule.getAllowedSourceIpCidr());
|
ruleData.setCidr(securityGroupRule
|
||||||
|
.getAllowedSourceIpCidr());
|
||||||
}
|
}
|
||||||
|
|
||||||
ingressData.setObjectName("ingressrule");
|
if (securityGroupRule.getRuleType() == SecurityRuleType.IngressRule) {
|
||||||
ingressRulesResponse.add(ingressData);
|
ruleData.setObjectName("ingressrule");
|
||||||
|
ingressRulesResponse.add(ruleData);
|
||||||
|
} else {
|
||||||
|
ruleData.setObjectName("egressrule");
|
||||||
|
egressRulesResponse.add(ruleData);
|
||||||
}
|
}
|
||||||
netGrpResponse.setIngressRules(ingressRulesResponse);
|
}
|
||||||
|
netGrpResponse
|
||||||
|
.setSecurityGroupIngressRules(ingressRulesResponse);
|
||||||
|
netGrpResponse.setSecurityGroupEgressRules(egressRulesResponse);
|
||||||
}
|
}
|
||||||
netGrpResponse.setObjectName("securitygroup");
|
netGrpResponse.setObjectName("securitygroup");
|
||||||
netGrpResponses.add(netGrpResponse);
|
netGrpResponses.add(netGrpResponse);
|
||||||
@ -2184,14 +2199,14 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SecurityGroupResponse createSecurityGroupResponseFromIngressRule(List<? extends IngressRule> ingressRules) {
|
public SecurityGroupResponse createSecurityGroupResponseFromSecurityGroupRule(List<? extends SecurityRule> securityRules) {
|
||||||
SecurityGroupResponse response = new SecurityGroupResponse();
|
SecurityGroupResponse response = new SecurityGroupResponse();
|
||||||
Map<Long, Account> securiytGroupAccounts = new HashMap<Long, Account>();
|
Map<Long, Account> securiytGroupAccounts = new HashMap<Long, Account>();
|
||||||
Map<Long, SecurityGroup> allowedSecurityGroups = new HashMap<Long, SecurityGroup>();
|
Map<Long, SecurityGroup> allowedSecurityGroups = new HashMap<Long, SecurityGroup>();
|
||||||
Map<Long, Account> allowedSecuriytGroupAccounts = new HashMap<Long, Account>();
|
Map<Long, Account> allowedSecuriytGroupAccounts = new HashMap<Long, Account>();
|
||||||
|
|
||||||
if ((ingressRules != null) && !ingressRules.isEmpty()) {
|
if ((securityRules != null) && !securityRules.isEmpty()) {
|
||||||
SecurityGroup securityGroup = ApiDBUtils.findSecurityGroupById(ingressRules.get(0).getSecurityGroupId());
|
SecurityGroup securityGroup = ApiDBUtils.findSecurityGroupById(securityRules.get(0).getSecurityGroupId());
|
||||||
response.setId(securityGroup.getId());
|
response.setId(securityGroup.getId());
|
||||||
response.setName(securityGroup.getName());
|
response.setName(securityGroup.getName());
|
||||||
response.setDescription(securityGroup.getDescription());
|
response.setDescription(securityGroup.getDescription());
|
||||||
@ -2206,21 +2221,22 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
populateAccount(response, account.getId());
|
populateAccount(response, account.getId());
|
||||||
populateDomain(response, account.getDomainId());
|
populateDomain(response, account.getDomainId());
|
||||||
|
|
||||||
List<IngressRuleResponse> responses = new ArrayList<IngressRuleResponse>();
|
List<SecurityGroupRuleResponse> egressResponses = new ArrayList<SecurityGroupRuleResponse>();
|
||||||
for (IngressRule ingressRule : ingressRules) {
|
List<SecurityGroupRuleResponse> ingressResponses = new ArrayList<SecurityGroupRuleResponse>();
|
||||||
IngressRuleResponse ingressData = new IngressRuleResponse();
|
for (SecurityRule securityRule : securityRules) {
|
||||||
|
SecurityGroupRuleResponse securityGroupData = new SecurityGroupRuleResponse();
|
||||||
|
|
||||||
ingressData.setRuleId(ingressRule.getId());
|
securityGroupData.setRuleId(securityRule.getId());
|
||||||
ingressData.setProtocol(ingressRule.getProtocol());
|
securityGroupData.setProtocol(securityRule.getProtocol());
|
||||||
if ("icmp".equalsIgnoreCase(ingressRule.getProtocol())) {
|
if ("icmp".equalsIgnoreCase(securityRule.getProtocol())) {
|
||||||
ingressData.setIcmpType(ingressRule.getStartPort());
|
securityGroupData.setIcmpType(securityRule.getStartPort());
|
||||||
ingressData.setIcmpCode(ingressRule.getEndPort());
|
securityGroupData.setIcmpCode(securityRule.getEndPort());
|
||||||
} else {
|
} else {
|
||||||
ingressData.setStartPort(ingressRule.getStartPort());
|
securityGroupData.setStartPort(securityRule.getStartPort());
|
||||||
ingressData.setEndPort(ingressRule.getEndPort());
|
securityGroupData.setEndPort(securityRule.getEndPort());
|
||||||
}
|
}
|
||||||
|
|
||||||
Long allowedSecurityGroupId = ingressRule.getAllowedNetworkId();
|
Long allowedSecurityGroupId = securityRule.getAllowedNetworkId();
|
||||||
if (allowedSecurityGroupId != null) {
|
if (allowedSecurityGroupId != null) {
|
||||||
SecurityGroup allowedSecurityGroup = allowedSecurityGroups.get(allowedSecurityGroupId);
|
SecurityGroup allowedSecurityGroup = allowedSecurityGroups.get(allowedSecurityGroupId);
|
||||||
if (allowedSecurityGroup == null) {
|
if (allowedSecurityGroup == null) {
|
||||||
@ -2228,7 +2244,7 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
allowedSecurityGroups.put(allowedSecurityGroupId, allowedSecurityGroup);
|
allowedSecurityGroups.put(allowedSecurityGroupId, allowedSecurityGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
ingressData.setSecurityGroupName(allowedSecurityGroup.getName());
|
securityGroupData.setSecurityGroupName(allowedSecurityGroup.getName());
|
||||||
|
|
||||||
Account allowedAccount = allowedSecuriytGroupAccounts.get(allowedSecurityGroup.getAccountId());
|
Account allowedAccount = allowedSecuriytGroupAccounts.get(allowedSecurityGroup.getAccountId());
|
||||||
if (allowedAccount == null) {
|
if (allowedAccount == null) {
|
||||||
@ -2236,84 +2252,21 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
allowedSecuriytGroupAccounts.put(allowedAccount.getId(), allowedAccount);
|
allowedSecuriytGroupAccounts.put(allowedAccount.getId(), allowedAccount);
|
||||||
}
|
}
|
||||||
|
|
||||||
ingressData.setAccountName(allowedAccount.getAccountName());
|
securityGroupData.setAccountName(allowedAccount.getAccountName());
|
||||||
} else {
|
} else {
|
||||||
ingressData.setCidr(ingressRule.getAllowedSourceIpCidr());
|
securityGroupData.setCidr(securityRule.getAllowedSourceIpCidr());
|
||||||
}
|
}
|
||||||
|
if (securityRule.getRuleType() == SecurityRuleType.IngressRule) {
|
||||||
ingressData.setObjectName("ingressrule");
|
securityGroupData.setObjectName("ingressrule");
|
||||||
responses.add(ingressData);
|
ingressResponses.add(securityGroupData);
|
||||||
}
|
|
||||||
response.setIngressRules(responses);
|
|
||||||
response.setObjectName("securitygroup");
|
|
||||||
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SecurityGroupResponse createSecurityGroupResponseFromEgressRule(List<? extends EgressRule> egressRules) {
|
|
||||||
SecurityGroupResponse response = new SecurityGroupResponse();
|
|
||||||
Map<Long, Account> securiytGroupAccounts = new HashMap<Long, Account>();
|
|
||||||
Map<Long, SecurityGroup> allowedSecurityGroups = new HashMap<Long, SecurityGroup>();
|
|
||||||
Map<Long, Account> allowedSecuriytGroupAccounts = new HashMap<Long, Account>();
|
|
||||||
|
|
||||||
if ((egressRules != null) && !egressRules.isEmpty()) {
|
|
||||||
SecurityGroup securityGroup = ApiDBUtils.findSecurityGroupById(egressRules.get(0).getSecurityGroupId());
|
|
||||||
response.setId(securityGroup.getId());
|
|
||||||
response.setName(securityGroup.getName());
|
|
||||||
response.setDescription(securityGroup.getDescription());
|
|
||||||
|
|
||||||
Account account = securiytGroupAccounts.get(securityGroup.getAccountId());
|
|
||||||
|
|
||||||
if (account == null) {
|
|
||||||
account = ApiDBUtils.findAccountById(securityGroup.getAccountId());
|
|
||||||
securiytGroupAccounts.put(securityGroup.getAccountId(), account);
|
|
||||||
}
|
|
||||||
|
|
||||||
populateAccount(response, account.getId());
|
|
||||||
populateDomain(response, account.getDomainId());
|
|
||||||
|
|
||||||
|
|
||||||
List<EgressRuleResponse> responses = new ArrayList<EgressRuleResponse>();
|
|
||||||
for (EgressRule egressRule : egressRules) {
|
|
||||||
EgressRuleResponse egressData = new EgressRuleResponse();
|
|
||||||
|
|
||||||
egressData.setRuleId(egressRule.getId());
|
|
||||||
egressData.setProtocol(egressRule.getProtocol());
|
|
||||||
if ("icmp".equalsIgnoreCase(egressRule.getProtocol())) {
|
|
||||||
egressData.setIcmpType(egressRule.getStartPort());
|
|
||||||
egressData.setIcmpCode(egressRule.getEndPort());
|
|
||||||
} else {
|
} else {
|
||||||
egressData.setStartPort(egressRule.getStartPort());
|
securityGroupData.setObjectName("egressrule");
|
||||||
egressData.setEndPort(egressRule.getEndPort());
|
egressResponses.add(securityGroupData);
|
||||||
}
|
}
|
||||||
|
|
||||||
Long allowedSecurityGroupId = egressRule.getAllowedNetworkId();
|
|
||||||
if (allowedSecurityGroupId != null) {
|
|
||||||
SecurityGroup allowedSecurityGroup = allowedSecurityGroups.get(allowedSecurityGroupId);
|
|
||||||
if (allowedSecurityGroup == null) {
|
|
||||||
allowedSecurityGroup = ApiDBUtils.findSecurityGroupById(allowedSecurityGroupId);
|
|
||||||
allowedSecurityGroups.put(allowedSecurityGroupId, allowedSecurityGroup);
|
|
||||||
}
|
}
|
||||||
|
response.setSecurityGroupIngressRules(ingressResponses);
|
||||||
egressData.setSecurityGroupName(allowedSecurityGroup.getName());
|
response.setSecurityGroupEgressRules(egressResponses);
|
||||||
|
|
||||||
Account allowedAccount = allowedSecuriytGroupAccounts.get(allowedSecurityGroup.getAccountId());
|
|
||||||
if (allowedAccount == null) {
|
|
||||||
allowedAccount = ApiDBUtils.findAccountById(allowedSecurityGroup.getAccountId());
|
|
||||||
allowedSecuriytGroupAccounts.put(allowedAccount.getId(), allowedAccount);
|
|
||||||
}
|
|
||||||
|
|
||||||
egressData.setAccountName(allowedAccount.getAccountName());
|
|
||||||
} else {
|
|
||||||
egressData.setCidr(egressRule.getAllowedDestinationIpCidr());
|
|
||||||
}
|
|
||||||
|
|
||||||
egressData.setObjectName("egressrule");
|
|
||||||
responses.add(egressData);
|
|
||||||
}
|
|
||||||
response.setEgressRules(responses);
|
|
||||||
response.setObjectName("securitygroup");
|
response.setObjectName("securitygroup");
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -2855,3 +2808,4 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,112 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
|
||||||
*
|
|
||||||
* This software is licensed under the GNU General Public License v3 or later.
|
|
||||||
*
|
|
||||||
* It is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cloud.api.response;
|
|
||||||
|
|
||||||
import com.cloud.serializer.Param;
|
|
||||||
|
|
||||||
public class EgressRuleResultObject {
|
|
||||||
@Param(name="id")
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
@Param(name="startport")
|
|
||||||
private int startPort;
|
|
||||||
|
|
||||||
@Param(name="endport")
|
|
||||||
private int endPort;
|
|
||||||
|
|
||||||
@Param(name="protocol")
|
|
||||||
private String protocol;
|
|
||||||
|
|
||||||
@Param(name="securitygroup")
|
|
||||||
private String allowedSecurityGroup = null;
|
|
||||||
|
|
||||||
@Param(name="account")
|
|
||||||
private String allowedSecGroupAcct = null;
|
|
||||||
|
|
||||||
@Param(name="cidr")
|
|
||||||
private String allowedDestinationIpCidr = null;
|
|
||||||
|
|
||||||
public EgressRuleResultObject() { }
|
|
||||||
|
|
||||||
public EgressRuleResultObject(Long id, int startPort, int endPort, String protocol, String allowedSecurityGroup, String allowedSecGroupAcct, String allowedSourceIpCidr) {
|
|
||||||
this.id = id;
|
|
||||||
this.startPort = startPort;
|
|
||||||
this.endPort = endPort;
|
|
||||||
this.protocol = protocol;
|
|
||||||
this.allowedSecurityGroup = allowedSecurityGroup;
|
|
||||||
this.allowedSecGroupAcct = allowedSecGroupAcct;
|
|
||||||
this.allowedDestinationIpCidr = allowedSourceIpCidr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Long id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getStartPort() {
|
|
||||||
return startPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStartPort(int startPort) {
|
|
||||||
this.startPort = startPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getEndPort() {
|
|
||||||
return endPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setEndPort(int endPort) {
|
|
||||||
this.endPort = endPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getProtocol() {
|
|
||||||
return protocol;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProtocol(String protocol) {
|
|
||||||
this.protocol = protocol;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAllowedSecurityGroup() {
|
|
||||||
return allowedSecurityGroup;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAllowedSecurityGroup(String allowedSecurityGroup) {
|
|
||||||
this.allowedSecurityGroup = allowedSecurityGroup;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAllowedSecGroupAcct() {
|
|
||||||
return allowedSecGroupAcct;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAllowedSecGroupAcct(String allowedSecGroupAcct) {
|
|
||||||
this.allowedSecGroupAcct = allowedSecGroupAcct;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAllowedDestinationIpCidr() {
|
|
||||||
return allowedDestinationIpCidr;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAllowedDestinationIpCidr(String allowedDestinationIpCidr) {
|
|
||||||
this.allowedDestinationIpCidr = allowedDestinationIpCidr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -49,20 +49,20 @@ public class SecurityGroupResultObject implements ControlledEntity{
|
|||||||
@Param(name = "accountname")
|
@Param(name = "accountname")
|
||||||
private String accountName = null;
|
private String accountName = null;
|
||||||
|
|
||||||
@Param(name = "ingressrules")
|
@Param(name = "securitygrouprules")
|
||||||
private List<IngressRuleResultObject> ingressRules = null;
|
private List<SecurityGroupRuleResultObject> securityGroupRules = null;
|
||||||
|
|
||||||
public SecurityGroupResultObject() {
|
public SecurityGroupResultObject() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public SecurityGroupResultObject(Long id, String name, String description, long domainId, long accountId, String accountName, List<IngressRuleResultObject> ingressRules) {
|
public SecurityGroupResultObject(Long id, String name, String description, long domainId, long accountId, String accountName, List<SecurityGroupRuleResultObject> ingressRules) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.description = description;
|
this.description = description;
|
||||||
this.domainId = domainId;
|
this.domainId = domainId;
|
||||||
this.accountId = accountId;
|
this.accountId = accountId;
|
||||||
this.accountName = accountName;
|
this.accountName = accountName;
|
||||||
this.ingressRules = ingressRules;
|
this.securityGroupRules = ingressRules;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Long getId() {
|
public Long getId() {
|
||||||
@ -113,21 +113,22 @@ public class SecurityGroupResultObject implements ControlledEntity{
|
|||||||
this.accountName = accountName;
|
this.accountName = accountName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<IngressRuleResultObject> getIngressRules() {
|
public List<SecurityGroupRuleResultObject> getSecurityGroupRules() {
|
||||||
return ingressRules;
|
return securityGroupRules;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setIngressRules(List<IngressRuleResultObject> ingressRules) {
|
public void setSecurityGroupRules(List<SecurityGroupRuleResultObject> securityGroupRules) {
|
||||||
this.ingressRules = ingressRules;
|
this.securityGroupRules = securityGroupRules;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<SecurityGroupResultObject> transposeNetworkGroups(List<? extends SecurityGroupRules> groups) {
|
public static List<SecurityGroupResultObject> transposeNetworkGroups(
|
||||||
|
List<? extends SecurityGroupRules> groups) {
|
||||||
List<SecurityGroupResultObject> resultObjects = new ArrayList<SecurityGroupResultObject>();
|
List<SecurityGroupResultObject> resultObjects = new ArrayList<SecurityGroupResultObject>();
|
||||||
Map<Long, SecurityGroup> allowedSecurityGroups = new HashMap<Long, SecurityGroup>();
|
Map<Long, SecurityGroup> allowedSecurityGroups = new HashMap<Long, SecurityGroup>();
|
||||||
Map<Long, Account> accounts = new HashMap<Long, Account>();
|
Map<Long, Account> accounts = new HashMap<Long, Account>();
|
||||||
|
|
||||||
if ((groups != null) && !groups.isEmpty()) {
|
if ((groups != null) && !groups.isEmpty()) {
|
||||||
List<IngressRuleResultObject> ingressDataList = new ArrayList<IngressRuleResultObject>();
|
List<SecurityGroupRuleResultObject> securityGroupRuleDataList = new ArrayList<SecurityGroupRuleResultObject>();
|
||||||
SecurityGroupResultObject currentGroup = null;
|
SecurityGroupResultObject currentGroup = null;
|
||||||
|
|
||||||
List<Long> processedGroups = new ArrayList<Long>();
|
List<Long> processedGroups = new ArrayList<Long>();
|
||||||
@ -137,9 +138,10 @@ public class SecurityGroupResultObject implements ControlledEntity{
|
|||||||
processedGroups.add(groupId);
|
processedGroups.add(groupId);
|
||||||
|
|
||||||
if (currentGroup != null) {
|
if (currentGroup != null) {
|
||||||
if (!ingressDataList.isEmpty()) {
|
if (!securityGroupRuleDataList.isEmpty()) {
|
||||||
currentGroup.setIngressRules(ingressDataList);
|
currentGroup
|
||||||
ingressDataList = new ArrayList<IngressRuleResultObject>();
|
.setSecurityGroupRules(securityGroupRuleDataList);
|
||||||
|
securityGroupRuleDataList = new ArrayList<SecurityGroupRuleResultObject>();
|
||||||
}
|
}
|
||||||
resultObjects.add(currentGroup);
|
resultObjects.add(currentGroup);
|
||||||
}
|
}
|
||||||
@ -153,7 +155,8 @@ public class SecurityGroupResultObject implements ControlledEntity{
|
|||||||
|
|
||||||
Account account = accounts.get(netGroupRule.getAccountId());
|
Account account = accounts.get(netGroupRule.getAccountId());
|
||||||
if (account == null) {
|
if (account == null) {
|
||||||
account = ApiDBUtils.findAccountById(netGroupRule.getAccountId());
|
account = ApiDBUtils.findAccountById(netGroupRule
|
||||||
|
.getAccountId());
|
||||||
accounts.put(account.getId(), account);
|
accounts.put(account.getId(), account);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,41 +167,60 @@ public class SecurityGroupResultObject implements ControlledEntity{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (netGroupRule.getRuleId() != null) {
|
if (netGroupRule.getRuleId() != null) {
|
||||||
// there's at least one ingress rule for this network group, add the ingress rule data
|
// there's at least one securitygroup rule for this network
|
||||||
IngressRuleResultObject ingressData = new IngressRuleResultObject();
|
// group, add the securitygroup rule data
|
||||||
ingressData.setEndPort(netGroupRule.getEndPort());
|
SecurityGroupRuleResultObject securityGroupRuleData = new SecurityGroupRuleResultObject();
|
||||||
ingressData.setStartPort(netGroupRule.getStartPort());
|
securityGroupRuleData.setEndPort(netGroupRule.getEndPort());
|
||||||
ingressData.setId(netGroupRule.getRuleId());
|
securityGroupRuleData.setStartPort(netGroupRule
|
||||||
ingressData.setProtocol(netGroupRule.getProtocol());
|
.getStartPort());
|
||||||
|
securityGroupRuleData.setId(netGroupRule.getRuleId());
|
||||||
|
securityGroupRuleData.setProtocol(netGroupRule
|
||||||
|
.getProtocol());
|
||||||
|
securityGroupRuleData.setRuleType(netGroupRule
|
||||||
|
.getRuleType());
|
||||||
|
|
||||||
Long allowedSecurityGroupId = netGroupRule.getAllowedNetworkId();
|
Long allowedSecurityGroupId = netGroupRule
|
||||||
|
.getAllowedNetworkId();
|
||||||
if (allowedSecurityGroupId != null) {
|
if (allowedSecurityGroupId != null) {
|
||||||
SecurityGroup allowedSecurityGroup = allowedSecurityGroups.get(allowedSecurityGroupId);
|
SecurityGroup allowedSecurityGroup = allowedSecurityGroups
|
||||||
|
.get(allowedSecurityGroupId);
|
||||||
if (allowedSecurityGroup == null) {
|
if (allowedSecurityGroup == null) {
|
||||||
allowedSecurityGroup = ApiDBUtils.findSecurityGroupById(allowedSecurityGroupId);
|
allowedSecurityGroup = ApiDBUtils
|
||||||
allowedSecurityGroups.put(allowedSecurityGroupId, allowedSecurityGroup);
|
.findSecurityGroupById(allowedSecurityGroupId);
|
||||||
|
allowedSecurityGroups.put(allowedSecurityGroupId,
|
||||||
|
allowedSecurityGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
ingressData.setAllowedSecurityGroup(allowedSecurityGroup.getName());
|
securityGroupRuleData
|
||||||
|
.setAllowedSecurityGroup(allowedSecurityGroup
|
||||||
|
.getName());
|
||||||
|
|
||||||
Account allowedAccount = accounts.get(allowedSecurityGroup.getAccountId());
|
Account allowedAccount = accounts
|
||||||
|
.get(allowedSecurityGroup.getAccountId());
|
||||||
if (allowedAccount == null) {
|
if (allowedAccount == null) {
|
||||||
allowedAccount = ApiDBUtils.findAccountById(allowedSecurityGroup.getAccountId());
|
allowedAccount = ApiDBUtils
|
||||||
|
.findAccountById(allowedSecurityGroup
|
||||||
|
.getAccountId());
|
||||||
accounts.put(allowedAccount.getId(), allowedAccount);
|
accounts.put(allowedAccount.getId(), allowedAccount);
|
||||||
}
|
}
|
||||||
|
|
||||||
ingressData.setAllowedSecGroupAcct(allowedAccount.getAccountName());
|
securityGroupRuleData
|
||||||
|
.setAllowedSecGroupAcct(allowedAccount
|
||||||
|
.getAccountName());
|
||||||
} else if (netGroupRule.getAllowedSourceIpCidr() != null) {
|
} else if (netGroupRule.getAllowedSourceIpCidr() != null) {
|
||||||
ingressData.setAllowedSourceIpCidr(netGroupRule.getAllowedSourceIpCidr());
|
securityGroupRuleData
|
||||||
|
.setAllowedSourceIpCidr(netGroupRule
|
||||||
|
.getAllowedSourceIpCidr());
|
||||||
}
|
}
|
||||||
ingressDataList.add(ingressData);
|
securityGroupRuleDataList.add(securityGroupRuleData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// all rules have been processed, add the final data into the list
|
// all rules have been processed, add the final data into the list
|
||||||
if (currentGroup != null) {
|
if (currentGroup != null) {
|
||||||
if (!ingressDataList.isEmpty()) {
|
if (!securityGroupRuleDataList.isEmpty()) {
|
||||||
currentGroup.setIngressRules(ingressDataList);
|
currentGroup
|
||||||
|
.setSecurityGroupRules(securityGroupRuleDataList);
|
||||||
}
|
}
|
||||||
resultObjects.add(currentGroup);
|
resultObjects.add(currentGroup);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,9 +18,10 @@
|
|||||||
|
|
||||||
package com.cloud.api.response;
|
package com.cloud.api.response;
|
||||||
|
|
||||||
|
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
||||||
import com.cloud.serializer.Param;
|
import com.cloud.serializer.Param;
|
||||||
|
|
||||||
public class IngressRuleResultObject {
|
public class SecurityGroupRuleResultObject {
|
||||||
@Param(name="id")
|
@Param(name="id")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@ -42,9 +43,11 @@ public class IngressRuleResultObject {
|
|||||||
@Param(name="cidr")
|
@Param(name="cidr")
|
||||||
private String allowedSourceIpCidr = null;
|
private String allowedSourceIpCidr = null;
|
||||||
|
|
||||||
public IngressRuleResultObject() { }
|
private SecurityRuleType type;
|
||||||
|
|
||||||
public IngressRuleResultObject(Long id, int startPort, int endPort, String protocol, String allowedSecurityGroup, String allowedSecGroupAcct, String allowedSourceIpCidr) {
|
public SecurityGroupRuleResultObject() { }
|
||||||
|
|
||||||
|
public SecurityGroupRuleResultObject(Long id, int startPort, int endPort, String protocol, String allowedSecurityGroup, String allowedSecGroupAcct, String allowedSourceIpCidr) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.startPort = startPort;
|
this.startPort = startPort;
|
||||||
this.endPort = endPort;
|
this.endPort = endPort;
|
||||||
@ -66,6 +69,15 @@ public class IngressRuleResultObject {
|
|||||||
return startPort;
|
return startPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setRuleType(SecurityRuleType type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public SecurityRuleType getRuleType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
public void setStartPort(int startPort) {
|
public void setStartPort(int startPort) {
|
||||||
this.startPort = startPort;
|
this.startPort = startPort;
|
||||||
}
|
}
|
||||||
@ -113,7 +113,7 @@ import com.cloud.network.router.VirtualNetworkApplianceManagerImpl;
|
|||||||
import com.cloud.network.rules.RulesManagerImpl;
|
import com.cloud.network.rules.RulesManagerImpl;
|
||||||
import com.cloud.network.rules.dao.PortForwardingRulesDaoImpl;
|
import com.cloud.network.rules.dao.PortForwardingRulesDaoImpl;
|
||||||
import com.cloud.network.security.SecurityGroupManagerImpl2;
|
import com.cloud.network.security.SecurityGroupManagerImpl2;
|
||||||
import com.cloud.network.security.dao.IngressRuleDaoImpl;
|
import com.cloud.network.security.dao.SecurityGroupRuleDaoImpl;
|
||||||
import com.cloud.network.security.dao.SecurityGroupDaoImpl;
|
import com.cloud.network.security.dao.SecurityGroupDaoImpl;
|
||||||
import com.cloud.network.security.dao.SecurityGroupRulesDaoImpl;
|
import com.cloud.network.security.dao.SecurityGroupRulesDaoImpl;
|
||||||
import com.cloud.network.security.dao.SecurityGroupVMMapDaoImpl;
|
import com.cloud.network.security.dao.SecurityGroupVMMapDaoImpl;
|
||||||
@ -225,7 +225,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com
|
|||||||
addDao("LoadBalancerVMMapDao", LoadBalancerVMMapDaoImpl.class);
|
addDao("LoadBalancerVMMapDao", LoadBalancerVMMapDaoImpl.class);
|
||||||
addDao("DataCenterIpAddressDao", DataCenterIpAddressDaoImpl.class);
|
addDao("DataCenterIpAddressDao", DataCenterIpAddressDaoImpl.class);
|
||||||
addDao("SecurityGroupDao", SecurityGroupDaoImpl.class);
|
addDao("SecurityGroupDao", SecurityGroupDaoImpl.class);
|
||||||
addDao("IngressRuleDao", IngressRuleDaoImpl.class);
|
addDao("SecurityGroupRuleDao", SecurityGroupRuleDaoImpl.class);
|
||||||
addDao("SecurityGroupVMMapDao", SecurityGroupVMMapDaoImpl.class);
|
addDao("SecurityGroupVMMapDao", SecurityGroupVMMapDaoImpl.class);
|
||||||
addDao("SecurityGroupRulesDao", SecurityGroupRulesDaoImpl.class);
|
addDao("SecurityGroupRulesDao", SecurityGroupRulesDaoImpl.class);
|
||||||
addDao("SecurityGroupWorkDao", SecurityGroupWorkDaoImpl.class);
|
addDao("SecurityGroupWorkDao", SecurityGroupWorkDaoImpl.class);
|
||||||
|
|||||||
@ -33,10 +33,10 @@ import com.cloud.agent.api.Answer;
|
|||||||
import com.cloud.agent.api.CleanupNetworkRulesCmd;
|
import com.cloud.agent.api.CleanupNetworkRulesCmd;
|
||||||
import com.cloud.agent.api.Command;
|
import com.cloud.agent.api.Command;
|
||||||
import com.cloud.agent.api.PingRoutingWithNwGroupsCommand;
|
import com.cloud.agent.api.PingRoutingWithNwGroupsCommand;
|
||||||
import com.cloud.agent.api.SecurityIngressRuleAnswer;
|
import com.cloud.agent.api.SecurityGroupRuleAnswer;
|
||||||
import com.cloud.agent.api.StartupCommand;
|
import com.cloud.agent.api.StartupCommand;
|
||||||
import com.cloud.agent.api.StartupRoutingCommand;
|
import com.cloud.agent.api.StartupRoutingCommand;
|
||||||
import com.cloud.agent.api.SecurityIngressRuleAnswer.FailureReason;
|
import com.cloud.agent.api.SecurityGroupRuleAnswer.FailureReason;
|
||||||
import com.cloud.agent.manager.Commands;
|
import com.cloud.agent.manager.Commands;
|
||||||
import com.cloud.exception.AgentUnavailableException;
|
import com.cloud.exception.AgentUnavailableException;
|
||||||
import com.cloud.host.HostVO;
|
import com.cloud.host.HostVO;
|
||||||
@ -89,8 +89,8 @@ public class SecurityGroupListener implements Listener {
|
|||||||
List<Long> affectedVms = new ArrayList<Long>();
|
List<Long> affectedVms = new ArrayList<Long>();
|
||||||
int commandNum = 0;
|
int commandNum = 0;
|
||||||
for (Answer ans: answers) {
|
for (Answer ans: answers) {
|
||||||
if (ans instanceof SecurityIngressRuleAnswer) {
|
if (ans instanceof SecurityGroupRuleAnswer) {
|
||||||
SecurityIngressRuleAnswer ruleAnswer = (SecurityIngressRuleAnswer) ans;
|
SecurityGroupRuleAnswer ruleAnswer = (SecurityGroupRuleAnswer) ans;
|
||||||
if (ans.getResult()) {
|
if (ans.getResult()) {
|
||||||
s_logger.debug("Successfully programmed rule " + ruleAnswer.toString() + " into host " + agentId);
|
s_logger.debug("Successfully programmed rule " + ruleAnswer.toString() + " into host " + agentId);
|
||||||
_workDao.updateStep(ruleAnswer.getVmId(), ruleAnswer.getLogSequenceNumber(), Step.Done);
|
_workDao.updateStep(ruleAnswer.getVmId(), ruleAnswer.getLogSequenceNumber(), Step.Done);
|
||||||
|
|||||||
@ -42,14 +42,16 @@ import org.apache.log4j.Logger;
|
|||||||
|
|
||||||
import com.cloud.agent.AgentManager;
|
import com.cloud.agent.AgentManager;
|
||||||
import com.cloud.agent.api.NetworkRulesSystemVmCommand;
|
import com.cloud.agent.api.NetworkRulesSystemVmCommand;
|
||||||
import com.cloud.agent.api.SecurityIngressRulesCmd;
|
import com.cloud.agent.api.SecurityGroupRulesCmd;
|
||||||
import com.cloud.agent.api.SecurityIngressRulesCmd.IpPortAndProto;
|
import com.cloud.agent.api.SecurityGroupRulesCmd.IpPortAndProto;
|
||||||
import com.cloud.agent.manager.Commands;
|
import com.cloud.agent.manager.Commands;
|
||||||
import com.cloud.api.commands.AuthorizeSecurityGroupIngressCmd;
|
import com.cloud.api.commands.AuthorizeSecurityGroupIngressCmd;
|
||||||
|
import com.cloud.api.commands.AuthorizeSecurityGroupEgressCmd;
|
||||||
import com.cloud.api.commands.CreateSecurityGroupCmd;
|
import com.cloud.api.commands.CreateSecurityGroupCmd;
|
||||||
import com.cloud.api.commands.DeleteSecurityGroupCmd;
|
import com.cloud.api.commands.DeleteSecurityGroupCmd;
|
||||||
import com.cloud.api.commands.ListSecurityGroupsCmd;
|
import com.cloud.api.commands.ListSecurityGroupsCmd;
|
||||||
import com.cloud.api.commands.RevokeSecurityGroupIngressCmd;
|
import com.cloud.api.commands.RevokeSecurityGroupIngressCmd;
|
||||||
|
import com.cloud.api.commands.RevokeSecurityGroupEgressCmd;
|
||||||
import com.cloud.configuration.Config;
|
import com.cloud.configuration.Config;
|
||||||
import com.cloud.configuration.dao.ConfigurationDao;
|
import com.cloud.configuration.dao.ConfigurationDao;
|
||||||
import com.cloud.domain.Domain;
|
import com.cloud.domain.Domain;
|
||||||
@ -67,7 +69,7 @@ import com.cloud.network.Network;
|
|||||||
import com.cloud.network.Network.Service;
|
import com.cloud.network.Network.Service;
|
||||||
import com.cloud.network.NetworkManager;
|
import com.cloud.network.NetworkManager;
|
||||||
import com.cloud.network.security.SecurityGroupWork.Step;
|
import com.cloud.network.security.SecurityGroupWork.Step;
|
||||||
import com.cloud.network.security.dao.IngressRuleDao;
|
import com.cloud.network.security.dao.SecurityGroupRuleDao;
|
||||||
import com.cloud.network.security.dao.SecurityGroupDao;
|
import com.cloud.network.security.dao.SecurityGroupDao;
|
||||||
import com.cloud.network.security.dao.SecurityGroupRulesDao;
|
import com.cloud.network.security.dao.SecurityGroupRulesDao;
|
||||||
import com.cloud.network.security.dao.SecurityGroupVMMapDao;
|
import com.cloud.network.security.dao.SecurityGroupVMMapDao;
|
||||||
@ -109,6 +111,7 @@ import com.cloud.vm.VirtualMachine.State;
|
|||||||
import com.cloud.vm.VirtualMachineManager;
|
import com.cloud.vm.VirtualMachineManager;
|
||||||
import com.cloud.vm.dao.UserVmDao;
|
import com.cloud.vm.dao.UserVmDao;
|
||||||
import com.cloud.vm.dao.VMInstanceDao;
|
import com.cloud.vm.dao.VMInstanceDao;
|
||||||
|
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
||||||
|
|
||||||
import edu.emory.mathcs.backport.java.util.Collections;
|
import edu.emory.mathcs.backport.java.util.Collections;
|
||||||
|
|
||||||
@ -119,7 +122,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
@Inject
|
@Inject
|
||||||
SecurityGroupDao _securityGroupDao;
|
SecurityGroupDao _securityGroupDao;
|
||||||
@Inject
|
@Inject
|
||||||
IngressRuleDao _ingressRuleDao;
|
SecurityGroupRuleDao _securityGroupRuleDao;
|
||||||
@Inject
|
@Inject
|
||||||
SecurityGroupVMMapDao _securityGroupVMMapDao;
|
SecurityGroupVMMapDao _securityGroupVMMapDao;
|
||||||
@Inject
|
@Inject
|
||||||
@ -328,14 +331,14 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Map<PortAndProto, Set<String>> generateRulesForVM(Long userVmId) {
|
protected Map<PortAndProto, Set<String>> generateRulesForVM(Long userVmId, SecurityRuleType type) {
|
||||||
|
|
||||||
Map<PortAndProto, Set<String>> allowed = new TreeMap<PortAndProto, Set<String>>();
|
Map<PortAndProto, Set<String>> allowed = new TreeMap<PortAndProto, Set<String>>();
|
||||||
|
|
||||||
List<SecurityGroupVMMapVO> groupsForVm = _securityGroupVMMapDao.listByInstanceId(userVmId);
|
List<SecurityGroupVMMapVO> groupsForVm = _securityGroupVMMapDao.listByInstanceId(userVmId);
|
||||||
for (SecurityGroupVMMapVO mapVO : groupsForVm) {
|
for (SecurityGroupVMMapVO mapVO : groupsForVm) {
|
||||||
List<IngressRuleVO> rules = _ingressRuleDao.listBySecurityGroupId(mapVO.getSecurityGroupId());
|
List<SecurityGroupRuleVO> rules = _securityGroupRuleDao.listBySecurityGroupId(mapVO.getSecurityGroupId(), type);
|
||||||
for (IngressRuleVO rule : rules) {
|
for (SecurityGroupRuleVO rule : rules) {
|
||||||
PortAndProto portAndProto = new PortAndProto(rule.getProtocol(), rule.getStartPort(), rule.getEndPort());
|
PortAndProto portAndProto = new PortAndProto(rule.getProtocol(), rule.getStartPort(), rule.getEndPort());
|
||||||
Set<String> cidrs = allowed.get(portAndProto);
|
Set<String> cidrs = allowed.get(portAndProto);
|
||||||
if (cidrs == null) {
|
if (cidrs == null) {
|
||||||
@ -448,9 +451,9 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
List<SecurityGroupVMMapVO> groupsForVm = _securityGroupVMMapDao.listByInstanceId(vm.getId());
|
List<SecurityGroupVMMapVO> groupsForVm = _securityGroupVMMapDao.listByInstanceId(vm.getId());
|
||||||
// For each group, find the ingress rules that allow the group
|
// For each group, find the ingress rules that allow the group
|
||||||
for (SecurityGroupVMMapVO mapVO : groupsForVm) {// FIXME: use custom sql in the dao
|
for (SecurityGroupVMMapVO mapVO : groupsForVm) {// FIXME: use custom sql in the dao
|
||||||
List<IngressRuleVO> allowingRules = _ingressRuleDao.listByAllowedSecurityGroupId(mapVO.getSecurityGroupId());
|
List<SecurityGroupRuleVO> allowingRules = _securityGroupRuleDao.listByAllowedSecurityGroupId(mapVO.getSecurityGroupId());
|
||||||
// For each ingress rule that allows a group that the vm belongs to, find the group it belongs to
|
// For each ingress rule that allows a group that the vm belongs to, find the group it belongs to
|
||||||
affectedVms.addAll(getAffectedVmsForIngressRules(allowingRules));
|
affectedVms.addAll(getAffectedVmsForSecurityRules(allowingRules));
|
||||||
}
|
}
|
||||||
return affectedVms;
|
return affectedVms;
|
||||||
}
|
}
|
||||||
@ -460,18 +463,18 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
List<SecurityGroupVMMapVO> groupsForVm = _securityGroupVMMapDao.listByInstanceId(vm.getId());
|
List<SecurityGroupVMMapVO> groupsForVm = _securityGroupVMMapDao.listByInstanceId(vm.getId());
|
||||||
// For each group, find the ingress rules that allow the group
|
// For each group, find the ingress rules that allow the group
|
||||||
for (SecurityGroupVMMapVO mapVO : groupsForVm) {// FIXME: use custom sql in the dao
|
for (SecurityGroupVMMapVO mapVO : groupsForVm) {// FIXME: use custom sql in the dao
|
||||||
List<IngressRuleVO> allowingRules = _ingressRuleDao.listByAllowedSecurityGroupId(mapVO.getSecurityGroupId());
|
List<SecurityGroupRuleVO> allowingRules = _securityGroupRuleDao.listByAllowedSecurityGroupId(mapVO.getSecurityGroupId());
|
||||||
// For each ingress rule that allows a group that the vm belongs to, find the group it belongs to
|
// For each ingress rule that allows a group that the vm belongs to, find the group it belongs to
|
||||||
affectedVms.addAll(getAffectedVmsForIngressRules(allowingRules));
|
affectedVms.addAll(getAffectedVmsForSecurityRules(allowingRules));
|
||||||
}
|
}
|
||||||
return affectedVms;
|
return affectedVms;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<Long> getAffectedVmsForIngressRules(List<IngressRuleVO> allowingRules) {
|
protected List<Long> getAffectedVmsForSecurityRules(List<SecurityGroupRuleVO> allowingRules) {
|
||||||
Set<Long> distinctGroups = new HashSet<Long>();
|
Set<Long> distinctGroups = new HashSet<Long>();
|
||||||
List<Long> affectedVms = new ArrayList<Long>();
|
List<Long> affectedVms = new ArrayList<Long>();
|
||||||
|
|
||||||
for (IngressRuleVO allowingRule : allowingRules) {
|
for (SecurityGroupRuleVO allowingRule : allowingRules) {
|
||||||
distinctGroups.add(allowingRule.getSecurityGroupId());
|
distinctGroups.add(allowingRule.getSecurityGroupId());
|
||||||
}
|
}
|
||||||
for (Long groupId : distinctGroups) {
|
for (Long groupId : distinctGroups) {
|
||||||
@ -481,16 +484,16 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
return affectedVms;
|
return affectedVms;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected SecurityIngressRulesCmd generateRulesetCmd(String vmName, String guestIp, String guestMac, Long vmId, String signature, long seqnum, Map<PortAndProto, Set<String>> rules) {
|
protected SecurityGroupRulesCmd generateRulesetCmd(SecurityRuleType ruleType, String vmName, String guestIp, String guestMac, Long vmId, String signature, long seqnum, Map<PortAndProto, Set<String>> rules) {
|
||||||
List<IpPortAndProto> result = new ArrayList<IpPortAndProto>();
|
List<IpPortAndProto> result = new ArrayList<IpPortAndProto>();
|
||||||
for (PortAndProto pAp : rules.keySet()) {
|
for (PortAndProto pAp : rules.keySet()) {
|
||||||
Set<String> cidrs = rules.get(pAp);
|
Set<String> cidrs = rules.get(pAp);
|
||||||
if (cidrs.size() > 0) {
|
if (cidrs.size() > 0) {
|
||||||
IpPortAndProto ipPortAndProto = new SecurityIngressRulesCmd.IpPortAndProto(pAp.getProto(), pAp.getStartPort(), pAp.getEndPort(), cidrs.toArray(new String[cidrs.size()]));
|
IpPortAndProto ipPortAndProto = new SecurityGroupRulesCmd.IpPortAndProto(pAp.getProto(), pAp.getStartPort(), pAp.getEndPort(), cidrs.toArray(new String[cidrs.size()]));
|
||||||
result.add(ipPortAndProto);
|
result.add(ipPortAndProto);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new SecurityIngressRulesCmd(guestIp, guestMac, vmName, vmId, signature, seqnum, result.toArray(new IpPortAndProto[result.size()]));
|
return new SecurityGroupRulesCmd(ruleType,guestIp, guestMac, vmName, vmId, signature, seqnum, result.toArray(new IpPortAndProto[result.size()]));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void handleVmStopped(VMInstanceVO vm) {
|
protected void handleVmStopped(VMInstanceVO vm) {
|
||||||
@ -521,11 +524,11 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
scheduleRulesetUpdateToHosts(affectedVms, true, null);
|
scheduleRulesetUpdateToHosts(affectedVms, true, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@DB
|
@DB
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public List<IngressRuleVO> authorizeSecurityGroupIngress(AuthorizeSecurityGroupIngressCmd cmd) {
|
@ActionEvent(eventType = EventTypes.EVENT_SECURITY_GROUP_AUTHORIZE_EGRESS, eventDescription = "Adding Egress Rule ", async = true)
|
||||||
|
public List<SecurityGroupRuleVO> authorizeSecurityGroupEgress(AuthorizeSecurityGroupEgressCmd cmd) {
|
||||||
Long securityGroupId = cmd.getSecurityGroupId();
|
Long securityGroupId = cmd.getSecurityGroupId();
|
||||||
String protocol = cmd.getProtocol();
|
String protocol = cmd.getProtocol();
|
||||||
Integer startPort = cmd.getStartPort();
|
Integer startPort = cmd.getStartPort();
|
||||||
@ -534,6 +537,26 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
Integer icmpCode = cmd.getIcmpCode();
|
Integer icmpCode = cmd.getIcmpCode();
|
||||||
List<String> cidrList = cmd.getCidrList();
|
List<String> cidrList = cmd.getCidrList();
|
||||||
Map groupList = cmd.getUserSecurityGroupList();
|
Map groupList = cmd.getUserSecurityGroupList();
|
||||||
|
return authorizeSecurityGroupRule(securityGroupId,protocol,startPort,endPort,icmpType,icmpCode,cidrList,groupList,SecurityRuleType.EgressRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@DB
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
@ActionEvent(eventType = EventTypes.EVENT_SECURITY_GROUP_AUTHORIZE_INGRESS, eventDescription = "Adding Ingress Rule ", async = true)
|
||||||
|
public List<SecurityGroupRuleVO> authorizeSecurityGroupIngress(AuthorizeSecurityGroupIngressCmd cmd) {
|
||||||
|
Long securityGroupId = cmd.getSecurityGroupId();
|
||||||
|
String protocol = cmd.getProtocol();
|
||||||
|
Integer startPort = cmd.getStartPort();
|
||||||
|
Integer endPort = cmd.getEndPort();
|
||||||
|
Integer icmpType = cmd.getIcmpType();
|
||||||
|
Integer icmpCode = cmd.getIcmpCode();
|
||||||
|
List<String> cidrList = cmd.getCidrList();
|
||||||
|
Map groupList = cmd.getUserSecurityGroupList();
|
||||||
|
return authorizeSecurityGroupRule(securityGroupId,protocol,startPort,endPort,icmpType,icmpCode,cidrList,groupList,SecurityRuleType.IngressRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<SecurityGroupRuleVO> authorizeSecurityGroupRule(Long securityGroupId,String protocol,Integer startPort,Integer endPort,Integer icmpType,Integer icmpCode,List<String> cidrList,Map groupList,SecurityRuleType ruleType) {
|
||||||
Integer startPortOrType = null;
|
Integer startPortOrType = null;
|
||||||
Integer endPortOrCode = null;
|
Integer endPortOrCode = null;
|
||||||
|
|
||||||
@ -622,13 +645,13 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
|
|
||||||
Account authorizedAccount = _accountDao.findActiveAccount(authorizedAccountName, domainId);
|
Account authorizedAccount = _accountDao.findActiveAccount(authorizedAccountName, domainId);
|
||||||
if (authorizedAccount == null) {
|
if (authorizedAccount == null) {
|
||||||
throw new InvalidParameterValueException("Nonexistent account: " + authorizedAccountName + " when trying to authorize ingress for " + securityGroupId + ":" + protocol + ":"
|
throw new InvalidParameterValueException("Nonexistent account: " + authorizedAccountName + " when trying to authorize security group rule for " + securityGroupId + ":" + protocol + ":"
|
||||||
+ startPortOrType + ":" + endPortOrCode);
|
+ startPortOrType + ":" + endPortOrCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
SecurityGroupVO groupVO = _securityGroupDao.findByAccountAndName(authorizedAccount.getId(), group);
|
SecurityGroupVO groupVO = _securityGroupDao.findByAccountAndName(authorizedAccount.getId(), group);
|
||||||
if (groupVO == null) {
|
if (groupVO == null) {
|
||||||
throw new InvalidParameterValueException("Nonexistent group " + group + " for account " + authorizedAccountName + "/" + domainId + " is given, unable to authorize ingress.");
|
throw new InvalidParameterValueException("Nonexistent group " + group + " for account " + authorizedAccountName + "/" + domainId + " is given, unable to authorize security group rule.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check permissions
|
// Check permissions
|
||||||
@ -652,7 +675,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
s_logger.warn("Could not acquire lock on network security group: id= " + securityGroupId);
|
s_logger.warn("Could not acquire lock on network security group: id= " + securityGroupId);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
List<IngressRuleVO> newRules = new ArrayList<IngressRuleVO>();
|
List<SecurityGroupRuleVO> newRules = new ArrayList<SecurityGroupRuleVO>();
|
||||||
try {
|
try {
|
||||||
for (final SecurityGroupVO ngVO : authorizedGroups2) {
|
for (final SecurityGroupVO ngVO : authorizedGroups2) {
|
||||||
final Long ngId = ngVO.getId();
|
final Long ngId = ngVO.getId();
|
||||||
@ -665,23 +688,23 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
IngressRuleVO ingressRule = _ingressRuleDao.findByProtoPortsAndAllowedGroupId(securityGroup.getId(), protocol, startPortOrType, endPortOrCode, ngVO.getId());
|
SecurityGroupRuleVO securityGroupRule = _securityGroupRuleDao.findByProtoPortsAndAllowedGroupId(securityGroup.getId(), protocol, startPortOrType, endPortOrCode, ngVO.getId());
|
||||||
if (ingressRule != null) {
|
if ((securityGroupRule != null) && (securityGroupRule.getRuleType() == ruleType)) {
|
||||||
continue; // rule already exists.
|
continue; // rule already exists.
|
||||||
}
|
}
|
||||||
ingressRule = new IngressRuleVO(securityGroup.getId(), startPortOrType, endPortOrCode, protocol, ngVO.getId());
|
securityGroupRule = new SecurityGroupRuleVO(ruleType,securityGroup.getId(), startPortOrType, endPortOrCode, protocol, ngVO.getId());
|
||||||
ingressRule = _ingressRuleDao.persist(ingressRule);
|
securityGroupRule = _securityGroupRuleDao.persist(securityGroupRule);
|
||||||
newRules.add(ingressRule);
|
newRules.add(securityGroupRule);
|
||||||
}
|
}
|
||||||
if (cidrList != null) {
|
if (cidrList != null) {
|
||||||
for (String cidr : cidrList) {
|
for (String cidr : cidrList) {
|
||||||
IngressRuleVO ingressRule = _ingressRuleDao.findByProtoPortsAndCidr(securityGroup.getId(), protocol, startPortOrType, endPortOrCode, cidr);
|
SecurityGroupRuleVO securityGroupRule = _securityGroupRuleDao.findByProtoPortsAndCidr(securityGroup.getId(), protocol, startPortOrType, endPortOrCode, cidr);
|
||||||
if (ingressRule != null) {
|
if ((securityGroupRule != null) && (securityGroupRule.getRuleType() == ruleType)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ingressRule = new IngressRuleVO(securityGroup.getId(), startPortOrType, endPortOrCode, protocol, cidr);
|
securityGroupRule = new SecurityGroupRuleVO(ruleType,securityGroup.getId(), startPortOrType, endPortOrCode, protocol, cidr);
|
||||||
ingressRule = _ingressRuleDao.persist(ingressRule);
|
securityGroupRule = _securityGroupRuleDao.persist(securityGroupRule);
|
||||||
newRules.add(ingressRule);
|
newRules.add(securityGroupRule);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (s_logger.isDebugEnabled()) {
|
if (s_logger.isDebugEnabled()) {
|
||||||
@ -693,8 +716,8 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
scheduleRulesetUpdateToHosts(affectedVms, true, null);
|
scheduleRulesetUpdateToHosts(affectedVms, true, null);
|
||||||
return newRules;
|
return newRules;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
s_logger.warn("Exception caught when adding ingress rules ", e);
|
s_logger.warn("Exception caught when adding security group rules ", e);
|
||||||
throw new CloudRuntimeException("Exception caught when adding ingress rules", e);
|
throw new CloudRuntimeException("Exception caught when adding security group rules", e);
|
||||||
} finally {
|
} finally {
|
||||||
if (securityGroup != null) {
|
if (securityGroup != null) {
|
||||||
_securityGroupDao.releaseFromLockTable(securityGroup.getId());
|
_securityGroupDao.releaseFromLockTable(securityGroup.getId());
|
||||||
@ -704,15 +727,35 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@DB
|
@DB
|
||||||
|
@ActionEvent(eventType = EventTypes.EVENT_SECURITY_GROUP_REVOKE_EGRESS, eventDescription = "Revoking Egress Rule ", async = true)
|
||||||
|
public boolean revokeSecurityGroupEgress(RevokeSecurityGroupEgressCmd cmd) {
|
||||||
|
Long id = cmd.getId();
|
||||||
|
return revokeSecurityGroupRule(id, SecurityRuleType.EgressRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@DB
|
||||||
|
@ActionEvent(eventType = EventTypes.EVENT_SECURITY_GROUP_REVOKE_INGRESS, eventDescription = "Revoking Ingress Rule ", async = true)
|
||||||
public boolean revokeSecurityGroupIngress(RevokeSecurityGroupIngressCmd cmd) {
|
public boolean revokeSecurityGroupIngress(RevokeSecurityGroupIngressCmd cmd) {
|
||||||
|
|
||||||
|
Long id = cmd.getId();
|
||||||
|
return revokeSecurityGroupRule(id, SecurityRuleType.IngressRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean revokeSecurityGroupRule(Long id, SecurityRuleType type) {
|
||||||
// input validation
|
// input validation
|
||||||
Account caller = UserContext.current().getCaller();
|
Account caller = UserContext.current().getCaller();
|
||||||
Long id = cmd.getId();
|
|
||||||
|
|
||||||
IngressRuleVO rule = _ingressRuleDao.findById(id);
|
SecurityGroupRuleVO rule = _securityGroupRuleDao.findById(id);
|
||||||
if (rule == null) {
|
if (rule == null) {
|
||||||
s_logger.debug("Unable to find ingress rule with id " + id);
|
s_logger.debug("Unable to find security rule with id " + id);
|
||||||
throw new InvalidParameterValueException("Unable to find ingress rule with id " + id);
|
throw new InvalidParameterValueException("Unable to find security rule with id " + id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check type
|
||||||
|
if (type != rule.getRuleType()) {
|
||||||
|
s_logger.debug("Mismatch in rule type for security rule with id " + id );
|
||||||
|
throw new InvalidParameterValueException("Mismatch in rule type for security rule with id " + id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check permissions
|
// Check permissions
|
||||||
@ -731,8 +774,8 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_ingressRuleDao.remove(id);
|
_securityGroupRuleDao.remove(id);
|
||||||
s_logger.debug("revokeSecurityGroupIngress succeeded for ingress rule id: " + id);
|
s_logger.debug("revokeSecurityGroupIngress succeeded for security rule id: " + id);
|
||||||
|
|
||||||
final ArrayList<Long> affectedVms = new ArrayList<Long>();
|
final ArrayList<Long> affectedVms = new ArrayList<Long>();
|
||||||
affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(groupHandle.getId()));
|
affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(groupHandle.getId()));
|
||||||
@ -740,8 +783,8 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
s_logger.warn("Exception caught when deleting ingress rules ", e);
|
s_logger.warn("Exception caught when deleting security rules ", e);
|
||||||
throw new CloudRuntimeException("Exception caught when deleting ingress rules", e);
|
throw new CloudRuntimeException("Exception caught when deleting security rules", e);
|
||||||
} finally {
|
} finally {
|
||||||
if (groupHandle != null) {
|
if (groupHandle != null) {
|
||||||
_securityGroupDao.releaseFromLockTable(groupHandle.getId());
|
_securityGroupDao.releaseFromLockTable(groupHandle.getId());
|
||||||
@ -885,16 +928,26 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
seqnum = log.getLogsequence();
|
seqnum = log.getLogsequence();
|
||||||
|
|
||||||
if (vm != null && vm.getState() == State.Running) {
|
if (vm != null && vm.getState() == State.Running) {
|
||||||
Map<PortAndProto, Set<String>> rules = generateRulesForVM(userVmId);
|
Map<PortAndProto, Set<String>> rules = generateRulesForVM(userVmId, SecurityRuleType.IngressRule);
|
||||||
agentId = vm.getHostId();
|
agentId = vm.getHostId();
|
||||||
if (agentId != null) {
|
if (agentId != null) {
|
||||||
SecurityIngressRulesCmd cmd = generateRulesetCmd(vm.getInstanceName(), vm.getPrivateIpAddress(), vm.getPrivateMacAddress(), vm.getId(), generateRulesetSignature(rules), seqnum,
|
SecurityGroupRulesCmd cmd = generateRulesetCmd(SecurityRuleType.IngressRule, vm.getInstanceName(), vm.getPrivateIpAddress(), vm.getPrivateMacAddress(), vm.getId(), generateRulesetSignature(rules), seqnum,
|
||||||
rules);
|
rules);
|
||||||
Commands cmds = new Commands(cmd);
|
Commands cmds = new Commands(cmd);
|
||||||
try {
|
try {
|
||||||
_agentMgr.send(agentId, cmds, _answerListener);
|
_agentMgr.send(agentId, cmds, _answerListener);
|
||||||
} catch (AgentUnavailableException e) {
|
} catch (AgentUnavailableException e) {
|
||||||
s_logger.debug("Unable to send updates for vm: " + userVmId + "(agentid=" + agentId + ")");
|
s_logger.debug("Unable to send ingress rules updates for vm: " + userVmId + "(agentid=" + agentId + ")");
|
||||||
|
_workDao.updateStep(work.getInstanceId(), seqnum, Step.Done);
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd = generateRulesetCmd(SecurityRuleType.EgressRule, vm.getInstanceName(), vm.getPrivateIpAddress(), vm.getPrivateMacAddress(), vm.getId(), generateRulesetSignature(rules), seqnum,
|
||||||
|
rules);
|
||||||
|
cmds = new Commands(cmd);
|
||||||
|
try {
|
||||||
|
_agentMgr.send(agentId, cmds, _answerListener);
|
||||||
|
} catch (AgentUnavailableException e) {
|
||||||
|
s_logger.debug("Unable to send egress rules updates for vm: " + userVmId + "(agentid=" + agentId + ")");
|
||||||
_workDao.updateStep(work.getInstanceId(), seqnum, Step.Done);
|
_workDao.updateStep(work.getInstanceId(), seqnum, Step.Done);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1002,7 +1055,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
|
|||||||
throw new InvalidParameterValueException("The network group default is reserved");
|
throw new InvalidParameterValueException("The network group default is reserved");
|
||||||
}
|
}
|
||||||
|
|
||||||
List<IngressRuleVO> allowingRules = _ingressRuleDao.listByAllowedSecurityGroupId(groupId);
|
List<SecurityGroupRuleVO> allowingRules = _securityGroupRuleDao.listByAllowedSecurityGroupId(groupId);
|
||||||
List<SecurityGroupVMMapVO> securityGroupVmMap = _securityGroupVMMapDao.listBySecurityGroup(groupId);
|
List<SecurityGroupVMMapVO> securityGroupVmMap = _securityGroupVMMapDao.listBySecurityGroup(groupId);
|
||||||
if (!allowingRules.isEmpty()) {
|
if (!allowingRules.isEmpty()) {
|
||||||
throw new ResourceInUseException("Cannot delete group when there are ingress rules that allow this group");
|
throw new ResourceInUseException("Cannot delete group when there are ingress rules that allow this group");
|
||||||
|
|||||||
@ -28,7 +28,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
import javax.ejb.Local;
|
import javax.ejb.Local;
|
||||||
import javax.naming.ConfigurationException;
|
import javax.naming.ConfigurationException;
|
||||||
|
|
||||||
import com.cloud.agent.api.SecurityIngressRulesCmd;
|
import com.cloud.agent.api.SecurityGroupRulesCmd;
|
||||||
import com.cloud.agent.manager.Commands;
|
import com.cloud.agent.manager.Commands;
|
||||||
import com.cloud.configuration.Config;
|
import com.cloud.configuration.Config;
|
||||||
import com.cloud.exception.AgentUnavailableException;
|
import com.cloud.exception.AgentUnavailableException;
|
||||||
@ -39,7 +39,7 @@ import com.cloud.utils.Profiler;
|
|||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.mgmt.JmxUtil;
|
import com.cloud.utils.mgmt.JmxUtil;
|
||||||
import com.cloud.vm.VirtualMachine.State;
|
import com.cloud.vm.VirtualMachine.State;
|
||||||
|
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Same as the base class -- except it uses the abstracted security group work queue
|
* Same as the base class -- except it uses the abstracted security group work queue
|
||||||
@ -143,7 +143,8 @@ public class SecurityGroupManagerImpl2 extends SecurityGroupManagerImpl{
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
work.setLogsequenceNumber(rulesetLog.getLogsequence());
|
work.setLogsequenceNumber(rulesetLog.getLogsequence());
|
||||||
sendRulesetUpdates(work);
|
sendRulesetUpdates(work, SecurityRuleType.IngressRule);
|
||||||
|
sendRulesetUpdates(work, SecurityRuleType.EgressRule);
|
||||||
_mBean.logUpdateDetails(work.getInstanceId(), work.getLogsequenceNumber());
|
_mBean.logUpdateDetails(work.getInstanceId(), work.getLogsequenceNumber());
|
||||||
}catch (Exception e) {
|
}catch (Exception e) {
|
||||||
s_logger.error("Problem during SG work " + work, e);
|
s_logger.error("Problem during SG work " + work, e);
|
||||||
@ -155,7 +156,7 @@ public class SecurityGroupManagerImpl2 extends SecurityGroupManagerImpl{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendRulesetUpdates(SecurityGroupWork work){
|
public void sendRulesetUpdates(SecurityGroupWork work, SecurityRuleType ruleType){
|
||||||
Long userVmId = work.getInstanceId();
|
Long userVmId = work.getInstanceId();
|
||||||
UserVm vm = _userVMDao.findById(userVmId);
|
UserVm vm = _userVMDao.findById(userVmId);
|
||||||
|
|
||||||
@ -170,8 +171,8 @@ public class SecurityGroupManagerImpl2 extends SecurityGroupManagerImpl{
|
|||||||
+ ": too many messages outstanding on host " + agentId);
|
+ ": too many messages outstanding on host " + agentId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Map<PortAndProto, Set<String>> rules = generateRulesForVM(userVmId);
|
Map<PortAndProto, Set<String>> rules = generateRulesForVM(userVmId, ruleType);
|
||||||
SecurityIngressRulesCmd cmd = generateRulesetCmd(vm.getInstanceName(), vm.getPrivateIpAddress(),
|
SecurityGroupRulesCmd cmd = generateRulesetCmd(ruleType, vm.getInstanceName(), vm.getPrivateIpAddress(),
|
||||||
vm.getPrivateMacAddress(), vm.getId(), null,
|
vm.getPrivateMacAddress(), vm.getId(), null,
|
||||||
work.getLogsequenceNumber(), rules);
|
work.getLogsequenceNumber(), rules);
|
||||||
cmd.setMsId(_serverId);
|
cmd.setMsId(_serverId);
|
||||||
@ -212,14 +213,14 @@ public class SecurityGroupManagerImpl2 extends SecurityGroupManagerImpl{
|
|||||||
* then we get all ips, including the default nic ip. This is also probably the correct behavior.
|
* then we get all ips, including the default nic ip. This is also probably the correct behavior.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected Map<PortAndProto, Set<String>> generateRulesForVM(Long userVmId) {
|
protected Map<PortAndProto, Set<String>> generateRulesForVM(Long userVmId, SecurityRuleType type) {
|
||||||
|
|
||||||
Map<PortAndProto, Set<String>> allowed = new TreeMap<PortAndProto, Set<String>>();
|
Map<PortAndProto, Set<String>> allowed = new TreeMap<PortAndProto, Set<String>>();
|
||||||
|
|
||||||
List<SecurityGroupVMMapVO> groupsForVm = _securityGroupVMMapDao.listByInstanceId(userVmId);
|
List<SecurityGroupVMMapVO> groupsForVm = _securityGroupVMMapDao.listByInstanceId(userVmId);
|
||||||
for (SecurityGroupVMMapVO mapVO : groupsForVm) {
|
for (SecurityGroupVMMapVO mapVO : groupsForVm) {
|
||||||
List<IngressRuleVO> rules = _ingressRuleDao.listBySecurityGroupId(mapVO.getSecurityGroupId());
|
List<SecurityGroupRuleVO> rules = _securityGroupRuleDao.listBySecurityGroupId(mapVO.getSecurityGroupId(), type);
|
||||||
for (IngressRuleVO rule : rules) {
|
for (SecurityGroupRuleVO rule : rules) {
|
||||||
PortAndProto portAndProto = new PortAndProto(rule.getProtocol(), rule.getStartPort(), rule.getEndPort());
|
PortAndProto portAndProto = new PortAndProto(rule.getProtocol(), rule.getStartPort(), rule.getEndPort());
|
||||||
Set<String> cidrs = allowed.get(portAndProto);
|
Set<String> cidrs = allowed.get(portAndProto);
|
||||||
if (cidrs == null) {
|
if (cidrs == null) {
|
||||||
|
|||||||
@ -14,6 +14,7 @@ import com.cloud.network.security.LocalSecurityGroupWorkQueue.LocalSecurityGroup
|
|||||||
import com.cloud.network.security.SecurityGroupWork.Step;
|
import com.cloud.network.security.SecurityGroupWork.Step;
|
||||||
import com.cloud.vm.VMInstanceVO;
|
import com.cloud.vm.VMInstanceVO;
|
||||||
import com.cloud.vm.VirtualMachine.Type;
|
import com.cloud.vm.VirtualMachine.Type;
|
||||||
|
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
||||||
|
|
||||||
public class SecurityManagerMBeanImpl extends StandardMBean implements SecurityGroupManagerMBean, RuleUpdateLog {
|
public class SecurityManagerMBeanImpl extends StandardMBean implements SecurityGroupManagerMBean, RuleUpdateLog {
|
||||||
SecurityGroupManagerImpl2 _sgMgr;
|
SecurityGroupManagerImpl2 _sgMgr;
|
||||||
@ -118,7 +119,8 @@ public class SecurityManagerMBeanImpl extends StandardMBean implements SecurityG
|
|||||||
@Override
|
@Override
|
||||||
public void tryRulesetUpdateForVmBypassSchedulerVeryDangerous(Long vmId, Long seqno) {
|
public void tryRulesetUpdateForVmBypassSchedulerVeryDangerous(Long vmId, Long seqno) {
|
||||||
LocalSecurityGroupWork work = new LocalSecurityGroupWorkQueue.LocalSecurityGroupWork(vmId, seqno, Step.Scheduled);
|
LocalSecurityGroupWork work = new LocalSecurityGroupWorkQueue.LocalSecurityGroupWork(vmId, seqno, Step.Scheduled);
|
||||||
_sgMgr.sendRulesetUpdates(work);
|
_sgMgr.sendRulesetUpdates(work, SecurityRuleType.IngressRule);
|
||||||
|
_sgMgr.sendRulesetUpdates(work, SecurityRuleType.EgressRule);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -1,36 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
|
||||||
*
|
|
||||||
* This software is licensed under the GNU General Public License v3 or later.
|
|
||||||
*
|
|
||||||
* It is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cloud.network.security.dao;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.cloud.network.security.EgressRuleVO;
|
|
||||||
import com.cloud.utils.db.GenericDao;
|
|
||||||
|
|
||||||
public interface EgressRuleDao extends GenericDao<EgressRuleVO, Long> {
|
|
||||||
List<EgressRuleVO> listBySecurityGroupId(long networkGroupId);
|
|
||||||
List<EgressRuleVO> listByAllowedSecurityGroupId(long networkGroupId);
|
|
||||||
EgressRuleVO findByProtoPortsAndCidr(long networkGroupId, String proto, int startPort, int endPort, String cidr);
|
|
||||||
EgressRuleVO findByProtoPortsAndGroup(String proto, int startPort, int endPort, String networkGroup);
|
|
||||||
EgressRuleVO findByProtoPortsAndAllowedGroupId(long networkGroupId, String proto, int startPort, int endPort, Long allowedGroupId);
|
|
||||||
int deleteBySecurityGroup(long securityGroupId);
|
|
||||||
int deleteByPortProtoAndGroup(long securityGroupId, String protocol, int startPort,int endPort, Long id);
|
|
||||||
int deleteByPortProtoAndCidr(long securityGroupId, String protocol, int startPort,int endPort, String cidr);
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,167 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
|
||||||
*
|
|
||||||
* This software is licensed under the GNU General Public License v3 or later.
|
|
||||||
*
|
|
||||||
* It is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cloud.network.security.dao;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import javax.ejb.Local;
|
|
||||||
import javax.naming.ConfigurationException;
|
|
||||||
|
|
||||||
import com.cloud.network.security.EgressRuleVO;
|
|
||||||
import com.cloud.network.security.SecurityGroupVO;
|
|
||||||
import com.cloud.utils.component.Inject;
|
|
||||||
import com.cloud.utils.db.GenericDaoBase;
|
|
||||||
import com.cloud.utils.db.JoinBuilder;
|
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
|
||||||
|
|
||||||
@Local(value={EgressRuleDao.class})
|
|
||||||
public class EgressRuleDaoImpl extends GenericDaoBase<EgressRuleVO, Long> implements EgressRuleDao {
|
|
||||||
|
|
||||||
@Inject SecurityGroupDao _securityGroupDao;
|
|
||||||
|
|
||||||
protected SearchBuilder<EgressRuleVO> securityGroupIdSearch;
|
|
||||||
protected SearchBuilder<EgressRuleVO> allowedSecurityGroupIdSearch;
|
|
||||||
protected SearchBuilder<EgressRuleVO> protoPortsAndCidrSearch;
|
|
||||||
protected SearchBuilder<EgressRuleVO> protoPortsAndSecurityGroupNameSearch;
|
|
||||||
protected SearchBuilder<EgressRuleVO> protoPortsAndSecurityGroupIdSearch;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected EgressRuleDaoImpl() {
|
|
||||||
securityGroupIdSearch = createSearchBuilder();
|
|
||||||
securityGroupIdSearch.and("securityGroupId", securityGroupIdSearch.entity().getSecurityGroupId(), SearchCriteria.Op.EQ);
|
|
||||||
securityGroupIdSearch.done();
|
|
||||||
|
|
||||||
allowedSecurityGroupIdSearch = createSearchBuilder();
|
|
||||||
allowedSecurityGroupIdSearch.and("allowedNetworkId", allowedSecurityGroupIdSearch.entity().getAllowedNetworkId(), SearchCriteria.Op.EQ);
|
|
||||||
allowedSecurityGroupIdSearch.done();
|
|
||||||
|
|
||||||
protoPortsAndCidrSearch = createSearchBuilder();
|
|
||||||
protoPortsAndCidrSearch.and("securityGroupId", protoPortsAndCidrSearch.entity().getSecurityGroupId(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndCidrSearch.and("proto", protoPortsAndCidrSearch.entity().getProtocol(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndCidrSearch.and("startPort", protoPortsAndCidrSearch.entity().getStartPort(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndCidrSearch.and("endPort", protoPortsAndCidrSearch.entity().getEndPort(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndCidrSearch.and("cidr", protoPortsAndCidrSearch.entity().getAllowedDestinationIpCidr(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndCidrSearch.done();
|
|
||||||
|
|
||||||
protoPortsAndSecurityGroupIdSearch = createSearchBuilder();
|
|
||||||
protoPortsAndSecurityGroupIdSearch.and("securityGroupId", protoPortsAndSecurityGroupIdSearch.entity().getSecurityGroupId(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndSecurityGroupIdSearch.and("proto", protoPortsAndSecurityGroupIdSearch.entity().getProtocol(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndSecurityGroupIdSearch.and("startPort", protoPortsAndSecurityGroupIdSearch.entity().getStartPort(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndSecurityGroupIdSearch.and("endPort", protoPortsAndSecurityGroupIdSearch.entity().getEndPort(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndSecurityGroupIdSearch.and("allowedNetworkId", protoPortsAndSecurityGroupIdSearch.entity().getAllowedNetworkId(), SearchCriteria.Op.EQ);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<EgressRuleVO> listBySecurityGroupId(long securityGroupId) {
|
|
||||||
SearchCriteria<EgressRuleVO> sc = securityGroupIdSearch.create();
|
|
||||||
sc.setParameters("securityGroupId", securityGroupId);
|
|
||||||
return listBy(sc);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int deleteBySecurityGroup(long securityGroupId) {
|
|
||||||
SearchCriteria<EgressRuleVO> sc = securityGroupIdSearch.create();
|
|
||||||
sc.setParameters("securityGroupId", securityGroupId);
|
|
||||||
return expunge(sc);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<EgressRuleVO> listByAllowedSecurityGroupId(long securityGroupId) {
|
|
||||||
SearchCriteria<EgressRuleVO> sc = allowedSecurityGroupIdSearch.create();
|
|
||||||
sc.setParameters("allowedNetworkId", securityGroupId);
|
|
||||||
return listBy(sc);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EgressRuleVO findByProtoPortsAndCidr(long securityGroupId, String proto, int startPort,
|
|
||||||
int endPort, String cidr) {
|
|
||||||
SearchCriteria<EgressRuleVO> sc = protoPortsAndCidrSearch.create();
|
|
||||||
sc.setParameters("securityGroupId", securityGroupId);
|
|
||||||
sc.setParameters("proto", proto);
|
|
||||||
sc.setParameters("startPort", startPort);
|
|
||||||
sc.setParameters("endPort", endPort);
|
|
||||||
sc.setParameters("cidr", cidr);
|
|
||||||
return findOneIncludingRemovedBy(sc);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EgressRuleVO findByProtoPortsAndGroup(String proto, int startPort,
|
|
||||||
int endPort, String securityGroup) {
|
|
||||||
SearchCriteria<EgressRuleVO> sc = protoPortsAndSecurityGroupNameSearch.create();
|
|
||||||
sc.setParameters("proto", proto);
|
|
||||||
sc.setParameters("startPort", startPort);
|
|
||||||
sc.setParameters("endPort", endPort);
|
|
||||||
sc.setJoinParameters("groupName", "groupName", securityGroup);
|
|
||||||
return findOneIncludingRemovedBy(sc);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean configure(String name, Map<String, Object> params)
|
|
||||||
throws ConfigurationException {
|
|
||||||
protoPortsAndSecurityGroupNameSearch = createSearchBuilder();
|
|
||||||
protoPortsAndSecurityGroupNameSearch.and("proto", protoPortsAndSecurityGroupNameSearch.entity().getProtocol(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndSecurityGroupNameSearch.and("startPort", protoPortsAndSecurityGroupNameSearch.entity().getStartPort(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndSecurityGroupNameSearch.and("endPort", protoPortsAndSecurityGroupNameSearch.entity().getEndPort(), SearchCriteria.Op.EQ);
|
|
||||||
SearchBuilder<SecurityGroupVO> ngSb = _securityGroupDao.createSearchBuilder();
|
|
||||||
ngSb.and("groupName", ngSb.entity().getName(), SearchCriteria.Op.EQ);
|
|
||||||
protoPortsAndSecurityGroupNameSearch.join("groupName", ngSb, protoPortsAndSecurityGroupNameSearch.entity().getAllowedNetworkId(), ngSb.entity().getId(), JoinBuilder.JoinType.INNER);
|
|
||||||
protoPortsAndSecurityGroupNameSearch.done();
|
|
||||||
return super.configure(name, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int deleteByPortProtoAndGroup(long securityGroupId, String protocol, int startPort, int endPort, Long allowedGroupId) {
|
|
||||||
SearchCriteria<EgressRuleVO> sc = protoPortsAndSecurityGroupIdSearch.create();
|
|
||||||
sc.setParameters("securityGroupId", securityGroupId);
|
|
||||||
sc.setParameters("proto", protocol);
|
|
||||||
sc.setParameters("startPort", startPort);
|
|
||||||
sc.setParameters("endPort", endPort);
|
|
||||||
sc.setParameters("allowedNetworkId", allowedGroupId);
|
|
||||||
|
|
||||||
return expunge(sc);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int deleteByPortProtoAndCidr(long securityGroupId, String protocol, int startPort, int endPort, String cidr) {
|
|
||||||
SearchCriteria<EgressRuleVO> sc = protoPortsAndCidrSearch.create();
|
|
||||||
sc.setParameters("securityGroupId", securityGroupId);
|
|
||||||
sc.setParameters("proto", protocol);
|
|
||||||
sc.setParameters("startPort", startPort);
|
|
||||||
sc.setParameters("endPort", endPort);
|
|
||||||
sc.setParameters("cidr", cidr);
|
|
||||||
|
|
||||||
return expunge(sc);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EgressRuleVO findByProtoPortsAndAllowedGroupId(long securityGroupId, String proto,
|
|
||||||
int startPort, int endPort, Long allowedGroupId) {
|
|
||||||
SearchCriteria<EgressRuleVO> sc = protoPortsAndSecurityGroupIdSearch.create();
|
|
||||||
sc.addAnd("securityGroupId", SearchCriteria.Op.EQ, securityGroupId);
|
|
||||||
sc.setParameters("proto", proto);
|
|
||||||
sc.setParameters("startPort", startPort);
|
|
||||||
sc.setParameters("endPort", endPort);
|
|
||||||
sc.setParameters("allowedNetworkId", allowedGroupId);
|
|
||||||
|
|
||||||
return findOneIncludingRemovedBy(sc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -20,15 +20,16 @@ package com.cloud.network.security.dao;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.cloud.network.security.IngressRuleVO;
|
import com.cloud.network.security.SecurityGroupRuleVO;
|
||||||
|
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
||||||
import com.cloud.utils.db.GenericDao;
|
import com.cloud.utils.db.GenericDao;
|
||||||
|
|
||||||
public interface IngressRuleDao extends GenericDao<IngressRuleVO, Long> {
|
public interface SecurityGroupRuleDao extends GenericDao<SecurityGroupRuleVO, Long> {
|
||||||
List<IngressRuleVO> listBySecurityGroupId(long networkGroupId);
|
List<SecurityGroupRuleVO> listBySecurityGroupId(long securityGroupId, SecurityRuleType type);
|
||||||
List<IngressRuleVO> listByAllowedSecurityGroupId(long networkGroupId);
|
List<SecurityGroupRuleVO> listByAllowedSecurityGroupId(long networkGroupId);
|
||||||
IngressRuleVO findByProtoPortsAndCidr(long networkGroupId, String proto, int startPort, int endPort, String cidr);
|
SecurityGroupRuleVO findByProtoPortsAndCidr(long networkGroupId, String proto, int startPort, int endPort, String cidr);
|
||||||
IngressRuleVO findByProtoPortsAndGroup(String proto, int startPort, int endPort, String networkGroup);
|
SecurityGroupRuleVO findByProtoPortsAndGroup(String proto, int startPort, int endPort, String networkGroup);
|
||||||
IngressRuleVO findByProtoPortsAndAllowedGroupId(long networkGroupId, String proto, int startPort, int endPort, Long allowedGroupId);
|
SecurityGroupRuleVO findByProtoPortsAndAllowedGroupId(long networkGroupId, String proto, int startPort, int endPort, Long allowedGroupId);
|
||||||
int deleteBySecurityGroup(long securityGroupId);
|
int deleteBySecurityGroup(long securityGroupId);
|
||||||
int deleteByPortProtoAndGroup(long securityGroupId, String protocol, int startPort,int endPort, Long id);
|
int deleteByPortProtoAndGroup(long securityGroupId, String protocol, int startPort,int endPort, Long id);
|
||||||
int deleteByPortProtoAndCidr(long securityGroupId, String protocol, int startPort,int endPort, String cidr);
|
int deleteByPortProtoAndCidr(long securityGroupId, String protocol, int startPort,int endPort, String cidr);
|
||||||
@ -24,32 +24,39 @@ import java.util.Map;
|
|||||||
import javax.ejb.Local;
|
import javax.ejb.Local;
|
||||||
import javax.naming.ConfigurationException;
|
import javax.naming.ConfigurationException;
|
||||||
|
|
||||||
import com.cloud.network.security.IngressRuleVO;
|
import com.cloud.network.security.SecurityGroupRuleVO;
|
||||||
import com.cloud.network.security.SecurityGroupVO;
|
import com.cloud.network.security.SecurityGroupVO;
|
||||||
|
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
||||||
import com.cloud.utils.component.Inject;
|
import com.cloud.utils.component.Inject;
|
||||||
import com.cloud.utils.db.GenericDaoBase;
|
import com.cloud.utils.db.GenericDaoBase;
|
||||||
import com.cloud.utils.db.JoinBuilder;
|
import com.cloud.utils.db.JoinBuilder;
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
import com.cloud.utils.db.SearchBuilder;
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
import com.cloud.utils.db.SearchCriteria;
|
||||||
|
|
||||||
@Local(value={IngressRuleDao.class})
|
@Local(value={SecurityGroupRuleDao.class})
|
||||||
public class IngressRuleDaoImpl extends GenericDaoBase<IngressRuleVO, Long> implements IngressRuleDao {
|
public class SecurityGroupRuleDaoImpl extends GenericDaoBase<SecurityGroupRuleVO, Long> implements SecurityGroupRuleDao {
|
||||||
|
|
||||||
@Inject SecurityGroupDao _securityGroupDao;
|
@Inject SecurityGroupDao _securityGroupDao;
|
||||||
|
|
||||||
protected SearchBuilder<IngressRuleVO> securityGroupIdSearch;
|
protected SearchBuilder<SecurityGroupRuleVO> securityGroupIdSearch;
|
||||||
protected SearchBuilder<IngressRuleVO> allowedSecurityGroupIdSearch;
|
protected SearchBuilder<SecurityGroupRuleVO> securityGroupIdAndTypeSearch;
|
||||||
protected SearchBuilder<IngressRuleVO> protoPortsAndCidrSearch;
|
protected SearchBuilder<SecurityGroupRuleVO> allowedSecurityGroupIdSearch;
|
||||||
protected SearchBuilder<IngressRuleVO> protoPortsAndSecurityGroupNameSearch;
|
protected SearchBuilder<SecurityGroupRuleVO> protoPortsAndCidrSearch;
|
||||||
protected SearchBuilder<IngressRuleVO> protoPortsAndSecurityGroupIdSearch;
|
protected SearchBuilder<SecurityGroupRuleVO> protoPortsAndSecurityGroupNameSearch;
|
||||||
|
protected SearchBuilder<SecurityGroupRuleVO> protoPortsAndSecurityGroupIdSearch;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected IngressRuleDaoImpl() {
|
protected SecurityGroupRuleDaoImpl() {
|
||||||
securityGroupIdSearch = createSearchBuilder();
|
securityGroupIdSearch = createSearchBuilder();
|
||||||
securityGroupIdSearch.and("securityGroupId", securityGroupIdSearch.entity().getSecurityGroupId(), SearchCriteria.Op.EQ);
|
securityGroupIdSearch.and("securityGroupId", securityGroupIdSearch.entity().getSecurityGroupId(), SearchCriteria.Op.EQ);
|
||||||
securityGroupIdSearch.done();
|
securityGroupIdSearch.done();
|
||||||
|
|
||||||
|
securityGroupIdAndTypeSearch = createSearchBuilder();
|
||||||
|
securityGroupIdAndTypeSearch.and("securityGroupId", securityGroupIdAndTypeSearch.entity().getSecurityGroupId(), SearchCriteria.Op.EQ);
|
||||||
|
securityGroupIdAndTypeSearch.and("type", securityGroupIdAndTypeSearch.entity().getType(), SearchCriteria.Op.EQ);
|
||||||
|
securityGroupIdAndTypeSearch.done();
|
||||||
|
|
||||||
allowedSecurityGroupIdSearch = createSearchBuilder();
|
allowedSecurityGroupIdSearch = createSearchBuilder();
|
||||||
allowedSecurityGroupIdSearch.and("allowedNetworkId", allowedSecurityGroupIdSearch.entity().getAllowedNetworkId(), SearchCriteria.Op.EQ);
|
allowedSecurityGroupIdSearch.and("allowedNetworkId", allowedSecurityGroupIdSearch.entity().getAllowedNetworkId(), SearchCriteria.Op.EQ);
|
||||||
allowedSecurityGroupIdSearch.done();
|
allowedSecurityGroupIdSearch.done();
|
||||||
@ -71,29 +78,37 @@ public class IngressRuleDaoImpl extends GenericDaoBase<IngressRuleVO, Long> impl
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<IngressRuleVO> listBySecurityGroupId(long securityGroupId) {
|
public List<SecurityGroupRuleVO> listBySecurityGroupId(long securityGroupId, SecurityRuleType type) {
|
||||||
SearchCriteria<IngressRuleVO> sc = securityGroupIdSearch.create();
|
SearchCriteria<SecurityGroupRuleVO> sc = securityGroupIdAndTypeSearch.create();
|
||||||
sc.setParameters("securityGroupId", securityGroupId);
|
sc.setParameters("securityGroupId", securityGroupId);
|
||||||
|
String dbType;
|
||||||
|
if (type == SecurityRuleType.EgressRule) {
|
||||||
|
dbType = SecurityRuleType.EgressRule.getType();
|
||||||
|
}else {
|
||||||
|
dbType = SecurityRuleType.IngressRule.getType();
|
||||||
|
}
|
||||||
|
|
||||||
|
sc.setParameters("type", dbType);
|
||||||
return listBy(sc);
|
return listBy(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int deleteBySecurityGroup(long securityGroupId) {
|
public int deleteBySecurityGroup(long securityGroupId) {
|
||||||
SearchCriteria<IngressRuleVO> sc = securityGroupIdSearch.create();
|
SearchCriteria<SecurityGroupRuleVO> sc = securityGroupIdSearch.create();
|
||||||
sc.setParameters("securityGroupId", securityGroupId);
|
sc.setParameters("securityGroupId", securityGroupId);
|
||||||
return expunge(sc);
|
return expunge(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<IngressRuleVO> listByAllowedSecurityGroupId(long securityGroupId) {
|
public List<SecurityGroupRuleVO> listByAllowedSecurityGroupId(long securityGroupId) {
|
||||||
SearchCriteria<IngressRuleVO> sc = allowedSecurityGroupIdSearch.create();
|
SearchCriteria<SecurityGroupRuleVO> sc = allowedSecurityGroupIdSearch.create();
|
||||||
sc.setParameters("allowedNetworkId", securityGroupId);
|
sc.setParameters("allowedNetworkId", securityGroupId);
|
||||||
return listBy(sc);
|
return listBy(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IngressRuleVO findByProtoPortsAndCidr(long securityGroupId, String proto, int startPort,
|
public SecurityGroupRuleVO findByProtoPortsAndCidr(long securityGroupId, String proto, int startPort,
|
||||||
int endPort, String cidr) {
|
int endPort, String cidr) {
|
||||||
SearchCriteria<IngressRuleVO> sc = protoPortsAndCidrSearch.create();
|
SearchCriteria<SecurityGroupRuleVO> sc = protoPortsAndCidrSearch.create();
|
||||||
sc.setParameters("securityGroupId", securityGroupId);
|
sc.setParameters("securityGroupId", securityGroupId);
|
||||||
sc.setParameters("proto", proto);
|
sc.setParameters("proto", proto);
|
||||||
sc.setParameters("startPort", startPort);
|
sc.setParameters("startPort", startPort);
|
||||||
@ -103,9 +118,9 @@ public class IngressRuleDaoImpl extends GenericDaoBase<IngressRuleVO, Long> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IngressRuleVO findByProtoPortsAndGroup(String proto, int startPort,
|
public SecurityGroupRuleVO findByProtoPortsAndGroup(String proto, int startPort,
|
||||||
int endPort, String securityGroup) {
|
int endPort, String securityGroup) {
|
||||||
SearchCriteria<IngressRuleVO> sc = protoPortsAndSecurityGroupNameSearch.create();
|
SearchCriteria<SecurityGroupRuleVO> sc = protoPortsAndSecurityGroupNameSearch.create();
|
||||||
sc.setParameters("proto", proto);
|
sc.setParameters("proto", proto);
|
||||||
sc.setParameters("startPort", startPort);
|
sc.setParameters("startPort", startPort);
|
||||||
sc.setParameters("endPort", endPort);
|
sc.setParameters("endPort", endPort);
|
||||||
@ -129,7 +144,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase<IngressRuleVO, Long> impl
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int deleteByPortProtoAndGroup(long securityGroupId, String protocol, int startPort, int endPort, Long allowedGroupId) {
|
public int deleteByPortProtoAndGroup(long securityGroupId, String protocol, int startPort, int endPort, Long allowedGroupId) {
|
||||||
SearchCriteria<IngressRuleVO> sc = protoPortsAndSecurityGroupIdSearch.create();
|
SearchCriteria<SecurityGroupRuleVO> sc = protoPortsAndSecurityGroupIdSearch.create();
|
||||||
sc.setParameters("securityGroupId", securityGroupId);
|
sc.setParameters("securityGroupId", securityGroupId);
|
||||||
sc.setParameters("proto", protocol);
|
sc.setParameters("proto", protocol);
|
||||||
sc.setParameters("startPort", startPort);
|
sc.setParameters("startPort", startPort);
|
||||||
@ -142,7 +157,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase<IngressRuleVO, Long> impl
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int deleteByPortProtoAndCidr(long securityGroupId, String protocol, int startPort, int endPort, String cidr) {
|
public int deleteByPortProtoAndCidr(long securityGroupId, String protocol, int startPort, int endPort, String cidr) {
|
||||||
SearchCriteria<IngressRuleVO> sc = protoPortsAndCidrSearch.create();
|
SearchCriteria<SecurityGroupRuleVO> sc = protoPortsAndCidrSearch.create();
|
||||||
sc.setParameters("securityGroupId", securityGroupId);
|
sc.setParameters("securityGroupId", securityGroupId);
|
||||||
sc.setParameters("proto", protocol);
|
sc.setParameters("proto", protocol);
|
||||||
sc.setParameters("startPort", startPort);
|
sc.setParameters("startPort", startPort);
|
||||||
@ -153,9 +168,9 @@ public class IngressRuleDaoImpl extends GenericDaoBase<IngressRuleVO, Long> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IngressRuleVO findByProtoPortsAndAllowedGroupId(long securityGroupId, String proto,
|
public SecurityGroupRuleVO findByProtoPortsAndAllowedGroupId(long securityGroupId, String proto,
|
||||||
int startPort, int endPort, Long allowedGroupId) {
|
int startPort, int endPort, Long allowedGroupId) {
|
||||||
SearchCriteria<IngressRuleVO> sc = protoPortsAndSecurityGroupIdSearch.create();
|
SearchCriteria<SecurityGroupRuleVO> sc = protoPortsAndSecurityGroupIdSearch.create();
|
||||||
sc.addAnd("securityGroupId", SearchCriteria.Op.EQ, securityGroupId);
|
sc.addAnd("securityGroupId", SearchCriteria.Op.EQ, securityGroupId);
|
||||||
sc.setParameters("proto", proto);
|
sc.setParameters("proto", proto);
|
||||||
sc.setParameters("startPort", startPort);
|
sc.setParameters("startPort", startPort);
|
||||||
@ -129,6 +129,7 @@ import com.cloud.user.User;
|
|||||||
import com.cloud.user.dao.AccountDao;
|
import com.cloud.user.dao.AccountDao;
|
||||||
import com.cloud.user.dao.UserDao;
|
import com.cloud.user.dao.UserDao;
|
||||||
import com.cloud.uservm.UserVm;
|
import com.cloud.uservm.UserVm;
|
||||||
|
import com.cloud.utils.DateUtil;
|
||||||
import com.cloud.utils.Journal;
|
import com.cloud.utils.Journal;
|
||||||
import com.cloud.utils.NumbersUtil;
|
import com.cloud.utils.NumbersUtil;
|
||||||
import com.cloud.utils.Pair;
|
import com.cloud.utils.Pair;
|
||||||
@ -1712,6 +1713,10 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene
|
|||||||
AgentVmInfo info = infos.remove(vm.getId());
|
AgentVmInfo info = infos.remove(vm.getId());
|
||||||
VMInstanceVO castedVm = null;
|
VMInstanceVO castedVm = null;
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
|
// the vm is not there on cluster, check the vm status in DB
|
||||||
|
if (vm.getState() == State.Starting && (DateUtil.currentGMTTime().getTime() - vm.getUpdateTime().getTime()) < 10*60*1000){
|
||||||
|
continue; // ignoring this VM as it is still settling
|
||||||
|
}
|
||||||
info = new AgentVmInfo(vm.getInstanceName(), getVmGuru(vm), vm, State.Stopped);
|
info = new AgentVmInfo(vm.getInstanceName(), getVmGuru(vm), vm, State.Stopped);
|
||||||
castedVm = info.guru.findById(vm.getId());
|
castedVm = info.guru.findById(vm.getId());
|
||||||
hId = vm.getHostId() == null ? vm.getLastHostId() : vm.getHostId();
|
hId = vm.getHostId() == null ? vm.getLastHostId() : vm.getHostId();
|
||||||
|
|||||||
@ -22,7 +22,7 @@ import java.util.HashSet;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.cloud.api.response.IngressRuleResponse;
|
import com.cloud.api.response.SecurityGroupRuleResponse;
|
||||||
|
|
||||||
public class UserVmData {
|
public class UserVmData {
|
||||||
private Long id;
|
private Long id;
|
||||||
@ -580,7 +580,7 @@ public class UserVmData {
|
|||||||
private String domainName;
|
private String domainName;
|
||||||
private Long jobId;
|
private Long jobId;
|
||||||
private Integer jobStatus;
|
private Integer jobStatus;
|
||||||
private List<IngressRuleResponse> ingressRules;
|
private List<SecurityGroupRuleResponse> securityGroupRules;
|
||||||
|
|
||||||
public String getObjectName() {
|
public String getObjectName() {
|
||||||
return objectName;
|
return objectName;
|
||||||
@ -637,15 +637,14 @@ public class UserVmData {
|
|||||||
public void setDomainName(String domainName) {
|
public void setDomainName(String domainName) {
|
||||||
this.domainName = domainName;
|
this.domainName = domainName;
|
||||||
}
|
}
|
||||||
|
/* FIXME : the below functions are not used, so commenting out later need to include egress list
|
||||||
public List<IngressRuleResponse> getIngressRules() {
|
public List<SecurityGroupRuleResponse> getIngressRules() {
|
||||||
return ingressRules;
|
return securityGroupRules;
|
||||||
}
|
|
||||||
|
|
||||||
public void setIngressRules(List<IngressRuleResponse> ingressRules) {
|
|
||||||
this.ingressRules = ingressRules;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setIngressRules(List<SecurityGroupRuleResponse> securityGroupRules) {
|
||||||
|
this.securityGroupRules = securityGroupRules;
|
||||||
|
} */
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
|
|||||||
@ -107,8 +107,7 @@ DROP TABLE IF EXISTS `cloud`.`ovs_vm_flow_log`;
|
|||||||
DROP TABLE IF EXISTS `cloud`.`ovs_work`;
|
DROP TABLE IF EXISTS `cloud`.`ovs_work`;
|
||||||
DROP TABLE IF EXISTS `cloud`.`remote_access_vpn`;
|
DROP TABLE IF EXISTS `cloud`.`remote_access_vpn`;
|
||||||
DROP TABLE IF EXISTS `cloud`.`resource_count`;
|
DROP TABLE IF EXISTS `cloud`.`resource_count`;
|
||||||
DROP TABLE IF EXISTS `cloud`.`security_ingress_rule`;
|
DROP TABLE IF EXISTS `cloud`.`security_group_rule`;
|
||||||
DROP TABLE IF EXISTS `cloud`.`security_egress_rule`;
|
|
||||||
DROP TABLE IF EXISTS `cloud`.`stack_maid`;
|
DROP TABLE IF EXISTS `cloud`.`stack_maid`;
|
||||||
DROP TABLE IF EXISTS `cloud`.`storage_pool_work`;
|
DROP TABLE IF EXISTS `cloud`.`storage_pool_work`;
|
||||||
DROP TABLE IF EXISTS `cloud`.`user_vm_details`;
|
DROP TABLE IF EXISTS `cloud`.`user_vm_details`;
|
||||||
@ -1515,10 +1514,11 @@ CREATE TABLE `cloud`.`security_group` (
|
|||||||
CONSTRAINT `uc_security_group__uuid` UNIQUE (`uuid`)
|
CONSTRAINT `uc_security_group__uuid` UNIQUE (`uuid`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `cloud`.`security_ingress_rule` (
|
CREATE TABLE `cloud`.`security_group_rule` (
|
||||||
`id` bigint unsigned NOT NULL auto_increment,
|
`id` bigint unsigned NOT NULL auto_increment,
|
||||||
`uuid` varchar(40),
|
`uuid` varchar(40),
|
||||||
`security_group_id` bigint unsigned NOT NULL,
|
`security_group_id` bigint unsigned NOT NULL,
|
||||||
|
`type` varchar(10) default 'ingress',
|
||||||
`start_port` varchar(10) default NULL,
|
`start_port` varchar(10) default NULL,
|
||||||
`end_port` varchar(10) default NULL,
|
`end_port` varchar(10) default NULL,
|
||||||
`protocol` varchar(16) NOT NULL default 'TCP',
|
`protocol` varchar(16) NOT NULL default 'TCP',
|
||||||
@ -1526,21 +1526,7 @@ CREATE TABLE `cloud`.`security_ingress_rule` (
|
|||||||
`allowed_ip_cidr` varchar(44),
|
`allowed_ip_cidr` varchar(44),
|
||||||
`create_status` varchar(32) COMMENT 'rule creation status',
|
`create_status` varchar(32) COMMENT 'rule creation status',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
CONSTRAINT `uc_security_ingress_rule__uuid` UNIQUE (`uuid`)
|
CONSTRAINT `uc_security_group_rule__uuid` UNIQUE (`uuid`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
CREATE TABLE `cloud`.`security_egress_rule` (
|
|
||||||
`id` bigint unsigned NOT NULL auto_increment,
|
|
||||||
`uuid` varchar(40),
|
|
||||||
`security_group_id` bigint unsigned NOT NULL,
|
|
||||||
`start_port` varchar(10) default NULL,
|
|
||||||
`end_port` varchar(10) default NULL,
|
|
||||||
`protocol` varchar(16) NOT NULL default 'TCP',
|
|
||||||
`allowed_network_id` bigint unsigned,
|
|
||||||
`allowed_ip_cidr` varchar(44),
|
|
||||||
`create_status` varchar(32) COMMENT 'rule creation status',
|
|
||||||
PRIMARY KEY (`id`),
|
|
||||||
CONSTRAINT `uc_security_egress_rule__uuid` UNIQUE (`uuid`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `cloud`.`security_group_vm_map` (
|
CREATE TABLE `cloud`.`security_group_vm_map` (
|
||||||
|
|||||||
@ -187,11 +187,6 @@ ALTER TABLE `cloud`.`firewall_rules` ADD CONSTRAINT `uc_firewall_rules__uuid` UN
|
|||||||
ALTER TABLE `cloud`.`cluster` ADD COLUMN `uuid` varchar(40);
|
ALTER TABLE `cloud`.`cluster` ADD COLUMN `uuid` varchar(40);
|
||||||
ALTER TABLE `cloud`.`cluster` ADD CONSTRAINT `uc_cluster__uuid` UNIQUE (`uuid`);
|
ALTER TABLE `cloud`.`cluster` ADD CONSTRAINT `uc_cluster__uuid` UNIQUE (`uuid`);
|
||||||
|
|
||||||
ALTER TABLE `cloud`.`security_ingress_rule` ADD COLUMN `uuid` varchar(40);
|
|
||||||
ALTER TABLE `cloud`.`security_ingress_rule` ADD CONSTRAINT `uc_security_ingress_rule__uuid` UNIQUE (`uuid`);
|
|
||||||
|
|
||||||
ALTER TABLE `cloud`.`security_egress_rule` ADD COLUMN `uuid` varchar(40);
|
|
||||||
ALTER TABLE `cloud`.`security_egress_rule` ADD CONSTRAINT `uc_security_egress_rule__uuid` UNIQUE (`uuid`);
|
|
||||||
|
|
||||||
ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `uuid` varchar(40);
|
ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `uuid` varchar(40);
|
||||||
ALTER TABLE `cloud`.`network_offerings` ADD CONSTRAINT `uc_network_offerings__uuid` UNIQUE (`uuid`);
|
ALTER TABLE `cloud`.`network_offerings` ADD CONSTRAINT `uc_network_offerings__uuid` UNIQUE (`uuid`);
|
||||||
@ -217,3 +212,8 @@ ALTER TABLE `cloud`.`guest_os_category` ADD CONSTRAINT `uc_guest_os_category__uu
|
|||||||
ALTER TABLE `cloud`.`nics` ADD COLUMN `uuid` varchar(40);
|
ALTER TABLE `cloud`.`nics` ADD COLUMN `uuid` varchar(40);
|
||||||
ALTER TABLE `cloud`.`nics` ADD CONSTRAINT `uc_nics__uuid` UNIQUE (`uuid`);
|
ALTER TABLE `cloud`.`nics` ADD CONSTRAINT `uc_nics__uuid` UNIQUE (`uuid`);
|
||||||
|
|
||||||
|
ALTER TABLE `cloud`.`security_ingress_rule` RENAME TO `security_group_rule`;
|
||||||
|
ALTER TABLE `cloud`.`security_group_rule` ADD COLUMN `type` varchar(10) default 'ingress' AFTER security_group_id;
|
||||||
|
|
||||||
|
ALTER TABLE `cloud`.`security_group_rule` ADD COLUMN `uuid` varchar(40);
|
||||||
|
ALTER TABLE `cloud`.`security_group_rule` ADD CONSTRAINT `uc_security_group_rule__uuid` UNIQUE (`uuid`);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user