blob: 6aa6bf3e359e9fc65fd65715c1c95a32c47a69fb [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
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053018import org.onlab.util.KryoNamespace;
Mahesh Poojary Sa1075a92015-11-29 15:53:56 +053019import org.onosproject.event.AbstractListenerManager;
Phaneendra Manda8db7d092016-06-04 00:17:24 +053020import org.onosproject.net.DeviceId;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053021import org.onosproject.store.serializers.KryoNamespaces;
22import org.onosproject.store.service.EventuallyConsistentMap;
Bharat saraswala3f51b52015-12-11 01:09:02 +053023import org.onosproject.store.service.EventuallyConsistentMapEvent;
24import org.onosproject.store.service.EventuallyConsistentMapListener;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053025import org.onosproject.store.service.MultiValuedTimestamp;
26import org.onosproject.store.service.StorageService;
27import org.onosproject.store.service.WallClockTimestamp;
Phaneendra Manda8db7d092016-06-04 00:17:24 +053028import org.onosproject.vtnrsc.DefaultPortChain;
29import org.onosproject.vtnrsc.FiveTuple;
30import org.onosproject.vtnrsc.FlowClassifierId;
31import org.onosproject.vtnrsc.LoadBalanceId;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053032import org.onosproject.vtnrsc.PortChain;
33import org.onosproject.vtnrsc.PortChainId;
Phaneendra Manda8db7d092016-06-04 00:17:24 +053034import org.onosproject.vtnrsc.PortPairGroupId;
35import org.onosproject.vtnrsc.PortPairId;
36import org.onosproject.vtnrsc.TenantId;
Mahesh Poojary Sa1075a92015-11-29 15:53:56 +053037import org.onosproject.vtnrsc.portchain.PortChainEvent;
38import org.onosproject.vtnrsc.portchain.PortChainListener;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053039import org.onosproject.vtnrsc.portchain.PortChainService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070040import org.osgi.service.component.annotations.Activate;
41import org.osgi.service.component.annotations.Component;
42import org.osgi.service.component.annotations.Deactivate;
43import org.osgi.service.component.annotations.Reference;
44import org.osgi.service.component.annotations.ReferenceCardinality;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053045import org.slf4j.Logger;
46
Ray Milkeyd84f89b2018-08-17 14:54:17 -070047import java.util.Collections;
48import java.util.UUID;
49
50import static com.google.common.base.Preconditions.checkNotNull;
51import static org.slf4j.LoggerFactory.getLogger;
52
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053053/**
54 * Provides implementation of the portChainService.
55 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070056@Component(immediate = true, service = PortChainService.class)
Mahesh Poojary Sa1075a92015-11-29 15:53:56 +053057public class PortChainManager extends AbstractListenerManager<PortChainEvent, PortChainListener> implements
58 PortChainService {
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053059
60 private static final String PORT_CHAIN_ID_NULL = "PortChain ID cannot be null";
61 private static final String PORT_CHAIN_NULL = "PortChain cannot be null";
Bharat saraswala3f51b52015-12-11 01:09:02 +053062 private static final String EVENT_NOT_NULL = "event cannot be null";
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053063
Mahesh Poojary Sa1075a92015-11-29 15:53:56 +053064 private final Logger log = getLogger(getClass());
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053065 private EventuallyConsistentMap<PortChainId, PortChain> portChainStore;
66
Bharat saraswala3f51b52015-12-11 01:09:02 +053067 private EventuallyConsistentMapListener<PortChainId, PortChain> portChainListener =
68 new InnerPortChainStoreListener();
69
Ray Milkeyd84f89b2018-08-17 14:54:17 -070070 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053071 protected StorageService storageService;
72
73 @Activate
74 public void activate() {
75
Bharat saraswala3f51b52015-12-11 01:09:02 +053076 eventDispatcher.addSink(PortChainEvent.class, listenerRegistry);
77
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053078 KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
79 .register(KryoNamespaces.API)
80 .register(MultiValuedTimestamp.class)
Phaneendra Manda8db7d092016-06-04 00:17:24 +053081 .register(PortChain.class, PortChainId.class, UUID.class, PortPairGroupId.class,
82 FlowClassifierId.class, FiveTuple.class, LoadBalanceId.class, DeviceId.class,
83 DefaultPortChain.class, PortPairId.class, TenantId.class);
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053084
85 portChainStore = storageService
86 .<PortChainId, PortChain>eventuallyConsistentMapBuilder()
87 .withName("portchainstore").withSerializer(serializer)
88 .withTimestampProvider((k, v) -> new WallClockTimestamp()).build();
89
Bharat saraswala3f51b52015-12-11 01:09:02 +053090 portChainStore.addListener(portChainListener);
91
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053092 log.info("Started");
93 }
94
95 @Deactivate
96 public void deactivate() {
Bharat saraswala3f51b52015-12-11 01:09:02 +053097 eventDispatcher.removeSink(PortChainEvent.class);
Phaneendra Mandab212bc92016-07-08 16:50:11 +053098 portChainStore.removeListener(portChainListener);
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +053099 portChainStore.destroy();
100 log.info("Stopped");
101 }
102
103 @Override
104 public boolean exists(PortChainId portChainId) {
105 checkNotNull(portChainId, PORT_CHAIN_ID_NULL);
106 return portChainStore.containsKey(portChainId);
107 }
108
109 @Override
110 public int getPortChainCount() {
111 return portChainStore.size();
112 }
113
114 @Override
115 public Iterable<PortChain> getPortChains() {
116 return Collections.unmodifiableCollection(portChainStore.values());
117 }
118
119 @Override
120 public PortChain getPortChain(PortChainId portChainId) {
121 checkNotNull(portChainId, PORT_CHAIN_ID_NULL);
122 return portChainStore.get(portChainId);
123 }
124
125 @Override
126 public boolean createPortChain(PortChain portChain) {
127 checkNotNull(portChain, PORT_CHAIN_NULL);
128
129 portChainStore.put(portChain.portChainId(), portChain);
130 if (!portChainStore.containsKey(portChain.portChainId())) {
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530131 log.error("The portChain created is failed which identifier was {}", portChain.portChainId()
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530132 .toString());
133 return false;
134 }
135 return true;
136 }
137
138 @Override
139 public boolean updatePortChain(PortChain portChain) {
140 checkNotNull(portChain, PORT_CHAIN_NULL);
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530141 PortChain oldPortChain = null;
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530142 if (!portChainStore.containsKey(portChain.portChainId())) {
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530143 log.warn("The portChain is not exist whose identifier was {} ",
144 portChain.portChainId().toString());
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530145 return false;
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530146 } else {
147 oldPortChain = portChainStore.get(portChain.portChainId());
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530148 }
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530149 PortChain newPortChain = DefaultPortChain.create(portChain, oldPortChain);
150 portChainStore.put(newPortChain.portChainId(), newPortChain);
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530151
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530152 if (!newPortChain.equals(portChainStore.get(newPortChain.portChainId()))) {
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530153 log.debug("The portChain is updated failed whose identifier was {} ",
Phaneendra Manda8db7d092016-06-04 00:17:24 +0530154 newPortChain.portChainId().toString());
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530155 return false;
156 }
157 return true;
158 }
159
160 @Override
161 public boolean removePortChain(PortChainId portChainId) {
162 checkNotNull(portChainId, PORT_CHAIN_NULL);
163
164 portChainStore.remove(portChainId);
165 if (portChainStore.containsKey(portChainId)) {
166 log.debug("The portChain is removed failed whose identifier was {}",
167 portChainId.toString());
168 return false;
169 }
170 return true;
171 }
Bharat saraswala3f51b52015-12-11 01:09:02 +0530172
173 private class InnerPortChainStoreListener
174 implements
175 EventuallyConsistentMapListener<PortChainId, PortChain> {
176
177 @Override
178 public void event(EventuallyConsistentMapEvent<PortChainId, PortChain> event) {
179 checkNotNull(event, EVENT_NOT_NULL);
180 PortChain portChain = event.value();
181 if (EventuallyConsistentMapEvent.Type.PUT == event.type()) {
182 notifyListeners(new PortChainEvent(
183 PortChainEvent.Type.PORT_CHAIN_PUT,
184 portChain));
185 }
186 if (EventuallyConsistentMapEvent.Type.REMOVE == event.type()) {
187 notifyListeners(new PortChainEvent(
188 PortChainEvent.Type.PORT_CHAIN_DELETE,
189 portChain));
190 }
191 }
192 }
193
194 /**
195 * Notifies specify event to all listeners.
196 *
197 * @param event port chain event
198 */
199 private void notifyListeners(PortChainEvent event) {
200 checkNotNull(event, EVENT_NOT_NULL);
201 post(event);
202 }
Phaneendra Mandaf5c14e62015-10-29 19:29:52 +0530203}