blob: 81fb581d9d9b86c2535a05421182c6700dc1b490 [file] [log] [blame]
Jimmy Yanda878fc2016-09-02 16:32:01 -07001/*
2 * Copyright 2016-present 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.roadm;
17
18import com.fasterxml.jackson.databind.node.ObjectNode;
19import com.google.common.collect.ImmutableSet;
20import com.google.common.collect.Range;
21import org.onlab.osgi.ServiceDirectory;
22import org.onosproject.net.AnnotationKeys;
23import org.onosproject.net.DeviceId;
24import org.onosproject.net.optical.OpticalAnnotations;
25import org.onosproject.net.Port;
26import org.onosproject.net.PortNumber;
27import org.onosproject.net.device.DeviceService;
28import org.onosproject.ui.RequestHandler;
29import org.onosproject.ui.UiConnection;
30import org.onosproject.ui.UiMessageHandler;
31import org.onosproject.ui.table.TableModel;
32import org.onosproject.ui.table.TableRequestHandler;
33import org.slf4j.Logger;
34import org.slf4j.LoggerFactory;
35
36import java.util.Collection;
37import java.util.List;
38
39/**
40 * Table-View message handler for ROADM port view.
41 */
42public class RoadmPortViewMessageHandler extends UiMessageHandler {
43
44 private static final String ROADM_PORT_DATA_REQ = "roadmPortDataRequest";
45 private static final String ROADM_PORT_DATA_RESP = "roadmPortDataResponse";
46 private static final String ROADM_PORTS = "roadmPorts";
47
48 private static final String ROADM_SET_TARGET_POWER_REQ = "roadmSetTargetPowerRequest";
49 private static final String ROADM_SET_TARGET_POWER_RESP = "roadmSetTargetPowerResponse";
50
51 private static final String NO_ROWS_MESSAGE = "No items found";
52
53 private static final String DEV_ID = "devId";
54
55 private static final String ID = "id";
56 private static final String TYPE = "type";
57 private static final String NAME = "name";
58 private static final String ENABLED = "enabled";
59 private static final String MIN_FREQ = "minFreq";
60 private static final String MAX_FREQ = "maxFreq";
61 private static final String GRID = "grid";
62 private static final String INPUT_POWER_RANGE = "inputPowerRange";
63 private static final String CURRENT_POWER = "currentPower";
64 private static final String TARGET_POWER = "targetPower";
65 private static final String HAS_TARGET_POWER = "hasTargetPower";
66
67 private static final String[] COLUMN_IDS = {
68 ID, TYPE, NAME, ENABLED, MIN_FREQ, MAX_FREQ, GRID, INPUT_POWER_RANGE,
69 CURRENT_POWER, TARGET_POWER, HAS_TARGET_POWER,
70 };
71
72 private static final String NA = "N/A";
73 private static final String UNKNOWN = "Unknown";
74
75 private static final long GHZ = 1_000_000_000L;
76 private static final long THZ = 1_000_000_000_000L;
77
78 private DeviceService deviceService;
79 private RoadmService roadmService;
80
81 private final Logger log = LoggerFactory.getLogger(getClass());
82
83 @Override
84 public void init(UiConnection connection, ServiceDirectory directory) {
85 super.init(connection, directory);
86 deviceService = get(DeviceService.class);
87 roadmService = get(RoadmService.class);
88 }
89
90 @Override
91 protected Collection<RequestHandler> createRequestHandlers() {
92 return ImmutableSet.of(
93 new PortTableDataRequestHandler(),
94 new SetTargetPowerRequestHandler()
95 );
96 }
97
98 private String asGHz(String value) {
99 return String.valueOf(Double.valueOf(value) / GHZ);
100 }
101
102 private String asTHz(String value) {
103 return String.valueOf(Double.valueOf(value) / THZ);
104 }
105
106 private String annotation(Port port, String key, String defaultValue) {
107 String value = port.annotations().value(key);
108 return value != null ? value : defaultValue;
109 }
110
111 private String annotation(Port port, String key) {
112 return annotation(port, key, NA);
113 }
114
115 // Handler for sample table requests
116 private final class PortTableDataRequestHandler extends TableRequestHandler {
117
118 private PortTableDataRequestHandler() {
119 super(ROADM_PORT_DATA_REQ, ROADM_PORT_DATA_RESP, ROADM_PORTS);
120 }
121
122 @Override
123 protected String[] getColumnIds() {
124 return COLUMN_IDS;
125 }
126
127 @Override
128 protected String noRowsMessage(ObjectNode payload) {
129 return NO_ROWS_MESSAGE;
130 }
131
132 @Override
133 protected void populateTable(TableModel tm, ObjectNode payload) {
134 DeviceId deviceId = DeviceId.deviceId(string(payload, DEV_ID, "(none)"));
135
136 if (deviceService.isAvailable(deviceId)) {
137 List<Port> ports = deviceService.getPorts(deviceId);
138 for (Port port : ports) {
139 populateRow(tm.addRow(), port, deviceId);
140 }
141 }
142 }
143
144 private void populateRow(TableModel.Row row, Port port, DeviceId deviceId) {
145 row.cell(ID, port.number().toLong())
146 .cell(TYPE, port.type())
147 .cell(ENABLED, port.isEnabled())
148 .cell(NAME, annotation(port, AnnotationKeys.PORT_NAME))
149 .cell(MIN_FREQ, asTHz(annotation(port, OpticalAnnotations.MIN_FREQ_HZ)))
150 .cell(MAX_FREQ, asTHz(annotation(port, OpticalAnnotations.MAX_FREQ_HZ)))
151 .cell(GRID, asGHz(annotation(port, OpticalAnnotations.GRID_HZ)))
152 .cell(INPUT_POWER_RANGE, getInputPowerRange(deviceId, port.number()))
153 .cell(CURRENT_POWER, getCurrentPower(deviceId, port.number()))
154 .cell(TARGET_POWER, getTargetPower(deviceId, port.number()))
155 .cell(HAS_TARGET_POWER, roadmService.hasPortTargetPower(deviceId, port.number()));
156 }
157
158 // Returns the input power range as a string, N/A if the port is not an
159 // input port
160 private String getInputPowerRange(DeviceId deviceId, PortNumber portNumber) {
161 Range<Long> range =
162 roadmService.inputPortPowerRange(deviceId, portNumber);
163 if (range != null) {
164 return range.toString();
165 }
166 return NA;
167 }
168
169 // Returns the current power as a string, Unknown if no value can be found.
170 private String getCurrentPower(DeviceId deviceId, PortNumber portNumber) {
171 Long currentPower =
172 roadmService.getCurrentPortPower(deviceId, portNumber);
173 if (currentPower != null) {
174 return String.valueOf(currentPower);
175 }
176 return UNKNOWN;
177 }
178
179 // Returns target power as a string, Unknown if target power is expected but
180 // cannot be found, N/A if port does not have configurable target power
181 private String getTargetPower(DeviceId deviceId, PortNumber portNumber) {
182 if (roadmService.hasPortTargetPower(deviceId, portNumber)) {
183 Long targetPower =
184 roadmService.getTargetPortPower(deviceId, portNumber);
185 if (targetPower != null) {
186 return String.valueOf(targetPower);
187 } else {
188 return UNKNOWN;
189 }
190 }
191 return NA;
192 }
193 }
194
195
196 // Handler for setting port target power
197 private final class SetTargetPowerRequestHandler extends RequestHandler {
198
199 private static final String VALID = "valid";
200 private static final String MESSAGE = "message";
201
202 private static final String TARGET_POWER_ERR_MSG = "Target power range is %s.";
203
204 private SetTargetPowerRequestHandler() {
205 super(ROADM_SET_TARGET_POWER_REQ);
206 }
207
208 @Override
209 public void process(ObjectNode payload) {
210 DeviceId deviceId = DeviceId.deviceId(string(payload, DEV_ID, "(none)"));
211 PortNumber portNumber = PortNumber.portNumber(payload.get(ID).asLong());
212 long targetPower = payload.get(TARGET_POWER).asLong();
213 boolean validTargetPower;
214
215 Range<Long> range =
216 roadmService.targetPortPowerRange(deviceId, portNumber);
217 if (range != null) {
218 validTargetPower = range.contains(targetPower);
219
220 if (validTargetPower) {
221 roadmService.setTargetPortPower(deviceId, portNumber, targetPower);
222 }
223
224 ObjectNode rootNode = objectNode();
225 rootNode.put(ID, payload.get(ID).asText());
226 rootNode.put(VALID, validTargetPower);
227 rootNode.put(MESSAGE, String.format(TARGET_POWER_ERR_MSG, range.toString()));
228 sendMessage(ROADM_SET_TARGET_POWER_RESP, rootNode);
229
230 } else {
231 log.warn("Unable to determine target power range for device {}", deviceId);
232 }
233 }
234 }
235}