Nikhil Cheerla
Committed by Gerrit Code Review

OECFG (onos-oecfg) completely removed

Change-Id: Id44f58c0402cfdb0fedd91d8a3479cc817f2b4a4
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2014 Open Networking Laboratory
~
~ 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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.onosproject</groupId>
<artifactId>onos-apps</artifactId>
<version>1.3.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>onos-app-oecfg</artifactId>
<packaging>jar</packaging>
<description>Standalone utility for converting ONOS JSON config to OE-Linc JSON config</description>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>org.onosproject.oecfg.OELinkConfig</Main-Class>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
/*
* Copyright 2014 Open Networking Laboratory
*
* 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.oecfg;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* Utility program to convert standard ONOS config JSON to format expected
* by the OE Link switch.
*/
public final class OELinkConfig {
private ObjectMapper mapper = new ObjectMapper();
private Map<String, String> dpidToName = new HashMap<>();
public static void main(String[] args) {
try {
OELinkConfig config = new OELinkConfig();
JsonNode json = config.convert(System.in);
System.out.println(json.toString());
} catch (IOException e) {
System.err.println("Unable to convert JSON due to: " + e.getMessage());
e.printStackTrace();
}
}
private OELinkConfig() {
}
private JsonNode convert(InputStream input) throws IOException {
JsonNode json = mapper.readTree(input);
ObjectNode result = mapper.createObjectNode();
result.set("switchConfig", opticalSwitches(json));
result.set("linkConfig", opticalLinks(json));
return result;
}
private JsonNode opticalSwitches(JsonNode json) {
ArrayNode result = mapper.createArrayNode();
for (JsonNode node : json.get("devices")) {
String dpid = dpid(node.path("uri"));
String name = node.path("name").asText("none");
dpidToName.put(dpid, name);
if (node.path("type").asText("none").equals("ROADM")) {
result.add(opticalSwitch(dpid, name, (ObjectNode) node));
}
}
return result;
}
private ObjectNode opticalSwitch(String dpid, String name, ObjectNode node) {
ObjectNode result = mapper.createObjectNode();
ObjectNode annot = (ObjectNode) node.path("annotations");
result.put("allowed", true).put("type", "Roadm")
.put("name", name).put("nodeDpid", dpid)
.put("latitude", annot.path("latitude").asDouble(0.0))
.put("longitude", annot.path("longitude").asDouble(0.0))
.set("params", switchParams(annot));
return result;
}
private ObjectNode switchParams(ObjectNode annot) {
return mapper.createObjectNode()
.put("numRegen", annot.path("optical.regens").asInt(0));
}
private JsonNode opticalLinks(JsonNode json) {
ArrayNode result = mapper.createArrayNode();
for (JsonNode node : json.get("links")) {
if (node.path("type").asText("none").equals("OPTICAL")) {
result.add(opticalLink((ObjectNode) node));
}
}
return result;
}
private ObjectNode opticalLink(ObjectNode node) {
ObjectNode result = mapper.createObjectNode();
ObjectNode annot = (ObjectNode) node.path("annotations");
String src = dpid(node.path("src"));
String dst = dpid(node.path("dst"));
result.put("allowed", true).put("type", linkType(annot))
.put("nodeDpid1", src).put("nodeDpid2", dst)
.set("params", linkParams(src, dst, node, annot));
return result;
}
private String linkType(ObjectNode annot) {
return annot.path("optical.type").asText("cross-connect").equals("WDM") ?
"wdmLink" : "pktOptLink";
}
private ObjectNode linkParams(String src, String dst,
ObjectNode node, ObjectNode annot) {
ObjectNode result = mapper.createObjectNode()
.put("nodeName1", dpidToName.get(src))
.put("nodeName2", dpidToName.get(dst))
.put("port1", port(node.path("src")))
.put("port2", port(node.path("dst")));
if (annot.has("bandwidth")) {
result.put("bandwidth", annot.path("bandwidth").asInt());
}
if (annot.has("optical.waves")) {
result.put("numWaves", annot.path("optical.waves").asInt());
}
return result;
}
private String dpid(JsonNode node) {
String s = node.asText("of:0000000000000000").substring(3);
return s.substring(0, 2) + ":" + s.substring(2, 4) + ":" +
s.substring(4, 6) + ":" + s.substring(6, 8) + ":" +
s.substring(8, 10) + ":" + s.substring(10, 12) + ":" +
s.substring(12, 14) + ":" + s.substring(14, 16);
}
private int port(JsonNode node) {
return Integer.parseInt(node.asText("of:0000000000000000/0").substring(20));
}
}
......@@ -41,7 +41,6 @@
<module>sdnip</module>
<module>optical</module>
<module>metrics</module>
<module>oecfg</module>
<module>routing</module>
<module>routing-api</module>
<module>reactive-routing</module>
......
......@@ -366,11 +366,17 @@ class LINCSwitch(OpticalSwitch):
with open('Topology.json', 'w') as outfile:
json.dump(opticalJSON, outfile, indent=4, separators=(',', ': '))
info('*** Converting Topology.json to linc-oe format (TopoConfig.json) file\n')
output = quietRun('%s/tools/test/bin/onos-oecfg ./Topology.json > TopoConfig.json' % LINCSwitch.onosDir, shell=True)
if output:
error('***ERROR: Error creating topology file: %s ' % output + '\n')
return False
info('*** Converting Topology.json to linc-oe format (TopoConfig.json) file (no oecfg) \n')
topoConfigJson = {};
dpIdToName = {};
topoConfigJson["switchConfig"] = getSwitchConfig(dpIdToName);
topoConfigJson["linkConfig"] = getLinkConfig(dpIdToName);
#Writing to TopoConfig.json
with open( 'TopoConfig.json', 'w' ) as outfile:
json.dump( topoConfigJson, outfile, indent=4, separators=(',', ': ') )
info('*** Creating sys.config...\n')
output = quietRun('%s/config_generator TopoConfig.json %s/sys.config.template %s %s'
......@@ -452,6 +458,87 @@ class LINCSwitch(OpticalSwitch):
if output.strip('{}'):
warn('***WARNING: Could not push topology file to ONOS: %s\n' % output)
#converts node ids to linc-oe format, with colons every two chars
def dpId(id):
nodeDpid = ""
id = id.split("/", 1)[0]
for i in range(3, len(id) - 1, 2):
nodeDpid += (id[i:(i + 2):]) + ":"
return nodeDpid[0:(len(nodeDpid) - 1)];
def getSwitchConfig (dpIdToName):
switchConfig = [];
#Iterate through all switches and convert the ROADM switches to linc-oe format
for switch in opticalJSON["devices"]:
if switch.get("type", "none") == "ROADM":
builtSwitch = {}
#set basic switch params based on annotations
builtSwitch["allowed"] = True;
builtSwitch["latitude"] = switch["annotations"].get("latitude", 0.0);
builtSwitch["longitude"] = switch["annotations"].get("longitude", 0.0);
#assumed that all switches have this entry
nodeId = switch["uri"]
#convert the nodeId to linc-oe format
nodeDpid = dpId(nodeId);
builtSwitch["name"] = switch.get("name", "none");
#keep track of the name corresponding to each switch dpid
dpIdToName[nodeDpid] = builtSwitch["name"];
builtSwitch["nodeDpid"] = nodeDpid
#set switch params and type
builtSwitch["params"] = {};
builtSwitch["params"]["numregens"] = switch["annotations"].get("optical.regens", 0);
builtSwitch["type"] = "Roadm"
#append to list of switches
switchConfig.append(builtSwitch);
return switchConfig
def getLinkConfig (dpIdToName):
newLinkConfig = [];
#Iterate through all optical links and convert them to linc-oe format
for link in opticalJSON["links"]:
if link.get("type", "none") == "OPTICAL":
builtLink = {}
#set basic link params for src and dst
builtLink["allowed"] = True;
builtLink["nodeDpid1"] = dpId(link["src"])
builtLink["nodeDpid2"] = dpId(link["dst"])
#set more params such as name/bandwidth/port/waves if they exist
params = {}
params["nodeName1"] = dpIdToName.get(builtLink["nodeDpid1"], "none")
params["nodeName2"] = dpIdToName.get(builtLink["nodeDpid2"], "none")
params["port1"] = int(link["src"].split("/")[1])
params["port2"] = int(link["dst"].split("/")[1])
if "bandwidth" in link["annotations"]:
params["bandwidth"] = link["annotations"]["bandwidth"]
if "optical.waves" in link["annotations"]:
params["numWaves"] = link["annotations"]["optical.waves"]
builtLink["params"] = params
#set type of link (WDM or pktOpt)
if link["annotations"].get("optical.type", "cross-connect") == "WDM":
builtLink["type"] = "wdmLink"
else:
builtLink["type"] = "pktOptLink"
newLinkConfig.append(builtLink);
return newLinkConfig
@staticmethod
def waitStarted(net, timeout=TIMEOUT):
"wait until all tap interfaces are available"
......@@ -559,6 +646,8 @@ class LINCSwitch(OpticalSwitch):
def terminate(self):
pass
class LINCLink(Link):
"""
LINC link class
......