blob: 5e3a44216a32cc259ed27a71424f6f7b49bb799f [file] [log] [blame]
Andrea Campanellad8d92db2016-01-14 16:24:41 -08001/*
2 *
3 * * Copyright 2016 Open Networking Laboratory
4 * *
5 * * Licensed under the Apache License, Version 2.0 (the "License");
6 * * you may not use this file except in compliance with the License.
7 * * You may obtain a copy of the License at
8 * *
9 * * http://www.apache.org/licenses/LICENSE-2.0
10 * *
11 * * Unless required by applicable law or agreed to in writing, software
12 * * distributed under the License is distributed on an "AS IS" BASIS,
13 * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * * See the License for the specific language governing permissions and
15 * * limitations under the License.
16 *
17 */
18
Andrea Campanella238d96e2016-01-20 11:52:02 -080019package org.onosproject.drivers.ciena;
Andrea Campanellad8d92db2016-01-14 16:24:41 -080020
21import com.google.common.collect.Lists;
22import org.apache.commons.configuration.HierarchicalConfiguration;
Andrea Campanella238d96e2016-01-20 11:52:02 -080023import org.onosproject.drivers.utilities.XmlConfigParser;
Andrea Campanellad8d92db2016-01-14 16:24:41 -080024import org.onosproject.net.AnnotationKeys;
25import org.onosproject.net.CltSignalType;
26import org.onosproject.net.DefaultAnnotations;
27import org.onosproject.net.DeviceId;
28import org.onosproject.net.PortNumber;
29import org.onosproject.net.SparseAnnotations;
30import org.onosproject.net.behaviour.PortDiscovery;
31import org.onosproject.net.device.OduCltPortDescription;
32import org.onosproject.net.device.PortDescription;
33import org.onosproject.net.driver.AbstractHandlerBehaviour;
34import org.onosproject.net.driver.DriverHandler;
35import org.onosproject.protocol.rest.RestSBController;
36
37import java.util.ArrayList;
38import java.util.List;
39
40import static com.google.common.base.Preconditions.checkNotNull;
41
42/**
43 * Discovers the ports from a Ciena WaveServer Rest device.
44 */
45public class PortDiscoveryCienaWaveserverImpl extends AbstractHandlerBehaviour
46 implements PortDiscovery {
47
48 private static final String SPEED = "speed";
49 private static final String GBPS = "Gbps";
50 private static final String PORT_ID = "port-id";
51 private static final String XML = "xml";
52 private static final String ENABLED = "enabled";
53 private static final String EMPTY_STRING = "";
54 private static final String NAME = "name";
55 private static final String ADMIN_STATE = "admin-state";
56
Andrea Campanella2947e622016-01-27 09:23:46 -080057 private static final ArrayList<String> LINESIDE_PORT_ID = Lists.newArrayList(
58 "4", "48");
Andrea Campanellad8d92db2016-01-14 16:24:41 -080059
60 private static final String GENERAL_PORT_REQUEST =
Andrea Campanella2947e622016-01-27 09:23:46 -080061 "ws-ports?config=true&format=xml&depth=unbounded";
62 private static final String SPECIFIC_PORT_PATH = "ws-ptps/ptp/";
Andrea Campanellad8d92db2016-01-14 16:24:41 -080063 private static final String SPECIFIC_PORT_CONFIG =
64 "/ptp-config?config=true&format=xml&depth=unbounded";
Andrea Campanella2947e622016-01-27 09:23:46 -080065 //HTTP strings
66// private static final String GENERAL_PORT_REQUEST =
67// "/yang-api/datastore/ws-ports?config=true&format=xml&depth=unbounded";
68// private static final String SPECIFIC_PORT_PATH = "/yang-api/datastore/ws-ptps/ptp/";
69// private static final String SPECIFIC_PORT_CONFIG =
70// "/ptp-config?config=true&format=xml&depth=unbounded";
Andrea Campanellad8d92db2016-01-14 16:24:41 -080071
72
73 @Override
74 public List<PortDescription> getPorts() {
75 List<PortDescription> ports = Lists.newArrayList();
76 DriverHandler handler = handler();
77 RestSBController controller = checkNotNull(handler.get(RestSBController.class));
78 DeviceId deviceId = handler.data().deviceId();
79
80
81 HierarchicalConfiguration config = XmlConfigParser.
82 loadXml(controller.get(deviceId, GENERAL_PORT_REQUEST, XML));
83 List<HierarchicalConfiguration> portsConfig =
84 XmlConfigParser.parseWaveServerCienaPorts(config);
Andrea Campanellad8d92db2016-01-14 16:24:41 -080085 portsConfig.stream().forEach(sub -> {
Andrea Campanella2947e622016-01-27 09:23:46 -080086 String portId = sub.getString(PORT_ID);
Andrea Campanellad8d92db2016-01-14 16:24:41 -080087 String name = sub.getString(NAME);
88 SparseAnnotations annotations = DefaultAnnotations.builder()
Andrea Campanella2947e622016-01-27 09:23:46 -080089 .set(AnnotationKeys.NAME, name).build();
90 if (LINESIDE_PORT_ID.contains(portId)) {
91 String wsportInfoRequest = SPECIFIC_PORT_PATH + portId +
Andrea Campanellad8d92db2016-01-14 16:24:41 -080092 SPECIFIC_PORT_CONFIG;
Jonathan Hart51539b82015-10-29 09:53:04 -070093 ports.add(XmlConfigParser.parseWaveServerCienaOchPorts(
Andrea Campanellad8d92db2016-01-14 16:24:41 -080094 sub.getLong(PORT_ID),
Andrea Campanella2947e622016-01-27 09:23:46 -080095 toGbps(Long.parseLong(sub.getString(SPEED).replace(GBPS, EMPTY_STRING)
96 .replace(" ", EMPTY_STRING))),
Andrea Campanellad8d92db2016-01-14 16:24:41 -080097 XmlConfigParser.loadXml(controller.get(deviceId, wsportInfoRequest, XML)),
98 annotations));
Andrea Campanella2947e622016-01-27 09:23:46 -080099 //adding corresponding opposite side port
100 ports.add(XmlConfigParser.parseWaveServerCienaOchPorts(
101 sub.getLong(PORT_ID) + 1,
102 toGbps(Long.parseLong(sub.getString(SPEED).replace(GBPS, EMPTY_STRING)
103 .replace(" ", EMPTY_STRING))),
104 XmlConfigParser.loadXml(controller.get(deviceId, wsportInfoRequest, XML)),
105 DefaultAnnotations.builder()
106 .set(AnnotationKeys.NAME, name.replace(".1", ".2"))
107 .build()));
108 } else if (!portId.equals("5") && !portId.equals("49")) {
Andrea Campanellad8d92db2016-01-14 16:24:41 -0800109 //FIXME change when all optical types have two way information methods, see jira tickets
110 final int speed100GbpsinMbps = 100000;
111 CltSignalType cltType = toGbps(Long.parseLong(
Andrea Campanella2947e622016-01-27 09:23:46 -0800112 sub.getString(SPEED).replace(GBPS, EMPTY_STRING)
113 .replace(" ", EMPTY_STRING))) == speed100GbpsinMbps ?
Andrea Campanellad8d92db2016-01-14 16:24:41 -0800114 CltSignalType.CLT_100GBE : null;
115 ports.add(new OduCltPortDescription(PortNumber.portNumber(sub.getLong(PORT_ID)),
116 sub.getString(ADMIN_STATE).equals(ENABLED),
117 cltType, annotations));
118 }
119 });
120 return ports;
121 }
122
123 //FIXME remove when all optical types have two way information methods, see jira tickets
124 private long toGbps(long speed) {
125 return speed * 1000;
126 }
Andrea Campanella2947e622016-01-27 09:23:46 -0800127
Andrea Campanellad8d92db2016-01-14 16:24:41 -0800128}
129