blob: 133c9583fa08fc1b4b89487d9bfc74c04e37b05a [file] [log] [blame]
Jian Li75642312017-01-19 14:23:05 -08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Jian Li75642312017-01-19 14:23:05 -08003 *
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.mapping.impl;
17
Jian Li38bb1092017-05-01 15:04:32 +090018import com.google.common.collect.ImmutableList;
Jian Li2dc9f002017-03-03 04:26:31 +090019import com.google.common.collect.Iterables;
Jian Li38bb1092017-05-01 15:04:32 +090020import com.google.common.collect.Lists;
Jian Li2dc9f002017-03-03 04:26:31 +090021import com.google.common.collect.Sets;
Jian Li2dc9f002017-03-03 04:26:31 +090022import org.onosproject.core.ApplicationId;
Jian Licdd1bfd2017-03-12 22:42:56 +090023import org.onosproject.mapping.MappingAdminService;
Jian Li2dc9f002017-03-03 04:26:31 +090024import org.onosproject.mapping.MappingEntry;
25import org.onosproject.mapping.MappingEvent;
Jian Li791dd322017-04-20 00:15:56 +090026import org.onosproject.mapping.MappingKey;
Jian Li95edb592017-01-29 08:42:07 +090027import org.onosproject.mapping.MappingListener;
Jian Li2dc9f002017-03-03 04:26:31 +090028import org.onosproject.mapping.MappingProvider;
29import org.onosproject.mapping.MappingProviderRegistry;
30import org.onosproject.mapping.MappingProviderService;
Jian Li75642312017-01-19 14:23:05 -080031import org.onosproject.mapping.MappingService;
Jian Li2dc9f002017-03-03 04:26:31 +090032import org.onosproject.mapping.MappingStore;
33import org.onosproject.mapping.MappingStore.Type;
34import org.onosproject.mapping.MappingStoreDelegate;
Jian Li791dd322017-04-20 00:15:56 +090035import org.onosproject.mapping.MappingValue;
Jian Li2dc9f002017-03-03 04:26:31 +090036import org.onosproject.net.Device;
37import org.onosproject.net.DeviceId;
38import org.onosproject.net.device.DeviceService;
39import org.onosproject.net.provider.AbstractListenerProviderRegistry;
40import org.onosproject.net.provider.AbstractProviderService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070041import org.osgi.service.component.annotations.Activate;
42import org.osgi.service.component.annotations.Component;
43import org.osgi.service.component.annotations.Deactivate;
44import org.osgi.service.component.annotations.Reference;
45import org.osgi.service.component.annotations.ReferenceCardinality;
Jian Li2dc9f002017-03-03 04:26:31 +090046import org.slf4j.Logger;
47
Jian Li38bb1092017-05-01 15:04:32 +090048import java.util.List;
Jian Li2dc9f002017-03-03 04:26:31 +090049import java.util.Set;
50
51import static org.slf4j.LoggerFactory.getLogger;
Jian Li75642312017-01-19 14:23:05 -080052
53/**
54 * Implementation of mapping management service.
55 */
Ray Milkey86ad7bb2018-09-27 12:32:28 -070056@Component(immediate = true,
57 service = { MappingService.class, MappingAdminService.class, MappingProviderRegistry.class })
Jian Li2dc9f002017-03-03 04:26:31 +090058public class MappingManager
59 extends AbstractListenerProviderRegistry<MappingEvent, MappingListener,
60 MappingProvider, MappingProviderService>
Jian Licdd1bfd2017-03-12 22:42:56 +090061 implements MappingService, MappingAdminService, MappingProviderRegistry {
Jian Li95edb592017-01-29 08:42:07 +090062
Jian Li2dc9f002017-03-03 04:26:31 +090063 private final Logger log = getLogger(getClass());
64
65 private static final String MAPPING_OP_TOPIC = "mapping-ops-ids";
66 private final MappingStoreDelegate delegate = new InternalStoreDelegate();
67
Ray Milkeyd84f89b2018-08-17 14:54:17 -070068 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Li2dc9f002017-03-03 04:26:31 +090069 protected MappingStore store;
70
Ray Milkeyd84f89b2018-08-17 14:54:17 -070071 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Li2dc9f002017-03-03 04:26:31 +090072 protected DeviceService deviceService;
73
74 @Activate
75 public void activate() {
76 store.setDelegate(delegate);
77 eventDispatcher.addSink(MappingEvent.class, listenerRegistry);
78 log.info("Started");
79 }
80
81 @Deactivate
82 public void deactivate() {
83 store.unsetDelegate(delegate);
84 eventDispatcher.removeSink(MappingEvent.class);
85 log.info("Stopped");
Jian Li95edb592017-01-29 08:42:07 +090086 }
87
88 @Override
Jian Li2dc9f002017-03-03 04:26:31 +090089 public int getMappingCount(Type type) {
90 return store.getMappingCount(type);
91 }
Jian Li95edb592017-01-29 08:42:07 +090092
Jian Li2dc9f002017-03-03 04:26:31 +090093 @Override
Jian Lic87b23b2017-04-24 15:28:10 +090094 public Iterable<MappingEntry> getAllMappingEntries(Type type) {
95 return store.getAllMappingEntries(type);
96 }
97
98 @Override
Jian Li2dc9f002017-03-03 04:26:31 +090099 public void storeMappingEntry(Type type, MappingEntry entry) {
100 store.storeMapping(type, entry);
101 }
102
103 @Override
104 public Iterable<MappingEntry> getMappingEntries(Type type, DeviceId deviceId) {
105 return store.getMappingEntries(type, deviceId);
106 }
107
108 @Override
Jian Li9552f172017-04-20 00:19:56 +0900109 public Iterable<MappingEntry> getMappingEntriesByAppId(Type type, ApplicationId appId) {
Jian Li2dc9f002017-03-03 04:26:31 +0900110
111 Set<MappingEntry> mappingEntries = Sets.newHashSet();
112 for (Device d : deviceService.getDevices()) {
113 for (MappingEntry mappingEntry : store.getMappingEntries(type, d.id())) {
114 if (mappingEntry.appId() == appId.id()) {
115 mappingEntries.add(mappingEntry);
116 }
117 }
118 }
119 return mappingEntries;
120 }
121
122 @Override
123 public void removeMappingEntries(Type type, MappingEntry... mappingEntries) {
124 for (MappingEntry entry : mappingEntries) {
125 store.removeMapping(type, entry);
126 }
127 }
128
129 @Override
130 public void removeMappingEntriesByAppId(Type type, ApplicationId appId) {
131 removeMappingEntries(type, Iterables.toArray(
Jian Li9552f172017-04-20 00:19:56 +0900132 getMappingEntriesByAppId(type, appId), MappingEntry.class));
Jian Li2dc9f002017-03-03 04:26:31 +0900133 }
134
135 @Override
136 public void purgeMappings(Type type, DeviceId deviceId) {
137 store.purgeMappingEntry(type, deviceId);
138 }
139
140 @Override
141 protected MappingProviderService createProviderService(MappingProvider provider) {
142 return new InternalMappingProviderService(provider);
143 }
144
145 /**
Jian Li791dd322017-04-20 00:15:56 +0900146 * Obtains a mapping value associated a mapping key.
147 *
148 * @param mappingKey a given mapping key
149 * @return a mapping value
150 */
151 private MappingValue getMappingValueByMappingKey(MappingKey mappingKey) {
152 for (MappingEntry entry : store.getAllMappingEntries(Type.MAP_DATABASE)) {
153 if (entry.key().equals(mappingKey)) {
154 return entry.value();
155 }
156 }
157 return null;
158 }
159
160 /**
Jian Li2dc9f002017-03-03 04:26:31 +0900161 * Store delegate.
162 */
163 private class InternalStoreDelegate implements MappingStoreDelegate {
164
165 @Override
166 public void notify(MappingEvent event) {
167 post(event);
168 }
169 }
170
171 /**
172 * Internal mapping provider service.
173 */
174 private class InternalMappingProviderService
175 extends AbstractProviderService<MappingProvider> implements MappingProviderService {
176
177 /**
178 * Initializes internal mapping provider service.
179 *
180 * @param provider mapping provider
181 */
182 protected InternalMappingProviderService(MappingProvider provider) {
183 super(provider);
184 }
185
186 @Override
187 public void mappingAdded(MappingEntry mappingEntry, Type type) {
188 storeMappingEntry(type, mappingEntry);
189 }
Jian Li791dd322017-04-20 00:15:56 +0900190
191 @Override
192 public MappingValue mappingQueried(MappingKey mappingKey) {
193 return getMappingValueByMappingKey(mappingKey);
194 }
Jian Li38bb1092017-05-01 15:04:32 +0900195
196 @Override
197 public List<MappingValue> mappingQueried(List<MappingKey> mappingKeys) {
198 List<MappingValue> values = Lists.newArrayList();
199 mappingKeys.forEach(key -> {
200 MappingValue value = getMappingValueByMappingKey(key);
201 if (value != null) {
202 values.add(value);
203 }
204 });
205 return ImmutableList.copyOf(values);
206 }
Jian Li95edb592017-01-29 08:42:07 +0900207 }
Jian Li75642312017-01-19 14:23:05 -0800208}