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