blob: e898df4387f5b405988db428cde31095c1d55695 [file] [log] [blame]
Jian Li485a2cd2017-07-18 18:16:38 +09001/*
2 * Copyright 2017-present Open Networking Foundation
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 */
shivani vaidya530917c2017-07-11 11:27:48 -070016package org.onosproject.incubator.protobuf.services.nb;
Jian Li485a2cd2017-07-18 18:16:38 +090017
18
19import com.google.common.annotations.Beta;
Jian Li52de6812017-10-20 17:24:44 +090020import io.grpc.BindableService;
Jian Li485a2cd2017-07-18 18:16:38 +090021import io.grpc.stub.StreamObserver;
22import org.apache.felix.scr.annotations.Activate;
23import org.apache.felix.scr.annotations.Component;
24import org.apache.felix.scr.annotations.Deactivate;
25import org.apache.felix.scr.annotations.Reference;
26import org.apache.felix.scr.annotations.ReferenceCardinality;
27import org.onosproject.grpc.net.device.models.PortEnumsProto;
28import org.onosproject.grpc.net.device.models.PortStatisticsProtoOuterClass.PortStatisticsProto;
29import org.onosproject.grpc.nb.net.device.DeviceServiceGrpc.DeviceServiceImplBase;
30import org.onosproject.grpc.net.models.PortProtoOuterClass.PortProto;
31import org.onosproject.grpc.net.device.models.DeviceEnumsProto;
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070032import org.onosproject.protobuf.api.GrpcServiceRegistry;
Jian Li485a2cd2017-07-18 18:16:38 +090033import org.onosproject.net.ConnectPoint;
34import org.onosproject.net.DeviceId;
35import org.onosproject.net.MastershipRole;
36import org.onosproject.net.PortNumber;
37import org.onosproject.net.device.DeviceService;
shivani vaidya9632b5f2017-06-27 11:00:04 -070038import org.onosproject.incubator.protobuf.models.GrpcNbDeviceServiceUtil;
Jian Li52de6812017-10-20 17:24:44 +090039import org.slf4j.Logger;
Jian Li485a2cd2017-07-18 18:16:38 +090040
41import static org.onosproject.grpc.nb.net.device.DeviceServiceNb.*;
Jian Li52de6812017-10-20 17:24:44 +090042import static org.slf4j.LoggerFactory.getLogger;
Jian Li485a2cd2017-07-18 18:16:38 +090043
44
45/**
46 * A server that provides access to the methods exposed by {@link DeviceService}.
47 * TODO this requires major refactoring, translation should be delegated to calls to
48 * TODO{@link GrpcNbDeviceServiceUtil}.
49 */
50@Beta
51@Component(immediate = true)
52public class GrpcNbDeviceService {
53
Jian Li52de6812017-10-20 17:24:44 +090054 private final Logger log = getLogger(getClass());
55
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070056 private static DeviceServiceNbServerInternal instance = null;
57
58 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
59 protected GrpcServiceRegistry registry;
60
Jian Li485a2cd2017-07-18 18:16:38 +090061 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
62 protected DeviceService deviceService;
63
64 @Activate
65 public void activate() {
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070066 registry.register(getInnerInstance());
Jian Li52de6812017-10-20 17:24:44 +090067 log.info("Started.");
Jian Li485a2cd2017-07-18 18:16:38 +090068 }
69
70 @Deactivate
71 public void deactivate() {
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070072 registry.unregister(getInnerInstance());
Jian Li52de6812017-10-20 17:24:44 +090073 log.info("Stopped");
Jian Li485a2cd2017-07-18 18:16:38 +090074 }
75
Jian Li52de6812017-10-20 17:24:44 +090076 /**
77 * Register Device Service, Used for unit testing purposes.
78 *
79 * @return An instance of binding Device service
80 */
81 public InProcessServer<BindableService> registerInProcessServer() {
82 InProcessServer<BindableService> inprocessServer =
83 new InProcessServer(GrpcNbDeviceService.DeviceServiceNbServerInternal.class);
84 inprocessServer.addServiceToBind(getInnerInstance());
85
86 return inprocessServer;
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070087 }
Jian Li485a2cd2017-07-18 18:16:38 +090088
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070089 private final class DeviceServiceNbServerInternal extends DeviceServiceImplBase {
90
91 private DeviceServiceNbServerInternal() {
Jian Li485a2cd2017-07-18 18:16:38 +090092 super();
93 }
94
Jian Li485a2cd2017-07-18 18:16:38 +090095 @Override
96 public void getDeviceCount(
97 getDeviceCountRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -070098 StreamObserver<getDeviceCountReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +090099 responseObserver
100 .onNext(getDeviceCountReply
101 .newBuilder()
102 .setDeviceCount(
103 deviceService.getDeviceCount())
104 .build());
105 responseObserver.onCompleted();
106 }
107
108 //FIXME NOTE: this will be switched to a streaming version.
109 @Override
110 public void getDevices(getDevicesRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -0700111 StreamObserver<getDevicesReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900112 getDevicesReply.Builder replyBuilder = getDevicesReply.newBuilder();
113 deviceService.getDevices().forEach(d -> {
114 replyBuilder.addDevice(
115 org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
116 .newBuilder()
117 .setDeviceId(d.id().toString())
118 .setType(
119 DeviceEnumsProto.DeviceTypeProto
120 .valueOf(d.type().toString()))
121 .setManufacturer(d.manufacturer())
122 .setHwVersion(d.hwVersion())
123 .setSwVersion(d.swVersion())
124 .setSerialNumber(d.serialNumber())
125 .setChassisId(d.chassisId().toString())
126 .build());
127 });
128 responseObserver.onNext(replyBuilder.build());
129 responseObserver.onCompleted();
130 }
131
132 //FIXME NOTE: this will be switched to a streaming version.
133 @Override
134 public void getAvailableDevices(getAvailableDevicesRequest request,
135 StreamObserver
shivani vaidya530917c2017-07-11 11:27:48 -0700136 <getAvailableDevicesReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900137 getAvailableDevicesReply.Builder replyBuilder = getAvailableDevicesReply.newBuilder();
138 deviceService.getAvailableDevices().forEach(d -> {
139 replyBuilder.addDevice(
140 org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
141 .newBuilder()
142 .setDeviceId(d.id().toString())
143 .setType(DeviceEnumsProto.DeviceTypeProto.valueOf(
144 d.type().toString()))
145 .setManufacturer(d.manufacturer())
146 .setHwVersion(d.hwVersion())
147 .setSwVersion(d.swVersion())
148 .setSerialNumber(d.serialNumber())
149 .setChassisId(d.chassisId().toString())
150 .build());
151 });
152 responseObserver.onNext(replyBuilder.build());
153 responseObserver.onCompleted();
154 }
155
156 @Override
157 public void getDevice(getDeviceRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -0700158 io.grpc.stub.StreamObserver<getDeviceReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900159 org.onosproject.net.Device device = deviceService.getDevice(
160 DeviceId.deviceId(request.getDeviceId()));
161 responseObserver.onNext(
162 getDeviceReply.newBuilder().setDevice(
163 org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
164 .newBuilder()
165 .setDeviceId(device.id().toString())
166 .setType(
167 //TODO check for better approach to mapping between enum varieties
168 DeviceEnumsProto.DeviceTypeProto.valueOf(device.type().toString()))
169 .setManufacturer(device.manufacturer())
170 .setHwVersion(device.hwVersion())
171 .setSwVersion(device.swVersion())
172 .setSerialNumber(device.serialNumber())
173 .setChassisId(device.chassisId().toString())
174 .build()).build());
175 responseObserver.onCompleted();
176 }
177
178 @Override
179 public void getRole(getRoleRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -0700180 StreamObserver<getRoleReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900181 DeviceId deviceId = DeviceId.deviceId(request.getDeviceId());
182 MastershipRole role = deviceService.getRole(deviceId);
183 DeviceEnumsProto.MastershipRoleProto mastershipRole =
184 DeviceEnumsProto.MastershipRoleProto.valueOf(role.toString());
185 responseObserver.onNext(getRoleReply.newBuilder()
186 .setRole(mastershipRole).build());
187 responseObserver.onCompleted();
188 }
189
190 //FIXME NOTE: this may be switched to a streaming version.
191 @Override
192 public void getPorts(getPortsRequest request, StreamObserver<getPortsReply> responseObserver) {
193 getPortsReply.Builder replyBuilder = getPortsReply.newBuilder();
194 deviceService.getPorts(
195 DeviceId.deviceId(request.getDeviceId()))
196 .forEach(port -> {
197 PortProto.Builder portBuilder = PortProto
198 .newBuilder()
199 .setPortNumber(port.number().toString())
200 .setIsEnabled(port.isEnabled())
201 .setType(PortEnumsProto.PortTypeProto.valueOf(port.type().toString()))
202 .setPortSpeed(port.portSpeed());
203 port.annotations().keys().forEach(key -> portBuilder
204 .putAnnotations(key, port.annotations().value(key)));
205
206 replyBuilder.addPort(portBuilder.build());
207 });
208 responseObserver.onNext(replyBuilder.build());
209 responseObserver.onCompleted();
210 }
211
212 //FIXME NOTE: this may be switched to a streaming version.
213 @Override
214 public void getPortStatistics(getPortStatisticsRequest request,
215 StreamObserver<getPortStatisticsReply> responseObserver) {
216 getPortStatisticsReply.Builder replyBuilder = getPortStatisticsReply.newBuilder();
217 deviceService.getPortStatistics(DeviceId.deviceId(request.getDeviceId()))
218 .forEach(statistic -> {
219 replyBuilder.addPortStatistics(
220 PortStatisticsProto
221 .newBuilder()
222 .setPort(statistic.port())
223 .setPacketsReceived(statistic.packetsReceived())
224 .setPacketsSent(statistic.packetsSent())
225 .setBytesReceived(statistic.bytesReceived())
226 .setBytesSent(statistic.bytesSent())
227 .setPacketsRxDropped(statistic.packetsRxDropped())
228 .setPacketsTxDropped(statistic.packetsTxDropped())
229 .setPacketsRxErrors(statistic.packetsRxErrors())
230 .setPacketsTxErrors(statistic.packetsTxErrors())
231 .setDurationSec(statistic.durationSec())
232 .setDurationNano(statistic.durationNano())
233 .setIsZero(statistic.isZero())
234 .build());
235 });
236 responseObserver.onNext(replyBuilder.build());
237 responseObserver.onCompleted();
238 }
239
240 //FIXME NOTE: this may be switched to a streaming version.
241 @Override
242 public void getPortDeltaStatistics(getPortDeltaStatisticsRequest request,
243 StreamObserver<getPortDeltaStatisticsReply> responseObserver) {
244 getPortDeltaStatisticsReply.Builder replyBuilder = getPortDeltaStatisticsReply.newBuilder();
245 deviceService.getPortDeltaStatistics(DeviceId.deviceId(request.getDeviceId()))
246 .forEach(statistic -> {
247 replyBuilder.addPortStatistics(
248 PortStatisticsProto
249 .newBuilder()
250 .setPort(statistic.port())
251 .setPacketsReceived(statistic.packetsReceived())
252 .setPacketsSent(statistic.packetsSent())
253 .setBytesReceived(statistic.bytesReceived())
254 .setBytesSent(statistic.bytesSent())
255 .setPacketsRxDropped(statistic.packetsRxDropped())
256 .setPacketsTxDropped(statistic.packetsTxDropped())
257 .setPacketsRxErrors(statistic.packetsRxErrors())
258 .setPacketsTxErrors(statistic.packetsTxErrors())
259 .setDurationSec(statistic.durationSec())
260 .setDurationNano(statistic.durationNano())
261 .setIsZero(statistic.isZero())
262 .build());
263 });
264 responseObserver.onNext(replyBuilder.build());
265 responseObserver.onCompleted();
266 }
267
268 @Override
269 public void getStatisticsForPort(getStatisticsForPortRequest request,
270 StreamObserver<getStatisticsForPortReply> responseObserver) {
271 org.onosproject.net.device.PortStatistics statistics = deviceService
272 .getStatisticsForPort(DeviceId.deviceId(request.getDeviceId()),
273 PortNumber.portNumber(request.getPortNumber()));
274 responseObserver.onNext(
275 getStatisticsForPortReply
276 .newBuilder()
277 .setPortStatistics(
278 PortStatisticsProto
279 .newBuilder()
280 .setPort(statistics.port())
281 .setPacketsReceived(statistics.packetsReceived())
282 .setPacketsSent(statistics.packetsSent())
283 .setBytesReceived(statistics.bytesReceived())
284 .setBytesSent(statistics.bytesSent())
285 .setPacketsRxDropped(statistics.packetsRxDropped())
286 .setPacketsTxDropped(statistics.packetsTxDropped())
287 .setPacketsRxErrors(statistics.packetsRxErrors())
288 .setPacketsTxErrors(statistics.packetsTxErrors())
289 .setDurationSec(statistics.durationSec())
290 .setDurationNano(statistics.durationNano())
291 .setIsZero(statistics.isZero())
292 .build()).build());
293 responseObserver.onCompleted();
294
295 }
296
297 @Override
298 public void getDeltaStatisticsForPort(getDeltaStatisticsForPortRequest request,
299 StreamObserver<getDeltaStatisticsForPortReply> responseObserver) {
300 org.onosproject.net.device.PortStatistics statistics = deviceService
301 .getDeltaStatisticsForPort(DeviceId.deviceId(request.getDeviceId()),
302 PortNumber.portNumber(request.getPortNumber()));
303 responseObserver.onNext(
304 getDeltaStatisticsForPortReply
305 .newBuilder()
306 .setPortStatistics(
307 PortStatisticsProto
308 .newBuilder()
309 .setPort(statistics.port())
310 .setPacketsReceived(statistics.packetsReceived())
311 .setPacketsSent(statistics.packetsSent())
312 .setBytesReceived(statistics.bytesReceived())
313 .setBytesSent(statistics.bytesSent())
314 .setPacketsRxDropped(statistics.packetsRxDropped())
315 .setPacketsTxDropped(statistics.packetsTxDropped())
316 .setPacketsRxErrors(statistics.packetsRxErrors())
317 .setPacketsTxErrors(statistics.packetsTxErrors())
318 .setDurationSec(statistics.durationSec())
319 .setDurationNano(statistics.durationNano())
320 .setIsZero(statistics.isZero())
321 .build()).build());
322 responseObserver.onCompleted();
323 }
324
325 @Override
326 public void getPort(getPortRequest request,
327 StreamObserver<getPortReply> responseObserver) {
328 //FIXME getting deviceId here is dangerous because it is not guaranteed to be populated as port of a OneOf
329 org.onosproject.net.Port port = deviceService.getPort(
330 new ConnectPoint(DeviceId.deviceId(
331 request.getConnectPoint().getDeviceId()),
332 PortNumber.portNumber(
333 request.getConnectPoint()
334 .getPortNumber())));
335 PortProto.Builder portBuilder =
336 PortProto.newBuilder()
337 .setPortNumber(port.number().toString())
338 .setIsEnabled(port.isEnabled())
339 .setType(
340 PortEnumsProto.PortTypeProto
341 .valueOf(port.type().toString()))
342 .setPortSpeed(port.portSpeed());
343
344 port.annotations().keys().forEach(key -> portBuilder
345 .putAnnotations(key, port.annotations().value(key)));
346
347 responseObserver.onNext(getPortReply
348 .newBuilder()
349 .setPort(portBuilder.build())
350 .build());
351 responseObserver.onCompleted();
352 }
353
354 @Override
355 public void isAvailable(isAvailableRequest request,
356 StreamObserver<isAvailableReply> responseObserver) {
357 responseObserver.onNext(
358 isAvailableReply
359 .newBuilder()
360 .setIsAvailable(
361 deviceService.isAvailable(
362 DeviceId.deviceId(
363 request.getDeviceId())))
364 .build());
365 responseObserver.onCompleted();
366 }
367
368 @Override
369 public void localStatus(localStatusRequest request,
370 StreamObserver<localStatusReply> responseObserver) {
371 responseObserver.onNext(
372 localStatusReply
373 .newBuilder()
374 .setStatus(
375 deviceService.localStatus(
376 DeviceId.deviceId(request.getDeviceId())))
377 .build());
378 responseObserver.onCompleted();
379 }
380 }
Jian Li52de6812017-10-20 17:24:44 +0900381
382 private DeviceServiceNbServerInternal getInnerInstance() {
383 if (instance == null) {
384 instance = new DeviceServiceNbServerInternal();
385 }
386 return instance;
387 }
Jian Li485a2cd2017-07-18 18:16:38 +0900388}