blob: e73a724357369ef3e84c0608ed5f74b8b92df74c [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 Li69600e02018-12-24 13:21:18 +090018import com.google.common.collect.Maps;
19import com.google.common.collect.Sets;
Jian Lid1ce10a2018-06-12 13:47:23 +090020import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
Jian Li6803ccd2018-06-08 09:26:09 +090021import org.onosproject.openstacktelemetry.api.RestTelemetryAdminService;
Jian Li69600e02018-12-24 13:21:18 +090022import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
Jian Li6803ccd2018-06-08 09:26:09 +090023import org.onosproject.openstacktelemetry.api.config.RestTelemetryConfig;
24import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070025import org.osgi.service.component.annotations.Activate;
26import org.osgi.service.component.annotations.Component;
27import org.osgi.service.component.annotations.Deactivate;
28import org.osgi.service.component.annotations.Reference;
29import org.osgi.service.component.annotations.ReferenceCardinality;
Jian Li6803ccd2018-06-08 09:26:09 +090030import org.slf4j.Logger;
31import org.slf4j.LoggerFactory;
32
33import javax.ws.rs.client.Client;
34import javax.ws.rs.client.ClientBuilder;
35import javax.ws.rs.client.Entity;
36import javax.ws.rs.client.WebTarget;
37import javax.ws.rs.core.Response;
Jian Li69600e02018-12-24 13:21:18 +090038import java.util.Map;
39import java.util.Set;
40
41import static org.onosproject.openstacktelemetry.api.Constants.REST_SCHEME;
42import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType.REST;
Jian Li667c6eb2019-01-07 23:01:12 +090043import static org.onosproject.openstacktelemetry.api.config.TelemetryConfig.Status.ENABLED;
Jian Li69600e02018-12-24 13:21:18 +090044import static org.onosproject.openstacktelemetry.config.DefaultRestTelemetryConfig.fromTelemetryConfig;
Jian Li667c6eb2019-01-07 23:01:12 +090045import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.testConnectivity;
Jian Li6803ccd2018-06-08 09:26:09 +090046
47/**
48 * REST telemetry manager.
49 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070050@Component(immediate = true, service = RestTelemetryAdminService.class)
Jian Li6803ccd2018-06-08 09:26:09 +090051public class RestTelemetryManager implements RestTelemetryAdminService {
52
53 private final Logger log = LoggerFactory.getLogger(getClass());
54
55 private static final String PROTOCOL = "http";
56 private static final String POST_METHOD = "POST";
57 private static final String GET_METHOD = "GET";
58
Ray Milkeyd84f89b2018-08-17 14:54:17 -070059 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Lid1ce10a2018-06-12 13:47:23 +090060 protected OpenstackTelemetryService openstackTelemetryService;
61
Jian Li69600e02018-12-24 13:21:18 +090062 @Reference(cardinality = ReferenceCardinality.MANDATORY)
63 protected TelemetryConfigService telemetryConfigService;
64
65 private Map<String, WebTarget> targets = Maps.newConcurrentMap();
Jian Li6803ccd2018-06-08 09:26:09 +090066
67 @Activate
68 protected void activate() {
Jian Lid1ce10a2018-06-12 13:47:23 +090069
70 openstackTelemetryService.addTelemetryService(this);
71
Jian Li6803ccd2018-06-08 09:26:09 +090072 log.info("Started");
73 }
74
75 @Deactivate
76 protected void deactivate() {
Jian Lia61e0b62018-12-28 19:10:10 +090077 stopAll();
Jian Lid1ce10a2018-06-12 13:47:23 +090078
79 openstackTelemetryService.removeTelemetryService(this);
80
Jian Li6803ccd2018-06-08 09:26:09 +090081 log.info("Stopped");
82 }
83
84 @Override
Jian Lia61e0b62018-12-28 19:10:10 +090085 public void startAll() {
Jian Li6803ccd2018-06-08 09:26:09 +090086
Jian Lia61e0b62018-12-28 19:10:10 +090087 telemetryConfigService.getConfigsByType(REST).forEach(c -> start(c.name()));
Jian Li6803ccd2018-06-08 09:26:09 +090088
89 log.info("REST producer has Started");
90 }
91
92 @Override
Jian Lia61e0b62018-12-28 19:10:10 +090093 public void stopAll() {
Jian Li69600e02018-12-24 13:21:18 +090094 targets.values().forEach(t -> t = null);
Jian Li6803ccd2018-06-08 09:26:09 +090095 log.info("REST producer has Stopped");
96 }
97
98 @Override
Jian Lia61e0b62018-12-28 19:10:10 +090099 public void restartAll() {
100 stopAll();
101 startAll();
Jian Li6803ccd2018-06-08 09:26:09 +0900102 }
103
104 @Override
Jian Li69600e02018-12-24 13:21:18 +0900105 public Set<Response> publish(String record) {
Jian Li6803ccd2018-06-08 09:26:09 +0900106
Jian Li69600e02018-12-24 13:21:18 +0900107 Set<Response> responses = Sets.newConcurrentHashSet();
Jian Li6803ccd2018-06-08 09:26:09 +0900108
Jian Li69600e02018-12-24 13:21:18 +0900109 targets.forEach((k, v) -> {
110 TelemetryConfig config = telemetryConfigService.getConfig(k);
111 RestTelemetryConfig restConfig = fromTelemetryConfig(config);
Jian Lid1ce10a2018-06-12 13:47:23 +0900112
Jian Li69600e02018-12-24 13:21:18 +0900113 switch (restConfig.method()) {
114 case POST_METHOD:
115 responses.add(v.request(restConfig.requestMediaType())
116 .post(Entity.json(record)));
117 break;
118 case GET_METHOD:
119 responses.add(v.request(restConfig.requestMediaType()).get());
120 break;
121 default:
122 break;
123 }
124 });
Jian Lid1ce10a2018-06-12 13:47:23 +0900125
Jian Li69600e02018-12-24 13:21:18 +0900126 return responses;
Jian Li6803ccd2018-06-08 09:26:09 +0900127 }
Jian Lid1ce10a2018-06-12 13:47:23 +0900128
129 @Override
130 public boolean isRunning() {
Jian Li69600e02018-12-24 13:21:18 +0900131 return !targets.isEmpty();
Jian Lid1ce10a2018-06-12 13:47:23 +0900132 }
Jian Lia61e0b62018-12-28 19:10:10 +0900133
134 @Override
Jian Li667c6eb2019-01-07 23:01:12 +0900135 public boolean start(String name) {
136 boolean success = false;
Jian Lia61e0b62018-12-28 19:10:10 +0900137 TelemetryConfig config = telemetryConfigService.getConfig(name);
138 RestTelemetryConfig restConfig = fromTelemetryConfig(config);
139
Jian Li667c6eb2019-01-07 23:01:12 +0900140 if (restConfig != null && !config.name().equals(REST_SCHEME) &&
141 config.status() == ENABLED) {
Jian Lia61e0b62018-12-28 19:10:10 +0900142 StringBuilder restServerBuilder = new StringBuilder();
143 restServerBuilder.append(PROTOCOL);
144 restServerBuilder.append(":");
145 restServerBuilder.append("//");
146 restServerBuilder.append(restConfig.address());
147 restServerBuilder.append(":");
148 restServerBuilder.append(restConfig.port());
149 restServerBuilder.append("/");
150
Jian Li667c6eb2019-01-07 23:01:12 +0900151 if (testConnectivity(restConfig.address(), restConfig.port())) {
152 Client client = ClientBuilder.newBuilder().build();
Jian Lia61e0b62018-12-28 19:10:10 +0900153
Jian Li667c6eb2019-01-07 23:01:12 +0900154 WebTarget target = client.target(
155 restServerBuilder.toString()).path(restConfig.endpoint());
Jian Lia61e0b62018-12-28 19:10:10 +0900156
Jian Li667c6eb2019-01-07 23:01:12 +0900157 targets.put(config.name(), target);
158
159 success = true;
160 } else {
161 log.warn("Unable to connect to {}:{}, " +
162 "please check the connectivity manually",
163 restConfig.address(), restConfig.port());
164 }
Jian Lia61e0b62018-12-28 19:10:10 +0900165 }
Jian Li667c6eb2019-01-07 23:01:12 +0900166
167 return success;
Jian Lia61e0b62018-12-28 19:10:10 +0900168 }
169
170 @Override
171 public void stop(String name) {
172 WebTarget target = targets.get(name);
173
174 if (target != null) {
175 target = null;
176 targets.remove(name);
177 }
178 }
179
180 @Override
Jian Li667c6eb2019-01-07 23:01:12 +0900181 public boolean restart(String name) {
Jian Lia61e0b62018-12-28 19:10:10 +0900182 stop(name);
Jian Li667c6eb2019-01-07 23:01:12 +0900183 return start(name);
Jian Lia61e0b62018-12-28 19:10:10 +0900184 }
Jian Li6803ccd2018-06-08 09:26:09 +0900185}