blob: a85f7bb3aed4bdfc3163d032b8ba32ba13db2ddf [file] [log] [blame]
Jonathan Hart2b5ceec2017-12-04 13:57:19 -08001/*
2 * Copyright 2016-present Open Networking Foundation
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 */
16
17package org.opencord.cordconfig;
18
19import com.google.common.collect.ImmutableSet;
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.event.ListenerRegistry;
27import org.onosproject.net.DeviceId;
28import org.onosproject.net.config.ConfigFactory;
29import org.onosproject.net.config.NetworkConfigEvent;
30import org.onosproject.net.config.NetworkConfigListener;
31import org.onosproject.net.config.NetworkConfigRegistry;
32import org.onosproject.net.config.basics.SubjectFactories;
33import org.opencord.cordconfig.access.AccessAgentConfig;
34import org.opencord.cordconfig.access.AccessAgentData;
35import org.opencord.cordconfig.access.AccessDeviceConfig;
36import org.opencord.cordconfig.access.AccessDeviceData;
37import org.slf4j.Logger;
38import org.slf4j.LoggerFactory;
39
40import java.util.Map;
41import java.util.Optional;
42import java.util.Set;
43import java.util.concurrent.ConcurrentHashMap;
44
45import static com.google.common.base.Preconditions.checkNotNull;
46
47/**
48 * Manages the common CORD configuration.
49 */
50@Service
51@Component(immediate = true)
52public class CordConfigManager extends ListenerRegistry<CordConfigEvent, CordConfigListener>
53 implements CordConfigService {
54 private static Logger log = LoggerFactory.getLogger(CordConfigManager.class);
55
56 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
57 protected NetworkConfigRegistry networkConfig;
58
59 private Map<DeviceId, AccessDeviceData> accessDevices = new ConcurrentHashMap<>();
60 private Map<DeviceId, AccessAgentData> accessAgents = new ConcurrentHashMap<>();
61
62 private static final Class<AccessDeviceConfig> ACCESS_DEVICE_CONFIG_CLASS =
63 AccessDeviceConfig.class;
64 private static final String ACCESS_DEVICE_CONFIG_KEY = "accessDevice";
65
66 private ConfigFactory<DeviceId, AccessDeviceConfig> deviceConfigFactory =
67 new ConfigFactory<DeviceId, AccessDeviceConfig>(
68 SubjectFactories.DEVICE_SUBJECT_FACTORY,
69 ACCESS_DEVICE_CONFIG_CLASS, ACCESS_DEVICE_CONFIG_KEY) {
70 @Override
71 public AccessDeviceConfig createConfig() {
72 return new AccessDeviceConfig();
73 }
74 };
75
76 private static final Class<AccessAgentConfig> ACCESS_AGENT_CONFIG_CLASS =
77 AccessAgentConfig.class;
78 private static final String ACCESS_AGENT_CONFIG_KEY = "accessAgent";
79
80 private ConfigFactory<DeviceId, AccessAgentConfig> agentConfigFactory =
81 new ConfigFactory<DeviceId, AccessAgentConfig>(
82 SubjectFactories.DEVICE_SUBJECT_FACTORY,
83 ACCESS_AGENT_CONFIG_CLASS, ACCESS_AGENT_CONFIG_KEY) {
84 @Override
85 public AccessAgentConfig createConfig() {
86 return new AccessAgentConfig();
87 }
88 };
89
90 private InternalNetworkConfigListener configListener =
91 new InternalNetworkConfigListener();
92
93 @Activate
94 protected void activate() {
95 networkConfig.registerConfigFactory(deviceConfigFactory);
96 networkConfig.registerConfigFactory(agentConfigFactory);
97
98 networkConfig.addListener(configListener);
99
100 networkConfig.getSubjects(DeviceId.class, AccessDeviceConfig.class)
101 .forEach(this::addAccessDeviceConfig);
102
103 networkConfig.getSubjects(DeviceId.class, AccessAgentConfig.class)
104 .forEach(this::addAccessAgentConfig);
105 }
106
107 @Deactivate
108 protected void deactivate() {
109 networkConfig.unregisterConfigFactory(deviceConfigFactory);
110 networkConfig.unregisterConfigFactory(agentConfigFactory);
111 }
112
113 private void addAccessDeviceConfig(DeviceId subject) {
114 AccessDeviceConfig config =
115 networkConfig.getConfig(subject, ACCESS_DEVICE_CONFIG_CLASS);
116 if (config != null) {
117 addAccessDevice(config);
118 }
119 }
120
121 private void addAccessDevice(AccessDeviceConfig config) {
122 AccessDeviceData accessDevice = config.getAccessDevice();
123 accessDevices.put(accessDevice.deviceId(), accessDevice);
124 process(new CordConfigEvent(CordConfigEvent.Type.ACCESS_DEVICE_ADDED, accessDevice));
125 }
126
127 private void updateAccessDevice(AccessDeviceConfig config, AccessDeviceConfig prevConfig) {
128 AccessDeviceData prevAccessDevice = prevConfig.getAccessDevice();
129 accessDevices.remove(prevConfig.subject());
130 AccessDeviceData accessDevice = config.getAccessDevice();
131 accessDevices.put(accessDevice.deviceId(), accessDevice);
132 process(new CordConfigEvent(CordConfigEvent.Type.ACCESS_DEVICE_UPDATED, accessDevice, prevAccessDevice));
133 }
134
135 private void removeAccessDevice(AccessDeviceConfig prevConfig) {
136 AccessDeviceData prevAccessDevice = prevConfig.getAccessDevice();
137 accessDevices.remove(prevConfig.subject());
138 process(new CordConfigEvent(CordConfigEvent.Type.ACCESS_DEVICE_REMOVED, prevAccessDevice));
139 }
140
141 private void addAccessAgentConfig(DeviceId subject) {
142 AccessAgentConfig config =
143 networkConfig.getConfig(subject, ACCESS_AGENT_CONFIG_CLASS);
144 if (config != null) {
145 addAccessAgent(config);
146 }
147 }
148
149 private void addAccessAgent(AccessAgentConfig config) {
150 AccessAgentData accessAgent = config.getAgent();
151 accessAgents.put(accessAgent.deviceId(), accessAgent);
152 process(new CordConfigEvent(CordConfigEvent.Type.ACCESS_AGENT_ADDED, accessAgent, null));
153 }
154
155 private void updateAccessAgent(AccessAgentConfig config, AccessAgentConfig prevConfig) {
156 AccessAgentData prevAccessAgent = prevConfig.getAgent();
157 accessAgents.remove(prevConfig.subject());
158 AccessAgentData accessAgent = config.getAgent();
159 accessAgents.put(accessAgent.deviceId(), accessAgent);
160 process(new CordConfigEvent(CordConfigEvent.Type.ACCESS_AGENT_UPDATED, accessAgent, prevAccessAgent));
161 }
162
163 private void removeAccessAgent(AccessAgentConfig prevConfig) {
164 AccessAgentData prevAccessAgent = prevConfig.getAgent();
165 accessAgents.remove(prevConfig.subject());
166 process(new CordConfigEvent(CordConfigEvent.Type.ACCESS_AGENT_REMOVED, null, prevAccessAgent));
167 }
168
169 @Override
170 public Set<AccessDeviceData> getAccessDevices() {
171 return ImmutableSet.copyOf(accessDevices.values());
172 }
173
174 @Override
175 public Optional<AccessDeviceData> getAccessDevice(DeviceId deviceId) {
176 checkNotNull(deviceId, "Device ID cannot be null");
177 return Optional.ofNullable(accessDevices.get(deviceId));
178 }
179
180 @Override
181 public Set<AccessAgentData> getAccessAgents() {
182 return ImmutableSet.copyOf(accessAgents.values());
183 }
184
185 @Override
186 public Optional<AccessAgentData> getAccessAgent(DeviceId deviceId) {
187 checkNotNull(deviceId, "Device ID cannot be null");
188 return Optional.ofNullable(accessAgents.get(deviceId));
189 }
190
191 private class InternalNetworkConfigListener implements NetworkConfigListener {
192 @Override
193 public void event(NetworkConfigEvent event) {
194 if (event.configClass().equals(ACCESS_DEVICE_CONFIG_CLASS)) {
195 AccessDeviceConfig config = (AccessDeviceConfig) event.config().orElse(null);
196 AccessDeviceConfig prevConfig = (AccessDeviceConfig) event.prevConfig().orElse(null);
197 switch (event.type()) {
198 case CONFIG_ADDED:
199 addAccessDevice(config);
200 break;
201 case CONFIG_UPDATED:
202 updateAccessDevice(config, prevConfig);
203 break;
204 case CONFIG_REMOVED:
205 removeAccessDevice(prevConfig);
206 break;
207 default:
208 break;
209 }
210 } else if (event.configClass().equals(ACCESS_AGENT_CONFIG_CLASS)) {
211 AccessAgentConfig config = (AccessAgentConfig) event.config().orElse(null);
212 AccessAgentConfig prevConfig = (AccessAgentConfig) event.prevConfig().orElse(null);
213 switch (event.type()) {
214 case CONFIG_ADDED:
215 addAccessAgent(config);
216 break;
217 case CONFIG_UPDATED:
218 updateAccessAgent(config, prevConfig);
219 break;
220 case CONFIG_REMOVED:
221 removeAccessAgent(prevConfig);
222 break;
223 default:
224 break;
225 }
226 }
227 }
228 }
229}