blob: c21841c7d4da0d03819f650f932edd6e6fc065ea [file] [log] [blame]
Jimmy Yanda878fc2016-09-02 16:32:01 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Jimmy Yanda878fc2016-09-02 16:32:01 -07003 *
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;
MaoLu937cf422017-03-03 23:31:46 -080022import org.onlab.util.Frequency;
23import org.onlab.util.Spectrum;
Jimmy Yanda878fc2016-09-02 16:32:01 -070024import org.onosproject.net.ChannelSpacing;
25import org.onosproject.net.DeviceId;
MaoLu937cf422017-03-03 23:31:46 -080026import org.onosproject.net.device.DeviceService;
Jimmy Yanda878fc2016-09-02 16:32:01 -070027import org.onosproject.net.OchSignal;
28import org.onosproject.net.PortNumber;
29import org.onosproject.net.flow.FlowEntry;
30import org.onosproject.net.flow.FlowId;
31import org.onosproject.net.flow.FlowRuleService;
32import org.onosproject.ui.RequestHandler;
33import org.onosproject.ui.UiConnection;
34import org.onosproject.ui.UiMessageHandler;
35import org.onosproject.ui.table.TableModel;
36import org.onosproject.ui.table.TableRequestHandler;
37import org.onosproject.ui.table.cell.HexLongFormatter;
38import org.slf4j.Logger;
39import org.slf4j.LoggerFactory;
40
41import java.util.Collection;
42import java.util.Collections;
43import java.util.Comparator;
44import java.util.Set;
45
46import static org.onosproject.ui.JsonUtils.node;
47import static org.onosproject.ui.JsonUtils.number;
MaoLu937cf422017-03-03 23:31:46 -080048import static org.onosproject.net.Device.Type;
Jimmy Yanda878fc2016-09-02 16:32:01 -070049
50/**
51 * Table-View message handler for ROADM flow view.
52 */
53public class RoadmFlowViewMessageHandler extends UiMessageHandler {
54
55 private static final String ROADM_FLOW_DATA_REQ = "roadmFlowDataRequest";
56 private static final String ROADM_FLOW_DATA_RESP = "roadmFlowDataResponse";
57 private static final String ROADM_FLOWS = "roadmFlows";
58
59 private static final String ROADM_SET_ATTENUATION_REQ = "roadmSetAttenuationRequest";
60 private static final String ROADM_SET_ATTENUATION_RESP = "roadmSetAttenuationResponse";
61
62 private static final String ROADM_DELETE_FLOW_REQ = "roadmDeleteFlowRequest";
63
64 private static final String ROADM_CREATE_FLOW_REQ = "roadmCreateFlowRequest";
65 private static final String ROADM_CREATE_FLOW_RESP = "roadmCreateFlowResponse";
66
MaoLu937cf422017-03-03 23:31:46 -080067 private static final String ROADM_SHOW_ITEMS_REQ = "roadmShowFlowItemsRequest";
68 private static final String ROADM_SHOW_ITEMS_RESP = "roadmShowFlowItemsResponse";
Jimmy Yanda878fc2016-09-02 16:32:01 -070069
70 private static final String ID = "id";
71 private static final String FLOW_ID = "flowId";
72 private static final String APP_ID = "appId";
73 private static final String GROUP_ID = "groupId";
74 private static final String TABLE_ID = "tableId";
75 private static final String PRIORITY = "priority";
76 private static final String PERMANENT = "permanent";
77 private static final String TIMEOUT = "timeout";
78 private static final String STATE = "state";
79 private static final String IN_PORT = "inPort";
80 private static final String OUT_PORT = "outPort";
81 private static final String CHANNEL_SPACING = "spacing";
82 private static final String CHANNEL_MULTIPLIER = "multiplier";
83 private static final String CURRENT_POWER = "currentPower";
84 private static final String ATTENUATION = "attenuation";
85 private static final String HAS_ATTENUATION = "hasAttenuation";
MaoLu937cf422017-03-03 23:31:46 -080086 private static final String CHANNEL_FREQUENCY = "channelFrequency";
Jimmy Yanda878fc2016-09-02 16:32:01 -070087
88 private static final String[] COLUMN_IDS = {
89 ID, FLOW_ID, APP_ID, GROUP_ID, TABLE_ID, PRIORITY, TIMEOUT,
MaoLu937cf422017-03-03 23:31:46 -080090 PERMANENT, STATE, IN_PORT, OUT_PORT, CHANNEL_SPACING, CHANNEL_MULTIPLIER,
91 CHANNEL_FREQUENCY, CURRENT_POWER, ATTENUATION, HAS_ATTENUATION
Jimmy Yanda878fc2016-09-02 16:32:01 -070092 };
93
Jimmy Yanda878fc2016-09-02 16:32:01 -070094 private RoadmService roadmService;
MaoLu937cf422017-03-03 23:31:46 -080095 private DeviceService deviceService;
96 private FlowRuleService flowRuleService;
Jimmy Yanda878fc2016-09-02 16:32:01 -070097
98 private final Logger log = LoggerFactory.getLogger(getClass());
99
100 @Override
101 public void init(UiConnection connection, ServiceDirectory directory) {
102 super.init(connection, directory);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700103 roadmService = get(RoadmService.class);
MaoLu937cf422017-03-03 23:31:46 -0800104 deviceService = get(DeviceService.class);
105 flowRuleService = get(FlowRuleService.class);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700106 }
107
108 @Override
109 protected Collection<RequestHandler> createRequestHandlers() {
110 return ImmutableSet.of(
111 new FlowTableDataRequestHandler(),
112 new SetAttenuationRequestHandler(),
113 new DeleteConnectionRequestHandler(),
MaoLu937cf422017-03-03 23:31:46 -0800114 new CreateConnectionRequestHandler(),
115 new CreateShowItemsRequestHandler()
Jimmy Yanda878fc2016-09-02 16:32:01 -0700116 );
117 }
118
119 // Handler for sample table requests
120 private final class FlowTableDataRequestHandler extends TableRequestHandler {
121
122 private FlowTableDataRequestHandler() {
123 super(ROADM_FLOW_DATA_REQ, ROADM_FLOW_DATA_RESP, ROADM_FLOWS);
124 }
125
126 @Override
127 protected String[] getColumnIds() {
128 return COLUMN_IDS;
129 }
130
131 @Override
132 protected String noRowsMessage(ObjectNode payload) {
MaoLu937cf422017-03-03 23:31:46 -0800133 return RoadmUtil.NO_ROWS_MESSAGE;
Jimmy Yanda878fc2016-09-02 16:32:01 -0700134 }
135
136 @Override
137 protected TableModel createTableModel() {
138 TableModel tm = super.createTableModel();
139 tm.setFormatter(FLOW_ID, HexLongFormatter.INSTANCE);
140 return tm;
141 }
142
143 @Override
144 protected void populateTable(TableModel tm, ObjectNode payload) {
MaoLu937cf422017-03-03 23:31:46 -0800145 DeviceId deviceId = DeviceId.deviceId(string(payload, RoadmUtil.DEV_ID));
146 // Update flows
Jimmy Yanda878fc2016-09-02 16:32:01 -0700147 Iterable<FlowEntry> flowEntries = flowRuleService.getFlowEntries(deviceId);
148 for (FlowEntry flowEntry : flowEntries) {
149 populateRow(tm.addRow(), flowEntry, deviceId);
150 }
151 }
152
153 private void populateRow(TableModel.Row row, FlowEntry entry, DeviceId deviceId) {
154 ChannelData cd = ChannelData.fromFlow(entry);
MaoLu937cf422017-03-03 23:31:46 -0800155 String spacing = RoadmUtil.NA, multiplier = RoadmUtil.NA, channelFrequency = "";
156 OchSignal ochSignal = cd.ochSignal();
157 if (ochSignal != null) {
158 Frequency spacingFreq = ochSignal.channelSpacing().frequency();
159 spacing = RoadmUtil.asGHz(spacingFreq);
160 int spacingMult = ochSignal.spacingMultiplier();
161 multiplier = String.valueOf(spacingMult);
162 channelFrequency = String.format(" (%sGHz)",
163 RoadmUtil.asGHz(Spectrum.CENTER_FREQUENCY.add(spacingFreq.multiply(spacingMult))));
164 }
165
Jimmy Yanda878fc2016-09-02 16:32:01 -0700166 row.cell(ID, entry.id().value())
167 .cell(FLOW_ID, entry.id().value())
168 .cell(APP_ID, entry.appId())
169 .cell(PRIORITY, entry.priority())
170 .cell(TIMEOUT, entry.timeout())
171 .cell(PERMANENT, entry.isPermanent())
172 .cell(STATE, entry.state().toString())
173 .cell(IN_PORT, cd.inPort().toLong())
174 .cell(OUT_PORT, cd.outPort().toLong())
MaoLu937cf422017-03-03 23:31:46 -0800175 .cell(CHANNEL_SPACING, spacing)
176 .cell(CHANNEL_MULTIPLIER, multiplier)
177 .cell(CHANNEL_FREQUENCY, channelFrequency)
Jimmy Yanda878fc2016-09-02 16:32:01 -0700178 .cell(CURRENT_POWER, getCurrentPower(deviceId, cd))
MaoLu937cf422017-03-03 23:31:46 -0800179 .cell(HAS_ATTENUATION, hasAttenuation(deviceId, cd))
Jimmy Yanda878fc2016-09-02 16:32:01 -0700180 .cell(ATTENUATION, getAttenuation(deviceId, cd));
181 }
182
183 private String getCurrentPower(DeviceId deviceId, ChannelData channelData) {
MaoLu937cf422017-03-03 23:31:46 -0800184 if (hasAttenuation(deviceId, channelData)) {
185 // report channel power if channel exists
186 Long currentPower = roadmService.getCurrentChannelPower(deviceId,
187 channelData.outPort(), channelData.ochSignal());
188 return RoadmUtil.objectToString(currentPower, RoadmUtil.UNKNOWN);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700189 }
MaoLu937cf422017-03-03 23:31:46 -0800190 // otherwise, report port power
191 Type devType = deviceService.getDevice(deviceId).type();
192 PortNumber port = devType == Type.FIBER_SWITCH ? channelData.inPort() : channelData.outPort();
193 Long currentPower = roadmService.getCurrentPortPower(deviceId, port);
194 return RoadmUtil.objectToString(currentPower, RoadmUtil.UNKNOWN);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700195 }
196
197 private String getAttenuation(DeviceId deviceId, ChannelData channelData) {
MaoLu937cf422017-03-03 23:31:46 -0800198 OchSignal signal = channelData.ochSignal();
199 if (signal == null) {
200 return RoadmUtil.NA;
Jimmy Yanda878fc2016-09-02 16:32:01 -0700201 }
MaoLu937cf422017-03-03 23:31:46 -0800202 Long attenuation = roadmService.getAttenuation(deviceId, channelData.outPort(), signal);
203 return RoadmUtil.objectToString(attenuation, RoadmUtil.UNKNOWN);
204 }
205
206 private boolean hasAttenuation(DeviceId deviceId, ChannelData channelData) {
207 OchSignal signal = channelData.ochSignal();
208 if (signal == null) {
209 return false;
210 }
211 return roadmService.attenuationRange(deviceId, channelData.outPort(), signal) != null;
Jimmy Yanda878fc2016-09-02 16:32:01 -0700212 }
213 }
214
215 // Handler for setting attenuation
216 private final class SetAttenuationRequestHandler extends RequestHandler {
217
Jimmy Yanda878fc2016-09-02 16:32:01 -0700218 // Error messages to display to user
MaoLu937cf422017-03-03 23:31:46 -0800219 private static final String ATTENUATION_RANGE_MSG = "Attenuation must be in range %s.";
220 private static final String NO_ATTENUATION_MSG = "Cannot set attenuation for this connection";
Jimmy Yanda878fc2016-09-02 16:32:01 -0700221
222 private SetAttenuationRequestHandler() {
223 super(ROADM_SET_ATTENUATION_REQ);
224 }
225
226 @Override
227 public void process(ObjectNode payload) {
MaoLu937cf422017-03-03 23:31:46 -0800228 DeviceId deviceId = DeviceId.deviceId(string(payload, RoadmUtil.DEV_ID));
Jimmy Yanda878fc2016-09-02 16:32:01 -0700229 FlowId flowId = FlowId.valueOf(number(payload, FLOW_ID));
Jimmy Yanda878fc2016-09-02 16:32:01 -0700230 // Get connection information from the flow
231 FlowEntry entry = findFlow(deviceId, flowId);
232 if (entry == null) {
MaoLu937cf422017-03-03 23:31:46 -0800233 log.error("Unable to find flow rule to set attenuation for device {}", deviceId);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700234 return;
235 }
MaoLu937cf422017-03-03 23:31:46 -0800236 ChannelData channelData = ChannelData.fromFlow(entry);
237 PortNumber port = channelData.outPort();
238 OchSignal signal = channelData.ochSignal();
239 Range<Long> range = roadmService.attenuationRange(deviceId, port, signal);
240 Long attenuation = payload.get(ATTENUATION).asLong();
241 boolean validAttenuation = range != null && range.contains(attenuation);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700242 if (validAttenuation) {
MaoLu937cf422017-03-03 23:31:46 -0800243 roadmService.setAttenuation(deviceId, port, signal, attenuation);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700244 }
Jimmy Yanda878fc2016-09-02 16:32:01 -0700245 ObjectNode rootNode = objectNode();
246 // Send back flowId so view can identify which callback function to use
247 rootNode.put(FLOW_ID, payload.get(FLOW_ID).asText());
MaoLu937cf422017-03-03 23:31:46 -0800248 rootNode.put(RoadmUtil.VALID, validAttenuation);
249 if (range == null) {
250 rootNode.put(RoadmUtil.MESSAGE, NO_ATTENUATION_MSG);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700251 } else {
MaoLu937cf422017-03-03 23:31:46 -0800252 rootNode.put(RoadmUtil.MESSAGE, String.format(ATTENUATION_RANGE_MSG, range.toString()));
Jimmy Yanda878fc2016-09-02 16:32:01 -0700253 }
254 sendMessage(ROADM_SET_ATTENUATION_RESP, rootNode);
255 }
256
257 private FlowEntry findFlow(DeviceId deviceId, FlowId flowId) {
258 for (FlowEntry entry : flowRuleService.getFlowEntries(deviceId)) {
259 if (entry.id().equals(flowId)) {
260 return entry;
261 }
262 }
263 return null;
264 }
265 }
266
267 // Handler for deleting a connection
268 private final class DeleteConnectionRequestHandler extends RequestHandler {
269 private DeleteConnectionRequestHandler() {
270 super(ROADM_DELETE_FLOW_REQ);
271 }
272
273 @Override
274 public void process(ObjectNode payload) {
MaoLu937cf422017-03-03 23:31:46 -0800275 DeviceId deviceId = DeviceId.deviceId(string(payload, RoadmUtil.DEV_ID));
Jimmy Yanda878fc2016-09-02 16:32:01 -0700276 FlowId flowId = FlowId.valueOf(payload.get(ID).asLong());
277 roadmService.removeConnection(deviceId, flowId);
278 }
279 }
280
281 // Handler for creating a creating a connection from form data
282 private final class CreateConnectionRequestHandler extends RequestHandler {
283
284 // Keys to load from JSON
285 private static final String FORM_DATA = "formData";
286 private static final String CHANNEL_SPACING_INDEX = "index";
Jimmy Yanda878fc2016-09-02 16:32:01 -0700287
288 // Keys for validation results
289 private static final String CONNECTION = "connection";
290 private static final String CHANNEL_AVAILABLE = "channelAvailable";
291
292 // Error messages to display to user
293 private static final String IN_PORT_ERR_MSG = "Invalid input port.";
294 private static final String OUT_PORT_ERR_MSG = "Invalid output port.";
MaoLu937cf422017-03-03 23:31:46 -0800295 private static final String CONNECTION_ERR_MSG = "Invalid connection from input port to output port.";
296 private static final String CHANNEL_SPACING_ERR_MSG = "Channel spacing not supported.";
297 private static final String CHANNEL_ERR_MSG = "Channel index must be in range %s.";
298 private static final String CHANNEL_AVAILABLE_ERR_MSG = "Channel is already being used.";
299 private static final String ATTENUATION_ERR_MSG = "Attenuation must be in range %s.";
Jimmy Yanda878fc2016-09-02 16:32:01 -0700300
301 private CreateConnectionRequestHandler() {
302 super(ROADM_CREATE_FLOW_REQ);
303 }
304
305 @Override
306 public void process(ObjectNode payload) {
MaoLu937cf422017-03-03 23:31:46 -0800307 DeviceId did = DeviceId.deviceId(string(payload, RoadmUtil.DEV_ID));
Jimmy Yanda878fc2016-09-02 16:32:01 -0700308 ObjectNode flowNode = node(payload, FORM_DATA);
309 int priority = (int) number(flowNode, PRIORITY);
310 boolean permanent = bool(flowNode, PERMANENT);
311 int timeout = (int) number(flowNode, TIMEOUT);
312 PortNumber inPort = PortNumber.portNumber(number(flowNode, IN_PORT));
313 PortNumber outPort = PortNumber.portNumber(number(flowNode, OUT_PORT));
314 ObjectNode chNode = node(flowNode, CHANNEL_SPACING);
MaoLu937cf422017-03-03 23:31:46 -0800315 ChannelSpacing spacing = channelSpacing((int) number(chNode, CHANNEL_SPACING_INDEX));
Jimmy Yanda878fc2016-09-02 16:32:01 -0700316 int multiplier = (int) number(flowNode, CHANNEL_MULTIPLIER);
317 OchSignal och = OchSignal.newDwdmSlot(spacing, multiplier);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700318 long att = number(flowNode, ATTENUATION);
319
MaoLu937cf422017-03-03 23:31:46 -0800320 boolean showItems = deviceService.getDevice(did).type() != Type.FIBER_SWITCH;
Jimmy Yanda878fc2016-09-02 16:32:01 -0700321 boolean validInPort = roadmService.validInputPort(did, inPort);
322 boolean validOutPort = roadmService.validOutputPort(did, outPort);
323 boolean validConnect = roadmService.validConnection(did, inPort, outPort);
324 boolean validSpacing = true;
325 boolean validChannel = roadmService.validChannel(did, inPort, och);
326 boolean channelAvailable = roadmService.channelAvailable(did, och);
327 boolean validAttenuation = roadmService.attenuationInRange(did, outPort, att);
328
MaoLu937cf422017-03-03 23:31:46 -0800329 if (validConnect) {
330 if (validChannel && channelAvailable) {
331 if (validAttenuation) {
332 roadmService.createConnection(did, priority, permanent, timeout, inPort, outPort, och, att);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700333 } else {
MaoLu937cf422017-03-03 23:31:46 -0800334 roadmService.createConnection(did, priority, permanent, timeout, inPort, outPort, och);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700335 }
336 }
337 }
338
MaoLu937cf422017-03-03 23:31:46 -0800339 String channelMessage = "Invalid channel";
Jimmy Yanda878fc2016-09-02 16:32:01 -0700340 String attenuationMessage = "Invalid attenuation";
MaoLu937cf422017-03-03 23:31:46 -0800341 if (showItems) {
342 // Construct error for channel
343 if (!validChannel) {
344 Set<OchSignal> lambdas = roadmService.queryLambdas(did, outPort);
345 if (lambdas != null) {
346 Range<Integer> range = channelRange(lambdas);
347 if (range.contains(och.spacingMultiplier())) {
348 // Channel spacing error
349 validSpacing = false;
350 } else {
351 channelMessage = String.format(CHANNEL_ERR_MSG, range.toString());
352 }
353 }
354 }
355
356 // Construct error for attenuation
357 if (!validAttenuation) {
358 Range<Long> range = roadmService.attenuationRange(did, outPort, och);
359 if (range != null) {
360 attenuationMessage = String.format(ATTENUATION_ERR_MSG, range.toString());
361 }
Jimmy Yanda878fc2016-09-02 16:32:01 -0700362 }
363 }
364
365 // Build response
366 ObjectNode node = objectNode();
Jimmy Yanda878fc2016-09-02 16:32:01 -0700367 node.set(IN_PORT, validationObject(validInPort, IN_PORT_ERR_MSG));
368 node.set(OUT_PORT, validationObject(validOutPort, OUT_PORT_ERR_MSG));
369 node.set(CONNECTION, validationObject(validConnect, CONNECTION_ERR_MSG));
MaoLu937cf422017-03-03 23:31:46 -0800370 node.set(CHANNEL_SPACING, validationObject(validChannel || validSpacing, CHANNEL_SPACING_ERR_MSG));
371 node.set(CHANNEL_MULTIPLIER, validationObject(validChannel || !validSpacing, channelMessage));
372 node.set(CHANNEL_AVAILABLE, validationObject(!validChannel || channelAvailable, CHANNEL_AVAILABLE_ERR_MSG));
Jimmy Yanda878fc2016-09-02 16:32:01 -0700373 node.set(ATTENUATION, validationObject(validAttenuation, attenuationMessage));
Jimmy Yanda878fc2016-09-02 16:32:01 -0700374 sendMessage(ROADM_CREATE_FLOW_RESP, node);
375 }
376
377 // Returns the ChannelSpacing based on the selection made
378 private ChannelSpacing channelSpacing(int selectionIndex) {
379 switch (selectionIndex) {
380 case 0: return ChannelSpacing.CHL_100GHZ;
381 case 1: return ChannelSpacing.CHL_50GHZ;
382 case 2: return ChannelSpacing.CHL_25GHZ;
383 case 3: return ChannelSpacing.CHL_12P5GHZ;
384 // 6.25GHz cannot be used with ChannelSpacing.newDwdmSlot
385 // case 4: return ChannelSpacing.CHL_6P25GHZ;
386 default: return ChannelSpacing.CHL_50GHZ;
387 }
388 }
389
390 // Construct validation object to return to the view
391 private ObjectNode validationObject(boolean result, String message) {
392 ObjectNode node = objectNode();
MaoLu937cf422017-03-03 23:31:46 -0800393 node.put(RoadmUtil.VALID, result);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700394 if (!result) {
395 // return error message to display if validation failed
MaoLu937cf422017-03-03 23:31:46 -0800396 node.put(RoadmUtil.MESSAGE, message);
Jimmy Yanda878fc2016-09-02 16:32:01 -0700397 }
398 return node;
399 }
400
401 // Returns the minimum and maximum channel spacing
402 private Range<Integer> channelRange(Set<OchSignal> signals) {
403 Comparator<OchSignal> compare =
404 (OchSignal a, OchSignal b) -> a.spacingMultiplier() - b.spacingMultiplier();
405 OchSignal minOch = Collections.min(signals, compare);
406 OchSignal maxOch = Collections.max(signals, compare);
407 return Range.closed(minOch.spacingMultiplier(), maxOch.spacingMultiplier());
408 }
409 }
MaoLu937cf422017-03-03 23:31:46 -0800410
411 private final class CreateShowItemsRequestHandler extends RequestHandler {
412 private static final String SHOW_CHANNEL = "showChannel";
413 private static final String SHOW_ATTENUATION = "showAttenuation";
414 private CreateShowItemsRequestHandler() {
415 super(ROADM_SHOW_ITEMS_REQ);
416 }
417
418 @Override
419 public void process(ObjectNode payload) {
420 DeviceId did = DeviceId.deviceId(string(payload, RoadmUtil.DEV_ID));
421 Type devType = deviceService.getDevice(did).type();
422 // Build response
423 ObjectNode node = objectNode();
424 node.put(SHOW_CHANNEL, devType != Type.FIBER_SWITCH);
425 node.put(SHOW_ATTENUATION, devType == Type.ROADM);
426 sendMessage(ROADM_SHOW_ITEMS_RESP, node);
427 }
428 }
Jimmy Yanda878fc2016-09-02 16:32:01 -0700429}