blob: 5a125f5b4cab6119ceb47341374948434a85cd01 [file] [log] [blame]
Sean Condon0e89bda2017-03-21 14:23:19 +00001/*
2 * Copyright 2017-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 */
16package org.onosproject.incubator.net.l2monitoring.cfm.impl;
17
18import java.util.Collection;
19import java.util.Optional;
20
21import org.apache.felix.scr.annotations.Activate;
22import org.apache.felix.scr.annotations.Component;
23import org.apache.felix.scr.annotations.Deactivate;
24import org.apache.felix.scr.annotations.Reference;
25import org.apache.felix.scr.annotations.ReferenceCardinality;
26import org.apache.felix.scr.annotations.Service;
27import org.onosproject.core.ApplicationId;
28import org.onosproject.core.CoreService;
29import org.onosproject.event.AbstractListenerManager;
30import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMaintenanceDomain;
31import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation;
32import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
33import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
34import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
35import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
36import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
37import org.onosproject.incubator.net.l2monitoring.cfm.service.MdEvent;
38import org.onosproject.incubator.net.l2monitoring.cfm.service.MdListener;
39import org.onosproject.incubator.net.l2monitoring.cfm.service.MdStore;
40import org.onosproject.incubator.net.l2monitoring.cfm.service.MdStoreDelegate;
41import org.slf4j.Logger;
42import org.slf4j.LoggerFactory;
43
44/**
45 * Manager of Cfm Md Service - persists Maintenance Domain in distributed store.
46 */
47@Component(immediate = true)
48@Service
49public class CfmMdManager extends AbstractListenerManager<MdEvent, MdListener>
50 implements CfmMdService {
51
52 private final Logger log = LoggerFactory.getLogger(getClass());
53 private static final String APP_ID = "org.onosproject.app.cfm";
54
55 protected ApplicationId appId;
56
57 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
58 protected CoreService coreService;
59
60 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
61 protected MdStore store;
62
63 protected final MdStoreDelegate delegate = new InternalStoreDelegate();
64
65 @Activate
66 public void activate() {
67 appId = coreService.registerApplication(APP_ID);
68
69 eventDispatcher.addSink(MdEvent.class, listenerRegistry);
70 store.setDelegate(delegate);
71
72 log.info("CFM Service Started");
73 }
74
75 @Deactivate
76 public void deactivate() {
77 eventDispatcher.removeSink(MdEvent.class);
78 store.unsetDelegate(delegate);
79 log.info("CFM Service Stopped");
80 }
81
82 @Override
83 public Collection<MaintenanceDomain> getAllMaintenanceDomain() {
84 log.debug("Retrieving all MDs from distributed store");
85 return store.getAllMaintenanceDomain();
86 }
87
88 @Override
89 public Optional<MaintenanceDomain> getMaintenanceDomain(MdId mdName) {
90 log.debug("Retrieving MD {} from distributed store", mdName);
91 return store.getMaintenanceDomain(mdName);
92 }
93
94 @Override
95 public boolean deleteMaintenanceDomain(MdId mdName) throws CfmConfigException {
96 log.info("Deleting MD {} from distributed store", mdName);
97 return store.deleteMaintenanceDomain(mdName);
98 }
99
100 @Override
101 public Collection<MaintenanceAssociation> getAllMaintenanceAssociation(MdId mdName) {
102 log.debug("Retrieving all MA of MD {} from distributed store", mdName);
103 return store.getMaintenanceDomain(mdName)
104 .orElseThrow(() -> new IllegalArgumentException("Unknown MD " + mdName))
105 .maintenanceAssociationList();
106 }
107
108 @Override
109 public Optional<MaintenanceAssociation> getMaintenanceAssociation(
110 MdId mdName, MaIdShort maName) {
111 log.debug("Retrieving MA {} of MD {} from distributed store", maName, mdName);
112 return store.getMaintenanceDomain(mdName)
113 .orElseThrow(() -> new IllegalArgumentException("Unknown MD " + mdName))
114 .maintenanceAssociationList()
115 .stream().filter(ma -> ma.maId().equals(maName))
116 .findFirst();
117 }
118
119 @Override
120 public boolean deleteMaintenanceAssociation(MdId mdName, MaIdShort maName) throws CfmConfigException {
121 log.info("Deleting MA {} of MD {} from distributed store", maName, mdName);
122 MaintenanceDomain.MdBuilder builder = DefaultMaintenanceDomain
123 .builder(store.getMaintenanceDomain(mdName)
124 .orElseThrow(() -> new IllegalArgumentException("Unknown MD: " + mdName)));
125
126 //Check the MA is present
127 if (!builder.checkMaExists(maName)) {
128 return false;
129 }
130
131 builder = builder.deleteFromMaList(maName);
132
133 store.createUpdateMaintenanceDomain(builder.build());
134 return true;
135 }
136
137 @Override
138 public boolean createMaintenanceDomain(MaintenanceDomain newMd) throws CfmConfigException {
139 log.info("Creating/Updating MD {} in distributed store", newMd.mdId());
140 return store.createUpdateMaintenanceDomain(newMd);
141 }
142
143 @Override
144 public boolean createMaintenanceAssociation(MdId mdName, MaintenanceAssociation newMa)
145 throws CfmConfigException {
146 log.info("Updating MD {} in distributed store by adding new MA {}", mdName, newMa.maId());
147 MaintenanceDomain.MdBuilder builder = DefaultMaintenanceDomain
148 .builder(store.getMaintenanceDomain(mdName)
149 .orElseThrow(() -> new IllegalArgumentException("Unknown MD: " + mdName)));
150
151 boolean replaced = false;
152 //Check the MA is present
153 if (builder.checkMaExists(newMa.maId())) {
154 builder = builder.deleteFromMaList(newMa.maId());
155 replaced = true;
156 }
157
158 builder.addToMaList(newMa);
159 store.createUpdateMaintenanceDomain(builder.build());
160 return replaced;
161 }
162
163 private class InternalStoreDelegate implements MdStoreDelegate {
164 @Override
165 public void notify(MdEvent event) {
166 log.debug("New MD event: {}", event.subject());
167 eventDispatcher.post(event);
168 }
169 }
170
171}