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