blob: 964a56a12da060e9ae635052063ed3c601c5c242 [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 com.google.common.net.InternetDomainName;
19import org.apache.commons.lang3.tuple.ImmutablePair;
20import org.apache.felix.scr.annotations.Activate;
21import org.apache.felix.scr.annotations.Component;
22import org.apache.felix.scr.annotations.Reference;
23import org.apache.felix.scr.annotations.ReferenceCardinality;
24import org.apache.felix.scr.annotations.Service;
25import org.onlab.packet.MacAddress;
26import org.onlab.util.Identifier;
27import org.onlab.util.KryoNamespace;
28import org.onosproject.incubator.net.l2monitoring.cfm.DefaultComponent;
29import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMaintenanceAssociation;
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.MaId2Octet;
34import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
35import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdIccY1731;
36import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdPrimaryVid;
37import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdRfc2685VpnId;
38import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
39import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
40import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
41import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdDomainName;
42import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdMacUint;
43import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdNone;
44import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
45import org.onosproject.incubator.net.l2monitoring.cfm.service.MdEvent;
46import org.onosproject.incubator.net.l2monitoring.cfm.service.MdStore;
47import org.onosproject.incubator.net.l2monitoring.cfm.service.MdStoreDelegate;
48import org.onosproject.store.serializers.KryoNamespaces;
49import org.onosproject.store.AbstractStore;
50import org.onosproject.store.service.ConsistentMap;
51import org.onosproject.store.service.MapEvent;
52import org.onosproject.store.service.MapEventListener;
53import org.onosproject.store.service.Serializer;
54import org.onosproject.store.service.StorageService;
55import org.slf4j.Logger;
56import org.slf4j.LoggerFactory;
57
58import java.util.Collection;
59import java.util.Map;
60import java.util.Optional;
61
62/**
63 * Maintenance Domain Store implementation backed by consistent map.
64 */
65@Component(immediate = true)
66@Service
67public class DistributedMdStore extends AbstractStore<MdEvent, MdStoreDelegate>
68 implements MdStore {
69
70 private final Logger log = LoggerFactory.getLogger(getClass());
71
72 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
73 protected StorageService storageService;
74
75 private ConsistentMap<MdId, MaintenanceDomain> maintenanceDomainConsistentMap;
76 private Map<MdId, MaintenanceDomain> maintenanceDomainMap;
77
78 private final InternalMdListener listener = new InternalMdListener();
79
80 @Activate
81 public void activate() {
82 maintenanceDomainConsistentMap = storageService
83 .<MdId, MaintenanceDomain>consistentMapBuilder()
84 .withName("onos-cfm-ma-map")
85 .withSerializer(Serializer.using(new KryoNamespace.Builder()
86 .register(KryoNamespaces.API)
87 .register(DefaultMaintenanceDomain.class)
88 .register(MdIdCharStr.class)
89 .register(MdIdDomainName.class)
90 .register(MdIdMacUint.class)
91 .register(MdIdNone.class)
92 .register(MaintenanceDomain.MdLevel.class)
93 .register(DefaultMaintenanceAssociation.class)
94 .register(MaIdCharStr.class)
95 .register(MaIdShort.class)
96 .register(MaId2Octet.class)
97 .register(MaIdIccY1731.class)
98 .register(MaIdPrimaryVid.class)
99 .register(MaIdRfc2685VpnId.class)
100 .register(MaintenanceAssociation.CcmInterval.class)
101 .register(DefaultComponent.class)
102 .register(MepId.class)
103 .register(Identifier.class)
104 .register(InternetDomainName.class)
105 .register(MacAddress.class)
106 .register(ImmutablePair.class)
107 .register(org.onosproject.incubator.net.l2monitoring
108 .cfm.Component.MhfCreationType.class)
109 .register(org.onosproject.incubator.net.l2monitoring
110 .cfm.Component.IdPermissionType.class)
111 .register(org.onosproject.incubator.net.l2monitoring
112 .cfm.Component.TagType.class)
113 .build("md")))
114 .build();
115
116 maintenanceDomainMap = maintenanceDomainConsistentMap.asJavaMap();
117 }
118
119 @Override
120 public Collection<MaintenanceDomain> getAllMaintenanceDomain() {
121 return maintenanceDomainMap.values();
122 }
123
124 @Override
125 public Optional<MaintenanceDomain> getMaintenanceDomain(MdId mdName) {
126 return Optional.ofNullable(
127 maintenanceDomainMap.get(mdName));
128 }
129
130 @Override
131 public boolean deleteMaintenanceDomain(MdId mdName) {
132 return maintenanceDomainMap.remove(mdName) == null ? false : true;
133 }
134
135 @Override
136 public boolean createUpdateMaintenanceDomain(MaintenanceDomain md) {
137 return maintenanceDomainMap.put(md.mdId(), md) == null ? false : true;
138 }
139
140 private class InternalMdListener implements MapEventListener<MdId, MaintenanceDomain> {
141 @Override
142 public void event(MapEvent<MdId, MaintenanceDomain> mapEvent) {
143 final MdEvent.Type type;
144 switch (mapEvent.type()) {
145 case INSERT:
146 type = MdEvent.Type.MD_ADDED;
147 break;
148 case UPDATE:
149 type = MdEvent.Type.MD_UPDATED;
150 break;
151 case REMOVE:
152 default:
153 type = MdEvent.Type.MD_REMOVED;
154 break;
155 }
156 notifyDelegate(new MdEvent(type, mapEvent.key()));
157 }
158 }
159}