blob: 80322dcf30771d36bef44c8f0fcd5612cea4ea9d [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
54 LinkProviderServiceServerProxy(GrpcRemoteServiceServer server) {
55 this.server = checkNotNull(server);
56 }
57
58 /**
59 * Gets or creates {@link LinkProviderService} registered for given ProviderId scheme.
60 *
61 * @param scheme ProviderId scheme.
62 * @return {@link LinkProviderService}
63 */
64 private LinkProviderService getLinkProviderServiceFor(String scheme) {
65 return server.getLinkProviderServiceFor(scheme);
66 }
67
68 @Override
69 public void linkDetected(LinkDetectedMsg request,
70 StreamObserver<Void> responseObserver) {
71
72 try {
73 onLinkDetected(request, responseObserver);
74 // If onNext call was not mandatory, it can be removed.
75 responseObserver.onNext(Void.getDefaultInstance());
76 responseObserver.onCompleted();
77 } catch (Exception e) {
78 log.error("Exception caught", e);
79 responseObserver.onError(e);
80 }
81 }
82
83 private void onLinkDetected(LinkDetectedMsg request,
84 StreamObserver<Void> responseObserver) {
85 String scheme = request.getProviderId();
86
87 LinkProviderService linkProviderService = getLinkProviderServiceFor(scheme);
88
89 LinkDescription linkDescription = translate(request.getLinkDescription());
90 linkProviderService.linkDetected(linkDescription);
91 }
92
93 @Override
94 public void linkVanished(LinkVanishedMsg request,
95 StreamObserver<Void> responseObserver) {
96 try {
97 onLinksVanished(request, responseObserver);
98 // If onNext call was not mandatory, it can be removed.
99 responseObserver.onNext(Void.getDefaultInstance());
100 responseObserver.onCompleted();
101 } catch (Exception e) {
102 log.error("Exception caught", e);
103 responseObserver.onError(e);
104 }
105 }
106
107 private void onLinksVanished(LinkVanishedMsg request,
108 StreamObserver<Void> responseObserver) {
109 String scheme = request.getProviderId();
110 switch (request.getSubjectCase()) {
111 case CONNECT_POINT:
112 ConnectPoint cp = translate(request.getConnectPoint());
113 getLinkProviderServiceFor(scheme).linksVanished(cp);
114 break;
115 case DEVICE_ID:
116 DeviceId did = deviceId(request.getDeviceId());
117 getLinkProviderServiceFor(scheme).linksVanished(did);
118 break;
119 case LINK_DESCRIPTION:
120 LinkDescription desc = translate(request.getLinkDescription());
121 getLinkProviderServiceFor(scheme).linkVanished(desc);
122 break;
123 case SUBJECT_NOT_SET:
124 default:
125 // do nothing
126 break;
127 }
128 }
129
130 /**
131 * Translates gRPC message to corresponding ONOS object.
132 *
133 * @param connectPoint gRPC message.
134 * @return {@link ConnectPoint}
135 */
136 private ConnectPoint translate(org.onosproject.grpc.Link.ConnectPoint connectPoint) {
137 checkArgument(connectPoint.getElementIdCase() == ElementIdCase.DEVICE_ID,
138 "Only DeviceId supported.");
139 return new ConnectPoint(deviceId(connectPoint.getDeviceId()),
140 PortNumber.fromString(connectPoint.getPortNumber()));
141 }
142
143 /**
144 * Translates gRPC message to corresponding ONOS object.
145 *
146 * @param linkDescription gRPC message
147 * @return {@link LinkDescription}
148 */
149 private LinkDescription translate(org.onosproject.grpc.Link.LinkDescription linkDescription) {
150 ConnectPoint src = translate(linkDescription.getSrc());
151 ConnectPoint dst = translate(linkDescription.getDst());
152 Link.Type type = translate(linkDescription.getType());
153 SparseAnnotations annotations = GrpcDeviceUtils.asAnnotations(linkDescription.getAnnotations());
154 return new DefaultLinkDescription(src, dst, type, annotations);
155 }
156
157 /**
158 * Translates gRPC message to corresponding ONOS object.
159 *
160 * @param type gRPC message enum
161 * @return {@link Type}
162 */
163 private Link.Type translate(LinkType type) {
164 switch (type) {
165 case DIRECT:
166 return Link.Type.DIRECT;
167 case EDGE:
168 return Link.Type.EDGE;
169 case INDIRECT:
170 return Link.Type.INDIRECT;
171 case OPTICAL:
172 return Link.Type.INDIRECT;
173 case TUNNEL:
174 return Link.Type.TUNNEL;
175 case VIRTUAL:
176 return Link.Type.VIRTUAL;
177
178 case UNRECOGNIZED:
179 default:
180 return Link.Type.DIRECT;
181 }
182 }
183
184}