blob: 289bb2aa4692b6f07d6080cdd5b6bfb4f5b35d64 [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 Li95edb592017-01-29 08:42:07 +090030import org.onosproject.mapping.MappingListener;
Jian Li2dc9f002017-03-03 04:26:31 +090031import org.onosproject.mapping.MappingProvider;
32import org.onosproject.mapping.MappingProviderRegistry;
33import org.onosproject.mapping.MappingProviderService;
Jian Li75642312017-01-19 14:23:05 -080034import org.onosproject.mapping.MappingService;
Jian Li2dc9f002017-03-03 04:26:31 +090035import org.onosproject.mapping.MappingStore;
36import org.onosproject.mapping.MappingStore.Type;
37import org.onosproject.mapping.MappingStoreDelegate;
38import org.onosproject.net.Device;
39import org.onosproject.net.DeviceId;
40import org.onosproject.net.device.DeviceService;
41import org.onosproject.net.provider.AbstractListenerProviderRegistry;
42import org.onosproject.net.provider.AbstractProviderService;
43import org.slf4j.Logger;
44
45import java.util.Set;
46
47import static org.slf4j.LoggerFactory.getLogger;
Jian Li75642312017-01-19 14:23:05 -080048
49/**
50 * Implementation of mapping management service.
51 */
Jian Li2dc9f002017-03-03 04:26:31 +090052@Component(immediate = true)
53@Service
54public class MappingManager
55 extends AbstractListenerProviderRegistry<MappingEvent, MappingListener,
56 MappingProvider, MappingProviderService>
Jian Licdd1bfd2017-03-12 22:42:56 +090057 implements MappingService, MappingAdminService, MappingProviderRegistry {
Jian Li95edb592017-01-29 08:42:07 +090058
Jian Li2dc9f002017-03-03 04:26:31 +090059 private final Logger log = getLogger(getClass());
60
61 private static final String MAPPING_OP_TOPIC = "mapping-ops-ids";
62 private final MappingStoreDelegate delegate = new InternalStoreDelegate();
63
64 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
65 protected MappingStore store;
66
67 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
68 protected DeviceService deviceService;
69
70 @Activate
71 public void activate() {
72 store.setDelegate(delegate);
73 eventDispatcher.addSink(MappingEvent.class, listenerRegistry);
74 log.info("Started");
75 }
76
77 @Deactivate
78 public void deactivate() {
79 store.unsetDelegate(delegate);
80 eventDispatcher.removeSink(MappingEvent.class);
81 log.info("Stopped");
Jian Li95edb592017-01-29 08:42:07 +090082 }
83
84 @Override
Jian Li2dc9f002017-03-03 04:26:31 +090085 public int getMappingCount(Type type) {
86 return store.getMappingCount(type);
87 }
Jian Li95edb592017-01-29 08:42:07 +090088
Jian Li2dc9f002017-03-03 04:26:31 +090089 @Override
90 public void storeMappingEntry(Type type, MappingEntry entry) {
91 store.storeMapping(type, entry);
92 }
93
94 @Override
95 public Iterable<MappingEntry> getMappingEntries(Type type, DeviceId deviceId) {
96 return store.getMappingEntries(type, deviceId);
97 }
98
99 @Override
Jian Li9552f172017-04-20 00:19:56 +0900100 public Iterable<MappingEntry> getMappingEntriesByAppId(Type type, ApplicationId appId) {
Jian Li2dc9f002017-03-03 04:26:31 +0900101
102 Set<MappingEntry> mappingEntries = Sets.newHashSet();
103 for (Device d : deviceService.getDevices()) {
104 for (MappingEntry mappingEntry : store.getMappingEntries(type, d.id())) {
105 if (mappingEntry.appId() == appId.id()) {
106 mappingEntries.add(mappingEntry);
107 }
108 }
109 }
110 return mappingEntries;
111 }
112
113 @Override
114 public void removeMappingEntries(Type type, MappingEntry... mappingEntries) {
115 for (MappingEntry entry : mappingEntries) {
116 store.removeMapping(type, entry);
117 }
118 }
119
120 @Override
121 public void removeMappingEntriesByAppId(Type type, ApplicationId appId) {
122 removeMappingEntries(type, Iterables.toArray(
Jian Li9552f172017-04-20 00:19:56 +0900123 getMappingEntriesByAppId(type, appId), MappingEntry.class));
Jian Li2dc9f002017-03-03 04:26:31 +0900124 }
125
126 @Override
127 public void purgeMappings(Type type, DeviceId deviceId) {
128 store.purgeMappingEntry(type, deviceId);
129 }
130
131 @Override
132 protected MappingProviderService createProviderService(MappingProvider provider) {
133 return new InternalMappingProviderService(provider);
134 }
135
136 /**
137 * Store delegate.
138 */
139 private class InternalStoreDelegate implements MappingStoreDelegate {
140
141 @Override
142 public void notify(MappingEvent event) {
143 post(event);
144 }
145 }
146
147 /**
148 * Internal mapping provider service.
149 */
150 private class InternalMappingProviderService
151 extends AbstractProviderService<MappingProvider> implements MappingProviderService {
152
153 /**
154 * Initializes internal mapping provider service.
155 *
156 * @param provider mapping provider
157 */
158 protected InternalMappingProviderService(MappingProvider provider) {
159 super(provider);
160 }
161
162 @Override
163 public void mappingAdded(MappingEntry mappingEntry, Type type) {
164 storeMappingEntry(type, mappingEntry);
165 }
Jian Li95edb592017-01-29 08:42:07 +0900166 }
Jian Li75642312017-01-19 14:23:05 -0800167}