blob: 1e5b8d94069ae5d1359457c13cd681a4cc859b36 [file] [log] [blame]
Jordan Halterman980a8c12017-09-22 18:01:19 -07001/*
Thomas Vachuskab6d31672018-07-27 17:03:46 -07002 * Copyright 2018-present Open Networking Foundation
Jordan Halterman980a8c12017-09-22 18:01:19 -07003 *
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 */
Thomas Vachuskab6d31672018-07-27 17:03:46 -070016package org.onosproject.store.atomix.primitives.impl;
Jordan Halterman980a8c12017-09-22 18:01:19 -070017
Jordan Halterman00e92da2018-05-22 23:05:52 -070018import io.atomix.core.Atomix;
19import io.atomix.primitive.partition.PartitionGroup;
Jordan Halterman28183ee2017-10-17 17:29:10 -070020import org.onosproject.cluster.ClusterService;
Jordan Halterman980a8c12017-09-22 18:01:19 -070021import org.onosproject.cluster.ControllerNode;
slowr878625f2017-10-24 14:53:49 -070022import org.onosproject.cluster.NodeId;
Jordan Halterman980a8c12017-09-22 18:01:19 -070023import org.onosproject.persistence.PersistenceService;
Thomas Vachuskab6d31672018-07-27 17:03:46 -070024import org.onosproject.store.atomix.impl.AtomixManager;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070025import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
Jordan Halterman980a8c12017-09-22 18:01:19 -070026import org.onosproject.store.service.AsyncConsistentMultimap;
27import org.onosproject.store.service.AsyncConsistentTreeMap;
28import org.onosproject.store.service.AsyncDocumentTree;
29import org.onosproject.store.service.AtomicCounterBuilder;
30import org.onosproject.store.service.AtomicCounterMapBuilder;
31import org.onosproject.store.service.AtomicIdGeneratorBuilder;
32import org.onosproject.store.service.AtomicValueBuilder;
33import org.onosproject.store.service.ConsistentMapBuilder;
34import org.onosproject.store.service.ConsistentMultimapBuilder;
35import org.onosproject.store.service.ConsistentTreeMapBuilder;
36import org.onosproject.store.service.CoordinationService;
37import org.onosproject.store.service.DistributedSetBuilder;
38import org.onosproject.store.service.DocumentTreeBuilder;
39import org.onosproject.store.service.EventuallyConsistentMapBuilder;
40import org.onosproject.store.service.LeaderElectorBuilder;
41import org.onosproject.store.service.Serializer;
42import org.onosproject.store.service.Topic;
Jordan Halterman400bbe52018-04-05 23:07:47 -070043import org.onosproject.store.service.TopicBuilder;
Jordan Halterman980a8c12017-09-22 18:01:19 -070044import org.onosproject.store.service.TransactionContextBuilder;
45import org.onosproject.store.service.WorkQueue;
Jordan Halterman00e92da2018-05-22 23:05:52 -070046import org.onosproject.store.service.WorkQueueBuilder;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070047import org.osgi.service.component.annotations.Activate;
48import org.osgi.service.component.annotations.Component;
49import org.osgi.service.component.annotations.Deactivate;
50import org.osgi.service.component.annotations.Reference;
51import org.osgi.service.component.annotations.ReferenceCardinality;
Jordan Halterman980a8c12017-09-22 18:01:19 -070052import org.slf4j.Logger;
53
Ray Milkeyd84f89b2018-08-17 14:54:17 -070054import java.util.List;
55import java.util.function.Supplier;
56import java.util.stream.Collectors;
57
Jordan Halterman980a8c12017-09-22 18:01:19 -070058import static org.onosproject.security.AppGuard.checkPermission;
59import static org.onosproject.security.AppPermission.Type.STORAGE_WRITE;
60import static org.slf4j.LoggerFactory.getLogger;
61
62/**
Jordan Halterman00e92da2018-05-22 23:05:52 -070063 * Implementation of {@code CoordinationService} that uses the Atomix management partition group.
Jordan Halterman980a8c12017-09-22 18:01:19 -070064 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070065@Component(immediate = true, service = CoordinationService.class)
Jordan Halterman980a8c12017-09-22 18:01:19 -070066public class CoordinationManager implements CoordinationService {
67
68 private final Logger log = getLogger(getClass());
69
Ray Milkeyd84f89b2018-08-17 14:54:17 -070070 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jordan Halterman28183ee2017-10-17 17:29:10 -070071 protected ClusterService clusterService;
Jordan Halterman980a8c12017-09-22 18:01:19 -070072
Ray Milkeyd84f89b2018-08-17 14:54:17 -070073 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jordan Halterman28183ee2017-10-17 17:29:10 -070074 protected ClusterCommunicationService clusterCommunicator;
Jordan Halterman980a8c12017-09-22 18:01:19 -070075
Ray Milkeyd84f89b2018-08-17 14:54:17 -070076 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jordan Halterman980a8c12017-09-22 18:01:19 -070077 protected PersistenceService persistenceService;
78
Ray Milkeyd84f89b2018-08-17 14:54:17 -070079 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jordan Halterman00e92da2018-05-22 23:05:52 -070080 protected AtomixManager atomixManager;
81
82 private Atomix atomix;
83 private PartitionGroup group;
Jordan Halterman980a8c12017-09-22 18:01:19 -070084
85 @Activate
86 public void activate() {
Jordan Halterman00e92da2018-05-22 23:05:52 -070087 atomix = atomixManager.getAtomix();
88 group = atomix.getPartitionService().getSystemPartitionGroup();
Jordan Halterman980a8c12017-09-22 18:01:19 -070089 log.info("Started");
90 }
91
92 @Deactivate
93 public void deactivate() {
94 log.info("Stopped");
95 }
96
97 @Override
98 public <K, V> EventuallyConsistentMapBuilder<K, V> eventuallyConsistentMapBuilder() {
99 checkPermission(STORAGE_WRITE);
slowr878625f2017-10-24 14:53:49 -0700100 final NodeId localNodeId = clusterService.getLocalNode().id();
101
102 Supplier<List<NodeId>> peersSupplier = () -> clusterService.getNodes().stream()
Jordan Halterman00e92da2018-05-22 23:05:52 -0700103 .map(ControllerNode::id)
104 .filter(nodeId -> !nodeId.equals(localNodeId))
105 .filter(id -> clusterService.getState(id).isActive())
106 .collect(Collectors.toList());
slowr878625f2017-10-24 14:53:49 -0700107
108 Supplier<List<NodeId>> bootstrapPeersSupplier = () -> clusterService.getNodes()
Jordan Halterman00e92da2018-05-22 23:05:52 -0700109 .stream()
110 .map(ControllerNode::id)
111 .filter(id -> !localNodeId.equals(id))
112 .filter(id -> clusterService.getState(id).isActive())
113 .collect(Collectors.toList());
slowr878625f2017-10-24 14:53:49 -0700114
115 return new EventuallyConsistentMapBuilderImpl<>(
Jordan Halterman00e92da2018-05-22 23:05:52 -0700116 localNodeId,
117 clusterCommunicator,
118 persistenceService,
119 peersSupplier,
120 bootstrapPeersSupplier
slowr878625f2017-10-24 14:53:49 -0700121 );
Jordan Halterman980a8c12017-09-22 18:01:19 -0700122 }
123
124 @Override
125 public <K, V> ConsistentMapBuilder<K, V> consistentMapBuilder() {
126 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700127 return new AtomixConsistentMapBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700128 }
129
130 @Override
131 public <V> DocumentTreeBuilder<V> documentTreeBuilder() {
132 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700133 return new AtomixDocumentTreeBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700134 }
135
136 @Override
137 public <V> ConsistentTreeMapBuilder<V> consistentTreeMapBuilder() {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700138 return new AtomixConsistentTreeMapBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700139 }
140
141 @Override
142 public <K, V> ConsistentMultimapBuilder<K, V> consistentMultimapBuilder() {
143 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700144 return new AtomixConsistentMultimapBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700145 }
146
147 @Override
148 public <K> AtomicCounterMapBuilder<K> atomicCounterMapBuilder() {
149 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700150 return new AtomixAtomicCounterMapBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700151 }
152
153 @Override
154 public <E> DistributedSetBuilder<E> setBuilder() {
155 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700156 return new AtomixDistributedSetBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700157 }
158
159 @Override
160 public AtomicCounterBuilder atomicCounterBuilder() {
161 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700162 return new AtomixAtomicCounterBuilder(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700163 }
164
165 @Override
166 public AtomicIdGeneratorBuilder atomicIdGeneratorBuilder() {
167 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700168 return new AtomixAtomicIdGeneratorBuilder(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700169 }
170
171 @Override
172 public <V> AtomicValueBuilder<V> atomicValueBuilder() {
173 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700174 return new AtomixAtomicValueBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700175 }
176
177 @Override
178 public TransactionContextBuilder transactionContextBuilder() {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700179 checkPermission(STORAGE_WRITE);
180 return new AtomixTransactionContextBuilder(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700181 }
182
183 @Override
184 public LeaderElectorBuilder leaderElectorBuilder() {
185 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700186 return new AtomixLeaderElectorBuilder(atomix, group.name(), clusterService.getLocalNode().id());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700187 }
188
189 @Override
Jordan Halterman400bbe52018-04-05 23:07:47 -0700190 public <T> TopicBuilder<T> topicBuilder() {
191 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700192 return new AtomixDistributedTopicBuilder<>(atomix, group.name());
193 }
194
195 @Override
196 public <E> WorkQueueBuilder<E> workQueueBuilder() {
197 checkPermission(STORAGE_WRITE);
198 return new AtomixWorkQueueBuilder<>(atomix, group.name());
Jordan Halterman400bbe52018-04-05 23:07:47 -0700199 }
200
201 @Override
Jordan Halterman980a8c12017-09-22 18:01:19 -0700202 public <E> WorkQueue<E> getWorkQueue(String name, Serializer serializer) {
203 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700204 return this.<E>workQueueBuilder()
205 .withName(name)
206 .withSerializer(serializer)
207 .build();
Jordan Halterman980a8c12017-09-22 18:01:19 -0700208 }
209
210 @Override
211 public <V> AsyncDocumentTree<V> getDocumentTree(String name, Serializer serializer) {
212 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700213 return this.<V>documentTreeBuilder()
214 .withName(name)
215 .withSerializer(serializer)
216 .build();
Jordan Halterman980a8c12017-09-22 18:01:19 -0700217 }
218
219 @Override
Jordan Halterman00e92da2018-05-22 23:05:52 -0700220 public <K, V> AsyncConsistentMultimap<K, V> getAsyncSetMultimap(String name, Serializer serializer) {
Jordan Halterman980a8c12017-09-22 18:01:19 -0700221 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700222 return this.<K, V>consistentMultimapBuilder()
223 .withName(name)
224 .withSerializer(serializer)
225 .buildMultimap();
Jordan Halterman980a8c12017-09-22 18:01:19 -0700226 }
227
228 @Override
Jordan Halterman00e92da2018-05-22 23:05:52 -0700229 public <V> AsyncConsistentTreeMap<V> getAsyncTreeMap(String name, Serializer serializer) {
Jordan Halterman980a8c12017-09-22 18:01:19 -0700230 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700231 return this.<V>consistentTreeMapBuilder()
232 .withName(name)
233 .withSerializer(serializer)
234 .buildTreeMap();
Jordan Halterman980a8c12017-09-22 18:01:19 -0700235 }
236
237 @Override
238 public <T> Topic<T> getTopic(String name, Serializer serializer) {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700239 checkPermission(STORAGE_WRITE);
240 return this.<T>topicBuilder()
241 .withName(name)
242 .withSerializer(serializer)
243 .build();
Jordan Halterman980a8c12017-09-22 18:01:19 -0700244 }
245}