You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by sa...@apache.org on 2016/06/16 08:12:19 UTC
[18/50] [abbrv] git commit: updated refs/heads/deploy-from-snapshot
to 44ba14d
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java
----------------------------------------------------------------------
diff --git a/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java b/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java
new file mode 100644
index 0000000..447e21b
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java
@@ -0,0 +1,999 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.utils.cisco.n1kv.vsm;
+
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSSerializer;
+
+import com.cloud.utils.Pair;
+
+public class VsmCommand {
+
+ private static final Logger s_logger = Logger.getLogger(VsmCommand.class);
+ private static final String s_namespace = "urn:ietf:params:xml:ns:netconf:base:1.0";
+ private static final String s_ciscons = "http://www.cisco.com/nxos:1.0:ppm";
+ private static final String s_configuremode = "__XML__MODE__exec_configure";
+ private static final String s_portprofmode = "__XML__MODE_port-prof";
+ private static final String s_policymapmode = "__XML__MODE_policy-map";
+ private static final String s_classtypemode = "__XML__MODE_policy-map_class_type";
+ private static final String s_paramvalue = "__XML__PARAM_value";
+
+ public enum PortProfileType {
+ none, vethernet, ethernet;
+ }
+
+ public enum BindingType {
+ none, portbindingstatic, portbindingdynamic, portbindingephermal;
+ }
+
+ public enum SwitchPortMode {
+ none, access, trunk, privatevlanhost, privatevlanpromiscuous
+ }
+
+ public enum OperationType {
+ addvlanid, removevlanid
+ }
+
+ public static String getAddPortProfile(String name, PortProfileType type, BindingType binding, SwitchPortMode mode, int vlanid, String vdc, String espName) {
+ try {
+ // Create the document and root element.
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementation domImpl = docBuilder.getDOMImplementation();
+ Document doc = createDocument(domImpl);
+
+ // Edit configuration command.
+ Element editConfig = doc.createElement("nf:edit-config");
+ doc.getDocumentElement().appendChild(editConfig);
+
+ // Command to get into exec configure mode.
+ Element target = doc.createElement("nf:target");
+ Element running = doc.createElement("nf:running");
+ target.appendChild(running);
+ editConfig.appendChild(target);
+
+ // Command to create the port profile with the desired configuration.
+ Element config = doc.createElement("nf:config");
+ config.appendChild(configPortProfileDetails(doc, name, type, binding, mode, vlanid, vdc, espName));
+ editConfig.appendChild(config);
+
+ return serialize(domImpl, doc);
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error while creating add port profile message : " + e.getMessage());
+ return null;
+ } catch (DOMException e) {
+ s_logger.error("Error while creating add port profile message : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static String getAddPortProfile(String name, PortProfileType type, BindingType binding, SwitchPortMode mode, int vlanid) {
+ try {
+ // Create the document and root element.
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementation domImpl = docBuilder.getDOMImplementation();
+ Document doc = createDocument(domImpl);
+
+ // Edit configuration command.
+ Element editConfig = doc.createElement("nf:edit-config");
+ doc.getDocumentElement().appendChild(editConfig);
+
+ // Command to get into exec configure mode.
+ Element target = doc.createElement("nf:target");
+ Element running = doc.createElement("nf:running");
+ target.appendChild(running);
+ editConfig.appendChild(target);
+
+ // Command to create the port profile with the desired configuration.
+ Element config = doc.createElement("nf:config");
+ config.appendChild(configPortProfileDetails(doc, name, type, binding, mode, vlanid));
+ editConfig.appendChild(config);
+
+ return serialize(domImpl, doc);
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error while creating add port profile message : " + e.getMessage());
+ return null;
+ } catch (DOMException e) {
+ s_logger.error("Error while creating add port profile message : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static String getUpdatePortProfile(String name, SwitchPortMode mode, List<Pair<VsmCommand.OperationType, String>> params) {
+ try {
+ // Create the document and root element.
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementation domImpl = docBuilder.getDOMImplementation();
+ Document doc = createDocument(domImpl);
+
+ // Edit configuration command.
+ Element editConfig = doc.createElement("nf:edit-config");
+ doc.getDocumentElement().appendChild(editConfig);
+
+ // Command to get into exec configure mode.
+ Element target = doc.createElement("nf:target");
+ Element running = doc.createElement("nf:running");
+ target.appendChild(running);
+ editConfig.appendChild(target);
+
+ // Command to update the port profile with the desired configuration.
+ Element config = doc.createElement("nf:config");
+ config.appendChild(configPortProfileDetails(doc, name, mode, params));
+ editConfig.appendChild(config);
+
+ return serialize(domImpl, doc);
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error while creating update port profile message : " + e.getMessage());
+ return null;
+ } catch (DOMException e) {
+ s_logger.error("Error while creating update port profile message : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static String getDeletePortProfile(String portName) {
+ try {
+ // Create the document and root element.
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementation domImpl = docBuilder.getDOMImplementation();
+ Document doc = createDocument(domImpl);
+
+ // Edit configuration command.
+ Element editConfig = doc.createElement("nf:edit-config");
+ doc.getDocumentElement().appendChild(editConfig);
+
+ // Command to get into exec configure mode.
+ Element target = doc.createElement("nf:target");
+ Element running = doc.createElement("nf:running");
+ target.appendChild(running);
+ editConfig.appendChild(target);
+
+ // Command to create the port profile with the desired configuration.
+ Element config = doc.createElement("nf:config");
+ config.appendChild(deletePortProfileDetails(doc, portName));
+ editConfig.appendChild(config);
+
+ return serialize(domImpl, doc);
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error while creating delete port profile message : " + e.getMessage());
+ return null;
+ } catch (DOMException e) {
+ s_logger.error("Error while creating delete port profile message : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static String getAddPolicyMap(String name, int averageRate, int maxRate, int burstRate) {
+ try {
+ // Create the document and root element.
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementation domImpl = docBuilder.getDOMImplementation();
+ Document doc = createDocument(domImpl);
+
+ // Edit configuration command.
+ Element editConfig = doc.createElement("nf:edit-config");
+ doc.getDocumentElement().appendChild(editConfig);
+
+ // Command to get into exec configure mode.
+ Element target = doc.createElement("nf:target");
+ Element running = doc.createElement("nf:running");
+ target.appendChild(running);
+ editConfig.appendChild(target);
+
+ // Command to create the port profile with the desired configuration.
+ Element config = doc.createElement("nf:config");
+ config.appendChild(policyMapDetails(doc, name, averageRate, maxRate, burstRate));
+ editConfig.appendChild(config);
+
+ return serialize(domImpl, doc);
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error while creating policy map message : " + e.getMessage());
+ return null;
+ } catch (DOMException e) {
+ s_logger.error("Error while creating policy map message : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static String getDeletePolicyMap(String name) {
+ try {
+ // Create the document and root element.
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementation domImpl = docBuilder.getDOMImplementation();
+ Document doc = createDocument(domImpl);
+
+ // Edit configuration command.
+ Element editConfig = doc.createElement("nf:edit-config");
+ doc.getDocumentElement().appendChild(editConfig);
+
+ // Command to get into exec configure mode.
+ Element target = doc.createElement("nf:target");
+ Element running = doc.createElement("nf:running");
+ target.appendChild(running);
+ editConfig.appendChild(target);
+
+ // Command to create the port profile with the desired configuration.
+ Element config = doc.createElement("nf:config");
+ config.appendChild(deletePolicyMapDetails(doc, name));
+ editConfig.appendChild(config);
+
+ return serialize(domImpl, doc);
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error while creating delete policy map message : " + e.getMessage());
+ return null;
+ } catch (DOMException e) {
+ s_logger.error("Error while creating delete policy map message : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static String getServicePolicy(String policyMap, String portProfile, boolean attach) {
+ try {
+ // Create the document and root element.
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementation domImpl = docBuilder.getDOMImplementation();
+ Document doc = createDocument(domImpl);
+
+ // Edit configuration command.
+ Element editConfig = doc.createElement("nf:edit-config");
+ doc.getDocumentElement().appendChild(editConfig);
+
+ // Command to get into exec configure mode.
+ Element target = doc.createElement("nf:target");
+ Element running = doc.createElement("nf:running");
+ target.appendChild(running);
+ editConfig.appendChild(target);
+
+ // Command to create the port profile with the desired configuration.
+ Element config = doc.createElement("nf:config");
+ config.appendChild(serviceDetails(doc, policyMap, portProfile, attach));
+ editConfig.appendChild(config);
+
+ return serialize(domImpl, doc);
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error while creating attach/detach service policy message : " + e.getMessage());
+ return null;
+ } catch (DOMException e) {
+ s_logger.error("Error while creating attach/detach service policy message : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static String getPortProfile(String name) {
+ try {
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementation domImpl = docBuilder.getDOMImplementation();
+ Document doc = createDocument(domImpl);
+
+ Element get = doc.createElement("nf:get");
+ doc.getDocumentElement().appendChild(get);
+
+ Element filter = doc.createElement("nf:filter");
+ filter.setAttribute("type", "subtree");
+ get.appendChild(filter);
+
+ // Create the show port-profile name <profile-name> command.
+ Element show = doc.createElement("show");
+ filter.appendChild(show);
+ Element portProfile = doc.createElement("port-profile");
+ show.appendChild(portProfile);
+ Element nameNode = doc.createElement("name");
+ portProfile.appendChild(nameNode);
+
+ // Profile name
+ Element profileName = doc.createElement("profile_name");
+ profileName.setTextContent(name);
+ nameNode.appendChild(profileName);
+
+ return serialize(domImpl, doc);
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error while creating the message to get port profile details: " + e.getMessage());
+ return null;
+ } catch (DOMException e) {
+ s_logger.error("Error while creating the message to get port profile details: " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static String getPolicyMap(String name) {
+ try {
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementation domImpl = docBuilder.getDOMImplementation();
+ Document doc = createDocument(domImpl);
+
+ Element get = doc.createElement("nf:get");
+ doc.getDocumentElement().appendChild(get);
+
+ Element filter = doc.createElement("nf:filter");
+ filter.setAttribute("type", "subtree");
+ get.appendChild(filter);
+
+ // Create the show port-profile name <profile-name> command.
+ Element show = doc.createElement("show");
+ filter.appendChild(show);
+ Element policyMap = doc.createElement("policy-map");
+ show.appendChild(policyMap);
+ Element nameNode = doc.createElement("name");
+ nameNode.setTextContent(name);
+ policyMap.appendChild(nameNode);
+
+ return serialize(domImpl, doc);
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error while creating the message to get policy map details : " + e.getMessage());
+ return null;
+ } catch (DOMException e) {
+ s_logger.error("Error while creating the message to get policy map details : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static String getHello() {
+ try {
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementation domImpl = docBuilder.getDOMImplementation();
+
+ // Root elements.
+ Document doc = domImpl.createDocument(s_namespace, "nc:hello", null);
+
+ // Client capacity. We are only supporting basic capacity.
+ Element capabilities = doc.createElement("nc:capabilities");
+ Element capability = doc.createElement("nc:capability");
+ capability.setTextContent("urn:ietf:params:xml:ns:netconf:base:1.0");
+
+ capabilities.appendChild(capability);
+ doc.getDocumentElement().appendChild(capabilities);
+
+ return serialize(domImpl, doc);
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error while creating hello message : " + e.getMessage());
+ return null;
+ } catch (DOMException e) {
+ s_logger.error("Error while creating hello message : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static String getVServiceNode(String vlanId, String ipAddr) {
+ try {
+ // Create the document and root element.
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementation domImpl = docBuilder.getDOMImplementation();
+ Document doc = createDocument(domImpl);
+
+ // Edit configuration command.
+ Element editConfig = doc.createElement("nf:edit-config");
+ doc.getDocumentElement().appendChild(editConfig);
+
+ // Command to get into exec configure mode.
+ Element target = doc.createElement("nf:target");
+ Element running = doc.createElement("nf:running");
+ target.appendChild(running);
+ editConfig.appendChild(target);
+
+ // Command to create the port profile with the desired configuration.
+ Element config = doc.createElement("nf:config");
+ config.appendChild(configVServiceNodeDetails(doc, vlanId, ipAddr));
+ editConfig.appendChild(config);
+
+ return serialize(domImpl, doc);
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error while adding vservice node for vlan " + vlanId + ", " + e.getMessage());
+ return null;
+ } catch (DOMException e) {
+ s_logger.error("Error while adding vservice node for vlan " + vlanId + ", " + e.getMessage());
+ return null;
+ }
+ }
+
+ private static Element configVServiceNodeDetails(Document doc, String vlanId, String ipAddr) {
+ // In mode, exec_configure.
+ Element configure = doc.createElementNS(s_ciscons, "nxos:configure");
+ Element modeConfigure = doc.createElement("nxos:" + s_configuremode);
+ configure.appendChild(modeConfigure);
+
+ // vservice node %name% type asa
+ Element vservice = doc.createElement("vservice");
+ vservice.appendChild(doc.createElement("node"))
+ .appendChild(doc.createElement("ASA_" + vlanId))
+ .appendChild(doc.createElement("type"))
+ .appendChild(doc.createElement("asa"));
+ modeConfigure.appendChild(vservice);
+
+ Element address = doc.createElement(s_paramvalue);
+ address.setAttribute("isKey", "true");
+ address.setTextContent(ipAddr);
+
+ // ip address %ipAddr%
+ modeConfigure.appendChild(doc.createElement("ip")).appendChild(doc.createElement("address")).appendChild(doc.createElement("value")).appendChild(address);
+
+ Element vlan = doc.createElement(s_paramvalue);
+ vlan.setAttribute("isKey", "true");
+ vlan.setTextContent(vlanId);
+
+ // adjacency l2 vlan %vlanId%
+ modeConfigure.appendChild(doc.createElement("adjacency"))
+ .appendChild(doc.createElement("l2"))
+ .appendChild(doc.createElement("vlan"))
+ .appendChild(doc.createElement("value"))
+ .appendChild(vlan);
+
+ // fail-mode close
+ modeConfigure.appendChild(doc.createElement("fail-mode")).appendChild(doc.createElement("close"));
+
+ // Persist the configuration across reboots.
+ modeConfigure.appendChild(persistConfiguration(doc));
+
+ return configure;
+ }
+
+ private static Element configPortProfileDetails(Document doc, String name, PortProfileType type, BindingType binding, SwitchPortMode mode, int vlanid, String vdc,
+ String espName) {
+
+ // In mode, exec_configure.
+ Element configure = doc.createElementNS(s_ciscons, "nxos:configure");
+ Element modeConfigure = doc.createElement("nxos:" + s_configuremode);
+ configure.appendChild(modeConfigure);
+
+ // Port profile name and type configuration.
+ Element portProfile = doc.createElement("port-profile");
+ modeConfigure.appendChild(portProfile);
+
+ // Port profile type.
+ Element portDetails = doc.createElement("name");
+ switch (type) {
+ case none:
+ portProfile.appendChild(portDetails);
+ break;
+ case ethernet: {
+ Element typetag = doc.createElement("type");
+ Element ethernettype = doc.createElement("ethernet");
+ portProfile.appendChild(typetag);
+ typetag.appendChild(ethernettype);
+ ethernettype.appendChild(portDetails);
+ }
+ break;
+ case vethernet: {
+ Element typetag = doc.createElement("type");
+ Element ethernettype = doc.createElement("vethernet");
+ portProfile.appendChild(typetag);
+ typetag.appendChild(ethernettype);
+ ethernettype.appendChild(portDetails);
+ }
+ break;
+ }
+
+ // Port profile name.
+ Element value = doc.createElement(s_paramvalue);
+ value.setAttribute("isKey", "true");
+ value.setTextContent(name);
+ portDetails.appendChild(value);
+
+ // element for port prof mode.
+ Element portProf = doc.createElement(s_portprofmode);
+ portDetails.appendChild(portProf);
+
+ // Binding type.
+ if (binding != BindingType.none) {
+ portProf.appendChild(getBindingType(doc, binding));
+ }
+
+ if (mode != SwitchPortMode.none) {
+ // Switchport mode.
+ portProf.appendChild(getSwitchPortMode(doc, mode));
+ // Adding vlan details.
+ if (vlanid > 0) {
+ portProf.appendChild(getAddVlanDetails(doc, mode, Integer.toString(vlanid)));
+ }
+ }
+
+ // Command "vmware port-group".
+ Element vmware = doc.createElement("vmware");
+ Element portgroup = doc.createElement("port-group");
+ vmware.appendChild(portgroup);
+ portProf.appendChild(vmware);
+
+ // org %vdc%
+ // vservice node <Node Name> profile <Edge Security Profile Name in VNMC>
+ Element vdcValue = doc.createElement(s_paramvalue);
+ vdcValue.setAttribute("isKey", "true");
+ vdcValue.setTextContent(vdc);
+
+ Element org = doc.createElement("org");
+ org.appendChild(doc.createElement("orgname")).appendChild(vdcValue);
+ portProf.appendChild(org);
+
+ String asaNodeName = "ASA_" + vlanid;
+ Element vservice = doc.createElement("vservice");
+ vservice.appendChild(doc.createElement("node"))
+ .appendChild(doc.createElement(asaNodeName))
+ .appendChild(doc.createElement("profile"))
+ .appendChild(doc.createElement(espName));
+ portProf.appendChild(vservice);
+
+ // no shutdown.
+ Element no = doc.createElement("no");
+ Element shutdown = doc.createElement("shutdown");
+ no.appendChild(shutdown);
+ portProf.appendChild(no);
+
+ // Enable the port profile.
+ Element state = doc.createElement("state");
+ Element enabled = doc.createElement("enabled");
+ state.appendChild(enabled);
+ portProf.appendChild(state);
+
+ // Persist the configuration across reboots.
+ modeConfigure.appendChild(persistConfiguration(doc));
+
+ return configure;
+ }
+
+ private static Element configPortProfileDetails(Document doc, String name, PortProfileType type, BindingType binding, SwitchPortMode mode, int vlanid) {
+
+ // In mode, exec_configure.
+ Element configure = doc.createElementNS(s_ciscons, "nxos:configure");
+ Element modeConfigure = doc.createElement("nxos:" + s_configuremode);
+ configure.appendChild(modeConfigure);
+
+ // Port profile name and type configuration.
+ Element portProfile = doc.createElement("port-profile");
+ modeConfigure.appendChild(portProfile);
+
+ // Port profile type.
+ Element portDetails = doc.createElement("name");
+ switch (type) {
+ case none:
+ portProfile.appendChild(portDetails);
+ break;
+ case ethernet: {
+ Element typetag = doc.createElement("type");
+ Element ethernettype = doc.createElement("ethernet");
+ portProfile.appendChild(typetag);
+ typetag.appendChild(ethernettype);
+ ethernettype.appendChild(portDetails);
+ }
+ break;
+ case vethernet: {
+ Element typetag = doc.createElement("type");
+ Element ethernettype = doc.createElement("vethernet");
+ portProfile.appendChild(typetag);
+ typetag.appendChild(ethernettype);
+ ethernettype.appendChild(portDetails);
+ }
+ break;
+ }
+
+ // Port profile name.
+ Element value = doc.createElement(s_paramvalue);
+ value.setAttribute("isKey", "true");
+ value.setTextContent(name);
+ portDetails.appendChild(value);
+
+ // element for port prof mode.
+ Element portProf = doc.createElement(s_portprofmode);
+ portDetails.appendChild(portProf);
+
+ // Binding type.
+ if (binding != BindingType.none) {
+ portProf.appendChild(getBindingType(doc, binding));
+ }
+
+ if (mode != SwitchPortMode.none) {
+ // Switchport mode.
+ portProf.appendChild(getSwitchPortMode(doc, mode));
+ // Adding vlan details.
+ if (vlanid > 0) {
+ portProf.appendChild(getAddVlanDetails(doc, mode, Integer.toString(vlanid)));
+ }
+ }
+
+ // Command "vmware port-group".
+ Element vmware = doc.createElement("vmware");
+ Element portgroup = doc.createElement("port-group");
+ vmware.appendChild(portgroup);
+ portProf.appendChild(vmware);
+
+ // no shutdown.
+ Element no = doc.createElement("no");
+ Element shutdown = doc.createElement("shutdown");
+ no.appendChild(shutdown);
+ portProf.appendChild(no);
+
+ // Enable the port profile.
+ Element state = doc.createElement("state");
+ Element enabled = doc.createElement("enabled");
+ state.appendChild(enabled);
+ portProf.appendChild(state);
+
+ // Persist the configuration across reboots.
+ modeConfigure.appendChild(persistConfiguration(doc));
+
+ return configure;
+ }
+
+ private static Element configPortProfileDetails(Document doc, String name, SwitchPortMode mode, List<Pair<VsmCommand.OperationType, String>> params) {
+
+ // In mode, exec_configure.
+ Element configure = doc.createElementNS(s_ciscons, "nxos:configure");
+ Element modeConfigure = doc.createElement("nxos:" + s_configuremode);
+ configure.appendChild(modeConfigure);
+
+ // Port profile name and type configuration.
+ Element portProfile = doc.createElement("port-profile");
+ modeConfigure.appendChild(portProfile);
+
+ // Port profile type.
+ Element portDetails = doc.createElement("name");
+ portProfile.appendChild(portDetails);
+
+ // Name of the profile to update.
+ Element value = doc.createElement(s_paramvalue);
+ value.setAttribute("isKey", "true");
+ value.setTextContent(name);
+ portDetails.appendChild(value);
+
+ // element for port prof mode.
+ Element portProfMode = doc.createElement(s_portprofmode);
+ portDetails.appendChild(portProfMode);
+
+ for (Pair<VsmCommand.OperationType, String> item : params) {
+ if (item.first() == OperationType.addvlanid) {
+ // Set the access mode configuration or the list
+ // of allowed vlans on the trunking interface.
+ portProfMode.appendChild(getAddVlanDetails(doc, mode, item.second()));
+ } else if (item.first() == OperationType.removevlanid) {
+ portProfMode.appendChild(getDeleteVlanDetails(doc, mode, item.second()));
+ }
+ }
+
+ // Persist the configuration across reboots.
+ modeConfigure.appendChild(persistConfiguration(doc));
+
+ return configure;
+ }
+
+ private static Element deletePortProfileDetails(Document doc, String name) {
+ Element configure = doc.createElementNS(s_ciscons, "nxos:configure");
+ Element modeConfigure = doc.createElement("nxos:" + s_configuremode);
+ configure.appendChild(modeConfigure);
+
+ // Command and name for the port profile to be deleted.
+ Element deletePortProfile = doc.createElement("no");
+ modeConfigure.appendChild(deletePortProfile);
+
+ Element portProfile = doc.createElement("port-profile");
+ deletePortProfile.appendChild(portProfile);
+
+ Element portDetails = doc.createElement("name");
+ portProfile.appendChild(portDetails);
+
+ // Name of the profile to delete.
+ Element value = doc.createElement(s_paramvalue);
+ value.setAttribute("isKey", "true");
+ value.setTextContent(name);
+ portDetails.appendChild(value);
+
+ // Persist the configuration across reboots.
+ modeConfigure.appendChild(persistConfiguration(doc));
+
+ return configure;
+ }
+
+ private static Element policyMapDetails(Document doc, String name, int averageRate, int maxRate, int burstRate) {
+ Element configure = doc.createElementNS(s_ciscons, "nxos:configure");
+ Element modeConfigure = doc.createElement("nxos:" + s_configuremode);
+ configure.appendChild(modeConfigure);
+
+ // Policy map details
+ Element policyMap = doc.createElement("policy-map");
+ modeConfigure.appendChild(policyMap);
+
+ Element policyDetails = doc.createElement("name");
+ policyMap.appendChild(policyDetails);
+
+ // Name of the policy to create/update.
+ Element value = doc.createElement(s_paramvalue);
+ value.setAttribute("isKey", "true");
+ value.setTextContent(name);
+ policyDetails.appendChild(value);
+
+ Element policyMapMode = doc.createElement(s_policymapmode);
+ policyDetails.appendChild(policyMapMode);
+
+ // Create the default class to match all traffic.
+ Element classRoot = doc.createElement("class");
+ Element classDefault = doc.createElement("class-default");
+ policyMapMode.appendChild(classRoot);
+ classRoot.appendChild(classDefault);
+
+ Element classMode = doc.createElement(s_classtypemode);
+ classDefault.appendChild(classMode);
+
+ // Set the average, max and burst rate.
+ // TODO: Add handling for max and burst.
+ Element police = doc.createElement("police");
+ classMode.appendChild(police);
+
+ // Set the committed information rate and its value in mbps.
+ Element cir = doc.createElement("cir");
+ police.appendChild(cir);
+ Element cirValue = doc.createElement("cir-val");
+ cir.appendChild(cirValue);
+ Element value2 = doc.createElement(s_paramvalue);
+ Element mbps = doc.createElement("mbps");
+ value2.setTextContent(Integer.toString(averageRate));
+ cirValue.appendChild(value2);
+ cirValue.appendChild(mbps);
+
+ // Persist the configuration across reboots.
+ modeConfigure.appendChild(persistConfiguration(doc));
+
+ return configure;
+ }
+
+ private static Element deletePolicyMapDetails(Document doc, String name) {
+ Element configure = doc.createElementNS(s_ciscons, "nxos:configure");
+ Element modeConfigure = doc.createElement("nxos:" + s_configuremode);
+ configure.appendChild(modeConfigure);
+
+ // Delete Policy map details
+ Element deletePolicyMap = doc.createElement("no");
+ Element policyMap = doc.createElement("policy-map");
+ deletePolicyMap.appendChild(policyMap);
+ modeConfigure.appendChild(deletePolicyMap);
+
+ Element policyDetails = doc.createElement("name");
+ policyMap.appendChild(policyDetails);
+
+ // Name of the policy to create/update.
+ Element value = doc.createElement(s_paramvalue);
+ value.setAttribute("isKey", "true");
+ value.setTextContent(name);
+ policyDetails.appendChild(value);
+
+ // Persist the configuration across reboots.
+ modeConfigure.appendChild(persistConfiguration(doc));
+
+ return configure;
+ }
+
+ private static Element serviceDetails(Document doc, String policyMap, String portProfile, boolean attach) {
+ // In mode, exec_configure.
+ Element configure = doc.createElementNS(s_ciscons, "nxos:configure");
+ Element modeConfigure = doc.createElement("nxos:" + s_configuremode);
+ configure.appendChild(modeConfigure);
+
+ // Port profile name and type configuration.
+ Element profile = doc.createElement("port-profile");
+ modeConfigure.appendChild(profile);
+
+ // Port profile type.
+ Element portDetails = doc.createElement("name");
+ profile.appendChild(portDetails);
+
+ // Name of the profile to update.
+ Element value = doc.createElement(s_paramvalue);
+ value.setAttribute("isKey", "true");
+ value.setTextContent(portProfile);
+ portDetails.appendChild(value);
+
+ // element for port prof mode.
+ Element portProfMode = doc.createElement(s_portprofmode);
+ portDetails.appendChild(portProfMode);
+
+ // Associate/Remove the policy for input.
+ if (attach) {
+ portProfMode.appendChild(getServicePolicyCmd(doc, policyMap, "input"));
+ } else {
+ Element detach = doc.createElement("no");
+ portProfMode.appendChild(detach);
+ detach.appendChild(getServicePolicyCmd(doc, policyMap, "input"));
+ }
+
+ // Associate/Remove the policy for output.
+ if (attach) {
+ portProfMode.appendChild(getServicePolicyCmd(doc, policyMap, "output"));
+ } else {
+ Element detach = doc.createElement("no");
+ portProfMode.appendChild(detach);
+ detach.appendChild(getServicePolicyCmd(doc, policyMap, "output"));
+ }
+
+ // Persist the configuration across reboots.
+ modeConfigure.appendChild(persistConfiguration(doc));
+
+ return configure;
+ }
+
+ private static Element persistConfiguration(Document doc) {
+ Element copy = doc.createElement("copy");
+ Element running = doc.createElement("running-config");
+ Element startup = doc.createElement("startup-config");
+ copy.appendChild(running);
+ running.appendChild(startup);
+ return copy;
+ }
+
+ private static Element getAddVlanDetails(Document doc, SwitchPortMode mode, String vlanid) {
+ Element switchport = doc.createElement("switchport");
+
+ // Details of the vlanid to add.
+ Element vlancreate = doc.createElement("vlan-id-create-delete");
+ Element value = doc.createElement(s_paramvalue);
+ value.setTextContent(vlanid);
+ vlancreate.appendChild(value);
+
+ // Handling is there only for 'access' and 'trunk allowed' mode command.
+ if (mode == SwitchPortMode.access) {
+ Element access = doc.createElement("access");
+ switchport.appendChild(access);
+
+ Element vlan = doc.createElement("vlan");
+ access.appendChild(vlan);
+
+ vlan.appendChild(vlancreate);
+ } else if (mode == SwitchPortMode.trunk) {
+ Element trunk = doc.createElement("trunk");
+ switchport.appendChild(trunk);
+
+ Element allowed = doc.createElement("allowed");
+ trunk.appendChild(allowed);
+
+ Element vlan = doc.createElement("vlan");
+ allowed.appendChild(vlan);
+
+ Element add = doc.createElement("add");
+ vlan.appendChild(add);
+
+ add.appendChild(vlancreate);
+ }
+
+ return switchport;
+ }
+
+ private static Node getDeleteVlanDetails(Document doc, SwitchPortMode mode, String vlanid) {
+ Node parentNode = null;
+ Element switchport = doc.createElement("switchport");
+
+ // Handling is there only for 'access' and 'trunk allowed' mode command.
+ if (mode == SwitchPortMode.access) {
+ Element no = doc.createElement("no");
+ no.appendChild(switchport);
+ parentNode = no;
+
+ Element access = doc.createElement("access");
+ switchport.appendChild(access);
+
+ Element vlan = doc.createElement("vlan");
+ access.appendChild(vlan);
+ } else if (mode == SwitchPortMode.trunk) {
+ parentNode = switchport;
+
+ Element trunk = doc.createElement("trunk");
+ switchport.appendChild(trunk);
+
+ Element allowed = doc.createElement("allowed");
+ trunk.appendChild(allowed);
+
+ Element vlan = doc.createElement("vlan");
+ allowed.appendChild(vlan);
+
+ Element remove = doc.createElement("remove");
+ vlan.appendChild(remove);
+
+ // Details of the vlanid to add.
+ Element vlancreate = doc.createElement("vlan-id-create-delete");
+ Element value = doc.createElement(s_paramvalue);
+ value.setTextContent(vlanid);
+ vlancreate.appendChild(value);
+
+ remove.appendChild(vlancreate);
+ }
+
+ return parentNode;
+ }
+
+ private static Element getBindingType(Document doc, BindingType binding) {
+ Element portBinding = doc.createElement("port-binding");
+
+ // We only have handling for access or trunk mode. Handling for private-vlan
+ // host/promiscuous command will have to be added.
+ if (binding == BindingType.portbindingstatic) {
+ Element type = doc.createElement("static");
+ portBinding.appendChild(type);
+ } else if (binding == BindingType.portbindingdynamic) {
+ Element type = doc.createElement("dynamic");
+ portBinding.appendChild(type);
+ } else if (binding == BindingType.portbindingephermal) {
+ Element type = doc.createElement("ephemeral");
+ portBinding.appendChild(type);
+ }
+
+ return portBinding;
+ }
+
+ private static Element getSwitchPortMode(Document doc, SwitchPortMode mode) {
+ Element switchport = doc.createElement("switchport");
+ Element accessmode = doc.createElement("mode");
+ switchport.appendChild(accessmode);
+
+ // We only have handling for access or trunk mode. Handling for private-vlan
+ // host/promiscuous command will have to be added.
+ if (mode == SwitchPortMode.access) {
+ Element access = doc.createElement("access");
+ accessmode.appendChild(access);
+ } else if (mode == SwitchPortMode.trunk) {
+ Element trunk = doc.createElement("trunk");
+ accessmode.appendChild(trunk);
+ }
+
+ return switchport;
+ }
+
+ private static Element getServicePolicyCmd(Document doc, String policyMap, String type) {
+ Element service = doc.createElement("service-policy");
+ Element input = doc.createElement(type);
+ service.appendChild(input);
+
+ Element name = doc.createElement("name");
+ input.appendChild(name);
+
+ Element policyValue = doc.createElement(s_paramvalue);
+ policyValue.setTextContent(policyMap);
+ name.appendChild(policyValue);
+
+ return service;
+ }
+
+ private static Document createDocument(DOMImplementation dom) {
+ Document doc = dom.createDocument(s_namespace, "nf:rpc", null);
+ doc.getDocumentElement().setAttribute("message-id", "101");
+ doc.getDocumentElement().setAttributeNS(s_ciscons, "portprofile", "true");
+ return doc;
+ }
+
+ private static String serialize(DOMImplementation domImpl, Document document) {
+ DOMImplementationLS ls = (DOMImplementationLS)domImpl;
+ LSSerializer lss = ls.createLSSerializer();
+ return lss.writeToString(document);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmOkResponse.java
----------------------------------------------------------------------
diff --git a/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmOkResponse.java b/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmOkResponse.java
new file mode 100644
index 0000000..8c56b22
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmOkResponse.java
@@ -0,0 +1,44 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.utils.cisco.n1kv.vsm;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+public class VsmOkResponse extends VsmResponse {
+
+ VsmOkResponse(String response) {
+ super(response);
+ initialize();
+ }
+
+ @Override
+ protected void parse(Element root) {
+ NodeList list = root.getElementsByTagName("nf:rpc-error");
+ if (list.getLength() == 0) {
+ // No rpc-error tag; means response was ok.
+ assert (root.getElementsByTagName("nf:ok").getLength() > 0);
+ _responseOk = true;
+ } else {
+ parseError(list.item(0));
+ _responseOk = false;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmPolicyMapResponse.java
----------------------------------------------------------------------
diff --git a/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmPolicyMapResponse.java b/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmPolicyMapResponse.java
new file mode 100644
index 0000000..c0ed6ee
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmPolicyMapResponse.java
@@ -0,0 +1,84 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.utils.cisco.n1kv.vsm;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class VsmPolicyMapResponse extends VsmResponse {
+ private static final Logger s_logger = Logger.getLogger(VsmPolicyMapResponse.class);
+ private static final String s_policyMapDetails = "__XML__OPT_Cmd_show_policy-map___readonly__";
+
+ private PolicyMap _policyMap = new PolicyMap();
+
+ VsmPolicyMapResponse(String response) {
+ super(response);
+ initialize();
+ }
+
+ public PolicyMap getPolicyMap() {
+ return _policyMap;
+ }
+
+ @Override
+ protected void parse(Element root) {
+ NodeList list = root.getElementsByTagName("nf:rpc-error");
+ if (list.getLength() == 0) {
+ // No rpc-error tag; means response was ok.
+ NodeList dataList = root.getElementsByTagName("nf:data");
+ if (dataList.getLength() > 0) {
+ parseData(dataList.item(0));
+ _responseOk = true;
+ }
+ } else {
+ super.parseError(list.item(0));
+ _responseOk = false;
+ }
+ }
+
+ protected void parseData(Node data) {
+ try {
+ NodeList list = ((Element)data).getElementsByTagName(s_policyMapDetails);
+ if (list.getLength() > 0) {
+ NodeList readOnlyList = ((Element)list.item(0)).getElementsByTagName("__readonly__");
+ Element readOnly = (Element)readOnlyList.item(0);
+
+ for (Node node = readOnly.getFirstChild(); node != null; node = node.getNextSibling()) {
+ String currentNode = node.getNodeName();
+ String value = node.getTextContent();
+ if ("pmap-name-out".equalsIgnoreCase(currentNode)) {
+ _policyMap.policyMapName = value;
+ } else if ("cir".equalsIgnoreCase(currentNode)) {
+ _policyMap.committedRate = Integer.parseInt(value.trim());
+ } else if ("bc".equalsIgnoreCase(currentNode)) {
+ _policyMap.burstRate = Integer.parseInt(value.trim());
+ } else if ("pir".equalsIgnoreCase(currentNode)) {
+ _policyMap.peakRate = Integer.parseInt(value.trim());
+ }
+ }
+ }
+ } catch (DOMException e) {
+ s_logger.error("Error parsing the response : " + e.toString());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmPortProfileResponse.java
----------------------------------------------------------------------
diff --git a/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmPortProfileResponse.java b/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmPortProfileResponse.java
new file mode 100644
index 0000000..0a3de18
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmPortProfileResponse.java
@@ -0,0 +1,166 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.utils.cisco.n1kv.vsm;
+
+import java.util.StringTokenizer;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.BindingType;
+import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.PortProfileType;
+import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.SwitchPortMode;
+
+public class VsmPortProfileResponse extends VsmResponse {
+ private static final Logger s_logger = Logger.getLogger(VsmPortProfileResponse.class);
+ private static final String s_portProfileDetails = "__XML__OPT_Cmd_show_port_profile___readonly__";
+
+ private PortProfile _portProfile = new PortProfile();
+
+ VsmPortProfileResponse(String response) {
+ super(response);
+ initialize();
+ }
+
+ public PortProfile getPortProfile() {
+ return _portProfile;
+ }
+
+ @Override
+ protected void parse(Element root) {
+ NodeList list = root.getElementsByTagName("nf:rpc-error");
+ if (list.getLength() == 0) {
+ // No rpc-error tag; means response was ok.
+ NodeList dataList = root.getElementsByTagName("nf:data");
+ if (dataList.getLength() > 0) {
+ parseData(dataList.item(0));
+ _responseOk = true;
+ }
+ } else {
+ super.parseError(list.item(0));
+ _responseOk = false;
+ }
+ }
+
+ protected void parseData(Node data) {
+ try {
+ NodeList list = ((Element)data).getElementsByTagName(s_portProfileDetails);
+ if (list.getLength() > 0) {
+ NodeList readOnlyList = ((Element)list.item(0)).getElementsByTagName("__readonly__");
+ Element readOnly = (Element)readOnlyList.item(0);
+
+ for (Node node = readOnly.getFirstChild(); node != null; node = node.getNextSibling()) {
+ String currentNode = node.getNodeName();
+ String value = node.getTextContent();
+ if ("port_binding".equalsIgnoreCase(currentNode)) {
+ setPortBinding(value);
+ } else if ("profile_name".equalsIgnoreCase(currentNode)) {
+ // Set the port profile name.
+ _portProfile.profileName = value;
+ } else if ("profile_cfg".equalsIgnoreCase(currentNode)) {
+ setProfileConfiguration(value);
+ } else if ("type".equalsIgnoreCase(currentNode)) {
+ setPortType(value);
+ } else if ("status".equalsIgnoreCase(currentNode)) {
+ // Has the profile been enabled.
+ if (value.equalsIgnoreCase("1")) {
+ _portProfile.status = true;
+ }
+ } else if ("max_ports".equalsIgnoreCase(currentNode)) {
+ // Has the profile been enabled.
+ _portProfile.maxPorts = Integer.parseInt(value.trim());
+ }
+ }
+ }
+ } catch (DOMException e) {
+ s_logger.error("Error parsing the response : " + e.toString());
+ }
+ }
+
+ private void setProfileConfiguration(String value) {
+ StringTokenizer tokens = new StringTokenizer(value.trim());
+ if (tokens.hasMoreTokens()) {
+ String currentToken = tokens.nextToken();
+ if ("switchport".equalsIgnoreCase(currentToken)) {
+ parseProfileMode(tokens);
+ } else if ("service-policy".equalsIgnoreCase(currentToken)) {
+ String ioType = tokens.nextToken();
+ if ("input".equalsIgnoreCase(ioType)) {
+ _portProfile.inputPolicyMap = tokens.nextToken();
+ } else if ("output".equalsIgnoreCase(ioType)) {
+ _portProfile.outputPolicyMap = tokens.nextToken();
+ }
+ }
+ }
+ }
+
+ private void parseProfileMode(StringTokenizer tokens) {
+ if (tokens.hasMoreTokens()) {
+ String firstToken = tokens.nextToken();
+ if ("mode".equalsIgnoreCase(firstToken)) {
+ setPortMode(tokens.nextToken());
+ } else if ("access".equalsIgnoreCase(firstToken)) {
+ if (tokens.hasMoreTokens()) {
+ String secondToken = tokens.nextToken();
+ assert ("vlan".equalsIgnoreCase(secondToken));
+ if (tokens.hasMoreTokens()) {
+ _portProfile.vlan = tokens.nextToken();
+ }
+ }
+ }
+ }
+ }
+
+ private void setPortMode(String value) {
+ // Set the mode for port profile.
+ if ("access".equalsIgnoreCase(value)) {
+ _portProfile.mode = SwitchPortMode.access;
+ } else if ("trunk".equalsIgnoreCase(value)) {
+ _portProfile.mode = SwitchPortMode.trunk;
+ } else if ("privatevlanhost".equalsIgnoreCase(value)) {
+ _portProfile.mode = SwitchPortMode.privatevlanhost;
+ } else if ("privatevlanpromiscuous".equalsIgnoreCase(value)) {
+ _portProfile.mode = SwitchPortMode.privatevlanpromiscuous;
+ }
+ }
+
+ private void setPortBinding(String value) {
+ // Set the binding type for the port profile.
+ if ("static".equalsIgnoreCase(value)) {
+ _portProfile.binding = BindingType.portbindingstatic;
+ } else if ("dynamic".equalsIgnoreCase(value)) {
+ _portProfile.binding = BindingType.portbindingdynamic;
+ } else if ("ephermal".equalsIgnoreCase(value)) {
+ _portProfile.binding = BindingType.portbindingephermal;
+ }
+ }
+
+ private void setPortType(String value) {
+ // Set the type field (vethernet/ethernet).
+ if ("vethernet".equalsIgnoreCase(value)) {
+ _portProfile.type = PortProfileType.vethernet;
+ } else if ("ethernet".equalsIgnoreCase(value)) {
+ _portProfile.type = PortProfileType.ethernet;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmResponse.java
----------------------------------------------------------------------
diff --git a/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmResponse.java b/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmResponse.java
new file mode 100644
index 0000000..d82b0dc
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/cisco/n1kv/vsm/VsmResponse.java
@@ -0,0 +1,222 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.utils.cisco.n1kv.vsm;
+
+import java.io.IOException;
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSSerializer;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+public abstract class VsmResponse {
+
+ // Following error tags, error types and severity have been taken from RFC 4741.
+ public enum ErrorTag {
+ InUse, // in-use
+ InvalidValue, // invalid-value
+ TooBig, // too-big
+ MissingAttribute, // missing-attribute
+ BadAttribute, // bad-attribute
+ UnknownAttribute, // unknown-attribute
+ MissingElement, // missing-element
+ BadElement, // bad-element
+ UnknownElement, // unknown-element
+ UnknownNamespace, // unknown-namespace
+ AccessDenied, // access-denied
+ LockDenied, // lock-denied
+ ResourceDenied, // resource-denied
+ RollbackFailed, // rollback-failed
+ DataExists, // data-exists
+ DataMissing, // data-missing
+ OperationNotSupported, // operation-not-supported
+ OperationFailed, // operation-failed
+ PartialOperation, // partial-operation
+ }
+
+ public enum ErrorType {
+ transport, rpc, protocol, application;
+ }
+
+ public enum ErrorSeverity {
+ error, warning;
+ }
+
+ private static final Logger s_logger = Logger.getLogger(VsmResponse.class);
+
+ protected String _xmlResponse;
+ protected Document _docResponse;
+ protected boolean _responseOk;
+
+ protected ErrorTag _tag;
+ protected ErrorType _type;
+ protected ErrorSeverity _severity;
+ protected String _path;
+ protected String _message;
+ protected String _info;
+
+ VsmResponse(String response) {
+ _xmlResponse = response;
+ _responseOk = false;
+ _tag = ErrorTag.InUse;
+ _type = ErrorType.rpc;
+ _severity = ErrorSeverity.error;
+ _docResponse = null;
+ }
+
+ protected void initialize() {
+ try {
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ docFactory.setNamespaceAware(true);
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ _docResponse = docBuilder.parse(new InputSource(new StringReader(_xmlResponse)));
+ if (_docResponse != null) {
+ parse(_docResponse.getDocumentElement());
+ }
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error parsing the response : " + e.toString());
+ } catch (SAXException e) {
+ s_logger.error("Error parsing the response : " + e.toString());
+ } catch (IOException e) {
+ s_logger.error("Error parsing the response : " + e.toString());
+ }
+ }
+
+ public boolean isResponseOk() {
+ return _responseOk;
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer error = new StringBuffer("");
+
+ error.append(" Severity: " + _severity).append(", Error code: " + _tag).append(", Error type: " + _type);
+
+ if (_message != null) {
+ error.append(", Error Message: " + _message);
+ }
+
+ if (_info != null) {
+ error.append(", Error info: " + _info);
+ }
+
+ if (_path != null) {
+ error.append(", Path: " + _path);
+ }
+
+ return error.toString();
+ }
+
+ protected abstract void parse(Element root);
+
+ protected void parseError(Node element) {
+ Element rpcError = (Element)element;
+
+ try {
+ assert (rpcError.getNodeName().equalsIgnoreCase("nf:rpc-error"));
+ for (Node node = rpcError.getFirstChild(); node != null; node = node.getNextSibling()) {
+ if (node.getNodeName().equalsIgnoreCase("nf:error-type")) {
+ _type = ErrorType.valueOf(node.getTextContent().trim());
+ } else if (node.getNodeName().equalsIgnoreCase("nf:error-tag")) {
+ _tag = getErrorTag(node.getTextContent().trim());
+ } else if (node.getNodeName().equalsIgnoreCase("nf:error-severity")) {
+ _severity = ErrorSeverity.valueOf(node.getTextContent().trim());
+ } else if (node.getNodeName().equalsIgnoreCase("nf:error-path")) {
+ _path = node.getTextContent();
+ } else if (node.getNodeName().equalsIgnoreCase("nf:error-message")) {
+ _message = node.getTextContent();
+ } else if (node.getNodeName().equalsIgnoreCase("nf:error-info")) {
+ _info = node.getTextContent();
+ }
+ }
+ } catch (DOMException e) {
+ s_logger.error("Error parsing the response : " + e.toString());
+ }
+ }
+
+ protected ErrorTag getErrorTag(String tagText) {
+ ErrorTag tag = ErrorTag.InUse;
+
+ if (tagText.equals("in-use")) {
+ tag = ErrorTag.InUse;
+ } else if (tagText.equals("invalid-value")) {
+ tag = ErrorTag.InvalidValue;
+ } else if (tagText.equals("too-big")) {
+ tag = ErrorTag.TooBig;
+ } else if (tagText.equals("missing-attribute")) {
+ tag = ErrorTag.MissingAttribute;
+ } else if (tagText.equals("bad-attribute")) {
+ tag = ErrorTag.BadAttribute;
+ } else if (tagText.equals("unknown-attribute")) {
+ tag = ErrorTag.UnknownAttribute;
+ } else if (tagText.equals("missing-element")) {
+ tag = ErrorTag.MissingElement;
+ } else if (tagText.equals("bad-element")) {
+ tag = ErrorTag.BadElement;
+ } else if (tagText.equals("unknown-element")) {
+ tag = ErrorTag.UnknownElement;
+ } else if (tagText.equals("unknown-namespace")) {
+ tag = ErrorTag.UnknownNamespace;
+ } else if (tagText.equals("access-denied")) {
+ tag = ErrorTag.AccessDenied;
+ } else if (tagText.equals("lock-denied")) {
+ tag = ErrorTag.LockDenied;
+ } else if (tagText.equals("resource-denied")) {
+ tag = ErrorTag.ResourceDenied;
+ } else if (tagText.equals("rollback-failed")) {
+ tag = ErrorTag.RollbackFailed;
+ } else if (tagText.equals("data-exists")) {
+ tag = ErrorTag.DataExists;
+ } else if (tagText.equals("data-missing")) {
+ tag = ErrorTag.DataMissing;
+ } else if (tagText.equals("operation-not-supported")) {
+ tag = ErrorTag.OperationNotSupported;
+ } else if (tagText.equals("operation-failed")) {
+ tag = ErrorTag.OperationFailed;
+ } else if (tagText.equals("partial-operation")) {
+ tag = ErrorTag.PartialOperation;
+ }
+
+ return tag;
+ }
+
+ // Helper routine to check for the response received.
+ protected void printResponse() {
+ try {
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ DOMImplementationLS ls = (DOMImplementationLS)docBuilder.getDOMImplementation();
+ LSSerializer lss = ls.createLSSerializer();
+ System.out.println(lss.writeToString(_docResponse));
+ } catch (ParserConfigurationException e) {
+ s_logger.error("Error parsing the repsonse : " + e.toString());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/main/java/com/cloud/utils/component/Adapter.java
----------------------------------------------------------------------
diff --git a/utils/src/main/java/com/cloud/utils/component/Adapter.java b/utils/src/main/java/com/cloud/utils/component/Adapter.java
new file mode 100644
index 0000000..d50b8d9
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/component/Adapter.java
@@ -0,0 +1,27 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.utils.component;
+
+/**
+ * Adapter defines methods for pluggable code within the Cloud Stack. An
+ * Adapters are a departure from regular structured programming.
+ */
+public interface Adapter extends ComponentLifecycle {
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/main/java/com/cloud/utils/component/AdapterBase.java
----------------------------------------------------------------------
diff --git a/utils/src/main/java/com/cloud/utils/component/AdapterBase.java b/utils/src/main/java/com/cloud/utils/component/AdapterBase.java
new file mode 100644
index 0000000..703b532
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/component/AdapterBase.java
@@ -0,0 +1,40 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.utils.component;
+
+import java.util.List;
+
+// Typical Adapter implementation.
+public class AdapterBase extends ComponentLifecycleBase implements Adapter, ComponentMethodInterceptable {
+
+ public AdapterBase() {
+ super();
+ // set default run level for adapter components
+ setRunLevel(ComponentLifecycle.RUN_LEVEL_COMPONENT);
+ }
+
+ public static <T extends Adapter> T getAdapterByName(List<T> adapters, String name) {
+ for (T adapter : adapters) {
+ if (adapter.getName() != null && adapter.getName().equalsIgnoreCase(name))
+ return adapter;
+ }
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/main/java/com/cloud/utils/component/AdapterList.java
----------------------------------------------------------------------
diff --git a/utils/src/main/java/com/cloud/utils/component/AdapterList.java b/utils/src/main/java/com/cloud/utils/component/AdapterList.java
new file mode 100644
index 0000000..dad3391
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/component/AdapterList.java
@@ -0,0 +1,37 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.utils.component;
+
+import java.util.List;
+
+public class AdapterList<T extends Adapter> {
+ protected List<T> adapters;
+
+ public AdapterList() {
+ }
+
+ public List<T> getAdapters() {
+ return adapters;
+ }
+
+ public void setAdapters(List<T> adapters) {
+ this.adapters = adapters;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/main/java/com/cloud/utils/component/ComponentContext.java
----------------------------------------------------------------------
diff --git a/utils/src/main/java/com/cloud/utils/component/ComponentContext.java b/utils/src/main/java/com/cloud/utils/component/ComponentContext.java
new file mode 100644
index 0000000..8948b27
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/component/ComponentContext.java
@@ -0,0 +1,282 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.utils.component;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MalformedObjectNameException;
+import javax.management.NotCompliantMBeanException;
+import javax.naming.ConfigurationException;
+
+import org.apache.log4j.Logger;
+import org.springframework.aop.framework.Advised;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.annotation.Primary;
+
+import com.cloud.utils.mgmt.JmxUtil;
+import com.cloud.utils.mgmt.ManagementBean;
+
+/**
+ *
+ * ComponentContext.setApplication() and ComponentContext.getApplication()
+ * are not recommended to be used outside, they exist to help wire Spring Framework
+ *
+ */
+@SuppressWarnings("unchecked")
+public class ComponentContext implements ApplicationContextAware {
+ private static final Logger s_logger = Logger.getLogger(ComponentContext.class);
+
+ private static ApplicationContext s_appContext;
+ private static Map<Class<?>, ApplicationContext> s_appContextDelegates;
+ private static boolean s_initializeBeans = true;
+
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) {
+ s_logger.info("Setup Spring Application context");
+ s_appContext = applicationContext;
+ }
+
+ public static ApplicationContext getApplicationContext() {
+ return s_appContext;
+ }
+
+ public static void initComponentsLifeCycle() {
+ if (!s_initializeBeans)
+ return;
+
+ AutowireCapableBeanFactory beanFactory = s_appContext.getAutowireCapableBeanFactory();
+
+ Map<String, ComponentMethodInterceptable> interceptableComponents = getApplicationContext().getBeansOfType(ComponentMethodInterceptable.class);
+ for (Map.Entry<String, ComponentMethodInterceptable> entry : interceptableComponents.entrySet()) {
+ Object bean = getTargetObject(entry.getValue());
+ beanFactory.configureBean(bean, entry.getKey());
+ }
+
+ Map<String, ComponentLifecycle> lifecycleComponents = getApplicationContext().getBeansOfType(ComponentLifecycle.class);
+
+ Map<String, ComponentLifecycle>[] classifiedComponents = new Map[ComponentLifecycle.MAX_RUN_LEVELS];
+ for (int i = 0; i < ComponentLifecycle.MAX_RUN_LEVELS; i++) {
+ classifiedComponents[i] = new HashMap<String, ComponentLifecycle>();
+ }
+
+ for (Map.Entry<String, ComponentLifecycle> entry : lifecycleComponents.entrySet()) {
+ classifiedComponents[entry.getValue().getRunLevel()].put(entry.getKey(), entry.getValue());
+ }
+
+ // Run the SystemIntegrityCheckers first
+ Map<String, SystemIntegrityChecker> integrityCheckers = getApplicationContext().getBeansOfType(SystemIntegrityChecker.class);
+ for (Entry<String, SystemIntegrityChecker> entry : integrityCheckers.entrySet()) {
+ s_logger.info("Running SystemIntegrityChecker " + entry.getKey());
+ try {
+ entry.getValue().check();
+ } catch (Throwable e) {
+ s_logger.error("System integrity check failed. Refuse to startup", e);
+ System.exit(1);
+ }
+ }
+
+ // configuration phase
+ Map<String, String> avoidMap = new HashMap<String, String>();
+ for (int i = 0; i < ComponentLifecycle.MAX_RUN_LEVELS; i++) {
+ for (Map.Entry<String, ComponentLifecycle> entry : classifiedComponents[i].entrySet()) {
+ ComponentLifecycle component = entry.getValue();
+ String implClassName = ComponentContext.getTargetClass(component).getName();
+ s_logger.info("Configuring " + implClassName);
+
+ if (avoidMap.containsKey(implClassName)) {
+ s_logger.info("Skip configuration of " + implClassName + " as it is already configured");
+ continue;
+ }
+
+ try {
+ component.configure(component.getName(), component.getConfigParams());
+ } catch (ConfigurationException e) {
+ s_logger.error("Unhandled exception", e);
+ throw new RuntimeException("Unable to configure " + implClassName, e);
+ }
+
+ avoidMap.put(implClassName, implClassName);
+ }
+ }
+
+ // starting phase
+ avoidMap.clear();
+ for (int i = 0; i < ComponentLifecycle.MAX_RUN_LEVELS; i++) {
+ for (Map.Entry<String, ComponentLifecycle> entry : classifiedComponents[i].entrySet()) {
+ ComponentLifecycle component = entry.getValue();
+ String implClassName = ComponentContext.getTargetClass(component).getName();
+ s_logger.info("Starting " + implClassName);
+
+ if (avoidMap.containsKey(implClassName)) {
+ s_logger.info("Skip configuration of " + implClassName + " as it is already configured");
+ continue;
+ }
+
+ try {
+ component.start();
+
+ if (getTargetObject(component) instanceof ManagementBean)
+ registerMBean((ManagementBean)getTargetObject(component));
+ } catch (Exception e) {
+ s_logger.error("Unhandled exception", e);
+ throw new RuntimeException("Unable to start " + implClassName, e);
+ }
+
+ avoidMap.put(implClassName, implClassName);
+ }
+ }
+ }
+
+ static void registerMBean(ManagementBean mbean) {
+ try {
+ JmxUtil.registerMBean(mbean);
+ } catch (MalformedObjectNameException e) {
+ s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
+ } catch (InstanceAlreadyExistsException e) {
+ s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
+ } catch (MBeanRegistrationException e) {
+ s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
+ } catch (NotCompliantMBeanException e) {
+ s_logger.warn("Unable to register MBean: " + mbean.getName(), e);
+ }
+ s_logger.info("Registered MBean: " + mbean.getName());
+ }
+
+ public static <T> T getComponent(String name) {
+ assert (s_appContext != null);
+ return (T)s_appContext.getBean(name);
+ }
+
+ public static <T> T getComponent(Class<T> beanType) {
+ assert (s_appContext != null);
+ Map<String, T> matchedTypes = getComponentsOfType(beanType);
+ if (matchedTypes.size() > 0) {
+ for (Map.Entry<String, T> entry : matchedTypes.entrySet()) {
+ Primary primary = getTargetClass(entry.getValue()).getAnnotation(Primary.class);
+ if (primary != null)
+ return entry.getValue();
+ }
+
+ if (matchedTypes.size() > 1) {
+ s_logger.warn("Unable to uniquely locate bean type " + beanType.getName());
+ for (Map.Entry<String, T> entry : matchedTypes.entrySet()) {
+ s_logger.warn("Candidate " + getTargetClass(entry.getValue()).getName());
+ }
+ }
+
+ return (T)matchedTypes.values().toArray()[0];
+ }
+
+ throw new NoSuchBeanDefinitionException(beanType.getName());
+ }
+
+ public static <T> Map<String, T> getComponentsOfType(Class<T> beanType) {
+ return s_appContext.getBeansOfType(beanType);
+ }
+
+ public static Class<?> getTargetClass(Object instance) {
+ while (instance instanceof Advised) {
+ try {
+ instance = ((Advised)instance).getTargetSource().getTarget();
+ } catch (Exception e) {
+ return instance.getClass();
+ }
+ }
+ return instance.getClass();
+ }
+
+ public static <T> T getTargetObject(Object instance) {
+ while (instance instanceof Advised) {
+ try {
+ instance = ((Advised)instance).getTargetSource().getTarget();
+ } catch (Exception e) {
+ return (T)instance;
+ }
+ }
+
+ return (T)instance;
+ }
+
+ public static <T> T inject(Class<T> clz) {
+ T instance;
+ try {
+ instance = clz.newInstance();
+ return inject(instance);
+ } catch (InstantiationException e) {
+ s_logger.error("Unhandled InstantiationException", e);
+ throw new RuntimeException("Unable to instantiate object of class " + clz.getName() + ", make sure it has public constructor");
+ } catch (IllegalAccessException e) {
+ s_logger.error("Unhandled IllegalAccessException", e);
+ throw new RuntimeException("Unable to instantiate object of class " + clz.getName() + ", make sure it has public constructor");
+ }
+ }
+
+ public static <T> T inject(Object instance) {
+ // autowire dynamically loaded object
+ AutowireCapableBeanFactory beanFactory = getApplicationContext(instance).getAutowireCapableBeanFactory();
+ beanFactory.autowireBean(instance);
+ return (T)instance;
+ }
+
+ private static ApplicationContext getApplicationContext(Object instance) {
+ ApplicationContext result = null;
+
+ synchronized (s_appContextDelegates) {
+ if (instance != null && s_appContextDelegates != null) {
+ result = s_appContextDelegates.get(instance.getClass());
+ }
+ }
+
+ return result == null ? s_appContext : result;
+ }
+
+ public static synchronized void addDelegateContext(Class<?> clazz, ApplicationContext context) {
+ if (s_appContextDelegates == null) {
+ s_appContextDelegates = new HashMap<Class<?>, ApplicationContext>();
+ }
+
+ s_appContextDelegates.put(clazz, context);
+ }
+
+ public static synchronized void removeDelegateContext(Class<?> clazz) {
+ if (s_appContextDelegates != null) {
+ s_appContextDelegates.remove(clazz);
+ }
+ }
+
+ public boolean isInitializeBeans() {
+ return s_initializeBeans;
+ }
+
+ public void setInitializeBeans(boolean initializeBeans) {
+ initInitializeBeans(initializeBeans);
+ }
+
+ private static synchronized void initInitializeBeans(boolean initializeBeans) {
+ s_initializeBeans = initializeBeans;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/main/java/com/cloud/utils/component/ComponentInstantiationPostProcessor.java
----------------------------------------------------------------------
diff --git a/utils/src/main/java/com/cloud/utils/component/ComponentInstantiationPostProcessor.java b/utils/src/main/java/com/cloud/utils/component/ComponentInstantiationPostProcessor.java
new file mode 100644
index 0000000..6704371
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/component/ComponentInstantiationPostProcessor.java
@@ -0,0 +1,149 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+
+package com.cloud.utils.component;
+
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.cglib.proxy.Callback;
+import net.sf.cglib.proxy.CallbackFilter;
+import net.sf.cglib.proxy.Enhancer;
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+import net.sf.cglib.proxy.NoOp;
+
+import org.apache.log4j.Logger;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.PropertyValues;
+import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
+
+import com.cloud.utils.Pair;
+
+public class ComponentInstantiationPostProcessor implements InstantiationAwareBeanPostProcessor {
+ private static final Logger s_logger = Logger.getLogger(ComponentInstantiationPostProcessor.class);
+
+ private List<ComponentMethodInterceptor> _interceptors = new ArrayList<ComponentMethodInterceptor>();
+ private Callback[] _callbacks;
+ private CallbackFilter _callbackFilter;
+
+ public ComponentInstantiationPostProcessor() {
+ _callbacks = new Callback[2];
+ _callbacks[0] = NoOp.INSTANCE;
+ _callbacks[1] = new InterceptorDispatcher();
+
+ _callbackFilter = new InterceptorFilter();
+ }
+
+ public List<ComponentMethodInterceptor> getInterceptors() {
+ return _interceptors;
+ }
+
+ public void setInterceptors(List<ComponentMethodInterceptor> interceptors) {
+ _interceptors = interceptors;
+ }
+
+ private Callback[] getCallbacks() {
+ return _callbacks;
+ }
+
+ private CallbackFilter getCallbackFilter() {
+ return _callbackFilter;
+ }
+
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+ return bean;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+ return bean;
+ }
+
+ @Override
+ public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
+ if (_interceptors != null && _interceptors.size() > 0) {
+ if (ComponentMethodInterceptable.class.isAssignableFrom(beanClass)) {
+ Enhancer enhancer = new Enhancer();
+ enhancer.setSuperclass(beanClass);
+ enhancer.setCallbacks(getCallbacks());
+ enhancer.setCallbackFilter(getCallbackFilter());
+ enhancer.setNamingPolicy(ComponentNamingPolicy.INSTANCE);
+
+ Object bean = enhancer.create();
+ return bean;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
+ return true;
+ }
+
+ @Override
+ public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
+ return pvs;
+ }
+
+ protected class InterceptorDispatcher implements MethodInterceptor {
+ @Override
+ public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
+ ArrayList<Pair<ComponentMethodInterceptor, Object>> interceptors = new ArrayList<Pair<ComponentMethodInterceptor, Object>>();
+
+ for (ComponentMethodInterceptor interceptor : getInterceptors()) {
+ if (interceptor.needToIntercept(method)) {
+ Object objReturnedInInterceptStart = interceptor.interceptStart(method, target);
+ interceptors.add(new Pair<ComponentMethodInterceptor, Object>(interceptor, objReturnedInInterceptStart));
+ }
+ }
+ boolean success = false;
+ try {
+ Object obj = methodProxy.invokeSuper(target, args);
+ success = true;
+ return obj;
+ } finally {
+ for (Pair<ComponentMethodInterceptor, Object> interceptor : interceptors) {
+ if (success) {
+ interceptor.first().interceptComplete(method, target, interceptor.second());
+ } else {
+ interceptor.first().interceptException(method, target, interceptor.second());
+ }
+ }
+ }
+ }
+ }
+
+ protected class InterceptorFilter implements CallbackFilter {
+ @Override
+ public int accept(Method method) {
+ for (ComponentMethodInterceptor interceptor : getInterceptors()) {
+
+ if (interceptor.needToIntercept(method)) {
+ return 1;
+ }
+ }
+ return 0;
+ }
+ }
+}