blob: 5d6ea4c1cd7e1534c93873c5de28a003f55167aa [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
Jian Li485a2cd2017-07-18 18:16:38 +090018import com.google.common.annotations.Beta;
Jian Li52de6812017-10-20 17:24:44 +090019import io.grpc.BindableService;
Jian Li485a2cd2017-07-18 18:16:38 +090020import io.grpc.stub.StreamObserver;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070021import org.osgi.service.component.annotations.Activate;
22import org.osgi.service.component.annotations.Component;
23import org.osgi.service.component.annotations.Deactivate;
24import org.osgi.service.component.annotations.Reference;
25import org.osgi.service.component.annotations.ReferenceCardinality;
Jian Li485a2cd2017-07-18 18:16:38 +090026import org.onosproject.grpc.net.device.models.PortEnumsProto;
27import org.onosproject.grpc.net.device.models.PortStatisticsProtoOuterClass.PortStatisticsProto;
28import org.onosproject.grpc.nb.net.device.DeviceServiceGrpc.DeviceServiceImplBase;
Jian Lid8e72072017-11-21 10:50:02 +090029import org.onosproject.grpc.net.models.MastershipRoleProtoOuterClass;
Jian Li485a2cd2017-07-18 18:16:38 +090030import 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;
Jian Lid8e72072017-11-21 10:50:02 +090038import org.onosproject.incubator.protobuf.models.net.device.DeviceProtoTranslator;
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
Jian Li485a2cd2017-07-18 18:16:38 +090044/**
45 * A server that provides access to the methods exposed by {@link DeviceService}.
46 * TODO this requires major refactoring, translation should be delegated to calls to
Jian Lid8e72072017-11-21 10:50:02 +090047 * TODO{@link DeviceProtoTranslator}.
Jian Li485a2cd2017-07-18 18:16:38 +090048 */
49@Beta
50@Component(immediate = true)
51public class GrpcNbDeviceService {
52
Jian Li52de6812017-10-20 17:24:44 +090053 private final Logger log = getLogger(getClass());
54
Ray Milkey06297ed2018-01-22 17:13:41 -080055 private DeviceServiceNbServerInternal instance = null;
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070056
Ray Milkeyd84f89b2018-08-17 14:54:17 -070057 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070058 protected GrpcServiceRegistry registry;
59
Ray Milkeyd84f89b2018-08-17 14:54:17 -070060 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Li485a2cd2017-07-18 18:16:38 +090061 protected DeviceService deviceService;
62
63 @Activate
64 public void activate() {
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070065 registry.register(getInnerInstance());
Jian Li52de6812017-10-20 17:24:44 +090066 log.info("Started.");
Jian Li485a2cd2017-07-18 18:16:38 +090067 }
68
69 @Deactivate
70 public void deactivate() {
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070071 registry.unregister(getInnerInstance());
Jian Li52de6812017-10-20 17:24:44 +090072 log.info("Stopped");
Jian Li485a2cd2017-07-18 18:16:38 +090073 }
74
Jian Li52de6812017-10-20 17:24:44 +090075 /**
76 * Register Device Service, Used for unit testing purposes.
77 *
78 * @return An instance of binding Device service
79 */
80 public InProcessServer<BindableService> registerInProcessServer() {
81 InProcessServer<BindableService> inprocessServer =
82 new InProcessServer(GrpcNbDeviceService.DeviceServiceNbServerInternal.class);
83 inprocessServer.addServiceToBind(getInnerInstance());
84
85 return inprocessServer;
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070086 }
Jian Li485a2cd2017-07-18 18:16:38 +090087
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070088 private final class DeviceServiceNbServerInternal extends DeviceServiceImplBase {
89
90 private DeviceServiceNbServerInternal() {
Jian Li485a2cd2017-07-18 18:16:38 +090091 super();
92 }
93
Jian Li485a2cd2017-07-18 18:16:38 +090094 @Override
95 public void getDeviceCount(
96 getDeviceCountRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -070097 StreamObserver<getDeviceCountReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +090098 responseObserver
99 .onNext(getDeviceCountReply
100 .newBuilder()
101 .setDeviceCount(
102 deviceService.getDeviceCount())
103 .build());
104 responseObserver.onCompleted();
105 }
106
107 //FIXME NOTE: this will be switched to a streaming version.
108 @Override
109 public void getDevices(getDevicesRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -0700110 StreamObserver<getDevicesReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900111 getDevicesReply.Builder replyBuilder = getDevicesReply.newBuilder();
112 deviceService.getDevices().forEach(d -> {
113 replyBuilder.addDevice(
114 org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
115 .newBuilder()
116 .setDeviceId(d.id().toString())
117 .setType(
118 DeviceEnumsProto.DeviceTypeProto
119 .valueOf(d.type().toString()))
120 .setManufacturer(d.manufacturer())
121 .setHwVersion(d.hwVersion())
122 .setSwVersion(d.swVersion())
123 .setSerialNumber(d.serialNumber())
124 .setChassisId(d.chassisId().toString())
125 .build());
126 });
127 responseObserver.onNext(replyBuilder.build());
128 responseObserver.onCompleted();
129 }
130
131 //FIXME NOTE: this will be switched to a streaming version.
132 @Override
133 public void getAvailableDevices(getAvailableDevicesRequest request,
134 StreamObserver
shivani vaidya530917c2017-07-11 11:27:48 -0700135 <getAvailableDevicesReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900136 getAvailableDevicesReply.Builder replyBuilder = getAvailableDevicesReply.newBuilder();
137 deviceService.getAvailableDevices().forEach(d -> {
138 replyBuilder.addDevice(
139 org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
140 .newBuilder()
141 .setDeviceId(d.id().toString())
142 .setType(DeviceEnumsProto.DeviceTypeProto.valueOf(
143 d.type().toString()))
144 .setManufacturer(d.manufacturer())
145 .setHwVersion(d.hwVersion())
146 .setSwVersion(d.swVersion())
147 .setSerialNumber(d.serialNumber())
148 .setChassisId(d.chassisId().toString())
149 .build());
150 });
151 responseObserver.onNext(replyBuilder.build());
152 responseObserver.onCompleted();
153 }
154
155 @Override
156 public void getDevice(getDeviceRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -0700157 io.grpc.stub.StreamObserver<getDeviceReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900158 org.onosproject.net.Device device = deviceService.getDevice(
159 DeviceId.deviceId(request.getDeviceId()));
160 responseObserver.onNext(
161 getDeviceReply.newBuilder().setDevice(
162 org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
163 .newBuilder()
164 .setDeviceId(device.id().toString())
165 .setType(
166 //TODO check for better approach to mapping between enum varieties
167 DeviceEnumsProto.DeviceTypeProto.valueOf(device.type().toString()))
168 .setManufacturer(device.manufacturer())
169 .setHwVersion(device.hwVersion())
170 .setSwVersion(device.swVersion())
171 .setSerialNumber(device.serialNumber())
172 .setChassisId(device.chassisId().toString())
173 .build()).build());
174 responseObserver.onCompleted();
175 }
176
177 @Override
178 public void getRole(getRoleRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -0700179 StreamObserver<getRoleReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900180 DeviceId deviceId = DeviceId.deviceId(request.getDeviceId());
181 MastershipRole role = deviceService.getRole(deviceId);
Jian Lid8e72072017-11-21 10:50:02 +0900182 MastershipRoleProtoOuterClass.MastershipRoleProto mastershipRole =
183 MastershipRoleProtoOuterClass.MastershipRoleProto.valueOf(role.toString());
Jian Li485a2cd2017-07-18 18:16:38 +0900184 responseObserver.onNext(getRoleReply.newBuilder()
185 .setRole(mastershipRole).build());
186 responseObserver.onCompleted();
187 }
188
189 //FIXME NOTE: this may be switched to a streaming version.
190 @Override
191 public void getPorts(getPortsRequest request, StreamObserver<getPortsReply> responseObserver) {
192 getPortsReply.Builder replyBuilder = getPortsReply.newBuilder();
193 deviceService.getPorts(
194 DeviceId.deviceId(request.getDeviceId()))
195 .forEach(port -> {
196 PortProto.Builder portBuilder = PortProto
197 .newBuilder()
198 .setPortNumber(port.number().toString())
199 .setIsEnabled(port.isEnabled())
200 .setType(PortEnumsProto.PortTypeProto.valueOf(port.type().toString()))
201 .setPortSpeed(port.portSpeed());
202 port.annotations().keys().forEach(key -> portBuilder
203 .putAnnotations(key, port.annotations().value(key)));
204
205 replyBuilder.addPort(portBuilder.build());
206 });
207 responseObserver.onNext(replyBuilder.build());
208 responseObserver.onCompleted();
209 }
210
211 //FIXME NOTE: this may be switched to a streaming version.
212 @Override
213 public void getPortStatistics(getPortStatisticsRequest request,
214 StreamObserver<getPortStatisticsReply> responseObserver) {
215 getPortStatisticsReply.Builder replyBuilder = getPortStatisticsReply.newBuilder();
216 deviceService.getPortStatistics(DeviceId.deviceId(request.getDeviceId()))
217 .forEach(statistic -> {
218 replyBuilder.addPortStatistics(
219 PortStatisticsProto
220 .newBuilder()
221 .setPort(statistic.port())
222 .setPacketsReceived(statistic.packetsReceived())
223 .setPacketsSent(statistic.packetsSent())
224 .setBytesReceived(statistic.bytesReceived())
225 .setBytesSent(statistic.bytesSent())
226 .setPacketsRxDropped(statistic.packetsRxDropped())
227 .setPacketsTxDropped(statistic.packetsTxDropped())
228 .setPacketsRxErrors(statistic.packetsRxErrors())
229 .setPacketsTxErrors(statistic.packetsTxErrors())
230 .setDurationSec(statistic.durationSec())
231 .setDurationNano(statistic.durationNano())
232 .setIsZero(statistic.isZero())
233 .build());
234 });
235 responseObserver.onNext(replyBuilder.build());
236 responseObserver.onCompleted();
237 }
238
239 //FIXME NOTE: this may be switched to a streaming version.
240 @Override
241 public void getPortDeltaStatistics(getPortDeltaStatisticsRequest request,
242 StreamObserver<getPortDeltaStatisticsReply> responseObserver) {
243 getPortDeltaStatisticsReply.Builder replyBuilder = getPortDeltaStatisticsReply.newBuilder();
244 deviceService.getPortDeltaStatistics(DeviceId.deviceId(request.getDeviceId()))
245 .forEach(statistic -> {
246 replyBuilder.addPortStatistics(
247 PortStatisticsProto
248 .newBuilder()
249 .setPort(statistic.port())
250 .setPacketsReceived(statistic.packetsReceived())
251 .setPacketsSent(statistic.packetsSent())
252 .setBytesReceived(statistic.bytesReceived())
253 .setBytesSent(statistic.bytesSent())
254 .setPacketsRxDropped(statistic.packetsRxDropped())
255 .setPacketsTxDropped(statistic.packetsTxDropped())
256 .setPacketsRxErrors(statistic.packetsRxErrors())
257 .setPacketsTxErrors(statistic.packetsTxErrors())
258 .setDurationSec(statistic.durationSec())
259 .setDurationNano(statistic.durationNano())
260 .setIsZero(statistic.isZero())
261 .build());
262 });
263 responseObserver.onNext(replyBuilder.build());
264 responseObserver.onCompleted();
265 }
266
267 @Override
268 public void getStatisticsForPort(getStatisticsForPortRequest request,
269 StreamObserver<getStatisticsForPortReply> responseObserver) {
270 org.onosproject.net.device.PortStatistics statistics = deviceService
271 .getStatisticsForPort(DeviceId.deviceId(request.getDeviceId()),
272 PortNumber.portNumber(request.getPortNumber()));
273 responseObserver.onNext(
274 getStatisticsForPortReply
275 .newBuilder()
276 .setPortStatistics(
277 PortStatisticsProto
278 .newBuilder()
279 .setPort(statistics.port())
280 .setPacketsReceived(statistics.packetsReceived())
281 .setPacketsSent(statistics.packetsSent())
282 .setBytesReceived(statistics.bytesReceived())
283 .setBytesSent(statistics.bytesSent())
284 .setPacketsRxDropped(statistics.packetsRxDropped())
285 .setPacketsTxDropped(statistics.packetsTxDropped())
286 .setPacketsRxErrors(statistics.packetsRxErrors())
287 .setPacketsTxErrors(statistics.packetsTxErrors())
288 .setDurationSec(statistics.durationSec())
289 .setDurationNano(statistics.durationNano())
290 .setIsZero(statistics.isZero())
291 .build()).build());
292 responseObserver.onCompleted();
293
294 }
295
296 @Override
297 public void getDeltaStatisticsForPort(getDeltaStatisticsForPortRequest request,
298 StreamObserver<getDeltaStatisticsForPortReply> responseObserver) {
299 org.onosproject.net.device.PortStatistics statistics = deviceService
300 .getDeltaStatisticsForPort(DeviceId.deviceId(request.getDeviceId()),
301 PortNumber.portNumber(request.getPortNumber()));
302 responseObserver.onNext(
303 getDeltaStatisticsForPortReply
304 .newBuilder()
305 .setPortStatistics(
306 PortStatisticsProto
307 .newBuilder()
308 .setPort(statistics.port())
309 .setPacketsReceived(statistics.packetsReceived())
310 .setPacketsSent(statistics.packetsSent())
311 .setBytesReceived(statistics.bytesReceived())
312 .setBytesSent(statistics.bytesSent())
313 .setPacketsRxDropped(statistics.packetsRxDropped())
314 .setPacketsTxDropped(statistics.packetsTxDropped())
315 .setPacketsRxErrors(statistics.packetsRxErrors())
316 .setPacketsTxErrors(statistics.packetsTxErrors())
317 .setDurationSec(statistics.durationSec())
318 .setDurationNano(statistics.durationNano())
319 .setIsZero(statistics.isZero())
320 .build()).build());
321 responseObserver.onCompleted();
322 }
323
324 @Override
325 public void getPort(getPortRequest request,
326 StreamObserver<getPortReply> responseObserver) {
327 //FIXME getting deviceId here is dangerous because it is not guaranteed to be populated as port of a OneOf
328 org.onosproject.net.Port port = deviceService.getPort(
329 new ConnectPoint(DeviceId.deviceId(
330 request.getConnectPoint().getDeviceId()),
331 PortNumber.portNumber(
332 request.getConnectPoint()
333 .getPortNumber())));
334 PortProto.Builder portBuilder =
335 PortProto.newBuilder()
336 .setPortNumber(port.number().toString())
337 .setIsEnabled(port.isEnabled())
338 .setType(
339 PortEnumsProto.PortTypeProto
340 .valueOf(port.type().toString()))
341 .setPortSpeed(port.portSpeed());
342
343 port.annotations().keys().forEach(key -> portBuilder
344 .putAnnotations(key, port.annotations().value(key)));
345
346 responseObserver.onNext(getPortReply
347 .newBuilder()
348 .setPort(portBuilder.build())
349 .build());
350 responseObserver.onCompleted();
351 }
352
353 @Override
354 public void isAvailable(isAvailableRequest request,
355 StreamObserver<isAvailableReply> responseObserver) {
356 responseObserver.onNext(
357 isAvailableReply
358 .newBuilder()
359 .setIsAvailable(
360 deviceService.isAvailable(
361 DeviceId.deviceId(
362 request.getDeviceId())))
363 .build());
364 responseObserver.onCompleted();
365 }
366
367 @Override
368 public void localStatus(localStatusRequest request,
369 StreamObserver<localStatusReply> responseObserver) {
370 responseObserver.onNext(
371 localStatusReply
372 .newBuilder()
373 .setStatus(
374 deviceService.localStatus(
375 DeviceId.deviceId(request.getDeviceId())))
376 .build());
377 responseObserver.onCompleted();
378 }
379 }
Jian Li52de6812017-10-20 17:24:44 +0900380
381 private DeviceServiceNbServerInternal getInnerInstance() {
382 if (instance == null) {
383 instance = new DeviceServiceNbServerInternal();
384 }
385 return instance;
386 }
Jian Li485a2cd2017-07-18 18:16:38 +0900387}