blob: 0bbca3bca4b25225a0a049cf08ca4baec2ec714a [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;
22import org.apache.felix.scr.annotations.Activate;
23import org.apache.felix.scr.annotations.Component;
24import org.apache.felix.scr.annotations.Deactivate;
25import org.apache.felix.scr.annotations.Reference;
26import org.apache.felix.scr.annotations.ReferenceCardinality;
27import org.apache.felix.scr.annotations.Service;
28import org.onosproject.core.ApplicationId;
Jian Licdd1bfd2017-03-12 22:42:56 +090029import org.onosproject.mapping.MappingAdminService;
Jian Li2dc9f002017-03-03 04:26:31 +090030import org.onosproject.mapping.MappingEntry;
31import org.onosproject.mapping.MappingEvent;
Jian Li791dd322017-04-20 00:15:56 +090032import org.onosproject.mapping.MappingKey;
Jian Li95edb592017-01-29 08:42:07 +090033import org.onosproject.mapping.MappingListener;
Jian Li2dc9f002017-03-03 04:26:31 +090034import org.onosproject.mapping.MappingProvider;
35import org.onosproject.mapping.MappingProviderRegistry;
36import org.onosproject.mapping.MappingProviderService;
Jian Li75642312017-01-19 14:23:05 -080037import org.onosproject.mapping.MappingService;
Jian Li2dc9f002017-03-03 04:26:31 +090038import org.onosproject.mapping.MappingStore;
39import org.onosproject.mapping.MappingStore.Type;
40import org.onosproject.mapping.MappingStoreDelegate;
Jian Li791dd322017-04-20 00:15:56 +090041import org.onosproject.mapping.MappingValue;
Jian Li2dc9f002017-03-03 04:26:31 +090042import org.onosproject.net.Device;
43import org.onosproject.net.DeviceId;
44import org.onosproject.net.device.DeviceService;
45import org.onosproject.net.provider.AbstractListenerProviderRegistry;
46import org.onosproject.net.provider.AbstractProviderService;
47import org.slf4j.Logger;
48
Jian Li38bb1092017-05-01 15:04:32 +090049import java.util.List;
Jian Li2dc9f002017-03-03 04:26:31 +090050import java.util.Set;
51
52import static org.slf4j.LoggerFactory.getLogger;
Jian Li75642312017-01-19 14:23:05 -080053
54/**
55 * Implementation of mapping management service.
56 */
Jian Li2dc9f002017-03-03 04:26:31 +090057@Component(immediate = true)
58@Service
59public class MappingManager
60 extends AbstractListenerProviderRegistry<MappingEvent, MappingListener,
61 MappingProvider, MappingProviderService>
Jian Licdd1bfd2017-03-12 22:42:56 +090062 implements MappingService, MappingAdminService, MappingProviderRegistry {
Jian Li95edb592017-01-29 08:42:07 +090063
Jian Li2dc9f002017-03-03 04:26:31 +090064 private final Logger log = getLogger(getClass());
65
66 private static final String MAPPING_OP_TOPIC = "mapping-ops-ids";
67 private final MappingStoreDelegate delegate = new InternalStoreDelegate();
68
69 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
70 protected MappingStore store;
71
72 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
73 protected DeviceService deviceService;
74
75 @Activate
76 public void activate() {
77 store.setDelegate(delegate);
78 eventDispatcher.addSink(MappingEvent.class, listenerRegistry);
79 log.info("Started");
80 }
81
82 @Deactivate
83 public void deactivate() {
84 store.unsetDelegate(delegate);
85 eventDispatcher.removeSink(MappingEvent.class);
86 log.info("Stopped");
Jian Li95edb592017-01-29 08:42:07 +090087 }
88
89 @Override
Jian Li2dc9f002017-03-03 04:26:31 +090090 public int getMappingCount(Type type) {
91 return store.getMappingCount(type);
92 }
Jian Li95edb592017-01-29 08:42:07 +090093
Jian Li2dc9f002017-03-03 04:26:31 +090094 @Override
Jian Lic87b23b2017-04-24 15:28:10 +090095 public Iterable<MappingEntry> getAllMappingEntries(Type type) {
96 return store.getAllMappingEntries(type);
97 }
98
99 @Override
Jian Li2dc9f002017-03-03 04:26:31 +0900100 public void storeMappingEntry(Type type, MappingEntry entry) {
101 store.storeMapping(type, entry);
102 }
103
104 @Override
105 public Iterable<MappingEntry> getMappingEntries(Type type, DeviceId deviceId) {
106 return store.getMappingEntries(type, deviceId);
107 }
108
109 @Override
Jian Li9552f172017-04-20 00:19:56 +0900110 public Iterable<MappingEntry> getMappingEntriesByAppId(Type type, ApplicationId appId) {
Jian Li2dc9f002017-03-03 04:26:31 +0900111
112 Set<MappingEntry> mappingEntries = Sets.newHashSet();
113 for (Device d : deviceService.getDevices()) {
114 for (MappingEntry mappingEntry : store.getMappingEntries(type, d.id())) {
115 if (mappingEntry.appId() == appId.id()) {
116 mappingEntries.add(mappingEntry);
117 }
118 }
119 }
120 return mappingEntries;
121 }
122
123 @Override
124 public void removeMappingEntries(Type type, MappingEntry... mappingEntries) {
125 for (MappingEntry entry : mappingEntries) {
126 store.removeMapping(type, entry);
127 }
128 }
129
130 @Override
131 public void removeMappingEntriesByAppId(Type type, ApplicationId appId) {
132 removeMappingEntries(type, Iterables.toArray(
Jian Li9552f172017-04-20 00:19:56 +0900133 getMappingEntriesByAppId(type, appId), MappingEntry.class));
Jian Li2dc9f002017-03-03 04:26:31 +0900134 }
135
136 @Override
137 public void purgeMappings(Type type, DeviceId deviceId) {
138 store.purgeMappingEntry(type, deviceId);
139 }
140
141 @Override
142 protected MappingProviderService createProviderService(MappingProvider provider) {
143 return new InternalMappingProviderService(provider);
144 }
145
146 /**
Jian Li791dd322017-04-20 00:15:56 +0900147 * Obtains a mapping value associated a mapping key.
148 *
149 * @param mappingKey a given mapping key
150 * @return a mapping value
151 */
152 private MappingValue getMappingValueByMappingKey(MappingKey mappingKey) {
153 for (MappingEntry entry : store.getAllMappingEntries(Type.MAP_DATABASE)) {
154 if (entry.key().equals(mappingKey)) {
155 return entry.value();
156 }
157 }
158 return null;
159 }
160
161 /**
Jian Li2dc9f002017-03-03 04:26:31 +0900162 * Store delegate.
163 */
164 private class InternalStoreDelegate implements MappingStoreDelegate {
165
166 @Override
167 public void notify(MappingEvent event) {
168 post(event);
169 }
170 }
171
172 /**
173 * Internal mapping provider service.
174 */
175 private class InternalMappingProviderService
176 extends AbstractProviderService<MappingProvider> implements MappingProviderService {
177
178 /**
179 * Initializes internal mapping provider service.
180 *
181 * @param provider mapping provider
182 */
183 protected InternalMappingProviderService(MappingProvider provider) {
184 super(provider);
185 }
186
187 @Override
188 public void mappingAdded(MappingEntry mappingEntry, Type type) {
189 storeMappingEntry(type, mappingEntry);
190 }
Jian Li791dd322017-04-20 00:15:56 +0900191
192 @Override
193 public MappingValue mappingQueried(MappingKey mappingKey) {
194 return getMappingValueByMappingKey(mappingKey);
195 }
Jian Li38bb1092017-05-01 15:04:32 +0900196
197 @Override
198 public List<MappingValue> mappingQueried(List<MappingKey> mappingKeys) {
199 List<MappingValue> values = Lists.newArrayList();
200 mappingKeys.forEach(key -> {
201 MappingValue value = getMappingValueByMappingKey(key);
202 if (value != null) {
203 values.add(value);
204 }
205 });
206 return ImmutableList.copyOf(values);
207 }
Jian Li95edb592017-01-29 08:42:07 +0900208 }
Jian Li75642312017-01-19 14:23:05 -0800209}