blob: f3739f6c1c00bf4829ef467962003bf51d6c35d6 [file] [log] [blame]
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +05301/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +05303 *
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.vtnrsc.portchain.impl;
17
18import static com.google.common.base.Preconditions.checkNotNull;
19import static org.slf4j.LoggerFactory.getLogger;
20
21import java.util.Collections;
Phaneendra Manda8db7d092016-06-04 00:17:24 +053022import java.util.UUID;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053023
24import org.apache.felix.scr.annotations.Activate;
25import org.apache.felix.scr.annotations.Component;
26import org.apache.felix.scr.annotations.Deactivate;
27import org.apache.felix.scr.annotations.Reference;
28import org.apache.felix.scr.annotations.ReferenceCardinality;
29import org.apache.felix.scr.annotations.Service;
30import org.onlab.util.KryoNamespace;
Mahesh Poojary Sa1075a92015-11-29 15:53:56 +053031import org.onosproject.event.AbstractListenerManager;
Phaneendra Manda8db7d092016-06-04 00:17:24 +053032import org.onosproject.net.DeviceId;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053033import org.onosproject.store.serializers.KryoNamespaces;
34import org.onosproject.store.service.EventuallyConsistentMap;
Bharat saraswala3f51b52015-12-11 01:09:02 +053035import org.onosproject.store.service.EventuallyConsistentMapEvent;
36import org.onosproject.store.service.EventuallyConsistentMapListener;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053037import org.onosproject.store.service.MultiValuedTimestamp;
38import org.onosproject.store.service.StorageService;
39import org.onosproject.store.service.WallClockTimestamp;
Phaneendra Manda8db7d092016-06-04 00:17:24 +053040import org.onosproject.vtnrsc.DefaultPortChain;
41import org.onosproject.vtnrsc.FiveTuple;
42import org.onosproject.vtnrsc.FlowClassifierId;
43import org.onosproject.vtnrsc.LoadBalanceId;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053044import org.onosproject.vtnrsc.PortChain;
45import org.onosproject.vtnrsc.PortChainId;
Phaneendra Manda8db7d092016-06-04 00:17:24 +053046import org.onosproject.vtnrsc.PortPairGroupId;
47import org.onosproject.vtnrsc.PortPairId;
48import org.onosproject.vtnrsc.TenantId;
Mahesh Poojary Sa1075a92015-11-29 15:53:56 +053049import org.onosproject.vtnrsc.portchain.PortChainEvent;
50import org.onosproject.vtnrsc.portchain.PortChainListener;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053051import org.onosproject.vtnrsc.portchain.PortChainService;
52import org.slf4j.Logger;
53
54/**
55 * Provides implementation of the portChainService.
56 */
57@Component(immediate = true)
58@Service
Mahesh Poojary Sa1075a92015-11-29 15:53:56 +053059public class PortChainManager extends AbstractListenerManager<PortChainEvent, PortChainListener> implements
60 PortChainService {
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053061
62 private static final String PORT_CHAIN_ID_NULL = "PortChain ID cannot be null";
63 private static final String PORT_CHAIN_NULL = "PortChain cannot be null";
Bharat saraswala3f51b52015-12-11 01:09:02 +053064 private static final String EVENT_NOT_NULL = "event cannot be null";
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053065
Mahesh Poojary Sa1075a92015-11-29 15:53:56 +053066 private final Logger log = getLogger(getClass());
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053067 private EventuallyConsistentMap<PortChainId, PortChain> portChainStore;
68
Bharat saraswala3f51b52015-12-11 01:09:02 +053069 private EventuallyConsistentMapListener<PortChainId, PortChain> portChainListener =
70 new InnerPortChainStoreListener();
71
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053072 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
73 protected StorageService storageService;
74
75 @Activate
76 public void activate() {
77
Bharat saraswala3f51b52015-12-11 01:09:02 +053078 eventDispatcher.addSink(PortChainEvent.class, listenerRegistry);
79
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053080 KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
81 .register(KryoNamespaces.API)
82 .register(MultiValuedTimestamp.class)
Phaneendra Manda8db7d092016-06-04 00:17:24 +053083 .register(PortChain.class, PortChainId.class, UUID.class, PortPairGroupId.class,
84 FlowClassifierId.class, FiveTuple.class, LoadBalanceId.class, DeviceId.class,
85 DefaultPortChain.class, PortPairId.class, TenantId.class);
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053086
87 portChainStore = storageService
88 .<PortChainId, PortChain>eventuallyConsistentMapBuilder()
89 .withName("portchainstore").withSerializer(serializer)
90 .withTimestampProvider((k, v) -> new WallClockTimestamp()).build();
91
Bharat saraswala3f51b52015-12-11 01:09:02 +053092 portChainStore.addListener(portChainListener);
93
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053094 log.info("Started");
95 }
96
97 @Deactivate
98 public void deactivate() {
Bharat saraswala3f51b52015-12-11 01:09:02 +053099 eventDispatcher.removeSink(PortChainEvent.class);
Phaneendra Mandab212bc92016-07-08 16:50:11 +0530100 portChainStore.removeListener(portChainListener);
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530101 portChainStore.destroy();
102 log.info("Stopped");
103 }
104
105 @Override
106 public boolean exists(PortChainId portChainId) {
107 checkNotNull(portChainId, PORT_CHAIN_ID_NULL);
108 return portChainStore.containsKey(portChainId);
109 }
110
111 @Override
112 public int getPortChainCount() {
113 return portChainStore.size();
114 }
115
116 @Override
117 public Iterable<PortChain> getPortChains() {
118 return Collections.unmodifiableCollection(portChainStore.values());
119 }
120
121 @Override
122 public PortChain getPortChain(PortChainId portChainId) {
123 checkNotNull(portChainId, PORT_CHAIN_ID_NULL);
124 return portChainStore.get(portChainId);
125 }
126
127 @Override
128 public boolean createPortChain(PortChain portChain) {
129 checkNotNull(portChain, PORT_CHAIN_NULL);
130
131 portChainStore.put(portChain.portChainId(), portChain);
132 if (!portChainStore.containsKey(portChain.portChainId())) {
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530133 log.error("The portChain created is failed which identifier was {}", portChain.portChainId()
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530134 .toString());
135 return false;
136 }
137 return true;
138 }
139
140 @Override
141 public boolean updatePortChain(PortChain portChain) {
142 checkNotNull(portChain, PORT_CHAIN_NULL);
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530143 PortChain oldPortChain = null;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530144 if (!portChainStore.containsKey(portChain.portChainId())) {
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530145 log.warn("The portChain is not exist whose identifier was {} ",
146 portChain.portChainId().toString());
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530147 return false;
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530148 } else {
149 oldPortChain = portChainStore.get(portChain.portChainId());
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530150 }
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530151 PortChain newPortChain = DefaultPortChain.create(portChain, oldPortChain);
152 portChainStore.put(newPortChain.portChainId(), newPortChain);
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530153
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530154 if (!newPortChain.equals(portChainStore.get(newPortChain.portChainId()))) {
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530155 log.debug("The portChain is updated failed whose identifier was {} ",
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530156 newPortChain.portChainId().toString());
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530157 return false;
158 }
159 return true;
160 }
161
162 @Override
163 public boolean removePortChain(PortChainId portChainId) {
164 checkNotNull(portChainId, PORT_CHAIN_NULL);
165
166 portChainStore.remove(portChainId);
167 if (portChainStore.containsKey(portChainId)) {
168 log.debug("The portChain is removed failed whose identifier was {}",
169 portChainId.toString());
170 return false;
171 }
172 return true;
173 }
Bharat saraswala3f51b52015-12-11 01:09:02 +0530174
175 private class InnerPortChainStoreListener
176 implements
177 EventuallyConsistentMapListener<PortChainId, PortChain> {
178
179 @Override
180 public void event(EventuallyConsistentMapEvent<PortChainId, PortChain> event) {
181 checkNotNull(event, EVENT_NOT_NULL);
182 PortChain portChain = event.value();
183 if (EventuallyConsistentMapEvent.Type.PUT == event.type()) {
184 notifyListeners(new PortChainEvent(
185 PortChainEvent.Type.PORT_CHAIN_PUT,
186 portChain));
187 }
188 if (EventuallyConsistentMapEvent.Type.REMOVE == event.type()) {
189 notifyListeners(new PortChainEvent(
190 PortChainEvent.Type.PORT_CHAIN_DELETE,
191 portChain));
192 }
193 }
194 }
195
196 /**
197 * Notifies specify event to all listeners.
198 *
199 * @param event port chain event
200 */
201 private void notifyListeners(PortChainEvent event) {
202 checkNotNull(event, EVENT_NOT_NULL);
203 post(event);
204 }
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530205}