From aa0fed787e04a11a5f68e4b5a9ae856e7336e444 Mon Sep 17 00:00:00 2001 From: anthony Date: Mon, 6 Dec 2010 13:08:10 -0800 Subject: [PATCH] move network group to oss --- .../xen/resource/XenServerResource.java | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/core/src/com/cloud/hypervisor/xen/resource/XenServerResource.java b/core/src/com/cloud/hypervisor/xen/resource/XenServerResource.java index 9e70d104236..7ff4cee9bcc 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/XenServerResource.java +++ b/core/src/com/cloud/hypervisor/xen/resource/XenServerResource.java @@ -21,6 +21,10 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import org.apache.xmlrpc.XmlRpcException; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import com.cloud.agent.api.NetworkIngressRuleAnswer; +import com.cloud.agent.api.NetworkIngressRulesCmd; import com.cloud.hypervisor.xen.resource.CitrixResourceBase; import com.xensource.xenapi.VM; import com.cloud.resource.ServerResource; @@ -32,11 +36,19 @@ import com.xensource.xenapi.Types.XenAPIException; public class XenServerResource extends CitrixResourceBase { private static final Logger s_logger = Logger.getLogger(XenServerResource.class); - public XenServerResource() { super(); } + @Override + public Answer executeRequest(Command cmd) { + if (cmd instanceof NetworkIngressRulesCmd) { + return execute((NetworkIngressRulesCmd) cmd); + } else { + return super.executeRequest(cmd); + } + } + @Override protected String getGuestOsType(String stdType, boolean bootFromCD) { return CitrixHelper.getXenServerGuestOsType(stdType); @@ -50,6 +62,39 @@ public class XenServerResource extends CitrixResourceBase { @Override protected String getPatchPath() { return "scripts/vm/hypervisor/xenserver/xenserver56"; + } + + @Override + protected boolean can_bridge_firewall() { + return Boolean.valueOf(callHostPlugin("vmops", "can_bridge_firewall", "host_uuid", _host.uuid)); + } + + private Answer execute(NetworkIngressRulesCmd cmd) { + 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 NetworkIngressRuleAnswer(cmd, false, "Host " + _host.ip + " cannot do bridge firewalling"); + } + + String result = callHostPlugin("vmops", "network_rules", + "vmName", cmd.getVmName(), + "vmIP", cmd.getGuestIp(), + "vmMAC", cmd.getGuestMac(), + "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 NetworkIngressRuleAnswer(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 NetworkIngressRuleAnswer(cmd); + } } }