blob: 50dc98c8d8a5ef57c7e6b52a8692488b9818bf7d [file] [log] [blame]
HIGUCHI Yuta34a3f692016-01-09 21:08:57 -08001/*
2 * Copyright 2016 Open Networking Laboratory
3 *
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;
41
42/**
43 * OCh port related helpers.
44 */
45@Beta
46public final class OchPortHelper {
47
48 private static final Logger log = getLogger(OchPortHelper.class);
49
50 private static final ObjectMapper MAPPER = new ObjectMapper();
51
52 // Annotation keys
53 private static final String SIGNAL_TYPE = "signalType";
54 private static final String TUNABLE = "tunable";
55 private static final String LAMBDA = "lambda";
56
57 /**
58 * Creates OCh port DefaultPortDescription based on the supplied information.
59 *
60 * @param number port number
61 * @param isEnabled port enabled state
62 * @param signalType ODU signal type
63 * @param isTunable tunable wavelength capability
64 * @param lambda OCh signal
65 * @return OCh port DefaultPortDescription with OCh annotations
66 */
67 public static PortDescription ochPortDescription(PortNumber number,
68 boolean isEnabled,
69 OduSignalType signalType,
70 boolean isTunable,
71 OchSignal lambda) {
72 return ochPortDescription(number, isEnabled, signalType, isTunable, lambda, DefaultAnnotations.EMPTY);
73 }
74
75 /**
76 * Creates OCh port DefaultPortDescription based on the supplied information.
77 *
78 * @param number port number
79 * @param isEnabled port enabled state
80 * @param signalType ODU signal type
81 * @param isTunable tunable wavelength capability
82 * @param lambda OCh signal
83 * @param annotationsIn key/value annotations map
84 * @return OCh port DefaultPortDescription with OCh annotations
85 */
86 public static PortDescription ochPortDescription(PortNumber number,
87 boolean isEnabled,
88 OduSignalType signalType,
89 boolean isTunable,
90 OchSignal lambda,
91 SparseAnnotations annotationsIn) {
92
93 Builder builder = DefaultAnnotations.builder();
94 builder.putAll(annotationsIn);
95
96 builder.set(TUNABLE, String.valueOf(isTunable));
97 builder.set(LAMBDA, OchSignalCodec.encode(lambda).toString());
98 builder.set(SIGNAL_TYPE, signalType.toString());
99
100 DefaultAnnotations annotations = builder.build();
101 long portSpeed = 0; // FIXME assign appropriate value
102 return new DefaultPortDescription(number, isEnabled, Port.Type.OCH, portSpeed, annotations);
103 }
104
105 /**
106 * Creates OCh port DefaultPortDescription based on the supplied information.
107 *
108 * @param base PortDescription to get basic information from
109 * @param signalType ODU signal type
110 * @param isTunable tunable wavelength capability
111 * @param lambda OCh signal
112 * @param annotations key/value annotations map
113 * @return OCh port DefaultPortDescription with OCh annotations
114 */
115 public static PortDescription ochPortDescription(PortDescription base,
116 OduSignalType signalType,
117 boolean isTunable,
118 OchSignal lambda,
119 SparseAnnotations annotations) {
120 return ochPortDescription(base.portNumber(), base.isEnabled(), signalType, isTunable, lambda, annotations);
121 }
122
123
124 public static Optional<OchPort> asOchPort(Port port) {
125 if (port instanceof OchPort) {
126 return Optional.of((OchPort) port);
127 }
128
129 try {
130 Annotations an = port.annotations();
131
132 OduSignalType signalType = Enum.valueOf(OduSignalType.class,
133 an.value(SIGNAL_TYPE));
134
135 boolean isTunable = Boolean.valueOf(an.value(TUNABLE));
136
137 ObjectNode obj = (ObjectNode) MAPPER.readTree(an.value(LAMBDA));
138 OchSignal lambda = OchSignalCodec.decode(obj);
139
140 // Note: OCh specific annotations is not filtered-out here.
141 // DefaultOchPort should filter them, if necessary.
142 return Optional.of(new DefaultOchPort(port, signalType, isTunable, lambda));
143
144 // TODO: it'll be better to verify each inputs properly
145 // instead of catching all these Exceptions.
146 } catch (IOException | NullPointerException
147 | IllegalArgumentException | ClassCastException e) {
148
149 log.warn("{} was not well-formed OCh port.", port, e);
150 return Optional.empty();
151 }
152 }
153
154 // not meant to be instantiated
155 private OchPortHelper() {}
156}