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