blob: 444ca9cb78c29026a7ce2db01d9000d5b632deb6 [file] [log] [blame]
Sean Condon96b896d2017-12-11 12:44:29 -08001/*
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
Sean Condon96b896d2017-12-11 12:44:29 -080018import org.onlab.packet.IpAddress;
19import org.onlab.packet.VlanId;
20import org.onlab.util.KryoNamespace;
21import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMep;
22import org.onosproject.incubator.net.l2monitoring.cfm.Mep;
23import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaId2Octet;
24import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
25import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdIccY1731;
26import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdPrimaryVid;
27import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdRfc2685VpnId;
28import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
29import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
30import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
31import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdDomainName;
32import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdMacUint;
33import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdNone;
34import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
35import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepKeyId;
36import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMepEvent;
37import org.onosproject.incubator.net.l2monitoring.cfm.service.MepStore;
38import org.onosproject.incubator.net.l2monitoring.cfm.service.MepStoreDelegate;
39import org.onosproject.net.DeviceId;
40import org.onosproject.net.NetworkResource;
41import org.onosproject.net.PortNumber;
42import org.onosproject.store.AbstractStore;
43import org.onosproject.store.serializers.KryoNamespaces;
44import org.onosproject.store.service.ConsistentMap;
45import org.onosproject.store.service.MapEvent;
46import org.onosproject.store.service.MapEventListener;
47import org.onosproject.store.service.Serializer;
48import org.onosproject.store.service.StorageService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070049import org.osgi.service.component.annotations.Activate;
50import org.osgi.service.component.annotations.Component;
51import org.osgi.service.component.annotations.Deactivate;
52import org.osgi.service.component.annotations.Reference;
53import org.osgi.service.component.annotations.ReferenceCardinality;
Sean Condon96b896d2017-12-11 12:44:29 -080054import org.slf4j.Logger;
55import org.slf4j.LoggerFactory;
56
57import java.time.Duration;
58import java.util.Collection;
59import java.util.Map;
60import java.util.Optional;
61import java.util.stream.Collectors;
62
63/**
64 * MEP Store implementation backed by consistent map.
65 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070066@Component(immediate = true, service = MepStore.class)
Sean Condon96b896d2017-12-11 12:44:29 -080067public class DistributedMepStore extends AbstractStore<CfmMepEvent, MepStoreDelegate>
68 implements MepStore {
69
70 private final Logger log = LoggerFactory.getLogger(getClass());
71
Ray Milkeyd84f89b2018-08-17 14:54:17 -070072 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Sean Condon96b896d2017-12-11 12:44:29 -080073 protected StorageService storageService;
74
75 private ConsistentMap<MepKeyId, Mep> mepConsistentMap;
76 private Map<MepKeyId, Mep> mepMap;
77
78 private MapEventListener<MepKeyId, Mep> mapListener = null;
79
80 @Activate
81 public void activate() {
82 mepConsistentMap = storageService
83 .<MepKeyId, Mep>consistentMapBuilder()
84 .withName("onos-cfm-mep-map")
85 .withSerializer(Serializer.using(new KryoNamespace.Builder()
86 .register(KryoNamespaces.API)
87 .register(DefaultMep.class)
88 .register(MepId.class)
89 .register(MepKeyId.class)
90 .register(NetworkResource.class)
91 .register(DeviceId.class)
92 .register(PortNumber.class)
93 .register(Mep.MepDirection.class)
94 .register(VlanId.class)
95 .register(Mep.Priority.class)
96 .register(Mep.FngAddress.class)
97 .register(Mep.FngAddressType.class)
98 .register(IpAddress.class)
99 .register(Mep.LowestFaultDefect.class)
100 .register(Duration.class)
101 .register(MdIdCharStr.class)
102 .register(MdIdDomainName.class)
103 .register(MdIdMacUint.class)
104 .register(MdIdNone.class)
105 .register(MaIdCharStr.class)
106 .register(MaIdShort.class)
107 .register(MaId2Octet.class)
108 .register(MaIdIccY1731.class)
109 .register(MaIdPrimaryVid.class)
110 .register(MaIdRfc2685VpnId.class)
111 .build("mep")))
112 .build();
113 mapListener = new InternalMepListener();
114 mepConsistentMap.addListener(mapListener);
115
116 mepMap = mepConsistentMap.asJavaMap();
117 log.info("MepStore started");
118 }
119
120 @Deactivate
121 public void deactivate() {
122 mepConsistentMap.removeListener(mapListener);
123 log.info("MepStore stopped");
124 }
125
126 @Override
127 public Collection<Mep> getAllMeps() {
128 return mepMap.values();
129 }
130
131 @Override
132 public Collection<Mep> getMepsByMd(MdId mdName) {
133 return mepMap.values().stream()
134 .filter(mep -> mep.mdId().equals(mdName))
135 .collect(Collectors.toList());
136 }
137
138 @Override
139 public Collection<Mep> getMepsByMdMa(MdId mdName, MaIdShort maName) {
140 return mepMap.values().stream()
141 .filter(mep -> mep.mdId().equals(mdName) && mep.maId().equals(maName))
142 .collect(Collectors.toList());
143 }
144
145 @Override
146 public Collection<Mep> getMepsByDeviceId(DeviceId deviceId) {
147 return mepMap.values().stream()
148 .filter(mep -> mep.deviceId().equals(deviceId))
149 .collect(Collectors.toList());
150 }
151
152 @Override
153 public Optional<Mep> getMep(MepKeyId mepKeyId) {
154 return mepMap.values().stream()
155 .filter(mep -> mep.mdId().equals(mepKeyId.mdId()) &&
156 mep.maId().equals(mepKeyId.maId()) &&
157 mep.mepId().equals(mepKeyId.mepId()))
158 .findFirst();
159 }
160
161 @Override
162 public boolean deleteMep(MepKeyId mepKeyId) {
163 return mepMap.remove(mepKeyId) == null ? false : true;
164 }
165
166 @Override
167 public boolean createUpdateMep(MepKeyId mepKeyId, Mep mep) {
168 return mepMap.put(mepKeyId, mep) == null ? false : true;
169 }
170
171 private class InternalMepListener implements MapEventListener<MepKeyId, Mep> {
172
173 @Override
174 public void event(MapEvent<MepKeyId, Mep> mapEvent) {
175 final CfmMepEvent.Type type;
176
177 switch (mapEvent.type()) {
178 case INSERT:
179 type = CfmMepEvent.Type.MEP_ADDED;
180 break;
181 case UPDATE:
182 type = CfmMepEvent.Type.MEP_UPDATED;
183 break;
184 default:
185 case REMOVE:
186 type = CfmMepEvent.Type.MEP_REMOVED;
187 }
188 notifyDelegate(new CfmMepEvent(type, mapEvent.key()));
189 }
190 }
191}