blob: b6e01c88b975c12aecc75a71aafab8566c8d8a42 [file] [log] [blame]
Jian Li75642312017-01-19 14:23:05 -08001/*
2 * Copyright 2017-present Open Networking Laboratory
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.mapping.impl;
17
Jian Li2dc9f002017-03-03 04:26:31 +090018import com.google.common.collect.Iterables;
19import com.google.common.collect.Sets;
20import org.apache.felix.scr.annotations.Activate;
21import org.apache.felix.scr.annotations.Component;
22import org.apache.felix.scr.annotations.Deactivate;
23import org.apache.felix.scr.annotations.Reference;
24import org.apache.felix.scr.annotations.ReferenceCardinality;
25import org.apache.felix.scr.annotations.Service;
26import org.onosproject.core.ApplicationId;
Jian Licdd1bfd2017-03-12 22:42:56 +090027import org.onosproject.mapping.MappingAdminService;
Jian Li2dc9f002017-03-03 04:26:31 +090028import org.onosproject.mapping.MappingEntry;
29import org.onosproject.mapping.MappingEvent;
Jian Li791dd322017-04-20 00:15:56 +090030import org.onosproject.mapping.MappingKey;
Jian Li95edb592017-01-29 08:42:07 +090031import org.onosproject.mapping.MappingListener;
Jian Li2dc9f002017-03-03 04:26:31 +090032import org.onosproject.mapping.MappingProvider;
33import org.onosproject.mapping.MappingProviderRegistry;
34import org.onosproject.mapping.MappingProviderService;
Jian Li75642312017-01-19 14:23:05 -080035import org.onosproject.mapping.MappingService;
Jian Li2dc9f002017-03-03 04:26:31 +090036import org.onosproject.mapping.MappingStore;
37import org.onosproject.mapping.MappingStore.Type;
38import org.onosproject.mapping.MappingStoreDelegate;
Jian Li791dd322017-04-20 00:15:56 +090039import org.onosproject.mapping.MappingValue;
Jian Li2dc9f002017-03-03 04:26:31 +090040import org.onosproject.net.Device;
41import org.onosproject.net.DeviceId;
42import org.onosproject.net.device.DeviceService;
43import org.onosproject.net.provider.AbstractListenerProviderRegistry;
44import org.onosproject.net.provider.AbstractProviderService;
45import org.slf4j.Logger;
46
47import java.util.Set;
48
49import static org.slf4j.LoggerFactory.getLogger;
Jian Li75642312017-01-19 14:23:05 -080050
51/**
52 * Implementation of mapping management service.
53 */
Jian Li2dc9f002017-03-03 04:26:31 +090054@Component(immediate = true)
55@Service
56public class MappingManager
57 extends AbstractListenerProviderRegistry<MappingEvent, MappingListener,
58 MappingProvider, MappingProviderService>
Jian Licdd1bfd2017-03-12 22:42:56 +090059 implements MappingService, MappingAdminService, MappingProviderRegistry {
Jian Li95edb592017-01-29 08:42:07 +090060
Jian Li2dc9f002017-03-03 04:26:31 +090061 private final Logger log = getLogger(getClass());
62
63 private static final String MAPPING_OP_TOPIC = "mapping-ops-ids";
64 private final MappingStoreDelegate delegate = new InternalStoreDelegate();
65
66 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
67 protected MappingStore store;
68
69 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
70 protected DeviceService deviceService;
71
72 @Activate
73 public void activate() {
74 store.setDelegate(delegate);
75 eventDispatcher.addSink(MappingEvent.class, listenerRegistry);
76 log.info("Started");
77 }
78
79 @Deactivate
80 public void deactivate() {
81 store.unsetDelegate(delegate);
82 eventDispatcher.removeSink(MappingEvent.class);
83 log.info("Stopped");
Jian Li95edb592017-01-29 08:42:07 +090084 }
85
86 @Override
Jian Li2dc9f002017-03-03 04:26:31 +090087 public int getMappingCount(Type type) {
88 return store.getMappingCount(type);
89 }
Jian Li95edb592017-01-29 08:42:07 +090090
Jian Li2dc9f002017-03-03 04:26:31 +090091 @Override
Jian Lic87b23b2017-04-24 15:28:10 +090092 public Iterable<MappingEntry> getAllMappingEntries(Type type) {
93 return store.getAllMappingEntries(type);
94 }
95
96 @Override
Jian Li2dc9f002017-03-03 04:26:31 +090097 public void storeMappingEntry(Type type, MappingEntry entry) {
98 store.storeMapping(type, entry);
99 }
100
101 @Override
102 public Iterable<MappingEntry> getMappingEntries(Type type, DeviceId deviceId) {
103 return store.getMappingEntries(type, deviceId);
104 }
105
106 @Override
Jian Li9552f172017-04-20 00:19:56 +0900107 public Iterable<MappingEntry> getMappingEntriesByAppId(Type type, ApplicationId appId) {
Jian Li2dc9f002017-03-03 04:26:31 +0900108
109 Set<MappingEntry> mappingEntries = Sets.newHashSet();
110 for (Device d : deviceService.getDevices()) {
111 for (MappingEntry mappingEntry : store.getMappingEntries(type, d.id())) {
112 if (mappingEntry.appId() == appId.id()) {
113 mappingEntries.add(mappingEntry);
114 }
115 }
116 }
117 return mappingEntries;
118 }
119
120 @Override
121 public void removeMappingEntries(Type type, MappingEntry... mappingEntries) {
122 for (MappingEntry entry : mappingEntries) {
123 store.removeMapping(type, entry);
124 }
125 }
126
127 @Override
128 public void removeMappingEntriesByAppId(Type type, ApplicationId appId) {
129 removeMappingEntries(type, Iterables.toArray(
Jian Li9552f172017-04-20 00:19:56 +0900130 getMappingEntriesByAppId(type, appId), MappingEntry.class));
Jian Li2dc9f002017-03-03 04:26:31 +0900131 }
132
133 @Override
134 public void purgeMappings(Type type, DeviceId deviceId) {
135 store.purgeMappingEntry(type, deviceId);
136 }
137
138 @Override
139 protected MappingProviderService createProviderService(MappingProvider provider) {
140 return new InternalMappingProviderService(provider);
141 }
142
143 /**
Jian Li791dd322017-04-20 00:15:56 +0900144 * Obtains a mapping value associated a mapping key.
145 *
146 * @param mappingKey a given mapping key
147 * @return a mapping value
148 */
149 private MappingValue getMappingValueByMappingKey(MappingKey mappingKey) {
150 for (MappingEntry entry : store.getAllMappingEntries(Type.MAP_DATABASE)) {
151 if (entry.key().equals(mappingKey)) {
152 return entry.value();
153 }
154 }
155 return null;
156 }
157
158 /**
Jian Li2dc9f002017-03-03 04:26:31 +0900159 * Store delegate.
160 */
161 private class InternalStoreDelegate implements MappingStoreDelegate {
162
163 @Override
164 public void notify(MappingEvent event) {
165 post(event);
166 }
167 }
168
169 /**
170 * Internal mapping provider service.
171 */
172 private class InternalMappingProviderService
173 extends AbstractProviderService<MappingProvider> implements MappingProviderService {
174
175 /**
176 * Initializes internal mapping provider service.
177 *
178 * @param provider mapping provider
179 */
180 protected InternalMappingProviderService(MappingProvider provider) {
181 super(provider);
182 }
183
184 @Override
185 public void mappingAdded(MappingEntry mappingEntry, Type type) {
186 storeMappingEntry(type, mappingEntry);
187 }
Jian Li791dd322017-04-20 00:15:56 +0900188
189 @Override
190 public MappingValue mappingQueried(MappingKey mappingKey) {
191 return getMappingValueByMappingKey(mappingKey);
192 }
Jian Li95edb592017-01-29 08:42:07 +0900193 }
Jian Li75642312017-01-19 14:23:05 -0800194}