89ad3f2d27d1bd35024f21f2c58611cbdf458ff2
[nemo.git] / nemo-renderers / cli-renderer / src / main / java / org / opendaylight / nemo / renderer / cli / physicalnetwork / PhysicalResourceLoader.java
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            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                //lsx\r                dataBrokerAdapter.addPhysicalLink(physicalLink);\r            }\r        } catch (IOException e) {\r            e.printStackTrace();\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            e.printStackTrace();\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