blob: 85b4c1d839a6c936609da6783f0cea3f6c80bfee [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 Milkeyd84f89b2018-08-17 14:54:17 -070056@Component(immediate = true, service = { MappingService.class, MappingAdminService.class, MappingProviderRegistry.class })
Jian Li2dc9f002017-03-03 04:26:31 +090057public class MappingManager
58 extends AbstractListenerProviderRegistry<MappingEvent, MappingListener,
59 MappingProvider, MappingProviderService>
Jian Licdd1bfd2017-03-12 22:42:56 +090060 implements MappingService, MappingAdminService, MappingProviderRegistry {
Jian Li95edb592017-01-29 08:42:07 +090061
Jian Li2dc9f002017-03-03 04:26:31 +090062 private final Logger log = getLogger(getClass());
63
64 private static final String MAPPING_OP_TOPIC = "mapping-ops-ids";
65 private final MappingStoreDelegate delegate = new InternalStoreDelegate();
66
Ray Milkeyd84f89b2018-08-17 14:54:17 -070067 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Li2dc9f002017-03-03 04:26:31 +090068 protected MappingStore store;
69
Ray Milkeyd84f89b2018-08-17 14:54:17 -070070 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jian Li2dc9f002017-03-03 04:26:31 +090071 protected DeviceService deviceService;
72
73 @Activate
74 public void activate() {
75 store.setDelegate(delegate);
76 eventDispatcher.addSink(MappingEvent.class, listenerRegistry);
77 log.info("Started");
78 }
79
80 @Deactivate
81 public void deactivate() {
82 store.unsetDelegate(delegate);
83 eventDispatcher.removeSink(MappingEvent.class);
84 log.info("Stopped");
Jian Li95edb592017-01-29 08:42:07 +090085 }
86
87 @Override
Jian Li2dc9f002017-03-03 04:26:31 +090088 public int getMappingCount(Type type) {
89 return store.getMappingCount(type);
90 }
Jian Li95edb592017-01-29 08:42:07 +090091
Jian Li2dc9f002017-03-03 04:26:31 +090092 @Override
Jian Lic87b23b2017-04-24 15:28:10 +090093 public Iterable<MappingEntry> getAllMappingEntries(Type type) {
94 return store.getAllMappingEntries(type);
95 }
96
97 @Override
Jian Li2dc9f002017-03-03 04:26:31 +090098 public void storeMappingEntry(Type type, MappingEntry entry) {
99 store.storeMapping(type, entry);
100 }
101
102 @Override
103 public Iterable<MappingEntry> getMappingEntries(Type type, DeviceId deviceId) {
104 return store.getMappingEntries(type, deviceId);
105 }
106
107 @Override
Jian Li9552f172017-04-20 00:19:56 +0900108 public Iterable<MappingEntry> getMappingEntriesByAppId(Type type, ApplicationId appId) {
Jian Li2dc9f002017-03-03 04:26:31 +0900109
110 Set<MappingEntry> mappingEntries = Sets.newHashSet();
111 for (Device d : deviceService.getDevices()) {
112 for (MappingEntry mappingEntry : store.getMappingEntries(type, d.id())) {
113 if (mappingEntry.appId() == appId.id()) {
114 mappingEntries.add(mappingEntry);
115 }
116 }
117 }
118 return mappingEntries;
119 }
120
121 @Override
122 public void removeMappingEntries(Type type, MappingEntry... mappingEntries) {
123 for (MappingEntry entry : mappingEntries) {
124 store.removeMapping(type, entry);
125 }
126 }
127
128 @Override
129 public void removeMappingEntriesByAppId(Type type, ApplicationId appId) {
130 removeMappingEntries(type, Iterables.toArray(
Jian Li9552f172017-04-20 00:19:56 +0900131 getMappingEntriesByAppId(type, appId), MappingEntry.class));
Jian Li2dc9f002017-03-03 04:26:31 +0900132 }
133
134 @Override
135 public void purgeMappings(Type type, DeviceId deviceId) {
136 store.purgeMappingEntry(type, deviceId);
137 }
138
139 @Override
140 protected MappingProviderService createProviderService(MappingProvider provider) {
141 return new InternalMappingProviderService(provider);
142 }
143
144 /**
Jian Li791dd322017-04-20 00:15:56 +0900145 * Obtains a mapping value associated a mapping key.
146 *
147 * @param mappingKey a given mapping key
148 * @return a mapping value
149 */
150 private MappingValue getMappingValueByMappingKey(MappingKey mappingKey) {
151 for (MappingEntry entry : store.getAllMappingEntries(Type.MAP_DATABASE)) {
152 if (entry.key().equals(mappingKey)) {
153 return entry.value();
154 }
155 }
156 return null;
157 }
158
159 /**
Jian Li2dc9f002017-03-03 04:26:31 +0900160 * Store delegate.
161 */
162 private class InternalStoreDelegate implements MappingStoreDelegate {
163
164 @Override
165 public void notify(MappingEvent event) {
166 post(event);
167 }
168 }
169
170 /**
171 * Internal mapping provider service.
172 */
173 private class InternalMappingProviderService
174 extends AbstractProviderService<MappingProvider> implements MappingProviderService {
175
176 /**
177 * Initializes internal mapping provider service.
178 *
179 * @param provider mapping provider
180 */
181 protected InternalMappingProviderService(MappingProvider provider) {
182 super(provider);
183 }
184
185 @Override
186 public void mappingAdded(MappingEntry mappingEntry, Type type) {
187 storeMappingEntry(type, mappingEntry);
188 }
Jian Li791dd322017-04-20 00:15:56 +0900189
190 @Override
191 public MappingValue mappingQueried(MappingKey mappingKey) {
192 return getMappingValueByMappingKey(mappingKey);
193 }
Jian Li38bb1092017-05-01 15:04:32 +0900194
195 @Override
196 public List<MappingValue> mappingQueried(List<MappingKey> mappingKeys) {
197 List<MappingValue> values = Lists.newArrayList();
198 mappingKeys.forEach(key -> {
199 MappingValue value = getMappingValueByMappingKey(key);
200 if (value != null) {
201 values.add(value);
202 }
203 });
204 return ImmutableList.copyOf(values);
205 }
Jian Li95edb592017-01-29 08:42:07 +0900206 }
Jian Li75642312017-01-19 14:23:05 -0800207}