blob: 608f6e39422cfe07a750b419a1d8ccaa53128b01 [file] [log] [blame]
HIGUCHI Yuta7c1583c2015-12-03 23:08:54 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
HIGUCHI Yuta7c1583c2015-12-03 23:08:54 -08003 *
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.incubator.rpc.grpc;
17
18import static com.google.common.base.Preconditions.checkArgument;
19import static com.google.common.base.Preconditions.checkNotNull;
20import static org.onosproject.net.DeviceId.deviceId;
21
HIGUCHI Yutae3e90632016-05-11 16:44:01 -070022import org.onosproject.grpc.net.Link.ConnectPoint.ElementIdCase;
23import org.onosproject.grpc.net.Link.LinkType;
24import org.onosproject.grpc.net.link.LinkProviderServiceRpcGrpc.LinkProviderServiceRpc;
25import org.onosproject.grpc.net.link.LinkService.LinkDetectedMsg;
26import org.onosproject.grpc.net.link.LinkService.LinkVanishedMsg;
27import org.onosproject.grpc.net.link.LinkService.Void;
HIGUCHI Yuta06c1a3f2016-05-23 12:54:55 -070028import org.onosproject.incubator.protobuf.net.ProtobufUtils;
HIGUCHI Yuta7c1583c2015-12-03 23:08:54 -080029import org.onosproject.net.ConnectPoint;
30import org.onosproject.net.DeviceId;
31import org.onosproject.net.Link;
32import org.onosproject.net.PortNumber;
33import org.onosproject.net.SparseAnnotations;
34import org.onosproject.net.link.DefaultLinkDescription;
35import org.onosproject.net.link.LinkDescription;
36import org.onosproject.net.link.LinkProviderService;
37import org.slf4j.Logger;
38import org.slf4j.LoggerFactory;
39
40import com.google.api.client.repackaged.com.google.common.annotations.Beta;
41
42import io.grpc.stub.StreamObserver;
43
44/**
45 * Server-side implementation of gRPC version of LinkProviderService.
46 */
47@Beta
48final class LinkProviderServiceServerProxy
49 implements LinkProviderServiceRpc {
50
51 private final Logger log = LoggerFactory.getLogger(getClass());
52
53 private final GrpcRemoteServiceServer server;
54
HIGUCHI Yuta6381a242016-03-13 23:29:10 -070055 // TODO implement aging mechanism to automatically remove
56 // stale links reported by dead client, etc.
57
HIGUCHI Yuta7c1583c2015-12-03 23:08:54 -080058 LinkProviderServiceServerProxy(GrpcRemoteServiceServer server) {
59 this.server = checkNotNull(server);
60 }
61
62 /**
63 * Gets or creates {@link LinkProviderService} registered for given ProviderId scheme.
64 *
65 * @param scheme ProviderId scheme.
66 * @return {@link LinkProviderService}
67 */
68 private LinkProviderService getLinkProviderServiceFor(String scheme) {
69 return server.getLinkProviderServiceFor(scheme);
70 }
71
72 @Override
73 public void linkDetected(LinkDetectedMsg request,
74 StreamObserver<Void> responseObserver) {
75
76 try {
77 onLinkDetected(request, responseObserver);
78 // If onNext call was not mandatory, it can be removed.
79 responseObserver.onNext(Void.getDefaultInstance());
80 responseObserver.onCompleted();
81 } catch (Exception e) {
82 log.error("Exception caught", e);
83 responseObserver.onError(e);
84 }
85 }
86
87 private void onLinkDetected(LinkDetectedMsg request,
88 StreamObserver<Void> responseObserver) {
89 String scheme = request.getProviderId();
90
91 LinkProviderService linkProviderService = getLinkProviderServiceFor(scheme);
92
93 LinkDescription linkDescription = translate(request.getLinkDescription());
94 linkProviderService.linkDetected(linkDescription);
95 }
96
97 @Override
98 public void linkVanished(LinkVanishedMsg request,
99 StreamObserver<Void> responseObserver) {
100 try {
101 onLinksVanished(request, responseObserver);
102 // If onNext call was not mandatory, it can be removed.
103 responseObserver.onNext(Void.getDefaultInstance());
104 responseObserver.onCompleted();
105 } catch (Exception e) {
106 log.error("Exception caught", e);
107 responseObserver.onError(e);
108 }
109 }
110
111 private void onLinksVanished(LinkVanishedMsg request,
112 StreamObserver<Void> responseObserver) {
113 String scheme = request.getProviderId();
114 switch (request.getSubjectCase()) {
115 case CONNECT_POINT:
116 ConnectPoint cp = translate(request.getConnectPoint());
117 getLinkProviderServiceFor(scheme).linksVanished(cp);
118 break;
119 case DEVICE_ID:
120 DeviceId did = deviceId(request.getDeviceId());
121 getLinkProviderServiceFor(scheme).linksVanished(did);
122 break;
123 case LINK_DESCRIPTION:
124 LinkDescription desc = translate(request.getLinkDescription());
125 getLinkProviderServiceFor(scheme).linkVanished(desc);
126 break;
127 case SUBJECT_NOT_SET:
128 default:
129 // do nothing
130 break;
131 }
132 }
133
134 /**
135 * Translates gRPC message to corresponding ONOS object.
136 *
137 * @param connectPoint gRPC message.
138 * @return {@link ConnectPoint}
139 */
HIGUCHI Yutae3e90632016-05-11 16:44:01 -0700140 private ConnectPoint translate(org.onosproject.grpc.net.Link.ConnectPoint connectPoint) {
HIGUCHI Yuta7c1583c2015-12-03 23:08:54 -0800141 checkArgument(connectPoint.getElementIdCase() == ElementIdCase.DEVICE_ID,
142 "Only DeviceId supported.");
143 return new ConnectPoint(deviceId(connectPoint.getDeviceId()),
144 PortNumber.fromString(connectPoint.getPortNumber()));
145 }
146
147 /**
148 * Translates gRPC message to corresponding ONOS object.
149 *
150 * @param linkDescription gRPC message
151 * @return {@link LinkDescription}
152 */
HIGUCHI Yutae3e90632016-05-11 16:44:01 -0700153 private LinkDescription translate(org.onosproject.grpc.net.Link.LinkDescription linkDescription) {
HIGUCHI Yuta7c1583c2015-12-03 23:08:54 -0800154 ConnectPoint src = translate(linkDescription.getSrc());
155 ConnectPoint dst = translate(linkDescription.getDst());
156 Link.Type type = translate(linkDescription.getType());
HIGUCHI Yuta06c1a3f2016-05-23 12:54:55 -0700157 SparseAnnotations annotations = ProtobufUtils.asAnnotations(linkDescription.getAnnotations());
HIGUCHI Yuta7c1583c2015-12-03 23:08:54 -0800158 return new DefaultLinkDescription(src, dst, type, annotations);
159 }
160
161 /**
162 * Translates gRPC message to corresponding ONOS object.
163 *
164 * @param type gRPC message enum
HIGUCHI Yutae3e90632016-05-11 16:44:01 -0700165 * @return {@link org.onosproject.net.Link.Type Link.Type}
HIGUCHI Yuta7c1583c2015-12-03 23:08:54 -0800166 */
167 private Link.Type translate(LinkType type) {
168 switch (type) {
169 case DIRECT:
170 return Link.Type.DIRECT;
171 case EDGE:
172 return Link.Type.EDGE;
173 case INDIRECT:
174 return Link.Type.INDIRECT;
175 case OPTICAL:
176 return Link.Type.INDIRECT;
177 case TUNNEL:
178 return Link.Type.TUNNEL;
179 case VIRTUAL:
180 return Link.Type.VIRTUAL;
181
182 case UNRECOGNIZED:
183 default:
184 return Link.Type.DIRECT;
185 }
186 }
187
188}