blob: f5641bd3aca32a0a8016c6ccfb45de36983f982c [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;
43import static org.onosproject.openstacktelemetry.config.DefaultRestTelemetryConfig.fromTelemetryConfig;
Jian Li6803ccd2018-06-08 09:26:09 +090044
45/**
46 * REST telemetry manager.
47 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070048@Component(immediate = true, service = RestTelemetryAdminService.class)
Jian Li6803ccd2018-06-08 09:26:09 +090049public class RestTelemetryManager implements RestTelemetryAdminService {
50
51 private final Logger log = LoggerFactory.getLogger(getClass());
52
53 private static final String PROTOCOL = "http";
54 private static final String POST_METHOD = "POST";
55 private static final String GET_METHOD = "GET";
56
Ray Milkeyd84f89b2018-08-17 14:54:17 -070057 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Lid1ce10a2018-06-12 13:47:23 +090058 protected OpenstackTelemetryService openstackTelemetryService;
59
Jian Li69600e02018-12-24 13:21:18 +090060 @Reference(cardinality = ReferenceCardinality.MANDATORY)
61 protected TelemetryConfigService telemetryConfigService;
62
63 private Map<String, WebTarget> targets = Maps.newConcurrentMap();
Jian Li6803ccd2018-06-08 09:26:09 +090064
65 @Activate
66 protected void activate() {
Jian Lid1ce10a2018-06-12 13:47:23 +090067
68 openstackTelemetryService.addTelemetryService(this);
69
Jian Li6803ccd2018-06-08 09:26:09 +090070 log.info("Started");
71 }
72
73 @Deactivate
74 protected void deactivate() {
Jian Lia61e0b62018-12-28 19:10:10 +090075 stopAll();
Jian Lid1ce10a2018-06-12 13:47:23 +090076
77 openstackTelemetryService.removeTelemetryService(this);
78
Jian Li6803ccd2018-06-08 09:26:09 +090079 log.info("Stopped");
80 }
81
82 @Override
Jian Lia61e0b62018-12-28 19:10:10 +090083 public void startAll() {
Jian Li6803ccd2018-06-08 09:26:09 +090084
Jian Lia61e0b62018-12-28 19:10:10 +090085 telemetryConfigService.getConfigsByType(REST).forEach(c -> start(c.name()));
Jian Li6803ccd2018-06-08 09:26:09 +090086
87 log.info("REST producer has Started");
88 }
89
90 @Override
Jian Lia61e0b62018-12-28 19:10:10 +090091 public void stopAll() {
Jian Li69600e02018-12-24 13:21:18 +090092 targets.values().forEach(t -> t = null);
Jian Li6803ccd2018-06-08 09:26:09 +090093 log.info("REST producer has Stopped");
94 }
95
96 @Override
Jian Lia61e0b62018-12-28 19:10:10 +090097 public void restartAll() {
98 stopAll();
99 startAll();
Jian Li6803ccd2018-06-08 09:26:09 +0900100 }
101
102 @Override
Jian Li69600e02018-12-24 13:21:18 +0900103 public Set<Response> publish(String record) {
Jian Li6803ccd2018-06-08 09:26:09 +0900104
Jian Li69600e02018-12-24 13:21:18 +0900105 Set<Response> responses = Sets.newConcurrentHashSet();
Jian Li6803ccd2018-06-08 09:26:09 +0900106
Jian Li69600e02018-12-24 13:21:18 +0900107 targets.forEach((k, v) -> {
108 TelemetryConfig config = telemetryConfigService.getConfig(k);
109 RestTelemetryConfig restConfig = fromTelemetryConfig(config);
Jian Lid1ce10a2018-06-12 13:47:23 +0900110
Jian Li69600e02018-12-24 13:21:18 +0900111 switch (restConfig.method()) {
112 case POST_METHOD:
113 responses.add(v.request(restConfig.requestMediaType())
114 .post(Entity.json(record)));
115 break;
116 case GET_METHOD:
117 responses.add(v.request(restConfig.requestMediaType()).get());
118 break;
119 default:
120 break;
121 }
122 });
Jian Lid1ce10a2018-06-12 13:47:23 +0900123
Jian Li69600e02018-12-24 13:21:18 +0900124 return responses;
Jian Li6803ccd2018-06-08 09:26:09 +0900125 }
Jian Lid1ce10a2018-06-12 13:47:23 +0900126
127 @Override
128 public boolean isRunning() {
Jian Li69600e02018-12-24 13:21:18 +0900129 return !targets.isEmpty();
Jian Lid1ce10a2018-06-12 13:47:23 +0900130 }
Jian Lia61e0b62018-12-28 19:10:10 +0900131
132 @Override
133 public void start(String name) {
134 TelemetryConfig config = telemetryConfigService.getConfig(name);
135 RestTelemetryConfig restConfig = fromTelemetryConfig(config);
136
137 if (restConfig != null &&
138 !config.name().equals(REST_SCHEME) && config.enabled()) {
139 StringBuilder restServerBuilder = new StringBuilder();
140 restServerBuilder.append(PROTOCOL);
141 restServerBuilder.append(":");
142 restServerBuilder.append("//");
143 restServerBuilder.append(restConfig.address());
144 restServerBuilder.append(":");
145 restServerBuilder.append(restConfig.port());
146 restServerBuilder.append("/");
147
148 Client client = ClientBuilder.newBuilder().build();
149
150 WebTarget target = client.target(
151 restServerBuilder.toString()).path(restConfig.endpoint());
152
153 targets.put(config.name(), target);
154 }
155 }
156
157 @Override
158 public void stop(String name) {
159 WebTarget target = targets.get(name);
160
161 if (target != null) {
162 target = null;
163 targets.remove(name);
164 }
165 }
166
167 @Override
168 public void restart(String name) {
169 stop(name);
170 start(name);
171 }
Jian Li6803ccd2018-06-08 09:26:09 +0900172}