blob: 32dd5cd7076b11a25f4860300ac81c2ecd1824d1 [file] [log] [blame]
Aaron Kruglikov17b4c852016-01-15 16:37:04 -08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Aaron Kruglikov17b4c852016-01-15 16:37:04 -08003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.drivers.fujitsu;
18
Andrea Campanella6c71a052016-04-22 11:56:31 -070019import com.google.common.collect.ImmutableList;
20import com.google.common.collect.Lists;
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -070021import org.apache.commons.configuration.HierarchicalConfiguration;
Aaron Kruglikov17b4c852016-01-15 16:37:04 -080022import org.onosproject.drivers.utilities.XmlConfigParser;
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -070023import org.onosproject.net.AnnotationKeys;
24import org.onosproject.net.ChannelSpacing;
25import org.onosproject.net.CltSignalType;
26import org.onosproject.net.DefaultAnnotations;
27import org.onosproject.net.GridType;
28import org.onosproject.net.OchSignal;
29import org.onosproject.net.OduSignalType;
30import org.onosproject.net.PortNumber;
Andrea Campanella6c71a052016-04-22 11:56:31 -070031import org.onosproject.net.device.DeviceDescription;
32import org.onosproject.net.device.DeviceDescriptionDiscovery;
Aaron Kruglikov17b4c852016-01-15 16:37:04 -080033import org.onosproject.net.device.PortDescription;
34import org.onosproject.net.driver.AbstractHandlerBehaviour;
35import org.onosproject.netconf.NetconfController;
Aaron Kruglikov17b4c852016-01-15 16:37:04 -080036import org.onosproject.netconf.NetconfSession;
37import org.slf4j.Logger;
38
39import java.io.ByteArrayInputStream;
40import java.io.IOException;
41import java.util.List;
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -070042import java.util.concurrent.atomic.AtomicInteger;
Aaron Kruglikov17b4c852016-01-15 16:37:04 -080043
44import static com.google.common.base.Preconditions.checkNotNull;
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -070045import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
46import static org.onosproject.net.optical.device.OduCltPortHelper.oduCltPortDescription;
Aaron Kruglikov17b4c852016-01-15 16:37:04 -080047import static org.slf4j.LoggerFactory.getLogger;
48
49/**
50 * Retrieves the ports from a Fujitsu T100 device via netconf.
51 */
Andrea Campanella6c71a052016-04-22 11:56:31 -070052public class FujitsuT100DeviceDescription extends AbstractHandlerBehaviour
53 implements DeviceDescriptionDiscovery {
Aaron Kruglikov17b4c852016-01-15 16:37:04 -080054
55 private final Logger log = getLogger(getClass());
56
57 @Override
Andrea Campanella6c71a052016-04-22 11:56:31 -070058 public DeviceDescription discoverDeviceDetails() {
59 log.info("No description to be added for device");
60 //TODO to be implemented if needed.
61 return null;
62 }
63
64 @Override
65 public List<PortDescription> discoverPortDetails() {
Aaron Kruglikov17b4c852016-01-15 16:37:04 -080066 NetconfController controller = checkNotNull(handler().get(NetconfController.class));
67 NetconfSession session = controller.getDevicesMap().get(handler().data().deviceId()).getSession();
68 String reply;
69 try {
70 reply = session.get(requestBuilder());
71 } catch (IOException e) {
Michele Santuari00cc1f72016-09-08 17:05:24 +020072 log.error("Failed to retrieve port details for device {}", handler().data().deviceId());
73 return ImmutableList.of();
Aaron Kruglikov17b4c852016-01-15 16:37:04 -080074 }
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -070075 List<PortDescription> descriptions =
Aaron Kruglikov17b4c852016-01-15 16:37:04 -080076 parseFujitsuT100Ports(XmlConfigParser.
77 loadXml(new ByteArrayInputStream(reply.getBytes())));
Andrea Campanella6c71a052016-04-22 11:56:31 -070078 return ImmutableList.copyOf(descriptions);
Aaron Kruglikov17b4c852016-01-15 16:37:04 -080079 }
80
81 /**
82 * Builds a request crafted to get the configuration required to create port
83 * descriptions for the device.
Andrea Campanella6c71a052016-04-22 11:56:31 -070084 *
Aaron Kruglikov17b4c852016-01-15 16:37:04 -080085 * @return The request string.
86 */
87 private String requestBuilder() {
88 StringBuilder rpc = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
89 //Message ID is injected later.
90 rpc.append("<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">");
91 rpc.append("<get>");
92 rpc.append("<filter type=\"subtree\">");
93 rpc.append("<interfaces xmlns=\"urn:ietf:params:xml:ns:yang:ietf-interfaces\">");
94 rpc.append("</interfaces>");
95 rpc.append("</filter>");
96 rpc.append("</get>");
97 rpc.append("</rpc>");
98 return rpc.toString();
99 }
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -0700100
101 /**
102 * Parses a configuration and returns a set of ports for the fujitsu T100.
Andrea Campanella6c71a052016-04-22 11:56:31 -0700103 *
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -0700104 * @param cfg a hierarchical configuration
105 * @return a list of port descriptions
106 */
107 private static List<PortDescription> parseFujitsuT100Ports(HierarchicalConfiguration cfg) {
108 AtomicInteger counter = new AtomicInteger(1);
109 List<PortDescription> portDescriptions = Lists.newArrayList();
110 List<HierarchicalConfiguration> subtrees =
111 cfg.configurationsAt("data.interfaces.interface");
112 for (HierarchicalConfiguration portConfig : subtrees) {
113 if (!portConfig.getString("name").contains("LCN") &&
114 !portConfig.getString("name").contains("LMP") &&
Jon Halla3fcf672017-03-28 16:53:22 -0700115 "ianaift:ethernetCsmacd".equals(portConfig.getString("type"))) {
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -0700116 portDescriptions.add(parseT100OduPort(portConfig, counter.getAndIncrement()));
Jon Halla3fcf672017-03-28 16:53:22 -0700117 } else if ("ianaift:otnOtu".equals(portConfig.getString("type"))) {
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -0700118 portDescriptions.add(parseT100OchPort(portConfig, counter.getAndIncrement()));
119 }
120 }
121 return portDescriptions;
122 }
123
124 private static PortDescription parseT100OchPort(HierarchicalConfiguration cfg, long count) {
125 PortNumber portNumber = PortNumber.portNumber(count);
126 HierarchicalConfiguration otuConfig = cfg.configurationAt("otu");
Jon Halla3fcf672017-03-28 16:53:22 -0700127 boolean enabled = "up".equals(otuConfig.getString("administrative-state"));
128 OduSignalType signalType = "OTU4".equals(otuConfig.getString("rate")) ? OduSignalType.ODU4 : null;
Frank Wangd8ab0962017-08-11 11:09:30 +0800129 //Unsure how to retrieve, outside knowledge it is tunable.
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -0700130 boolean isTunable = true;
131 OchSignal lambda = new OchSignal(GridType.DWDM, ChannelSpacing.CHL_50GHZ, 0, 4);
132 DefaultAnnotations annotations = DefaultAnnotations.builder().
133 set(AnnotationKeys.PORT_NAME, cfg.getString("name")).
134 build();
135 return ochPortDescription(portNumber, enabled, signalType, isTunable, lambda, annotations);
136 }
137
138 private static PortDescription parseT100OduPort(HierarchicalConfiguration cfg, long count) {
139 PortNumber portNumber = PortNumber.portNumber(count);
140 HierarchicalConfiguration ethernetConfig = cfg.configurationAt("ethernet");
Jon Halla3fcf672017-03-28 16:53:22 -0700141 boolean enabled = "up".equals(ethernetConfig.getString("administrative-state"));
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -0700142 //Rate is in kbps
Jon Halla3fcf672017-03-28 16:53:22 -0700143 CltSignalType signalType = "100000000".equals(ethernetConfig.getString("rate")) ?
HIGUCHI Yutadbb631f2016-05-16 16:18:10 -0700144 CltSignalType.CLT_100GBE : null;
145 DefaultAnnotations annotations = DefaultAnnotations.builder().
146 set(AnnotationKeys.PORT_NAME, cfg.getString("name")).
147 build();
148 return oduCltPortDescription(portNumber, enabled, signalType, annotations);
149 }
150
Aaron Kruglikov17b4c852016-01-15 16:37:04 -0800151}