blob: f5086494adddf8daf34f30b7668121d8551036fe [file] [log] [blame]
Jian Li6803ccd2018-06-08 09:26:09 +09001/*
2 * Copyright 2018-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.openstacktelemetry.impl;
17
Jian Lia61e0b62018-12-28 19:10:10 +090018import com.google.common.collect.Maps;
Jian Li6803ccd2018-06-08 09:26:09 +090019import io.grpc.ManagedChannel;
Jian Liae3fcff2018-07-30 11:55:44 +090020import io.grpc.ManagedChannelBuilder;
Jian Li6803ccd2018-06-08 09:26:09 +090021import org.onosproject.openstacktelemetry.api.GrpcTelemetryAdminService;
Jian Lid1ce10a2018-06-12 13:47:23 +090022import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
Jian Li69600e02018-12-24 13:21:18 +090023import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
Jian Liae3fcff2018-07-30 11:55:44 +090024import org.onosproject.openstacktelemetry.api.config.GrpcTelemetryConfig;
Jian Lia61e0b62018-12-28 19:10:10 +090025import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070026import org.osgi.service.component.annotations.Activate;
27import org.osgi.service.component.annotations.Component;
28import org.osgi.service.component.annotations.Deactivate;
29import org.osgi.service.component.annotations.Reference;
30import org.osgi.service.component.annotations.ReferenceCardinality;
Jian Li6803ccd2018-06-08 09:26:09 +090031import org.slf4j.Logger;
32import org.slf4j.LoggerFactory;
33
Jian Lia61e0b62018-12-28 19:10:10 +090034import java.util.Map;
Jian Li69600e02018-12-24 13:21:18 +090035
36import static org.onosproject.openstacktelemetry.api.Constants.GRPC_SCHEME;
37import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.GRPC;
Jian Li667c6eb2019-01-07 23:01:12 +090038import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED;
Jian Li69600e02018-12-24 13:21:18 +090039import static org.onosproject.openstacktelemetry.config.DefaultGrpcTelemetryConfig.fromTelemetryConfig;
Jian Li667c6eb2019-01-07 23:01:12 +090040import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.testConnectivity;
Jian Li69600e02018-12-24 13:21:18 +090041
Jian Li6803ccd2018-06-08 09:26:09 +090042/**
43 * gRPC telemetry manager.
44 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070045@Component(immediate = true, service = GrpcTelemetryAdminService.class)
Jian Li6803ccd2018-06-08 09:26:09 +090046public class GrpcTelemetryManager implements GrpcTelemetryAdminService {
47
48 private final Logger log = LoggerFactory.getLogger(getClass());
49
Ray Milkeyd84f89b2018-08-17 14:54:17 -070050 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Lid1ce10a2018-06-12 13:47:23 +090051 protected OpenstackTelemetryService openstackTelemetryService;
52
Jian Li69600e02018-12-24 13:21:18 +090053 @Reference(cardinality = ReferenceCardinality.MANDATORY)
54 protected TelemetryConfigService telemetryConfigService;
55
Jian Lia61e0b62018-12-28 19:10:10 +090056 private Map<String, ManagedChannel> channels = Maps.newConcurrentMap();
Jian Li6803ccd2018-06-08 09:26:09 +090057
58 @Activate
59 protected void activate() {
Jian Lid1ce10a2018-06-12 13:47:23 +090060
61 openstackTelemetryService.addTelemetryService(this);
62
Jian Li6803ccd2018-06-08 09:26:09 +090063 log.info("Started");
64 }
65
66 @Deactivate
67 protected void deactivate() {
Jian Lia61e0b62018-12-28 19:10:10 +090068 stopAll();
Jian Lid1ce10a2018-06-12 13:47:23 +090069
70 openstackTelemetryService.removeTelemetryService(this);
71
Jian Li6803ccd2018-06-08 09:26:09 +090072 log.info("Stopped");
73 }
74
75 @Override
Jian Li667c6eb2019-01-07 23:01:12 +090076 public boolean start(String name) {
77 boolean success = false;
Jian Lia61e0b62018-12-28 19:10:10 +090078 TelemetryConfig config = telemetryConfigService.getConfig(name);
79 GrpcTelemetryConfig grpcConfig = fromTelemetryConfig(config);
Jian Li6803ccd2018-06-08 09:26:09 +090080
Jian Li667c6eb2019-01-07 23:01:12 +090081 if (grpcConfig != null && !config.name().equals(GRPC_SCHEME) &&
82 config.status() == ENABLED) {
Jian Lia61e0b62018-12-28 19:10:10 +090083 ManagedChannel channel = ManagedChannelBuilder
84 .forAddress(grpcConfig.address(), grpcConfig.port())
85 .maxInboundMessageSize(grpcConfig.maxInboundMsgSize())
86 .usePlaintext(grpcConfig.usePlaintext())
87 .build();
Jian Li69600e02018-12-24 13:21:18 +090088
Jian Li667c6eb2019-01-07 23:01:12 +090089 if (testConnectivity(grpcConfig.address(), grpcConfig.port())) {
90 channels.put(name, channel);
91 success = true;
92 } else {
93 log.warn("Unable to connect to {}:{}, " +
94 "please check the connectivity manually",
95 grpcConfig.address(), grpcConfig.port());
96 }
Jian Lia61e0b62018-12-28 19:10:10 +090097 }
Jian Li667c6eb2019-01-07 23:01:12 +090098 return success;
Jian Lia61e0b62018-12-28 19:10:10 +090099 }
Jian Li6803ccd2018-06-08 09:26:09 +0900100
Jian Lia61e0b62018-12-28 19:10:10 +0900101 @Override
102 public void stop(String name) {
103 ManagedChannel channel = channels.get(name);
104
105 if (channel != null) {
106 channel.shutdown();
107 channels.remove(name);
108 }
109 }
110
111 @Override
Jian Li667c6eb2019-01-07 23:01:12 +0900112 public boolean restart(String name) {
Jian Lia61e0b62018-12-28 19:10:10 +0900113 stop(name);
Jian Li667c6eb2019-01-07 23:01:12 +0900114 return start(name);
Jian Lia61e0b62018-12-28 19:10:10 +0900115 }
116
117 @Override
118 public void startAll() {
119 telemetryConfigService.getConfigsByType(GRPC).forEach(c -> start(c.name()));
Jian Li6803ccd2018-06-08 09:26:09 +0900120 log.info("gRPC producer has Started");
121 }
122
123 @Override
Jian Lia61e0b62018-12-28 19:10:10 +0900124 public void stopAll() {
125 channels.values().forEach(ManagedChannel::shutdown);
Jian Li6803ccd2018-06-08 09:26:09 +0900126 log.info("gRPC producer has Stopped");
127 }
128
129 @Override
Jian Lia61e0b62018-12-28 19:10:10 +0900130 public void restartAll() {
131 stopAll();
132 startAll();
Jian Li6803ccd2018-06-08 09:26:09 +0900133 }
134
135 @Override
136 public Object publish(Object record) {
137 // TODO: need to find a way to invoke gRPC endpoint using channel
Jian Lid1ce10a2018-06-12 13:47:23 +0900138
Jian Li69600e02018-12-24 13:21:18 +0900139 if (channels.isEmpty()) {
Jian Li6c92b3c2018-08-03 11:26:55 +0900140 log.debug("gRPC telemetry service has not been enabled!");
Jian Lid1ce10a2018-06-12 13:47:23 +0900141 }
142
Jian Li6803ccd2018-06-08 09:26:09 +0900143 return null;
144 }
Jian Lid1ce10a2018-06-12 13:47:23 +0900145
146 @Override
147 public boolean isRunning() {
Jian Li69600e02018-12-24 13:21:18 +0900148 return !channels.isEmpty();
Jian Lid1ce10a2018-06-12 13:47:23 +0900149 }
Jian Li6803ccd2018-06-08 09:26:09 +0900150}