blob: 900b678dc0665b618d368c4ad20f4c17ad34de64 [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 java.util.List;
Jordan Halterman07f052b2017-10-08 14:22:41 -070019import java.util.function.Supplier;
20import java.util.stream.Collectors;
21
Jordan Halterman00e92da2018-05-22 23:05:52 -070022import io.atomix.core.Atomix;
23import io.atomix.primitive.partition.PartitionGroup;
Jordan Halterman980a8c12017-09-22 18:01:19 -070024import 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;
Jordan Halterman28183ee2017-10-17 17:29:10 -070030import org.onosproject.cluster.ClusterService;
Jordan Halterman980a8c12017-09-22 18:01:19 -070031import org.onosproject.cluster.ControllerNode;
slowr878625f2017-10-24 14:53:49 -070032import org.onosproject.cluster.NodeId;
Jordan Halterman980a8c12017-09-22 18:01:19 -070033import org.onosproject.persistence.PersistenceService;
Jordan Halterman28183ee2017-10-17 17:29:10 -070034import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
Thomas Vachuskab6d31672018-07-27 17:03:46 -070035import org.onosproject.store.atomix.impl.AtomixManager;
Jordan Halterman980a8c12017-09-22 18:01:19 -070036import org.onosproject.store.service.AsyncConsistentMultimap;
37import org.onosproject.store.service.AsyncConsistentTreeMap;
38import org.onosproject.store.service.AsyncDocumentTree;
39import org.onosproject.store.service.AtomicCounterBuilder;
40import org.onosproject.store.service.AtomicCounterMapBuilder;
41import org.onosproject.store.service.AtomicIdGeneratorBuilder;
42import org.onosproject.store.service.AtomicValueBuilder;
43import org.onosproject.store.service.ConsistentMapBuilder;
44import org.onosproject.store.service.ConsistentMultimapBuilder;
45import org.onosproject.store.service.ConsistentTreeMapBuilder;
46import org.onosproject.store.service.CoordinationService;
47import org.onosproject.store.service.DistributedSetBuilder;
48import org.onosproject.store.service.DocumentTreeBuilder;
49import org.onosproject.store.service.EventuallyConsistentMapBuilder;
50import org.onosproject.store.service.LeaderElectorBuilder;
51import org.onosproject.store.service.Serializer;
52import org.onosproject.store.service.Topic;
Jordan Halterman400bbe52018-04-05 23:07:47 -070053import org.onosproject.store.service.TopicBuilder;
Jordan Halterman980a8c12017-09-22 18:01:19 -070054import org.onosproject.store.service.TransactionContextBuilder;
55import org.onosproject.store.service.WorkQueue;
Jordan Halterman00e92da2018-05-22 23:05:52 -070056import org.onosproject.store.service.WorkQueueBuilder;
Jordan Halterman980a8c12017-09-22 18:01:19 -070057import org.slf4j.Logger;
58
59import static org.onosproject.security.AppGuard.checkPermission;
60import static org.onosproject.security.AppPermission.Type.STORAGE_WRITE;
61import static org.slf4j.LoggerFactory.getLogger;
62
63/**
Jordan Halterman00e92da2018-05-22 23:05:52 -070064 * Implementation of {@code CoordinationService} that uses the Atomix management partition group.
Jordan Halterman980a8c12017-09-22 18:01:19 -070065 */
66@Service
67@Component(immediate = true)
68public class CoordinationManager implements CoordinationService {
69
70 private final Logger log = getLogger(getClass());
71
72 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jordan Halterman28183ee2017-10-17 17:29:10 -070073 protected ClusterService clusterService;
Jordan Halterman980a8c12017-09-22 18:01:19 -070074
75 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jordan Halterman28183ee2017-10-17 17:29:10 -070076 protected ClusterCommunicationService clusterCommunicator;
Jordan Halterman980a8c12017-09-22 18:01:19 -070077
78 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
79 protected PersistenceService persistenceService;
80
Jordan Halterman00e92da2018-05-22 23:05:52 -070081 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
82 protected AtomixManager atomixManager;
83
84 private Atomix atomix;
85 private PartitionGroup group;
Jordan Halterman980a8c12017-09-22 18:01:19 -070086
87 @Activate
88 public void activate() {
Jordan Halterman00e92da2018-05-22 23:05:52 -070089 atomix = atomixManager.getAtomix();
90 group = atomix.getPartitionService().getSystemPartitionGroup();
Jordan Halterman980a8c12017-09-22 18:01:19 -070091 log.info("Started");
92 }
93
94 @Deactivate
95 public void deactivate() {
96 log.info("Stopped");
97 }
98
99 @Override
100 public <K, V> EventuallyConsistentMapBuilder<K, V> eventuallyConsistentMapBuilder() {
101 checkPermission(STORAGE_WRITE);
slowr878625f2017-10-24 14:53:49 -0700102 final NodeId localNodeId = clusterService.getLocalNode().id();
103
104 Supplier<List<NodeId>> peersSupplier = () -> clusterService.getNodes().stream()
Jordan Halterman00e92da2018-05-22 23:05:52 -0700105 .map(ControllerNode::id)
106 .filter(nodeId -> !nodeId.equals(localNodeId))
107 .filter(id -> clusterService.getState(id).isActive())
108 .collect(Collectors.toList());
slowr878625f2017-10-24 14:53:49 -0700109
110 Supplier<List<NodeId>> bootstrapPeersSupplier = () -> clusterService.getNodes()
Jordan Halterman00e92da2018-05-22 23:05:52 -0700111 .stream()
112 .map(ControllerNode::id)
113 .filter(id -> !localNodeId.equals(id))
114 .filter(id -> clusterService.getState(id).isActive())
115 .collect(Collectors.toList());
slowr878625f2017-10-24 14:53:49 -0700116
117 return new EventuallyConsistentMapBuilderImpl<>(
Jordan Halterman00e92da2018-05-22 23:05:52 -0700118 localNodeId,
119 clusterCommunicator,
120 persistenceService,
121 peersSupplier,
122 bootstrapPeersSupplier
slowr878625f2017-10-24 14:53:49 -0700123 );
Jordan Halterman980a8c12017-09-22 18:01:19 -0700124 }
125
126 @Override
127 public <K, V> ConsistentMapBuilder<K, V> consistentMapBuilder() {
128 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700129 return new AtomixConsistentMapBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700130 }
131
132 @Override
133 public <V> DocumentTreeBuilder<V> documentTreeBuilder() {
134 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700135 return new AtomixDocumentTreeBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700136 }
137
138 @Override
139 public <V> ConsistentTreeMapBuilder<V> consistentTreeMapBuilder() {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700140 return new AtomixConsistentTreeMapBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700141 }
142
143 @Override
144 public <K, V> ConsistentMultimapBuilder<K, V> consistentMultimapBuilder() {
145 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700146 return new AtomixConsistentMultimapBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700147 }
148
149 @Override
150 public <K> AtomicCounterMapBuilder<K> atomicCounterMapBuilder() {
151 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700152 return new AtomixAtomicCounterMapBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700153 }
154
155 @Override
156 public <E> DistributedSetBuilder<E> setBuilder() {
157 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700158 return new AtomixDistributedSetBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700159 }
160
161 @Override
162 public AtomicCounterBuilder atomicCounterBuilder() {
163 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700164 return new AtomixAtomicCounterBuilder(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700165 }
166
167 @Override
168 public AtomicIdGeneratorBuilder atomicIdGeneratorBuilder() {
169 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700170 return new AtomixAtomicIdGeneratorBuilder(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700171 }
172
173 @Override
174 public <V> AtomicValueBuilder<V> atomicValueBuilder() {
175 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700176 return new AtomixAtomicValueBuilder<>(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700177 }
178
179 @Override
180 public TransactionContextBuilder transactionContextBuilder() {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700181 checkPermission(STORAGE_WRITE);
182 return new AtomixTransactionContextBuilder(atomix, group.name());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700183 }
184
185 @Override
186 public LeaderElectorBuilder leaderElectorBuilder() {
187 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700188 return new AtomixLeaderElectorBuilder(atomix, group.name(), clusterService.getLocalNode().id());
Jordan Halterman980a8c12017-09-22 18:01:19 -0700189 }
190
191 @Override
Jordan Halterman400bbe52018-04-05 23:07:47 -0700192 public <T> TopicBuilder<T> topicBuilder() {
193 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700194 return new AtomixDistributedTopicBuilder<>(atomix, group.name());
195 }
196
197 @Override
198 public <E> WorkQueueBuilder<E> workQueueBuilder() {
199 checkPermission(STORAGE_WRITE);
200 return new AtomixWorkQueueBuilder<>(atomix, group.name());
Jordan Halterman400bbe52018-04-05 23:07:47 -0700201 }
202
203 @Override
Jordan Halterman980a8c12017-09-22 18:01:19 -0700204 public <E> WorkQueue<E> getWorkQueue(String name, Serializer serializer) {
205 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700206 return this.<E>workQueueBuilder()
207 .withName(name)
208 .withSerializer(serializer)
209 .build();
Jordan Halterman980a8c12017-09-22 18:01:19 -0700210 }
211
212 @Override
213 public <V> AsyncDocumentTree<V> getDocumentTree(String name, Serializer serializer) {
214 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700215 return this.<V>documentTreeBuilder()
216 .withName(name)
217 .withSerializer(serializer)
218 .build();
Jordan Halterman980a8c12017-09-22 18:01:19 -0700219 }
220
221 @Override
Jordan Halterman00e92da2018-05-22 23:05:52 -0700222 public <K, V> AsyncConsistentMultimap<K, V> getAsyncSetMultimap(String name, Serializer serializer) {
Jordan Halterman980a8c12017-09-22 18:01:19 -0700223 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700224 return this.<K, V>consistentMultimapBuilder()
225 .withName(name)
226 .withSerializer(serializer)
227 .buildMultimap();
Jordan Halterman980a8c12017-09-22 18:01:19 -0700228 }
229
230 @Override
Jordan Halterman00e92da2018-05-22 23:05:52 -0700231 public <V> AsyncConsistentTreeMap<V> getAsyncTreeMap(String name, Serializer serializer) {
Jordan Halterman980a8c12017-09-22 18:01:19 -0700232 checkPermission(STORAGE_WRITE);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700233 return this.<V>consistentTreeMapBuilder()
234 .withName(name)
235 .withSerializer(serializer)
236 .buildTreeMap();
Jordan Halterman980a8c12017-09-22 18:01:19 -0700237 }
238
239 @Override
240 public <T> Topic<T> getTopic(String name, Serializer serializer) {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700241 checkPermission(STORAGE_WRITE);
242 return this.<T>topicBuilder()
243 .withName(name)
244 .withSerializer(serializer)
245 .build();
Jordan Halterman980a8c12017-09-22 18:01:19 -0700246 }
247}