blob: 48cef3433fd9a8311a046064c80a9e0f1148f082 [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() {
75 stop();
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 Li69600e02018-12-24 13:21:18 +090083 public void start() {
Jian Li6803ccd2018-06-08 09:26:09 +090084
Jian Li69600e02018-12-24 13:21:18 +090085 telemetryConfigService.getConfigsByType(REST).forEach(c -> {
86 RestTelemetryConfig restConfig = fromTelemetryConfig(c);
Jian Li6803ccd2018-06-08 09:26:09 +090087
Jian Li69600e02018-12-24 13:21:18 +090088 if (restConfig != null && !c.name().equals(REST_SCHEME) && c.enabled()) {
89 StringBuilder restServerBuilder = new StringBuilder();
90 restServerBuilder.append(PROTOCOL);
91 restServerBuilder.append(":");
92 restServerBuilder.append("//");
93 restServerBuilder.append(restConfig.address());
94 restServerBuilder.append(":");
95 restServerBuilder.append(restConfig.port());
96 restServerBuilder.append("/");
Jian Li6803ccd2018-06-08 09:26:09 +090097
Jian Li69600e02018-12-24 13:21:18 +090098 Client client = ClientBuilder.newBuilder().build();
Jian Li6803ccd2018-06-08 09:26:09 +090099
Jian Li69600e02018-12-24 13:21:18 +0900100 WebTarget target = client.target(restServerBuilder.toString()).path(restConfig.endpoint());
101
102 targets.put(c.name(), target);
103 }
104 });
Jian Li6803ccd2018-06-08 09:26:09 +0900105
106 log.info("REST producer has Started");
107 }
108
109 @Override
110 public void stop() {
Jian Li69600e02018-12-24 13:21:18 +0900111 targets.values().forEach(t -> t = null);
Jian Li6803ccd2018-06-08 09:26:09 +0900112 log.info("REST producer has Stopped");
113 }
114
115 @Override
Jian Li69600e02018-12-24 13:21:18 +0900116 public void restart() {
Jian Li6803ccd2018-06-08 09:26:09 +0900117 stop();
Jian Li69600e02018-12-24 13:21:18 +0900118 start();
Jian Li6803ccd2018-06-08 09:26:09 +0900119 }
120
121 @Override
Jian Li69600e02018-12-24 13:21:18 +0900122 public Set<Response> publish(String record) {
Jian Li6803ccd2018-06-08 09:26:09 +0900123
Jian Li69600e02018-12-24 13:21:18 +0900124 Set<Response> responses = Sets.newConcurrentHashSet();
Jian Li6803ccd2018-06-08 09:26:09 +0900125
Jian Li69600e02018-12-24 13:21:18 +0900126 targets.forEach((k, v) -> {
127 TelemetryConfig config = telemetryConfigService.getConfig(k);
128 RestTelemetryConfig restConfig = fromTelemetryConfig(config);
Jian Lid1ce10a2018-06-12 13:47:23 +0900129
Jian Li69600e02018-12-24 13:21:18 +0900130 switch (restConfig.method()) {
131 case POST_METHOD:
132 responses.add(v.request(restConfig.requestMediaType())
133 .post(Entity.json(record)));
134 break;
135 case GET_METHOD:
136 responses.add(v.request(restConfig.requestMediaType()).get());
137 break;
138 default:
139 break;
140 }
141 });
Jian Lid1ce10a2018-06-12 13:47:23 +0900142
Jian Li69600e02018-12-24 13:21:18 +0900143 return responses;
Jian Li6803ccd2018-06-08 09:26:09 +0900144 }
Jian Lid1ce10a2018-06-12 13:47:23 +0900145
146 @Override
147 public boolean isRunning() {
Jian Li69600e02018-12-24 13:21:18 +0900148 return !targets.isEmpty();
Jian Lid1ce10a2018-06-12 13:47:23 +0900149 }
Jian Li6803ccd2018-06-08 09:26:09 +0900150}