-/*\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.openflow.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 PhyConfigLoader {\r\r private static final Logger log = LoggerFactory.getLogger(PhyConfigLoader.class);\r\r public final static String NODE_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-renderer-node-resource.json";\r public final static String LINK_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-renderer-link-resource.json";\r public final static String EXTERNAL_NETWORK_MAC_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-renderer-external-resource.json";\r public final static String HOST_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-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\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\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 EXTERNAL_NETWORK_MAC = "external-network-mac";\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 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_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 private Table<PhysicalNodeId, PhysicalPortId, MacAddress> externalNetworkMac;\r// final private DataBroker dataProvider;\r\r private ObjectMapper objectMapper = null;\r private DataBrokerAdapter dataBrokerAdapter = null;\r\r\r\r public PhyConfigLoader(DataBroker dataBroker) {\r physicalNodeHashMap = new HashMap<PhysicalNodeId, PhysicalNode>();\r physicalPortHashMap = new HashMap<PhysicalPortId, PhysicalPort>();\r physicalLinkHashMap = new HashMap<PhysicalLinkId, PhysicalLink>();\r externalNetworkMac = HashBasedTable.create();\r\r this.objectMapper = new ObjectMapper();\r this.dataBrokerAdapter = new DataBrokerAdapter(dataBroker);\r\r loadNodesPorts();\r loadLinks();\r loadHosts();\r loadExternals();\r }\r\r public Table<PhysicalNodeId, PhysicalPortId, MacAddress> getExternalNetworkMac() {\r return externalNetworkMac;\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 }\r } catch (IOException e) {\r e.printStackTrace();\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 }\r } catch (IOException e) {\r e.printStackTrace();\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 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 e.printStackTrace();\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 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 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// String strMac = port.get(PORT_MAC).asText();\r// MacAddress macAddress = new MacAddress(strMac);\r// physicalPortBuilder.setMacAddress(macAddress);\r//\r// long bandWidth = port.get(BANDWIDTH).asLong();\r// physicalPortBuilder.setBandwidth(bandWidth);\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 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 long metric = linkNode.get(METRIC).asLong();\r\r linkBuilder.setLinkId(new PhysicalLinkId(strLinkId));\r linkBuilder.setMetric(metric);\r\r linkBuilder.setBandwidth(DEFAULT_LINK_BANDWIDTH);\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\r}\r
\ No newline at end of file
+/*\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.openflow.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 PhyConfigLoader {\r\r private static final Logger log = LoggerFactory.getLogger(PhyConfigLoader.class);\r\r public final static String NODE_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-renderer-node-resource.json";\r public final static String LINK_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-renderer-link-resource.json";\r public final static String EXTERNAL_NETWORK_MAC_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-renderer-external-resource.json";\r public final static String HOST_PROPERTY = "etc/opendaylight/karaf/nemo-openflow-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\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\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 EXTERNAL_NETWORK_MAC = "external-network-mac";\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 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_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 private Table<PhysicalNodeId, PhysicalPortId, MacAddress> externalNetworkMac;\r// final private DataBroker dataProvider;\r\r private ObjectMapper objectMapper = null;\r private DataBrokerAdapter dataBrokerAdapter = null;\r\r\r\r public PhyConfigLoader(DataBroker dataBroker) {\r physicalNodeHashMap = new HashMap<PhysicalNodeId, PhysicalNode>();\r physicalPortHashMap = new HashMap<PhysicalPortId, PhysicalPort>();\r physicalLinkHashMap = new HashMap<PhysicalLinkId, PhysicalLink>();\r externalNetworkMac = HashBasedTable.create();\r\r this.objectMapper = new ObjectMapper();\r this.dataBrokerAdapter = new DataBrokerAdapter(dataBroker);\r\r loadNodesPorts();\r loadLinks();\r loadHosts();\r loadExternals();\r }\r\r public Table<PhysicalNodeId, PhysicalPortId, MacAddress> getExternalNetworkMac() {\r return externalNetworkMac;\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 }\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 }\r } catch (IOException e) {\r // TODO Auto-generated catch block\r log.error("Exception;",e);\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 // TODO Auto-generated catch block\r log.error("Exception;",e);\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 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 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 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// String strMac = port.get(PORT_MAC).asText();\r// MacAddress macAddress = new MacAddress(strMac);\r// physicalPortBuilder.setMacAddress(macAddress);\r//\r// long bandWidth = port.get(BANDWIDTH).asLong();\r// physicalPortBuilder.setBandwidth(bandWidth);\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 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 long metric = linkNode.get(METRIC).asLong();\r\r linkBuilder.setLinkId(new PhysicalLinkId(strLinkId));\r linkBuilder.setMetric(metric);\r\r linkBuilder.setBandwidth(DEFAULT_LINK_BANDWIDTH);\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\r}\r
\ No newline at end of file