blob: 8d2a48faf53e0e4cbb82c96a80b20c55278f8672 [file] [log] [blame]
Jian Lif5cebc12017-11-21 17:08:17 +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 */
16package org.onosproject.incubator.protobuf.services.nb;
17
18
19import com.google.common.annotations.Beta;
20import io.grpc.BindableService;
21import io.grpc.stub.StreamObserver;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070022import org.osgi.service.component.annotations.Activate;
23import org.osgi.service.component.annotations.Component;
24import org.osgi.service.component.annotations.Deactivate;
25import org.osgi.service.component.annotations.Reference;
26import org.osgi.service.component.annotations.ReferenceCardinality;
Jian Lif5cebc12017-11-21 17:08:17 +090027import org.onosproject.cluster.NodeId;
28import org.onosproject.cluster.RoleInfo;
29import org.onosproject.grpc.nb.mastership.MastershipServiceGrpc;
30import org.onosproject.grpc.nb.mastership.MastershipServiceNb;
31import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getLocalRoleReply;
32import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getLocalRoleRequest;
33import org.onosproject.grpc.nb.mastership.MastershipServiceNb.isLocalMasterReply;
34import org.onosproject.grpc.nb.mastership.MastershipServiceNb.isLocalMasterRequest;
35import org.onosproject.grpc.nb.mastership.MastershipServiceNb.relinquishMastershipSyncReply;
36import org.onosproject.grpc.nb.mastership.MastershipServiceNb.relinquishMastershipSyncRequest;
37import org.onosproject.grpc.nb.mastership.MastershipServiceNb.requestRoleForSyncReply;
38import org.onosproject.grpc.nb.mastership.MastershipServiceNb.requestRoleForSyncRequest;
39import org.onosproject.incubator.protobuf.models.cluster.NodeIdProtoTranslator;
40import org.onosproject.incubator.protobuf.models.cluster.RoleInfoProtoTranslator;
41import org.onosproject.incubator.protobuf.models.net.MastershipRoleProtoTranslator;
42import org.onosproject.mastership.MastershipService;
43import org.onosproject.net.DeviceId;
44import org.onosproject.net.MastershipRole;
45import org.onosproject.protobuf.api.GrpcServiceRegistry;
46import org.slf4j.Logger;
47
48import static org.slf4j.LoggerFactory.getLogger;
49
50/**
51 * A server that provides access to the methods exposed by {@link MastershipService}.
52 */
53
54@Beta
55@Component(immediate = true)
56public class GrpcNbMastershipService {
57
58 private final Logger log = getLogger(getClass());
59
Ray Milkeyd84f89b2018-08-17 14:54:17 -070060 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Lif5cebc12017-11-21 17:08:17 +090061 protected GrpcServiceRegistry registry;
62
Ray Milkeyd84f89b2018-08-17 14:54:17 -070063 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Lif5cebc12017-11-21 17:08:17 +090064 protected MastershipService mastershipService;
65
Ray Milkey06297ed2018-01-22 17:13:41 -080066 private MastershipServiceNbServerInternal instance = null;
Jian Lif5cebc12017-11-21 17:08:17 +090067
68 @Activate
69 public void activate() {
70 registry.register(getInnerInstance());
71 log.info("Started.");
72 }
73
74 @Deactivate
75 public void deactivate() {
76 registry.unregister(getInnerInstance());
77 log.info("Stopped");
78 }
79
80 /**
81 * Register Mastership Service, used for unit testing purposes.
82 *
83 * @return an instance of binding Mastership service
84 */
85 public InProcessServer<BindableService> registerInProcessServer() {
86 InProcessServer<BindableService> inprocessServer =
87 new InProcessServer(GrpcNbMastershipService.MastershipServiceNbServerInternal.class);
88 inprocessServer.addServiceToBind(getInnerInstance());
89
90 return inprocessServer;
91 }
92
93 private class MastershipServiceNbServerInternal extends MastershipServiceGrpc.MastershipServiceImplBase {
94
95 @Override
96 public void getLocalRole(getLocalRoleRequest request,
97 StreamObserver<getLocalRoleReply> responseObserver) {
98 MastershipRole mr = mastershipService.getLocalRole(DeviceId.deviceId(request.getDeviceId()));
99
100 responseObserver.onNext(getLocalRoleReply.newBuilder()
101 .setMastershipRole(MastershipRoleProtoTranslator.translate(mr))
102 .build());
103 responseObserver.onCompleted();
104 }
105
106 @Override
107 public void isLocalMaster(isLocalMasterRequest request,
108 StreamObserver<isLocalMasterReply> responseObserver) {
109 boolean isLocalMaster = mastershipService.isLocalMaster(DeviceId.deviceId(request.getDeviceId()));
110
111 responseObserver.onNext(isLocalMasterReply.newBuilder()
112 .setIsLocalMaster(isLocalMaster)
113 .build());
114 responseObserver.onCompleted();
115 }
116
117 @Override
118 public void requestRoleForSync(requestRoleForSyncRequest request,
119 StreamObserver<requestRoleForSyncReply> responseObserver) {
120 MastershipRole mr = mastershipService.requestRoleForSync(DeviceId.deviceId(request.getDeviceId()));
121
122 responseObserver.onNext(requestRoleForSyncReply.newBuilder()
123 .setMastershipRole(MastershipRoleProtoTranslator.translate(mr))
124 .build());
125 responseObserver.onCompleted();
126 }
127
128 @Override
129 public void relinquishMastershipSync(relinquishMastershipSyncRequest request,
130 StreamObserver<relinquishMastershipSyncReply> responseObserver) {
131 relinquishMastershipSyncReply.Builder replyBuilder = relinquishMastershipSyncReply.newBuilder();
132 mastershipService.relinquishMastershipSync(DeviceId.deviceId(request.getDeviceId()));
133
134 responseObserver.onNext(replyBuilder.build());
135 responseObserver.onCompleted();
136 }
137
138 @Override
139 public void getMasterFor(MastershipServiceNb.getMasterForRequest request,
140 StreamObserver<MastershipServiceNb.getMasterForReply> responseObserver) {
141 NodeId nodeId = mastershipService.getMasterFor(DeviceId.deviceId(request.getDeviceId()));
142
143 responseObserver.onNext(MastershipServiceNb.getMasterForReply.newBuilder()
144 .setNodeId(NodeIdProtoTranslator.translate(nodeId))
145 .build());
146 responseObserver.onCompleted();
147 }
148
149 @Override
150 public void getNodesFor(MastershipServiceNb.getNodesForRequest request,
151 StreamObserver<MastershipServiceNb.getNodesForReply> responseObserver) {
152 RoleInfo roleInfo = mastershipService.getNodesFor(DeviceId.deviceId(request.getDeviceId()));
153
154 responseObserver.onNext(MastershipServiceNb.getNodesForReply.newBuilder()
155 .setRoleInfo(RoleInfoProtoTranslator.translate(roleInfo))
156 .build());
157 responseObserver.onCompleted();
158 }
159 }
160
161 private MastershipServiceNbServerInternal getInnerInstance() {
162 if (instance == null) {
163 instance = new MastershipServiceNbServerInternal();
164 }
165 return instance;
166 }
167}