blob: bb8b305ed647ae007bb25757cd712169c763f5b6 [file] [log] [blame]
Jian Li69600e02018-12-24 13:21:18 +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
18import com.google.common.collect.ImmutableSet;
19import org.onlab.util.KryoNamespace;
20import org.onosproject.cluster.ClusterService;
21import org.onosproject.cluster.LeadershipService;
22import org.onosproject.cluster.NodeId;
23import org.onosproject.core.ApplicationId;
24import org.onosproject.core.CoreService;
25import org.onosproject.event.ListenerRegistry;
Jian Li7fe7eaf2018-12-31 17:00:33 +090026import org.onosproject.openstacktelemetry.api.DefaultTelemetryConfig;
Jian Li69600e02018-12-24 13:21:18 +090027import org.onosproject.openstacktelemetry.api.TelemetryConfigAdminService;
28import org.onosproject.openstacktelemetry.api.TelemetryConfigEvent;
29import org.onosproject.openstacktelemetry.api.TelemetryConfigListener;
30import org.onosproject.openstacktelemetry.api.TelemetryConfigProvider;
31import org.onosproject.openstacktelemetry.api.TelemetryConfigService;
32import org.onosproject.openstacktelemetry.api.TelemetryConfigStore;
33import org.onosproject.openstacktelemetry.api.TelemetryConfigStoreDelegate;
34import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
35import org.onosproject.openstacktelemetry.api.config.TelemetryConfig.ConfigType;
36import org.onosproject.store.serializers.KryoNamespaces;
37import org.onosproject.store.service.ConsistentMap;
38import org.onosproject.store.service.Serializer;
39import org.onosproject.store.service.StorageService;
40import org.osgi.service.component.annotations.Activate;
41import org.osgi.service.component.annotations.Component;
42import org.osgi.service.component.annotations.Deactivate;
43import org.osgi.service.component.annotations.Reference;
44import org.osgi.service.component.annotations.ReferenceCardinality;
45import org.slf4j.Logger;
46import org.slf4j.LoggerFactory;
47
48import java.util.Objects;
49import java.util.Set;
50
51import static com.google.common.base.Preconditions.checkNotNull;
52import static org.onlab.util.Tools.nullIsNotFound;
53import static org.onosproject.openstacktelemetry.api.Constants.OPENSTACK_TELEMETRY_APP_ID;
54
55/**
56 * Provides implementation of administering and interfacing telemetry configs.
57 * It also provides telemetry config events for the various exporters or connectors.
58 */
59@Component(
60 immediate = true,
61 service = {
62 TelemetryConfigService.class, TelemetryConfigAdminService.class
63 }
64)
65public class TelemetryConfigManager
66 extends ListenerRegistry<TelemetryConfigEvent, TelemetryConfigListener>
67 implements TelemetryConfigService, TelemetryConfigAdminService {
68
69 private final Logger log = LoggerFactory.getLogger(getClass());
70
71 private static final String MSG_TELEMETRY_CONFIG = "Telemetry config %s %s";
72 private static final String MSG_CREATED = "created";
73 private static final String MSG_UPDATED = "updated";
74 private static final String MSG_REMOVED = "removed";
75
76 private static final String ERR_NULL_CONFIG = "Telemetry config cannot be null";
77 private static final String NO_CONFIG = "Telemetry config not found";
Jian Li7fe7eaf2018-12-31 17:00:33 +090078 private static final String ERR_NULL_CONFIG_NAME = "Telemetry config name cannot be null";
Jian Li69600e02018-12-24 13:21:18 +090079
80 private static final KryoNamespace SERIALIZER_TELEMETRY_CONFIG =
81 KryoNamespace.newBuilder()
82 .register(KryoNamespaces.API)
83 .register(TelemetryConfigProvider.class)
84 .register(DefaultTelemetryConfigProvider.class)
85 .register(TelemetryConfig.class)
86 .register(TelemetryConfig.ConfigType.class)
Jian Li667c6eb2019-01-07 23:01:12 +090087 .register(TelemetryConfig.Status.class)
Jian Li69600e02018-12-24 13:21:18 +090088 .register(DefaultTelemetryConfig.class)
89 .build();
90
91 @Reference(cardinality = ReferenceCardinality.MANDATORY)
92 protected CoreService coreService;
93
94 @Reference(cardinality = ReferenceCardinality.MANDATORY)
95 protected StorageService storageService;
96
97 @Reference(cardinality = ReferenceCardinality.MANDATORY)
98 protected ClusterService clusterService;
99
100 @Reference(cardinality = ReferenceCardinality.MANDATORY)
101 protected LeadershipService leadershipService;
102
103 @Reference(cardinality = ReferenceCardinality.MANDATORY)
104 protected TelemetryConfigStore telemetryConfigStore;
105
106 private final TelemetryConfigStoreDelegate
107 delegate = new InternalTelemetryConfigStoreDelegate();
108
109 private ConsistentMap<String, TelemetryConfigProvider> providerMap;
110
111 private ApplicationId appId;
112 private NodeId localNodeId;
113
114 @Activate
115 protected void activate() {
116 appId = coreService.registerApplication(OPENSTACK_TELEMETRY_APP_ID);
117 localNodeId = clusterService.getLocalNode().id();
118 telemetryConfigStore.setDelegate(delegate);
119 leadershipService.runForLeadership(appId.name());
120
121 providerMap = storageService.<String, TelemetryConfigProvider>consistentMapBuilder()
122 .withSerializer(Serializer.using(SERIALIZER_TELEMETRY_CONFIG))
123 .withName("openstack-telemetry-config-provider")
124 .withApplicationId(appId)
125 .build();
126
127 log.info("Started");
128 }
129
130 @Deactivate
131 protected void deactivate() {
132 telemetryConfigStore.unsetDelegate(delegate);
133 leadershipService.withdraw(appId.name());
134 providerMap.clear();
135
136 log.info("Stopped");
137 }
138
139 @Override
140 public Set<TelemetryConfigProvider> getProviders() {
141 ImmutableSet.Builder<TelemetryConfigProvider> builder = ImmutableSet.builder();
142 providerMap.asJavaMap().values().forEach(builder::add);
143 return builder.build();
144 }
145
146 @Override
147 public void registerProvider(TelemetryConfigProvider provider) {
148 if (isLeader()) {
149 StringBuilder nameBuilder = new StringBuilder();
150 provider.getTelemetryConfigs().forEach(config -> {
151 nameBuilder.append(config.name());
152 telemetryConfigStore.createTelemetryConfig(config);
153 log.info(String.format(MSG_TELEMETRY_CONFIG, config.name(), MSG_CREATED));
154 });
155 providerMap.put(nameBuilder.toString(), provider);
156 }
157 }
158
159 @Override
160 public void unregisterProvider(TelemetryConfigProvider provider) {
161 if (isLeader()) {
162 StringBuilder nameBuilder = new StringBuilder();
163 provider.getTelemetryConfigs().forEach(config -> {
164 nameBuilder.append(config.name());
165 telemetryConfigStore.removeTelemetryConfig(config.name());
166 log.info(String.format(MSG_TELEMETRY_CONFIG, config.name(), MSG_REMOVED));
167 });
168 providerMap.remove(nameBuilder.toString());
169 }
170 }
171
172 @Override
173 public void updateTelemetryConfig(TelemetryConfig config) {
174 checkNotNull(config, ERR_NULL_CONFIG);
175
176 telemetryConfigStore.updateTelemetryConfig(config);
177 log.info(String.format(MSG_TELEMETRY_CONFIG, config.name(), MSG_UPDATED));
178 }
179
180 @Override
Jian Li7fe7eaf2018-12-31 17:00:33 +0900181 public void removeTelemetryConfig(String name) {
182 checkNotNull(name, ERR_NULL_CONFIG_NAME);
183
184 telemetryConfigStore.removeTelemetryConfig(name);
185 log.info(String.format(MSG_TELEMETRY_CONFIG, name, MSG_REMOVED));
186 }
187
188 @Override
Jian Li69600e02018-12-24 13:21:18 +0900189 public TelemetryConfig getConfig(String name) {
190 return nullIsNotFound(telemetryConfigStore.telemetryConfig(name), NO_CONFIG);
191 }
192
193 @Override
194 public Set<TelemetryConfig> getConfigsByType(ConfigType type) {
195 return ImmutableSet.copyOf(telemetryConfigStore.telemetryConfigsByType(type));
196 }
197
198 @Override
199 public Set<TelemetryConfig> getConfigs() {
200 return ImmutableSet.copyOf(telemetryConfigStore.telemetryConfigs());
201 }
202
203 private boolean isLeader() {
204 return Objects.equals(localNodeId, leadershipService.getLeader(appId.name()));
205 }
206
207 private class InternalTelemetryConfigStoreDelegate implements TelemetryConfigStoreDelegate {
208
209 @Override
210 public void notify(TelemetryConfigEvent event) {
211 if (event != null) {
212 log.trace("send telemetry config event {}", event);
213 process(event);
214 }
215 }
216 }
217}