blob: b18d2f6764af7f82a754cd6801e89de2bc354c75 [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);
Sean Condon0e89bda2017-03-21 14:23:19 +000068 eventDispatcher.addSink(MdEvent.class, listenerRegistry);
69 store.setDelegate(delegate);
Sean Condon0e89bda2017-03-21 14:23:19 +000070 log.info("CFM Service Started");
71 }
72
73 @Deactivate
74 public void deactivate() {
75 eventDispatcher.removeSink(MdEvent.class);
76 store.unsetDelegate(delegate);
77 log.info("CFM Service Stopped");
78 }
79
80 @Override
81 public Collection<MaintenanceDomain> getAllMaintenanceDomain() {
82 log.debug("Retrieving all MDs from distributed store");
83 return store.getAllMaintenanceDomain();
84 }
85
86 @Override
87 public Optional<MaintenanceDomain> getMaintenanceDomain(MdId mdName) {
88 log.debug("Retrieving MD {} from distributed store", mdName);
89 return store.getMaintenanceDomain(mdName);
90 }
91
92 @Override
93 public boolean deleteMaintenanceDomain(MdId mdName) throws CfmConfigException {
94 log.info("Deleting MD {} from distributed store", mdName);
95 return store.deleteMaintenanceDomain(mdName);
96 }
97
98 @Override
99 public Collection<MaintenanceAssociation> getAllMaintenanceAssociation(MdId mdName) {
100 log.debug("Retrieving all MA of MD {} from distributed store", mdName);
101 return store.getMaintenanceDomain(mdName)
102 .orElseThrow(() -> new IllegalArgumentException("Unknown MD " + mdName))
103 .maintenanceAssociationList();
104 }
105
106 @Override
107 public Optional<MaintenanceAssociation> getMaintenanceAssociation(
108 MdId mdName, MaIdShort maName) {
109 log.debug("Retrieving MA {} of MD {} from distributed store", maName, mdName);
110 return store.getMaintenanceDomain(mdName)
111 .orElseThrow(() -> new IllegalArgumentException("Unknown MD " + mdName))
112 .maintenanceAssociationList()
113 .stream().filter(ma -> ma.maId().equals(maName))
114 .findFirst();
115 }
116
117 @Override
118 public boolean deleteMaintenanceAssociation(MdId mdName, MaIdShort maName) throws CfmConfigException {
119 log.info("Deleting MA {} of MD {} from distributed store", maName, mdName);
120 MaintenanceDomain.MdBuilder builder = DefaultMaintenanceDomain
121 .builder(store.getMaintenanceDomain(mdName)
122 .orElseThrow(() -> new IllegalArgumentException("Unknown MD: " + mdName)));
123
124 //Check the MA is present
125 if (!builder.checkMaExists(maName)) {
126 return false;
127 }
128
129 builder = builder.deleteFromMaList(maName);
130
131 store.createUpdateMaintenanceDomain(builder.build());
132 return true;
133 }
134
135 @Override
136 public boolean createMaintenanceDomain(MaintenanceDomain newMd) throws CfmConfigException {
137 log.info("Creating/Updating MD {} in distributed store", newMd.mdId());
138 return store.createUpdateMaintenanceDomain(newMd);
139 }
140
141 @Override
142 public boolean createMaintenanceAssociation(MdId mdName, MaintenanceAssociation newMa)
143 throws CfmConfigException {
144 log.info("Updating MD {} in distributed store by adding new MA {}", mdName, newMa.maId());
145 MaintenanceDomain.MdBuilder builder = DefaultMaintenanceDomain
146 .builder(store.getMaintenanceDomain(mdName)
147 .orElseThrow(() -> new IllegalArgumentException("Unknown MD: " + mdName)));
148
149 boolean replaced = false;
150 //Check the MA is present
151 if (builder.checkMaExists(newMa.maId())) {
152 builder = builder.deleteFromMaList(newMa.maId());
153 replaced = true;
154 }
155
156 builder.addToMaList(newMa);
157 store.createUpdateMaintenanceDomain(builder.build());
158 return replaced;
159 }
160
161 private class InternalStoreDelegate implements MdStoreDelegate {
162 @Override
163 public void notify(MdEvent event) {
Sean Condon96b896d2017-12-11 12:44:29 -0800164 log.debug("New MD event: {}", event);
Sean Condon0e89bda2017-03-21 14:23:19 +0000165 eventDispatcher.post(event);
166 }
167 }
Sean Condon0e89bda2017-03-21 14:23:19 +0000168}