Add a Polatis NETCONF driver
Change-Id: Iecfe8df9d656bebbe82bf01bcaf185a77ccd26d8
diff --git a/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisNetconfUtility.java b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisNetconfUtility.java
new file mode 100644
index 0000000..8a6b89a
--- /dev/null
+++ b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisNetconfUtility.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright 2017 Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.drivers.polatis.netconf;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.onosproject.drivers.utilities.XmlConfigParser;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.netconf.DatastoreId;
+import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+
+import org.slf4j.Logger;
+
+import java.util.List;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Netconf utility for polatis netconf drivers.
+ */
+public final class PolatisNetconfUtility {
+
+ public static final String KEY_XMLNS = "xmlns=\"http://www.polatis.com/yang/optical-switch\"";
+ public static final String KEY_DATA = "data";
+ public static final String KEY_PORT = "port";
+ public static final String KEY_PORTID = "port-id";
+ public static final String KEY_PORTCONFIG = "port-config";
+ public static final String KEY_CONNS = "cross-connects";
+ public static final String KEY_PRODINF = "product-information";
+ public static final String KEY_PORTCONFIG_XMLNS = String.format("%s %s", KEY_PORTCONFIG, KEY_XMLNS);
+ public static final String KEY_CONNS_XMLNS = String.format("%s %s", KEY_CONNS, KEY_XMLNS);
+ public static final String KEY_PRODINF_XMLNS = String.format("%s %s", KEY_PRODINF, KEY_XMLNS);
+ public static final String KEY_DATA_CONNS = String.format("%s.%s", KEY_DATA, KEY_CONNS);
+ public static final String KEY_DATA_PRODINF = String.format("%s.%s", KEY_DATA, KEY_PRODINF);
+ public static final String KEY_DATA_PORTCONFIG = String.format("%s.%s.%s", KEY_DATA, KEY_PORTCONFIG, KEY_PORT);
+ public static final String KEY_OPM = "opm-power";
+ public static final String KEY_OPM_XMLNS = String.format("%s %s", KEY_OPM, KEY_XMLNS);
+ public static final String KEY_POWER = "power";
+ public static final String KEY_DATA_OPM_PORT = String.format("%s.%s.%s", KEY_DATA, KEY_OPM, KEY_PORT);
+ public static final String OPTICAL_CAPABILITY_PREFIX
+ = "http://www.polatis.com/yang/optical-switch?module=optical-switch&revision=";
+
+ private static final Logger log = getLogger(PolatisFlowRuleProgrammable.class);
+
+ private PolatisNetconfUtility() {
+ }
+
+ /**
+ * Retrieves session reply information for get operation.
+ *
+ * @param handler parent driver handler
+ * @param filter the filter string of xml content
+ * @return the reply string
+ */
+ public static String netconfGet(DriverHandler handler, String filter) {
+ NetconfSession session = getNetconfSession(handler);
+ String reply;
+ try {
+ reply = session.get(filter, null);
+ } catch (NetconfException e) {
+ throw new RuntimeException(new NetconfException("Failed to retrieve configuration.", e));
+ }
+ return reply;
+ }
+
+ /**
+ * Retrieves session reply information for get config operation.
+ *
+ * @param handler parent driver handler
+ * @param filter the filter string of xml content
+ * @return the reply string
+ */
+ public static String netconfGetConfig(DriverHandler handler, String filter) {
+ NetconfSession session = getNetconfSession(handler);
+ String reply;
+ try {
+ reply = session.getConfig(DatastoreId.RUNNING, filter);
+ } catch (NetconfException e) {
+ throw new RuntimeException(new NetconfException("Failed to retrieve configuration.", e));
+ }
+ return reply;
+ }
+
+ /**
+ * Retrieves session reply information for edit config operation.
+ *
+ * @param handler parent driver handler
+ * @param mode selected mode to change the configuration
+ * @param cfg the new configuration to be set
+ * @return the reply string
+ */
+ public static boolean netconfEditConfig(DriverHandler handler, String mode, String cfg) {
+ NetconfSession session = getNetconfSession(handler);
+ boolean reply = false;
+ try {
+ reply = session.editConfig(DatastoreId.RUNNING, mode, cfg);
+ } catch (NetconfException e) {
+ throw new RuntimeException(new NetconfException("Failed to edit configuration.", e));
+ }
+ return reply;
+ }
+
+ /**
+ * Retrieves specified node hierarchical configuration from the xml information.
+ *
+ * @param content the xml information
+ * @param key the configuration key node
+ * @return the hierarchical configuration, null if exception happens
+ */
+ public static HierarchicalConfiguration configAt(String content, String key) {
+ HierarchicalConfiguration info;
+ try {
+ HierarchicalConfiguration cfg = XmlConfigParser.loadXmlString(content);
+ info = cfg.configurationAt(key);
+ } catch (IllegalArgumentException e) {
+ // Accept null for information polling
+ return null;
+ }
+ return info;
+ }
+
+ /**
+ * Retrieves specified node hierarchical configurations from the xml information.
+ *
+ * @param content the xml information
+ * @param key the configuration key node
+ * @return the hierarchical configurations, empty if exception happens
+ */
+ public static List<HierarchicalConfiguration> configsAt(String content, String key) {
+ List<HierarchicalConfiguration> info;
+ try {
+ HierarchicalConfiguration cfg = XmlConfigParser.loadXmlString(content);
+ info = cfg.configurationsAt(key);
+ } catch (IllegalArgumentException e) {
+ // Accept empty for information polling
+ return ImmutableList.of();
+ }
+ return info;
+ }
+
+ /**
+ * Makes a xml format sentence.
+ *
+ * @param node the node name
+ * @param content the node content
+ * @return the xml format sentence
+ */
+ public static String xml(String node, String content) {
+ return String.format("<%s>%s</%s>", node, content, node);
+ }
+
+ /**
+ * Makes a xml format open tag.
+ *
+ * @param node the node name
+ * @return the xml head format string
+ */
+ public static String xmlOpen(String node) {
+ return String.format("<%s>", node);
+ }
+
+ /**
+ * Makes a xml format close tag.
+ *
+ * @param node the node name
+ * @return the xml end format string
+ */
+ public static String xmlClose(String node) {
+ return String.format("</%s>", node);
+ }
+
+ /**
+ * Makes a xml format empty tag.
+ *
+ * @param node the node name
+ * @return the xml format of empty tag
+ */
+ public static String xmlEmpty(String node) {
+ return String.format("<%s/>", node);
+ }
+
+ public static String opticalRevision(DriverHandler handler) {
+ NetconfSession session = getNetconfSession(handler);
+ Set<String> capabilities = session.getDeviceCapabilitiesSet();
+ for (String c : capabilities) {
+ if (c.startsWith(OPTICAL_CAPABILITY_PREFIX)) {
+ return c.substring(OPTICAL_CAPABILITY_PREFIX.length());
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns the NETCONF session of the device.
+ *
+ * @return session
+ */
+ private static NetconfSession getNetconfSession(DriverHandler handler) {
+ NetconfController controller = checkNotNull(handler.get(NetconfController.class));
+ NetconfSession session = controller.getNetconfDevice(handler.data().deviceId()).getSession();
+ if (session == null) {
+ throw new RuntimeException(new NetconfException("Failed to retrieve the netconf device."));
+ }
+ return session;
+ }
+}