1 /*
\r * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.
\r *
\r * This program and the accompanying materials are made available under the
\r * terms of the Eclipse Public License v1.0 which accompanies this distribution,
\r * and is available at http://www.eclipse.org/legal/epl-v10.html
\r */
\r\rpackage org.opendaylight.nemo.renderer.cli.physicalnetwork;
\r\rimport com.fasterxml.jackson.databind.JsonNode;
\rimport com.fasterxml.jackson.databind.ObjectMapper;
\rimport com.google.common.collect.HashBasedTable;
\rimport com.google.common.collect.Table;
\rimport org.opendaylight.controller.md.sal.binding.api.DataBroker;
\rimport org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
\rimport org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
\rimport org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNodeInstance;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalPortInstance;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.instance.AttributeValueBuilder;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.host.instance.IpAddressesBuilder;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHost;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHostBuilder;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHostKey;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLinkBuilder;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeBuilder;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNodeKey;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPort;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPortBuilder;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.Attribute;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.AttributeBuilder;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.port.instance.AttributeKey;
\rimport org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.*;
\rimport org.slf4j.Logger;
\rimport org.slf4j.LoggerFactory;
\r\rimport java.io.IOException;
\rimport java.util.ArrayList;
\rimport java.util.HashMap;
\rimport java.util.List;
\r\rpublic class PhysicalResourceLoader {
\r\r private static final Logger log = LoggerFactory.getLogger(PhysicalResourceLoader.class);
\r\r public final static String NODE_PROPERTY = "etc/opendaylight/karaf/nemo-cli-renderer-node-resource.json";
\r public final static String LINK_PROPERTY = "etc/opendaylight/karaf/nemo-cli-renderer-link-resource.json";
\r public final static String EXTERNAL_NETWORK_PROPERTY = "etc/opendaylight/karaf/nemo-cli-renderer-external-resource.json";
\r public final static String HOST_PROPERTY = "etc/opendaylight/karaf/nemo-cli-renderer-host-resource.json";
\r\r private final static String NODES = "node";
\r private final static String NODE_ID = "node-id";
\r private final static String NODE_TYPE = "node-type";
\r\r private final static String PORTS = "port";
\r private final static String PORT_ID = "port-id";
\r private final static String PORT_TYPE = "port-type";
\r private final static String PORT_IP = "port-ip-address";
\r private final static String PORT_MAC = "port-mac-address";
\r private final static String PORT_MASK = "mask";
\r private final static String PORT_BANDWIDTH = "bandwidth";
\r\r private final static String LINKS = "link";
\r private final static String LINK_ID = "link-id";
\r private final static String SRC_NODE_ID = "left-node-id";
\r private final static String SRC_PORT_ID = "left-port-id";
\r private final static String DST_NODE_ID = "right-node-id";
\r private final static String DST_PORT_ID = "right-port-id";
\r private final static String BANDWIDTH = "link-bandwidth";
\r private final static String METRIC = "metric";
\r private final static String DELAY = "delay";
\r private final static String LOSS_RATE = "loss-rate";
\r\r\r private final static String HOSTS = "host";
\r private final static String HOST_NAME = "name";
\r private final static String HOST_ID = "id";
\r private final static String HOST_IPS = "ip-addresses";
\r private final static String CONNECTOR_ID = "connector-id";
\r\r private final static String IP_ADDRESS = "ip-address";
\r private final static String MAC_ADDRESS = "mac-address";
\r\r private final static String EXTERNAL_NETWORK = "external-network";
\r\r private final static String ACCESS_NODE_ID = "access-node-id";
\r private final static String ACCESS_PORT_ID = "access-port-id";
\r private final static String LAYER = "layer";
\r private final static String PROTOCOL = "protocol";
\r\r\r private final static String ATTRIBUTES = "attribute";
\r private final static String ATTRIBUTE_NAME = "name";
\r private final static String ATTRIBUTE_VALUE = "value";
\r\r protected final static long DEFAULT_PORT_BANDWIDTH = 10240;
\r\r protected final static long DEFAULT_LINK_BANDWIDTH = 10240;
\r protected final static long DEFAULT_LINK_DELAY = 1;
\r protected final static short DEFAULT_LINK_LOSS_RATE = 1;
\r private HashMap<PhysicalNodeId, PhysicalNode> physicalNodeHashMap;
\r private HashMap<PhysicalPortId, PhysicalPort> physicalPortHashMap;
\r private HashMap<PhysicalLinkId, PhysicalLink> physicalLinkHashMap;
\r\r private ObjectMapper objectMapper = null;
\r private DataBrokerAdapter dataBrokerAdapter = null;
\r\r\r public PhysicalResourceLoader(DataBroker dataBroker) {
\r physicalNodeHashMap = new HashMap<PhysicalNodeId, PhysicalNode>();
\r physicalPortHashMap = new HashMap<PhysicalPortId, PhysicalPort>();
\r physicalLinkHashMap = new HashMap<PhysicalLinkId, PhysicalLink>();
\r\r this.objectMapper = new ObjectMapper();
\r this.dataBrokerAdapter = new DataBrokerAdapter(dataBroker);
\r\r loadNodesPorts();
\r loadLinks();
\r loadHosts();
\r //loadExternals();
\r }
\r\r protected PhysicalNode getPhysicalNode(PhysicalNodeId physicalNodeId){
\r return physicalNodeHashMap.get(physicalNodeId);
\r }
\r protected PhysicalPort getPhysicalPort(PhysicalPortId physicalPortId){
\r return physicalPortHashMap.get(physicalPortId);
\r }
\r protected PhysicalLink getPhysicalLink(PhysicalLinkId physicalLinkId){
\r return physicalLinkHashMap.get(physicalLinkId);
\r }
\r private void loadNodesPorts() {
\r String nodesStr = Utils.readFile(NODE_PROPERTY);
\r try {
\r JsonNode nodeRoot = objectMapper.readTree(nodesStr);
\r List<PhysicalNode> physicalNodes = buildNodes(nodeRoot);
\r for (PhysicalNode physicalNode : physicalNodes) {
\r physicalNodeHashMap.put(physicalNode.getNodeId(), physicalNode);
\r for (PhysicalPort physicalPort : physicalNode.getPhysicalPort()) {
\r physicalPortHashMap.put(physicalPort.getPortId(), physicalPort);
\r }
\r //lsx
\r dataBrokerAdapter.addPhysicalNode(physicalNode);
\r }
\r } catch (IOException e) {
\r // TODO Auto-generated catch block
\r log.error("Exception:",e);
\r }
\r }
\r\r private void loadLinks() {
\r String linkStr = Utils.readFile(LINK_PROPERTY);
\r try {
\r JsonNode linkRoot = objectMapper.readTree(linkStr);
\r List<PhysicalLink> physicalLinks = buildLinks(linkRoot);
\r for (PhysicalLink physicalLink : physicalLinks) {
\r physicalLinkHashMap.put(physicalLink.getLinkId(), physicalLink);
\r //lsx
\r dataBrokerAdapter.addPhysicalLink(physicalLink);
\r }
\r } catch (IOException e) {
\r // TODO Auto-generated catch block
\r log.error("Exception:",e);
\r }
\r }
\r\r /*
\r private void loadExternals() {
\r String externalStr = Utils.readFile(EXTERNAL_NETWORK_MAC_PROPERTY);
\r try {
\r JsonNode externalRoot = objectMapper.readTree(externalStr);
\r buildExternals(externalRoot);
\r } catch (IOException e) {
\r e.printStackTrace();
\r }
\r }
\r */
\r\r private void loadHosts() {
\r String hostStr = Utils.readFile(HOST_PROPERTY);
\r try {
\r JsonNode hostRoot = objectMapper.readTree(hostStr);
\r List<PhysicalHost> physicalHosts = buildHosts(hostRoot);
\r for (PhysicalHost physicalHost : physicalHosts) {
\r dataBrokerAdapter.addPhysicalHost(physicalHost);
\r }
\r } catch (IOException e) {
\r // TODO Auto-generated catch block
\r log.error("Exception:",e);
\r }
\r }
\r\r\r /*
\r private void buildExternals(JsonNode externalRoot) {
\r JsonNode exNetworkNodes = externalRoot.path(EXTERNAL_NETWORK_MAC);
\r log.debug("Build external network mac : {} .", exNetworkNodes);
\r for (int i = 0; i < exNetworkNodes.size(); i++) {
\r log.debug("Build external network execution body");
\r JsonNode exNetworkNode = exNetworkNodes.get(i);
\r buildExNetwork(exNetworkNode);
\r }
\r }
\r\r\r private void buildExNetwork(JsonNode exNetwork){
\r String nodeId = exNetwork.get(NODE_ID).asText();
\r String portId = exNetwork.get(PORT_ID).asText();
\r String peerMac = exNetwork.get(MAC_ADDRESS).asText();
\r PhysicalNodeId accessNodeId = new PhysicalNodeId(nodeId);
\r PhysicalPortId accessPortId = new PhysicalPortId(portId);
\r MacAddress macAddress = new MacAddress(peerMac);
\r externalNetworkMac.put(accessNodeId,accessPortId,macAddress);
\r }
\r */
\r\r private List<PhysicalNode> buildNodes(JsonNode nodesRoot) {
\r List<PhysicalNode> physicalNodes = new ArrayList<PhysicalNode>();
\r JsonNode nodes = nodesRoot.path(NODES);
\r log.debug("Build nodes: {} .", nodes);
\r for (int i = 0; i < nodes.size(); i++) {
\r log.debug("build physical node execution body");
\r JsonNode node = nodes.get(i);
\r PhysicalNode phyNode = buildNode(node);
\r if (phyNode != null) {
\r physicalNodes.add(phyNode);
\r }
\r }
\r return physicalNodes;
\r }
\r\r private PhysicalNode buildNode(JsonNode node) {
\r PhysicalNodeBuilder nodeBuilder = new PhysicalNodeBuilder();
\r\r String node_id = node.get(NODE_ID).asText();
\r if (node_id.equals(""))
\r return null;
\r nodeBuilder.setNodeId(new PhysicalNodeId(node_id));
\r PhysicalNodeKey key = new PhysicalNodeKey(nodeBuilder.getNodeId());
\r nodeBuilder.setKey(key);
\r\r String strType = node.get(NODE_TYPE).asText();
\r PhysicalNodeInstance.NodeType nodeType = Utils.getNodeType(strType);
\r nodeBuilder.setNodeType(nodeType);
\r\r JsonNode ports = node.path(PORTS);
\r List<PhysicalPort> phyPortList = buildPorts(ports);
\r nodeBuilder.setPhysicalPort(phyPortList);
\r\r JsonNode attributes = node.path(ATTRIBUTES);
\r nodeBuilder.setAttribute(buildNodeAttributes(attributes));
\r\r return nodeBuilder.build();
\r }
\r\r private List<PhysicalPort> buildPorts(JsonNode ports) {
\r List<PhysicalPort> phyPortList = new ArrayList<PhysicalPort>();
\r for (int j = 0; j < ports.size(); j++) {
\r //JsonNode port = portIt.next();
\r JsonNode port = ports.get(j);
\r PhysicalPort physicalPort = buildPort(port);
\r if (physicalPort != null) {
\r phyPortList.add(physicalPort);
\r }
\r }
\r return phyPortList;
\r }
\r\r private PhysicalPort buildPort(JsonNode port) {
\r PhysicalPortBuilder physicalPortBuilder = new PhysicalPortBuilder();
\r\r String strPortId = port.get(PORT_ID).asText();
\r physicalPortBuilder.setPortId(new PhysicalPortId(strPortId));
\r\r String strType = port.get(PORT_TYPE).asText();
\r PhysicalPortInstance.PortType portType = Utils.getPortType(strType);
\r physicalPortBuilder.setPortType(portType);
\r\r //lsx port mac
\r\r if(!(port.get("port-mac-address").asText().equals(""))){
\r MacAddress mac = new MacAddress(port.get("port-mac-address").asText());
\r physicalPortBuilder.setMacAddress(mac);
\r }
\r\r //lsx port bandwidth
\r if(port.get("bandwidth").asText().equals("")) {
\r physicalPortBuilder.setBandwidth(DEFAULT_PORT_BANDWIDTH);
\r }
\r else{
\r physicalPortBuilder.setBandwidth((long) (port.get("bandwidth").asInt()));
\r }
\r\r JsonNode portAttributes = port.path(ATTRIBUTES);
\r List<Attribute> attributes = buildPortAttributes(portAttributes);
\r physicalPortBuilder.setAttribute(attributes);
\r\r return physicalPortBuilder.build();
\r }
\r\r\r private List<Attribute> buildPortAttributes(JsonNode attributes) {
\r List<Attribute> attributeList = new ArrayList<Attribute>();
\r for (int i = 0; i < attributes.size(); i++) {
\r log.debug("build physical port attribute execution body.");
\r JsonNode portAttribute = attributes.get(i);
\r Attribute attribute = buildPortAttribute(portAttribute);
\r if (attribute != null) {
\r attributeList.add(attribute);
\r }
\r }
\r return attributeList;
\r }
\r\r private Attribute buildPortAttribute(JsonNode attribute) {
\r AttributeBuilder attributeBuilder = new AttributeBuilder();
\r String strName = attribute.path(ATTRIBUTE_NAME).asText();
\r if (strName.equals("")) {
\r return null;
\r }
\r attributeBuilder.setAttributeName(new AttributeName(strName));
\r AttributeValueBuilder attributeValueBuilder = new AttributeValueBuilder();
\r String strValue = attribute.path(ATTRIBUTE_VALUE).asText();
\r attributeValueBuilder.setStringValue(strValue);
\r attributeBuilder.setKey(new AttributeKey(attributeBuilder.getAttributeName()));
\r attributeBuilder.setAttributeValue(attributeValueBuilder.build());
\r return attributeBuilder.build();
\r }
\r\r private List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute> buildNodeAttributes(JsonNode attributes) {
\r List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute> attributeList =
\r new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute>();
\r for (int i = 0; i < attributes.size(); i++) {
\r log.debug("build physical port attribute execution body.");
\r JsonNode portAttribute = attributes.get(i);
\r org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute attribute = buildNodeAttribute(portAttribute);
\r if (attribute != null) {
\r attributeList.add(attribute);
\r }
\r }
\r return attributeList;
\r }
\r\r private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.Attribute buildNodeAttribute(JsonNode attribute) {
\r org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.AttributeBuilder attributeBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.AttributeBuilder();
\r String strName = attribute.path(ATTRIBUTE_NAME).asText();
\r if (strName.equals("")) {
\r return null;
\r }
\r attributeBuilder.setAttributeName(new AttributeName(strName));
\r AttributeValueBuilder attributeValueBuilder = new AttributeValueBuilder();
\r String strValue = attribute.path(ATTRIBUTE_VALUE).asText();
\r attributeValueBuilder.setStringValue(strValue);
\r attributeBuilder.setKey(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.AttributeKey(attributeBuilder.getAttributeName()));
\r attributeBuilder.setAttributeValue(attributeValueBuilder.build());
\r return attributeBuilder.build();
\r }
\r\r\r private List<PhysicalLink> buildLinks(JsonNode linksRoot) {
\r List<PhysicalLink> physicalLinks = new ArrayList<PhysicalLink>();
\r JsonNode links = linksRoot.path(LINKS);
\r log.debug("Build links: {} .", links);
\r for (int i = 0; i < links.size(); i++) {
\r log.debug("build physical node execution body");
\r JsonNode link = links.get(i);
\r PhysicalLink phyLink = buildLink(link);
\r if (phyLink != null) {
\r physicalLinks.add(phyLink);
\r }
\r }
\r return physicalLinks;
\r }
\r\r private PhysicalLink buildLink(JsonNode linkNode) {
\r PhysicalLinkBuilder linkBuilder = new PhysicalLinkBuilder();
\r\r String strLinkId = linkNode.get(LINK_ID).asText();
\r linkBuilder.setLinkId(new PhysicalLinkId(strLinkId));
\r\r //lsx
\r linkBuilder.setSrcNodeId(new PhysicalNodeId(linkNode.get(SRC_NODE_ID).asText()));
\r linkBuilder.setSrcPortId(new PhysicalPortId(linkNode.get(SRC_PORT_ID).asText()));
\r linkBuilder.setDestNodeId(new PhysicalNodeId(linkNode.get(DST_NODE_ID).asText()));
\r linkBuilder.setDestPortId(new PhysicalPortId(linkNode.get(DST_PORT_ID).asText()));
\r\r //lsx
\r if(linkNode.get("link-bandwidth").asText().equals("")) {
\r\r linkBuilder.setBandwidth(DEFAULT_LINK_BANDWIDTH);
\r }else{
\r linkBuilder.setBandwidth((long) (linkNode.get("link-bandwidth").asLong()));
\r }
\r\r long metric = linkNode.get(METRIC).asLong();
\r linkBuilder.setMetric(metric);
\r\r linkBuilder.setDelay(DEFAULT_LINK_DELAY);
\r linkBuilder.setLossRate(DEFAULT_LINK_LOSS_RATE);
\r\r return linkBuilder.build();
\r }
\r\r private List<PhysicalHost> buildHosts(JsonNode hostsNode) {
\r List<PhysicalHost> physicalHosts = new ArrayList<PhysicalHost>();
\r JsonNode hosts = hostsNode.path(HOSTS);
\r log.debug("Build hosts: {} .", hosts);
\r for (int i = 0; i < hosts.size(); i++) {
\r JsonNode host = hosts.get(i);
\r PhysicalHost physicalHost = buildHost(host);
\r if (physicalHost != null) {
\r physicalHosts.add(physicalHost);
\r }
\r }
\r return physicalHosts;
\r }
\r\r private PhysicalHost buildHost(JsonNode hostNode) {
\r PhysicalHostBuilder hostBuilder = new PhysicalHostBuilder();
\r hostBuilder.setHostId(new PhysicalHostId(hostNode.get(HOST_ID).asText()));
\r hostBuilder.setKey(new PhysicalHostKey(hostBuilder.getHostId()));
\r hostBuilder.setHostName(new PhysicalHostName(hostNode.get(HOST_NAME).asText()));
\r\r IpAddressesBuilder IpAddrBuilder = new IpAddressesBuilder();
\r List<IpAddress> ipList = new ArrayList<IpAddress>();
\r\r JsonNode ipaddrs = hostNode.path(HOST_IPS);
\r for (int p = 0; p < ipaddrs.size(); p++) {
\r JsonNode ipaddr = ipaddrs.get(p);
\r IpAddress ip = new IpAddress(new Ipv4Address(ipaddr.get(IP_ADDRESS).asText()));
\r ipList.add(ip);
\r }
\r\r IpAddrBuilder.setIpAddress(ipList);
\r hostBuilder.setIpAddresses(IpAddrBuilder.build());
\r MacAddress mac = new MacAddress(hostNode.get(MAC_ADDRESS).asText());
\r hostBuilder.setMacAddress(mac);
\r hostBuilder.setNodeId(new PhysicalNodeId(hostNode.get(NODE_ID).asText()));
\r hostBuilder.setPortId(new PhysicalPortId(hostNode.get(CONNECTOR_ID).asText()));
\r\r return hostBuilder.build();
\r }
\r\r\r public void close() {
\r physicalLinkHashMap.clear();
\r physicalPortHashMap.clear();
\r physicalNodeHashMap.clear();
\r //externalNetworkMac.clear();
\r }
\r}
\r