blob: e10a03cfbefa39eb6823c5c71c7a52ffa9f451de [file] [log] [blame]
Madan Jampani15b8ef52016-02-02 17:35:05 -08001/*
Thomas Vachuskab6d31672018-07-27 17:03:46 -07002 * Copyright 2018-present Open Networking Foundation
Madan Jampani15b8ef52016-02-02 17:35:05 -08003 *
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 */
16
Thomas Vachuskab6d31672018-07-27 17:03:46 -070017package org.onosproject.store.atomix.primitives.impl;
Madan Jampani15b8ef52016-02-02 17:35:05 -080018
Jordan Halterman00e92da2018-05-22 23:05:52 -070019import io.atomix.cluster.MemberId;
20import io.atomix.primitive.partition.PartitionGroup;
21import io.atomix.protocols.raft.MultiRaftProtocol;
Madan Jampani15b8ef52016-02-02 17:35:05 -080022import org.onosproject.cluster.NodeId;
23import org.onosproject.cluster.PartitionId;
24import org.onosproject.event.AbstractListenerManager;
Thomas Vachuskab6d31672018-07-27 17:03:46 -070025import org.onosproject.store.atomix.impl.AtomixManager;
Madan Jampani15b8ef52016-02-02 17:35:05 -080026import org.onosproject.store.primitives.DistributedPrimitiveCreator;
27import org.onosproject.store.primitives.PartitionAdminService;
28import org.onosproject.store.primitives.PartitionEvent;
29import org.onosproject.store.primitives.PartitionEventListener;
30import org.onosproject.store.primitives.PartitionService;
Madan Jampaniccdf9da2016-05-05 14:37:27 -070031import org.onosproject.store.service.PartitionClientInfo;
Madan Jampanie14a09c2016-02-11 10:43:21 -080032import org.onosproject.store.service.PartitionInfo;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070033import org.osgi.service.component.annotations.Activate;
34import org.osgi.service.component.annotations.Component;
35import org.osgi.service.component.annotations.Deactivate;
36import org.osgi.service.component.annotations.Reference;
37import org.osgi.service.component.annotations.ReferenceCardinality;
Madan Jampani15b8ef52016-02-02 17:35:05 -080038import org.slf4j.Logger;
39
Ray Milkeyd84f89b2018-08-17 14:54:17 -070040import java.util.List;
41import java.util.Set;
42import java.util.stream.Collectors;
43
Heedo Kang4a47a302016-02-29 17:40:23 +090044import static org.onosproject.security.AppGuard.checkPermission;
45import static org.onosproject.security.AppPermission.Type.PARTITION_READ;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070046import static org.slf4j.LoggerFactory.getLogger;
Heedo Kang4a47a302016-02-29 17:40:23 +090047
Madan Jampani15b8ef52016-02-02 17:35:05 -080048/**
49 * Implementation of {@code PartitionService} and {@code PartitionAdminService}.
50 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070051@Component(service = { PartitionService.class, PartitionAdminService.class })
Madan Jampani15b8ef52016-02-02 17:35:05 -080052public class PartitionManager extends AbstractListenerManager<PartitionEvent, PartitionEventListener>
53 implements PartitionService, PartitionAdminService {
54
55 private final Logger log = getLogger(getClass());
56
Ray Milkeyd84f89b2018-08-17 14:54:17 -070057 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jordan Halterman00e92da2018-05-22 23:05:52 -070058 protected AtomixManager atomixManager;
Madan Jampani15b8ef52016-02-02 17:35:05 -080059
Jordan Halterman00e92da2018-05-22 23:05:52 -070060 private PartitionGroup partitionGroup;
Madan Jampani15b8ef52016-02-02 17:35:05 -080061
62 @Activate
63 public void activate() {
Jordan Halterman00e92da2018-05-22 23:05:52 -070064 partitionGroup = atomixManager.getAtomix().getPartitionService().getPartitionGroup(MultiRaftProtocol.TYPE);
Madan Jampani15b8ef52016-02-02 17:35:05 -080065 eventDispatcher.addSink(PartitionEvent.class, listenerRegistry);
Madan Jampani15b8ef52016-02-02 17:35:05 -080066 log.info("Started");
67 }
68
Madan Jampani86cb2432016-02-17 11:07:56 -080069 @Deactivate
Madan Jampani15b8ef52016-02-02 17:35:05 -080070 public void deactivate() {
71 eventDispatcher.removeSink(PartitionEvent.class);
Madan Jampani15b8ef52016-02-02 17:35:05 -080072 log.info("Stopped");
73 }
74
75 @Override
Madan Jampani15b8ef52016-02-02 17:35:05 -080076 public int getNumberOfPartitions() {
Heedo Kang4a47a302016-02-29 17:40:23 +090077 checkPermission(PARTITION_READ);
Jordan Halterman00e92da2018-05-22 23:05:52 -070078 return partitionGroup.getPartitions().size();
Madan Jampani15b8ef52016-02-02 17:35:05 -080079 }
80
81 @Override
82 public Set<PartitionId> getAllPartitionIds() {
Heedo Kang4a47a302016-02-29 17:40:23 +090083 checkPermission(PARTITION_READ);
Jordan Halterman00e92da2018-05-22 23:05:52 -070084 return partitionGroup.getPartitionIds().stream()
85 .map(partitionId -> PartitionId.from(partitionId.id()))
86 .collect(Collectors.toSet());
Madan Jampani15b8ef52016-02-02 17:35:05 -080087 }
88
89 @Override
90 public DistributedPrimitiveCreator getDistributedPrimitiveCreator(PartitionId partitionId) {
Heedo Kang4a47a302016-02-29 17:40:23 +090091 checkPermission(PARTITION_READ);
Jordan Halterman00e92da2018-05-22 23:05:52 -070092 throw new UnsupportedOperationException();
Madan Jampani15b8ef52016-02-02 17:35:05 -080093 }
94
95 @Override
96 public Set<NodeId> getConfiguredMembers(PartitionId partitionId) {
Heedo Kang4a47a302016-02-29 17:40:23 +090097 checkPermission(PARTITION_READ);
Jordan Halterman00e92da2018-05-22 23:05:52 -070098 io.atomix.primitive.partition.PartitionId atomixPartitionId =
99 io.atomix.primitive.partition.PartitionId.from(partitionGroup.name(), partitionId.id());
100 return partitionGroup.getPartition(atomixPartitionId).members()
101 .stream()
102 .map(member -> NodeId.nodeId(member.id()))
103 .collect(Collectors.toSet());
Madan Jampani15b8ef52016-02-02 17:35:05 -0800104 }
105
106 @Override
107 public Set<NodeId> getActiveMembersMembers(PartitionId partitionId) {
Heedo Kang4a47a302016-02-29 17:40:23 +0900108 checkPermission(PARTITION_READ);
Madan Jampani15b8ef52016-02-02 17:35:05 -0800109 // TODO: This needs to query metadata to determine currently active
110 // members of partition
111 return getConfiguredMembers(partitionId);
112 }
Madan Jampanie14a09c2016-02-11 10:43:21 -0800113
114 @Override
115 public List<PartitionInfo> partitionInfo() {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700116 checkPermission(PARTITION_READ);
117 return partitionGroup.getPartitions()
118 .stream()
119 .map(partition -> {
120 MemberId primary = partition.primary();
121 return new PartitionInfo(
122 PartitionId.from(partition.id().id()),
123 partition.term(),
124 partition.members().stream().map(member -> member.id()).collect(Collectors.toList()),
125 primary != null ? primary.id() : null);
126 })
127 .collect(Collectors.toList());
Madan Jampani33547452016-02-29 16:45:04 -0800128 }
Madan Jampaniccdf9da2016-05-05 14:37:27 -0700129
130 @Override
131 public List<PartitionClientInfo> partitionClientInfo() {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700132 checkPermission(PARTITION_READ);
133 return partitionGroup.getPartitions()
134 .stream()
135 .map(partition -> new PartitionClientInfo(
136 PartitionId.from(partition.id().id()),
137 partition.members().stream()
138 .map(member -> NodeId.nodeId(member.id()))
139 .collect(Collectors.toList())))
140 .collect(Collectors.toList());
Madan Jampaniccdf9da2016-05-05 14:37:27 -0700141 }
Madan Jampani2f9cc712016-02-15 19:36:21 -0800142}