blob: 4ca0e03dc4f0c7b9137f346205dc3ce1df89c6ec [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;
20import io.grpc.stub.StreamObserver;
21import org.apache.felix.scr.annotations.Activate;
22import org.apache.felix.scr.annotations.Component;
23import org.apache.felix.scr.annotations.Deactivate;
24import org.apache.felix.scr.annotations.Reference;
25import org.apache.felix.scr.annotations.ReferenceCardinality;
26import 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;
29import org.onosproject.grpc.net.models.PortProtoOuterClass.PortProto;
30import org.onosproject.grpc.net.device.models.DeviceEnumsProto;
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070031import org.onosproject.protobuf.api.GrpcServiceRegistry;
Jian Li485a2cd2017-07-18 18:16:38 +090032import org.onosproject.net.ConnectPoint;
33import org.onosproject.net.DeviceId;
34import org.onosproject.net.MastershipRole;
35import org.onosproject.net.PortNumber;
36import org.onosproject.net.device.DeviceService;
shivani vaidya9632b5f2017-06-27 11:00:04 -070037import org.onosproject.incubator.protobuf.models.GrpcNbDeviceServiceUtil;
Jian Li485a2cd2017-07-18 18:16:38 +090038
39import static org.onosproject.grpc.nb.net.device.DeviceServiceNb.*;
40
41
42/**
43 * A server that provides access to the methods exposed by {@link DeviceService}.
44 * TODO this requires major refactoring, translation should be delegated to calls to
45 * TODO{@link GrpcNbDeviceServiceUtil}.
46 */
47@Beta
48@Component(immediate = true)
49public class GrpcNbDeviceService {
50
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070051 private static DeviceServiceNbServerInternal instance = null;
52
53 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
54 protected GrpcServiceRegistry registry;
55
Jian Li485a2cd2017-07-18 18:16:38 +090056 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
57 protected DeviceService deviceService;
58
59 @Activate
60 public void activate() {
61 //TODO this should contact the registry service and register an instance
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070062 // of this service
63 registry.register(getInnerInstance());
Jian Li485a2cd2017-07-18 18:16:38 +090064 }
65
66 @Deactivate
67 public void deactivate() {
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070068 registry.unregister(getInnerInstance());
Jian Li485a2cd2017-07-18 18:16:38 +090069 }
70
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070071 public DeviceServiceNbServerInternal getInnerInstance() {
72 if (instance == null) {
73 instance = new DeviceServiceNbServerInternal();
74 }
75 return instance;
76 }
Jian Li485a2cd2017-07-18 18:16:38 +090077
Aaron Kruglikovae7e3b82017-05-03 14:13:53 -070078 private final class DeviceServiceNbServerInternal extends DeviceServiceImplBase {
79
80 private DeviceServiceNbServerInternal() {
Jian Li485a2cd2017-07-18 18:16:38 +090081 super();
82 }
83
Jian Li485a2cd2017-07-18 18:16:38 +090084 @Override
85 public void getDeviceCount(
86 getDeviceCountRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -070087 StreamObserver<getDeviceCountReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +090088 responseObserver
89 .onNext(getDeviceCountReply
90 .newBuilder()
91 .setDeviceCount(
92 deviceService.getDeviceCount())
93 .build());
94 responseObserver.onCompleted();
95 }
96
97 //FIXME NOTE: this will be switched to a streaming version.
98 @Override
99 public void getDevices(getDevicesRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -0700100 StreamObserver<getDevicesReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900101 getDevicesReply.Builder replyBuilder = getDevicesReply.newBuilder();
102 deviceService.getDevices().forEach(d -> {
103 replyBuilder.addDevice(
104 org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
105 .newBuilder()
106 .setDeviceId(d.id().toString())
107 .setType(
108 DeviceEnumsProto.DeviceTypeProto
109 .valueOf(d.type().toString()))
110 .setManufacturer(d.manufacturer())
111 .setHwVersion(d.hwVersion())
112 .setSwVersion(d.swVersion())
113 .setSerialNumber(d.serialNumber())
114 .setChassisId(d.chassisId().toString())
115 .build());
116 });
117 responseObserver.onNext(replyBuilder.build());
118 responseObserver.onCompleted();
119 }
120
121 //FIXME NOTE: this will be switched to a streaming version.
122 @Override
123 public void getAvailableDevices(getAvailableDevicesRequest request,
124 StreamObserver
shivani vaidya530917c2017-07-11 11:27:48 -0700125 <getAvailableDevicesReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900126 getAvailableDevicesReply.Builder replyBuilder = getAvailableDevicesReply.newBuilder();
127 deviceService.getAvailableDevices().forEach(d -> {
128 replyBuilder.addDevice(
129 org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
130 .newBuilder()
131 .setDeviceId(d.id().toString())
132 .setType(DeviceEnumsProto.DeviceTypeProto.valueOf(
133 d.type().toString()))
134 .setManufacturer(d.manufacturer())
135 .setHwVersion(d.hwVersion())
136 .setSwVersion(d.swVersion())
137 .setSerialNumber(d.serialNumber())
138 .setChassisId(d.chassisId().toString())
139 .build());
140 });
141 responseObserver.onNext(replyBuilder.build());
142 responseObserver.onCompleted();
143 }
144
145 @Override
146 public void getDevice(getDeviceRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -0700147 io.grpc.stub.StreamObserver<getDeviceReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900148 org.onosproject.net.Device device = deviceService.getDevice(
149 DeviceId.deviceId(request.getDeviceId()));
150 responseObserver.onNext(
151 getDeviceReply.newBuilder().setDevice(
152 org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
153 .newBuilder()
154 .setDeviceId(device.id().toString())
155 .setType(
156 //TODO check for better approach to mapping between enum varieties
157 DeviceEnumsProto.DeviceTypeProto.valueOf(device.type().toString()))
158 .setManufacturer(device.manufacturer())
159 .setHwVersion(device.hwVersion())
160 .setSwVersion(device.swVersion())
161 .setSerialNumber(device.serialNumber())
162 .setChassisId(device.chassisId().toString())
163 .build()).build());
164 responseObserver.onCompleted();
165 }
166
167 @Override
168 public void getRole(getRoleRequest request,
shivani vaidya530917c2017-07-11 11:27:48 -0700169 StreamObserver<getRoleReply> responseObserver) {
Jian Li485a2cd2017-07-18 18:16:38 +0900170 DeviceId deviceId = DeviceId.deviceId(request.getDeviceId());
171 MastershipRole role = deviceService.getRole(deviceId);
172 DeviceEnumsProto.MastershipRoleProto mastershipRole =
173 DeviceEnumsProto.MastershipRoleProto.valueOf(role.toString());
174 responseObserver.onNext(getRoleReply.newBuilder()
175 .setRole(mastershipRole).build());
176 responseObserver.onCompleted();
177 }
178
179 //FIXME NOTE: this may be switched to a streaming version.
180 @Override
181 public void getPorts(getPortsRequest request, StreamObserver<getPortsReply> responseObserver) {
182 getPortsReply.Builder replyBuilder = getPortsReply.newBuilder();
183 deviceService.getPorts(
184 DeviceId.deviceId(request.getDeviceId()))
185 .forEach(port -> {
186 PortProto.Builder portBuilder = PortProto
187 .newBuilder()
188 .setPortNumber(port.number().toString())
189 .setIsEnabled(port.isEnabled())
190 .setType(PortEnumsProto.PortTypeProto.valueOf(port.type().toString()))
191 .setPortSpeed(port.portSpeed());
192 port.annotations().keys().forEach(key -> portBuilder
193 .putAnnotations(key, port.annotations().value(key)));
194
195 replyBuilder.addPort(portBuilder.build());
196 });
197 responseObserver.onNext(replyBuilder.build());
198 responseObserver.onCompleted();
199 }
200
201 //FIXME NOTE: this may be switched to a streaming version.
202 @Override
203 public void getPortStatistics(getPortStatisticsRequest request,
204 StreamObserver<getPortStatisticsReply> responseObserver) {
205 getPortStatisticsReply.Builder replyBuilder = getPortStatisticsReply.newBuilder();
206 deviceService.getPortStatistics(DeviceId.deviceId(request.getDeviceId()))
207 .forEach(statistic -> {
208 replyBuilder.addPortStatistics(
209 PortStatisticsProto
210 .newBuilder()
211 .setPort(statistic.port())
212 .setPacketsReceived(statistic.packetsReceived())
213 .setPacketsSent(statistic.packetsSent())
214 .setBytesReceived(statistic.bytesReceived())
215 .setBytesSent(statistic.bytesSent())
216 .setPacketsRxDropped(statistic.packetsRxDropped())
217 .setPacketsTxDropped(statistic.packetsTxDropped())
218 .setPacketsRxErrors(statistic.packetsRxErrors())
219 .setPacketsTxErrors(statistic.packetsTxErrors())
220 .setDurationSec(statistic.durationSec())
221 .setDurationNano(statistic.durationNano())
222 .setIsZero(statistic.isZero())
223 .build());
224 });
225 responseObserver.onNext(replyBuilder.build());
226 responseObserver.onCompleted();
227 }
228
229 //FIXME NOTE: this may be switched to a streaming version.
230 @Override
231 public void getPortDeltaStatistics(getPortDeltaStatisticsRequest request,
232 StreamObserver<getPortDeltaStatisticsReply> responseObserver) {
233 getPortDeltaStatisticsReply.Builder replyBuilder = getPortDeltaStatisticsReply.newBuilder();
234 deviceService.getPortDeltaStatistics(DeviceId.deviceId(request.getDeviceId()))
235 .forEach(statistic -> {
236 replyBuilder.addPortStatistics(
237 PortStatisticsProto
238 .newBuilder()
239 .setPort(statistic.port())
240 .setPacketsReceived(statistic.packetsReceived())
241 .setPacketsSent(statistic.packetsSent())
242 .setBytesReceived(statistic.bytesReceived())
243 .setBytesSent(statistic.bytesSent())
244 .setPacketsRxDropped(statistic.packetsRxDropped())
245 .setPacketsTxDropped(statistic.packetsTxDropped())
246 .setPacketsRxErrors(statistic.packetsRxErrors())
247 .setPacketsTxErrors(statistic.packetsTxErrors())
248 .setDurationSec(statistic.durationSec())
249 .setDurationNano(statistic.durationNano())
250 .setIsZero(statistic.isZero())
251 .build());
252 });
253 responseObserver.onNext(replyBuilder.build());
254 responseObserver.onCompleted();
255 }
256
257 @Override
258 public void getStatisticsForPort(getStatisticsForPortRequest request,
259 StreamObserver<getStatisticsForPortReply> responseObserver) {
260 org.onosproject.net.device.PortStatistics statistics = deviceService
261 .getStatisticsForPort(DeviceId.deviceId(request.getDeviceId()),
262 PortNumber.portNumber(request.getPortNumber()));
263 responseObserver.onNext(
264 getStatisticsForPortReply
265 .newBuilder()
266 .setPortStatistics(
267 PortStatisticsProto
268 .newBuilder()
269 .setPort(statistics.port())
270 .setPacketsReceived(statistics.packetsReceived())
271 .setPacketsSent(statistics.packetsSent())
272 .setBytesReceived(statistics.bytesReceived())
273 .setBytesSent(statistics.bytesSent())
274 .setPacketsRxDropped(statistics.packetsRxDropped())
275 .setPacketsTxDropped(statistics.packetsTxDropped())
276 .setPacketsRxErrors(statistics.packetsRxErrors())
277 .setPacketsTxErrors(statistics.packetsTxErrors())
278 .setDurationSec(statistics.durationSec())
279 .setDurationNano(statistics.durationNano())
280 .setIsZero(statistics.isZero())
281 .build()).build());
282 responseObserver.onCompleted();
283
284 }
285
286 @Override
287 public void getDeltaStatisticsForPort(getDeltaStatisticsForPortRequest request,
288 StreamObserver<getDeltaStatisticsForPortReply> responseObserver) {
289 org.onosproject.net.device.PortStatistics statistics = deviceService
290 .getDeltaStatisticsForPort(DeviceId.deviceId(request.getDeviceId()),
291 PortNumber.portNumber(request.getPortNumber()));
292 responseObserver.onNext(
293 getDeltaStatisticsForPortReply
294 .newBuilder()
295 .setPortStatistics(
296 PortStatisticsProto
297 .newBuilder()
298 .setPort(statistics.port())
299 .setPacketsReceived(statistics.packetsReceived())
300 .setPacketsSent(statistics.packetsSent())
301 .setBytesReceived(statistics.bytesReceived())
302 .setBytesSent(statistics.bytesSent())
303 .setPacketsRxDropped(statistics.packetsRxDropped())
304 .setPacketsTxDropped(statistics.packetsTxDropped())
305 .setPacketsRxErrors(statistics.packetsRxErrors())
306 .setPacketsTxErrors(statistics.packetsTxErrors())
307 .setDurationSec(statistics.durationSec())
308 .setDurationNano(statistics.durationNano())
309 .setIsZero(statistics.isZero())
310 .build()).build());
311 responseObserver.onCompleted();
312 }
313
314 @Override
315 public void getPort(getPortRequest request,
316 StreamObserver<getPortReply> responseObserver) {
317 //FIXME getting deviceId here is dangerous because it is not guaranteed to be populated as port of a OneOf
318 org.onosproject.net.Port port = deviceService.getPort(
319 new ConnectPoint(DeviceId.deviceId(
320 request.getConnectPoint().getDeviceId()),
321 PortNumber.portNumber(
322 request.getConnectPoint()
323 .getPortNumber())));
324 PortProto.Builder portBuilder =
325 PortProto.newBuilder()
326 .setPortNumber(port.number().toString())
327 .setIsEnabled(port.isEnabled())
328 .setType(
329 PortEnumsProto.PortTypeProto
330 .valueOf(port.type().toString()))
331 .setPortSpeed(port.portSpeed());
332
333 port.annotations().keys().forEach(key -> portBuilder
334 .putAnnotations(key, port.annotations().value(key)));
335
336 responseObserver.onNext(getPortReply
337 .newBuilder()
338 .setPort(portBuilder.build())
339 .build());
340 responseObserver.onCompleted();
341 }
342
343 @Override
344 public void isAvailable(isAvailableRequest request,
345 StreamObserver<isAvailableReply> responseObserver) {
346 responseObserver.onNext(
347 isAvailableReply
348 .newBuilder()
349 .setIsAvailable(
350 deviceService.isAvailable(
351 DeviceId.deviceId(
352 request.getDeviceId())))
353 .build());
354 responseObserver.onCompleted();
355 }
356
357 @Override
358 public void localStatus(localStatusRequest request,
359 StreamObserver<localStatusReply> responseObserver) {
360 responseObserver.onNext(
361 localStatusReply
362 .newBuilder()
363 .setStatus(
364 deviceService.localStatus(
365 DeviceId.deviceId(request.getDeviceId())))
366 .build());
367 responseObserver.onCompleted();
368 }
369 }
370}