blob: 93c3c74e081d3df8c867b451d2d8137b8fb6774f [file] [log] [blame]
/*
* Copyright 2018-present 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.odtn;
import com.google.common.io.CharSource;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
import org.junit.Test;
import org.onosproject.drivers.utilities.XmlConfigParser;
import org.onosproject.net.Port;
import org.onosproject.net.device.DeviceDescription;
import org.onosproject.net.device.PortDescription;
import org.slf4j.Logger;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.OC_NAME;
import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.OC_TYPE;
import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ODTN_PORT_TYPE;
import static org.slf4j.LoggerFactory.getLogger;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
public class FujitsuOpenConfigDeviceDiscoveryTest {
private static final Logger log = getLogger(FujitsuOpenConfigDeviceDiscoveryTest.class);
private static final String PORT_INPUT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"2\">\n" +
" <data>\n" +
" <components xmlns=\"http://openconfig.net/yang/platform\">\n" +
" <component>\n" +
" <name>transceiver-1/1/0/C1</name>\n" +
" <config>\n" +
" <name>transceiver-1/1/0/C1</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>transceiver-1/1/0/C1</name>\n" +
" <type>TRANSCEIVER</type>\n" +
" <id>C1</id>\n" +
" <description />\n" +
" <mfg-name />\n" +
" <hardware-version />\n" +
" <serial-no />\n" +
" <part-no />\n" +
" <oper-status xmlns:oc-platform-types=\"http://openconfig.net/yang/platform-types\">" +
"oc-platform-types:INACTIVE</oper-status>\n" +
" </state>\n" +
" <transceiver xmlns=\"http://openconfig.net/yang/platform/transceiver\">\n" +
" <config>\n" +
" <enabled>true</enabled>\n" +
" <form-factor-preconf xmlns:oc-opt-types=" +
"\"http://openconfig.net/yang/transport-types\">oc-opt-types:QSFP28</form-factor-preconf>\n" +
" </config>\n" +
" <state>\n" +
" <enabled>true</enabled>\n" +
" <form-factor-preconf xmlns:oc-opt-types=" +
"\"http://openconfig.net/yang/transport-types\">oc-opt-types:QSFP28</form-factor-preconf>\n" +
" <form-factor xmlns:oc-opt-types=" +
"\"http://openconfig.net/yang/transport-types\">oc-opt-types:QSFP28</form-factor>\n" +
" <output-power>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </output-power>\n" +
" <input-power>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </input-power>\n" +
" <laser-bias-current>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </laser-bias-current>\n" +
" </state>\n" +
" </transceiver>\n" +
" </component>\n" +
" <component>\n" +
" <name>transceiver-1/1/0/C2</name>\n" +
" <config>\n" +
" <name>transceiver-1/1/0/C2</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>transceiver-1/1/0/C2</name>\n" +
" <type>TRANSCEIVER</type>\n" +
" <id>C2</id>\n" +
" <description />\n" +
" <mfg-name />\n" +
" <hardware-version />\n" +
" <serial-no />\n" +
" <part-no />\n" +
" <oper-status xmlns:oc-platform-types=\"http://openconfig.net/yang/platform-types\">" +
"oc-platform-types:INACTIVE</oper-status>\n" +
" </state>\n" +
" <transceiver xmlns=\"http://openconfig.net/yang/platform/transceiver\">\n" +
" <config>\n" +
" <enabled>true</enabled>\n" +
" <form-factor-preconf xmlns:oc-opt-types=" +
"\"http://openconfig.net/yang/transport-types\">oc-opt-types:QSFP28</form-factor-preconf>\n" +
" </config>\n" +
" <state>\n" +
" <enabled>true</enabled>\n" +
" <form-factor-preconf xmlns:oc-opt-types=" +
"\"http://openconfig.net/yang/transport-types\">oc-opt-types:QSFP28</form-factor-preconf>\n" +
" <form-factor xmlns:oc-opt-types=" +
"\"http://openconfig.net/yang/transport-types\">oc-opt-types:QSFP28</form-factor>\n" +
" <output-power>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </output-power>\n" +
" <input-power>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </input-power>\n" +
" <laser-bias-current>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </laser-bias-current>\n" +
" </state>\n" +
" </transceiver>\n" +
" </component>\n" +
" <component>\n" +
" <name>transceiver-1/1/0/C3</name>\n" +
" <config>\n" +
" <name>transceiver-1/1/0/C3</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>transceiver-1/1/0/C3</name>\n" +
" <type>TRANSCEIVER</type>\n" +
" <id>C3</id>\n" +
" <description />\n" +
" <mfg-name />\n" +
" <hardware-version />\n" +
" <serial-no />\n" +
" <part-no />\n" +
" <oper-status xmlns:oc-platform-types=" +
"\"http://openconfig.net/yang/platform-types\">oc-platform-types:INACTIVE</oper-status>\n" +
" </state>\n" +
" <transceiver xmlns=\"http://openconfig.net/yang/platform/transceiver\">\n" +
" <config>\n" +
" <enabled>true</enabled>\n" +
" <form-factor-preconf xmlns:oc-opt-types=" +
"\"http://openconfig.net/yang/transport-types\">oc-opt-types:QSFP28</form-factor-preconf>\n" +
" </config>\n" +
" <state>\n" +
" <enabled>true</enabled>\n" +
" <form-factor-preconf xmlns:oc-opt-types=" +
"\"http://openconfig.net/yang/transport-types\">oc-opt-types:QSFP28</form-factor-preconf>\n" +
" <form-factor xmlns:oc-opt-types=\"http://openconfig.net/yang/transport-types\">" +
"oc-opt-types:QSFP28</form-factor>\n" +
" <output-power>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </output-power>\n" +
" <input-power>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </input-power>\n" +
" <laser-bias-current>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </laser-bias-current>\n" +
" </state>\n" +
" </transceiver>\n" +
" </component>\n" +
" <component>\n" +
" <name>transceiver-1/1/0/C4</name>\n" +
" <config>\n" +
" <name>transceiver-1/1/0/C4</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>transceiver-1/1/0/C4</name>\n" +
" <type>TRANSCEIVER</type>\n" +
" <id>C4</id>\n" +
" <description />\n" +
" <mfg-name />\n" +
" <hardware-version />\n" +
" <serial-no />\n" +
" <part-no />\n" +
" <oper-status xmlns:oc-platform-types=" +
"\"http://openconfig.net/yang/platform-types\">oc-platform-types:INACTIVE</oper-status>\n" +
" </state>\n" +
" <transceiver xmlns=\"http://openconfig.net/yang/platform/transceiver\">\n" +
" <config>\n" +
" <enabled>true</enabled>\n" +
" <form-factor-preconf xmlns:oc-opt-types=" +
"\"http://openconfig.net/yang/transport-types\">oc-opt-types:QSFP28</form-factor-preconf>\n" +
" </config>\n" +
" <state>\n" +
" <enabled>true</enabled>\n" +
" <form-factor-preconf xmlns:oc-opt-types=" +
"\"http://openconfig.net/yang/transport-types\">oc-opt-types:QSFP28</form-factor-preconf>\n" +
" <form-factor xmlns:oc-opt-types=" +
"\"http://openconfig.net/yang/transport-types\">oc-opt-types:QSFP28</form-factor>\n" +
" <output-power>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </output-power>\n" +
" <input-power>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </input-power>\n" +
" <laser-bias-current>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </laser-bias-current>\n" +
" </state>\n" +
" </transceiver>\n" +
" </component>\n" +
" <component>\n" +
" <name>port-1/1/0/E1</name>\n" +
" <config>\n" +
" <name>port-1/1/0/E1</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>port-1/1/0/E1</name>\n" +
" <type xmlns:oc-platform-types=" +
"\"http://openconfig.net/yang/platform-types\">oc-platform-types:PORT</type>\n" +
" <id>E1</id>\n" +
" <description />\n" +
" <mfg-name />\n" +
" <hardware-version />\n" +
" <serial-no />\n" +
" <part-no />\n" +
" <oper-status xmlns:oc-platform-types=" +
"\"http://openconfig.net/yang/platform-types\">oc-platform-types:INACTIVE</oper-status>\n" +
" </state>\n" +
" <subcomponents>\n" +
" <subcomponent>\n" +
" <name>otsi-1/1/0/E1</name>\n" +
" <config>\n" +
" <name>otsi-1/1/0/E1</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>otsi-1/1/0/E1</name>\n" +
" </state>\n" +
" </subcomponent>\n" +
" </subcomponents>\n" +
" </component>\n" +
" <component>\n" +
" <name>otsi-1/1/0/E1</name>\n" +
" <config>\n" +
" <name>otsi-1/1/0/E1</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>otsi-1/1/0/E1</name>\n" +
" <type>OPTICAL_CHANNEL</type>\n" +
" <id>E1</id>\n" +
" <mfg-name />\n" +
" <hardware-version />\n" +
" <serial-no />\n" +
" <part-no />\n" +
" <oper-status xmlns:oc-platform-types=" +
"\"http://openconfig.net/yang/platform-types\">oc-platform-types:INACTIVE</oper-status>\n" +
" </state>\n" +
" <optical-channel xmlns=\"http://openconfig.net/yang/terminal-device\">\n" +
" <config>\n" +
" <frequency>0</frequency>\n" +
" <target-output-power>1.0</target-output-power>\n" +
" <operational-mode>5</operational-mode>\n" +
" </config>\n" +
" <state>\n" +
" <frequency>0</frequency>\n" +
" <target-output-power>1.0</target-output-power>\n" +
" <operational-mode>5</operational-mode>\n" +
" <output-power>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </output-power>\n" +
" <input-power>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </input-power>\n" +
" <laser-bias-current>\n" +
" <instant>-99.9</instant>\n" +
" <interval>900000000000</interval>\n" +
" </laser-bias-current>\n" +
" <chromatic-dispersion>\n" +
" <instant>-99.9</instant>\n" +
" </chromatic-dispersion>\n" +
" <polarization-mode-dispersion>\n" +
" <instant>-99.9</instant>\n" +
" </polarization-mode-dispersion>\n" +
" </state>\n" +
" </optical-channel>\n" +
" </component>\n" +
" </components>\n" +
" </data>\n" +
"</rpc-reply>";
private static final String DEVICE_DISCOVERY_INPUT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"2\">\n" +
" <data>\n" +
" <components xmlns=\"http://openconfig.net/yang/platform\">\n" +
" <component>\n" +
" <name>shelf-1</name>\n" +
" <config>\n" +
" <name>shelf-1</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>shelf-1</name>\n" +
" <type xmlns:oc-platform-types=\"http://openconfig.net/yang/platform-types\">" +
"oc-platform-types:CHASSIS</type>\n" +
" <id>1</id>\n" +
" <description>BDT6-T600</description>\n" +
" <mfg-name>FUJITSU</mfg-name>\n" +
" <hardware-version>01</hardware-version>\n" +
" <software-version>1.1.1</software-version>\n" +
" <serial-no>00026</serial-no>\n" +
" <part-no>FC9569T600</part-no>\n" +
" <oper-status xmlns:oc-platform-types=\"http://openconfig.net/yang/platform-types\">" +
"oc-platform-types:ACTIVE</oper-status>\n" +
" <temperature>\n" +
" <instant>0.0</instant>\n" +
" <interval>900000000000</interval>\n" +
" </temperature>\n" +
" <memory>\n" +
" <available>1997</available>\n" +
" <utilized>632</utilized>\n" +
" </memory>\n" +
" </state>\n" +
" <subcomponents>\n" +
" <subcomponent>\n" +
" <name>slot-1/0</name>\n" +
" <config>\n" +
" <name>slot-1/0</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>slot-1/0</name>\n" +
" </state>\n" +
" </subcomponent>\n" +
" <subcomponent>\n" +
" <name>slot-1/1</name>\n" +
" <config>\n" +
" <name>slot-1/1</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>slot-1/1</name>\n" +
" </state>\n" +
" </subcomponent>\n" +
" <subcomponent>\n" +
" <name>fan-1/FAN1</name>\n" +
" <config>\n" +
" <name>fan-1/FAN1</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>fan-1/FAN1</name>\n" +
" </state>\n" +
" </subcomponent>\n" +
" <subcomponent>\n" +
" <name>fan-1/FAN2</name>\n" +
" <config>\n" +
" <name>fan-1/FAN2</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>fan-1/FAN2</name>\n" +
" </state>\n" +
" </subcomponent>\n" +
" <subcomponent>\n" +
" <name>fan-1/FAN3</name>\n" +
" <config>\n" +
" <name>fan-1/FAN3</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>fan-1/FAN3</name>\n" +
" </state>\n" +
" </subcomponent>\n" +
" <subcomponent>\n" +
" <name>fan-1/FAN4</name>\n" +
" <config>\n" +
" <name>fan-1/FAN4</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>fan-1/FAN4</name>\n" +
" </state>\n" +
" </subcomponent>\n" +
" <subcomponent>\n" +
" <name>fan-1/FAN5</name>\n" +
" <config>\n" +
" <name>fan-1/FAN5</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>fan-1/FAN5</name>\n" +
" </state>\n" +
" </subcomponent>\n" +
" <subcomponent>\n" +
" <name>psu-1/PWR1</name>\n" +
" <config>\n" +
" <name>psu-1/PWR1</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>psu-1/PWR1</name>\n" +
" </state>\n" +
" </subcomponent>\n" +
" <subcomponent>\n" +
" <name>psu-1/PWR2</name>\n" +
" <config>\n" +
" <name>psu-1/PWR2</name>\n" +
" </config>\n" +
" <state>\n" +
" <name>psu-1/PWR2</name>\n" +
" </state>\n" +
" </subcomponent>\n" +
" </subcomponents>\n" +
" <cpu>\n" +
" <utilization xmlns=\"http://openconfig.net/yang/platform/cpu\">\n" +
" <state>\n" +
" <instant>8</instant>\n" +
" <avg>9</avg>\n" +
" <min>8</min>\n" +
" <max>11</max>\n" +
" <interval>600000000000</interval>\n" +
" </state>\n" +
" </utilization>\n" +
" </cpu>\n" +
" </component>\n" +
" </components>\n" +
" </data>\n" +
"</rpc-reply>\n";
private static final String DEVICE_ID = "netconf:167.253.10.10:830";
private static final String DEVICE_MANUFACTURER = "FUJITSU";
private static final String SW_VERSION = "1.1.1";
private static final String TRANSCEIVER_COMPONENT_1 = "transceiver-1/1/0/C1";
private static final String TRANSCEIVER = "TRANSCEIVER";
private static final String OPTICAL_CHANNEL_COMPONENT_1 = "otsi-1/1/0/E1";
private static final String OPTICAL_CHANNEL = "OPTICAL_CHANNEL";
@Test
public void testDeviceDescription() throws IOException, ConfigurationException, URISyntaxException {
FujitsuOpenConfigDeviceDiscovery fujitsuOpenConfigDeviceDiscovery = new FujitsuOpenConfigDeviceDiscovery();
URI uri = new URI(DEVICE_ID);
XMLConfiguration xmlCfg = (XMLConfiguration) XmlConfigParser.loadXmlString(DEVICE_DISCOVERY_INPUT);
xmlCfg.load(CharSource.wrap(DEVICE_DISCOVERY_INPUT).openStream());
DeviceDescription deviceDescription = fujitsuOpenConfigDeviceDiscovery.parseDeviceInformation(uri, xmlCfg);
assertEquals(deviceDescription.manufacturer(), DEVICE_MANUFACTURER);
assertEquals(deviceDescription.swVersion(), SW_VERSION);
}
@Test
public void testPortDescription() throws IOException, ConfigurationException {
XMLConfiguration portCfg = new XMLConfiguration();
portCfg.load(CharSource.wrap(PORT_INPUT).openStream());
FujitsuOpenConfigDeviceDiscovery fujitsuOpenConfigDeviceDiscovery = new FujitsuOpenConfigDeviceDiscovery();
List<PortDescription> t600Ports = fujitsuOpenConfigDeviceDiscovery.parse1FinityPorts(portCfg);
assertThat(t600Ports.size(), is(5));
PortDescription portDescription;
portDescription = t600Ports.get(0);
assertThat(portDescription.portNumber().name(), is(TRANSCEIVER_COMPONENT_1));
assertThat(portDescription.annotations().value(OC_NAME), is(TRANSCEIVER_COMPONENT_1));
assertThat(portDescription.annotations().value(OC_TYPE), is(TRANSCEIVER));
assertThat(portDescription.annotations().value(ODTN_PORT_TYPE),
is(FujitsuOpenConfigDeviceDiscovery.OdtnPortType.CLIENT.value()));
assertThat(portDescription.type(), is(Port.Type.PACKET));
portDescription = t600Ports.get(4);
assertThat(portDescription.portNumber().name(), is(OPTICAL_CHANNEL_COMPONENT_1));
assertThat(portDescription.annotations().value(OC_NAME), is(OPTICAL_CHANNEL_COMPONENT_1));
assertThat(portDescription.annotations().value(OC_TYPE), is(OPTICAL_CHANNEL));
assertThat(portDescription.annotations().value(ODTN_PORT_TYPE),
is(FujitsuOpenConfigDeviceDiscovery.OdtnPortType.LINE.value()));
assertThat(portDescription.type(), is(Port.Type.OCH));
}
}