blob: 0578858da34d1153a1afe443a4afa8c5c9e4700f [file] [log] [blame]
HIGUCHI Yuta34a3f692016-01-09 21:08:57 -08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
HIGUCHI Yuta34a3f692016-01-09 21:08:57 -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 */
16package org.onosproject.net.optical.device;
17
18import static org.slf4j.LoggerFactory.getLogger;
19
20import java.io.IOException;
21import java.util.Optional;
22
23import org.onosproject.net.Annotations;
24import org.onosproject.net.DefaultAnnotations;
25import org.onosproject.net.DefaultAnnotations.Builder;
26import org.onosproject.net.OchSignal;
27import org.onosproject.net.OduSignalType;
28import org.onosproject.net.Port;
29import org.onosproject.net.PortNumber;
30import org.onosproject.net.SparseAnnotations;
31import org.onosproject.net.device.DefaultPortDescription;
32import org.onosproject.net.device.PortDescription;
33import org.onosproject.net.optical.OchPort;
34import org.onosproject.net.optical.impl.DefaultOchPort;
35import org.onosproject.net.optical.json.OchSignalCodec;
36import org.slf4j.Logger;
37
38import com.fasterxml.jackson.databind.ObjectMapper;
39import com.fasterxml.jackson.databind.node.ObjectNode;
40import com.google.common.annotations.Beta;
Yuta HIGUCHI1d547bf2016-08-02 21:44:48 -070041import com.google.common.collect.ImmutableSet;
HIGUCHI Yuta34a3f692016-01-09 21:08:57 -080042
43/**
44 * OCh port related helpers.
45 */
46@Beta
47public final class OchPortHelper {
48
49 private static final Logger log = getLogger(OchPortHelper.class);
50
51 private static final ObjectMapper MAPPER = new ObjectMapper();
52
53 // Annotation keys
54 private static final String SIGNAL_TYPE = "signalType";
55 private static final String TUNABLE = "tunable";
56 private static final String LAMBDA = "lambda";
57
58 /**
59 * Creates OCh port DefaultPortDescription based on the supplied information.
60 *
61 * @param number port number
62 * @param isEnabled port enabled state
63 * @param signalType ODU signal type
64 * @param isTunable tunable wavelength capability
65 * @param lambda OCh signal
66 * @return OCh port DefaultPortDescription with OCh annotations
67 */
68 public static PortDescription ochPortDescription(PortNumber number,
69 boolean isEnabled,
70 OduSignalType signalType,
71 boolean isTunable,
72 OchSignal lambda) {
73 return ochPortDescription(number, isEnabled, signalType, isTunable, lambda, DefaultAnnotations.EMPTY);
74 }
75
76 /**
77 * Creates OCh port DefaultPortDescription based on the supplied information.
78 *
79 * @param number port number
80 * @param isEnabled port enabled state
81 * @param signalType ODU signal type
82 * @param isTunable tunable wavelength capability
83 * @param lambda OCh signal
84 * @param annotationsIn key/value annotations map
85 * @return OCh port DefaultPortDescription with OCh annotations
86 */
87 public static PortDescription ochPortDescription(PortNumber number,
88 boolean isEnabled,
89 OduSignalType signalType,
90 boolean isTunable,
91 OchSignal lambda,
92 SparseAnnotations annotationsIn) {
93
94 Builder builder = DefaultAnnotations.builder();
95 builder.putAll(annotationsIn);
96
97 builder.set(TUNABLE, String.valueOf(isTunable));
98 builder.set(LAMBDA, OchSignalCodec.encode(lambda).toString());
99 builder.set(SIGNAL_TYPE, signalType.toString());
100
101 DefaultAnnotations annotations = builder.build();
Yuta HIGUCHI5ae80852017-02-13 18:30:15 -0800102 long portSpeed = signalType.bitRate();
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800103 return DefaultPortDescription.builder().withPortNumber(number).isEnabled(isEnabled)
104 .type(Port.Type.OCH).portSpeed(portSpeed).annotations(annotations)
105 .build();
HIGUCHI Yuta34a3f692016-01-09 21:08:57 -0800106 }
107
108 /**
109 * Creates OCh port DefaultPortDescription based on the supplied information.
110 *
111 * @param base PortDescription to get basic information from
112 * @param signalType ODU signal type
113 * @param isTunable tunable wavelength capability
114 * @param lambda OCh signal
115 * @param annotations key/value annotations map
116 * @return OCh port DefaultPortDescription with OCh annotations
117 */
118 public static PortDescription ochPortDescription(PortDescription base,
119 OduSignalType signalType,
120 boolean isTunable,
121 OchSignal lambda,
122 SparseAnnotations annotations) {
123 return ochPortDescription(base.portNumber(), base.isEnabled(), signalType, isTunable, lambda, annotations);
124 }
125
126
127 public static Optional<OchPort> asOchPort(Port port) {
128 if (port instanceof OchPort) {
129 return Optional.of((OchPort) port);
130 }
131
132 try {
133 Annotations an = port.annotations();
134
135 OduSignalType signalType = Enum.valueOf(OduSignalType.class,
136 an.value(SIGNAL_TYPE));
137
138 boolean isTunable = Boolean.valueOf(an.value(TUNABLE));
139
140 ObjectNode obj = (ObjectNode) MAPPER.readTree(an.value(LAMBDA));
141 OchSignal lambda = OchSignalCodec.decode(obj);
142
143 // Note: OCh specific annotations is not filtered-out here.
144 // DefaultOchPort should filter them, if necessary.
145 return Optional.of(new DefaultOchPort(port, signalType, isTunable, lambda));
146
147 // TODO: it'll be better to verify each inputs properly
148 // instead of catching all these Exceptions.
149 } catch (IOException | NullPointerException
150 | IllegalArgumentException | ClassCastException e) {
151
152 log.warn("{} was not well-formed OCh port.", port, e);
153 return Optional.empty();
154 }
155 }
156
Yuta HIGUCHI1d547bf2016-08-02 21:44:48 -0700157 /**
158 * Returns {@link Annotations} not used by the port type projection.
159 *
160 * @param input {@link Annotations}
161 * @return filtered view of given {@link Annotations}
162 */
163 public static Annotations stripHandledAnnotations(Annotations input) {
164 return new FilteredAnnotation(input, ImmutableSet.of(SIGNAL_TYPE, TUNABLE, LAMBDA));
165 }
166
HIGUCHI Yuta34a3f692016-01-09 21:08:57 -0800167 // not meant to be instantiated
168 private OchPortHelper() {}
169}