blob: 5deb8d0265653075a18f27a35146f2fec2eb7531 [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
Madan Jampanie14a09c2016-02-11 10:43:21 -080019import java.util.List;
Madan Jampani15b8ef52016-02-02 17:35:05 -080020import java.util.Set;
Madan Jampanie14a09c2016-02-11 10:43:21 -080021import java.util.stream.Collectors;
Madan Jampani15b8ef52016-02-02 17:35:05 -080022
Jordan Halterman00e92da2018-05-22 23:05:52 -070023import io.atomix.cluster.MemberId;
24import io.atomix.primitive.partition.PartitionGroup;
25import io.atomix.protocols.raft.MultiRaftProtocol;
Madan Jampani15b8ef52016-02-02 17:35:05 -080026import org.apache.felix.scr.annotations.Activate;
27import org.apache.felix.scr.annotations.Component;
Madan Jampani86cb2432016-02-17 11:07:56 -080028import org.apache.felix.scr.annotations.Deactivate;
Madan Jampani15b8ef52016-02-02 17:35:05 -080029import org.apache.felix.scr.annotations.Reference;
30import org.apache.felix.scr.annotations.ReferenceCardinality;
31import org.apache.felix.scr.annotations.Service;
Madan Jampani15b8ef52016-02-02 17:35:05 -080032import org.onosproject.cluster.NodeId;
33import org.onosproject.cluster.PartitionId;
34import org.onosproject.event.AbstractListenerManager;
Thomas Vachuskab6d31672018-07-27 17:03:46 -070035import org.onosproject.store.atomix.impl.AtomixManager;
Madan Jampani15b8ef52016-02-02 17:35:05 -080036import org.onosproject.store.primitives.DistributedPrimitiveCreator;
37import org.onosproject.store.primitives.PartitionAdminService;
38import org.onosproject.store.primitives.PartitionEvent;
39import org.onosproject.store.primitives.PartitionEventListener;
40import org.onosproject.store.primitives.PartitionService;
Madan Jampaniccdf9da2016-05-05 14:37:27 -070041import org.onosproject.store.service.PartitionClientInfo;
Madan Jampanie14a09c2016-02-11 10:43:21 -080042import org.onosproject.store.service.PartitionInfo;
Madan Jampani15b8ef52016-02-02 17:35:05 -080043import org.slf4j.Logger;
44
Heedo Kang4a47a302016-02-29 17:40:23 +090045import static org.onosproject.security.AppGuard.checkPermission;
46import static org.onosproject.security.AppPermission.Type.PARTITION_READ;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070047import static org.slf4j.LoggerFactory.getLogger;
Heedo Kang4a47a302016-02-29 17:40:23 +090048
Madan Jampani15b8ef52016-02-02 17:35:05 -080049/**
50 * Implementation of {@code PartitionService} and {@code PartitionAdminService}.
51 */
52@Component
53@Service
54public class PartitionManager extends AbstractListenerManager<PartitionEvent, PartitionEventListener>
55 implements PartitionService, PartitionAdminService {
56
57 private final Logger log = getLogger(getClass());
58
59 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jordan Halterman00e92da2018-05-22 23:05:52 -070060 protected AtomixManager atomixManager;
Madan Jampani15b8ef52016-02-02 17:35:05 -080061
Jordan Halterman00e92da2018-05-22 23:05:52 -070062 private PartitionGroup partitionGroup;
Madan Jampani15b8ef52016-02-02 17:35:05 -080063
64 @Activate
65 public void activate() {
Jordan Halterman00e92da2018-05-22 23:05:52 -070066 partitionGroup = atomixManager.getAtomix().getPartitionService().getPartitionGroup(MultiRaftProtocol.TYPE);
Madan Jampani15b8ef52016-02-02 17:35:05 -080067 eventDispatcher.addSink(PartitionEvent.class, listenerRegistry);
Madan Jampani15b8ef52016-02-02 17:35:05 -080068 log.info("Started");
69 }
70
Madan Jampani86cb2432016-02-17 11:07:56 -080071 @Deactivate
Madan Jampani15b8ef52016-02-02 17:35:05 -080072 public void deactivate() {
73 eventDispatcher.removeSink(PartitionEvent.class);
Madan Jampani15b8ef52016-02-02 17:35:05 -080074 log.info("Stopped");
75 }
76
77 @Override
Madan Jampani15b8ef52016-02-02 17:35:05 -080078 public int getNumberOfPartitions() {
Heedo Kang4a47a302016-02-29 17:40:23 +090079 checkPermission(PARTITION_READ);
Jordan Halterman00e92da2018-05-22 23:05:52 -070080 return partitionGroup.getPartitions().size();
Madan Jampani15b8ef52016-02-02 17:35:05 -080081 }
82
83 @Override
84 public Set<PartitionId> getAllPartitionIds() {
Heedo Kang4a47a302016-02-29 17:40:23 +090085 checkPermission(PARTITION_READ);
Jordan Halterman00e92da2018-05-22 23:05:52 -070086 return partitionGroup.getPartitionIds().stream()
87 .map(partitionId -> PartitionId.from(partitionId.id()))
88 .collect(Collectors.toSet());
Madan Jampani15b8ef52016-02-02 17:35:05 -080089 }
90
91 @Override
92 public DistributedPrimitiveCreator getDistributedPrimitiveCreator(PartitionId partitionId) {
Heedo Kang4a47a302016-02-29 17:40:23 +090093 checkPermission(PARTITION_READ);
Jordan Halterman00e92da2018-05-22 23:05:52 -070094 throw new UnsupportedOperationException();
Madan Jampani15b8ef52016-02-02 17:35:05 -080095 }
96
97 @Override
98 public Set<NodeId> getConfiguredMembers(PartitionId partitionId) {
Heedo Kang4a47a302016-02-29 17:40:23 +090099 checkPermission(PARTITION_READ);
Jordan Halterman00e92da2018-05-22 23:05:52 -0700100 io.atomix.primitive.partition.PartitionId atomixPartitionId =
101 io.atomix.primitive.partition.PartitionId.from(partitionGroup.name(), partitionId.id());
102 return partitionGroup.getPartition(atomixPartitionId).members()
103 .stream()
104 .map(member -> NodeId.nodeId(member.id()))
105 .collect(Collectors.toSet());
Madan Jampani15b8ef52016-02-02 17:35:05 -0800106 }
107
108 @Override
109 public Set<NodeId> getActiveMembersMembers(PartitionId partitionId) {
Heedo Kang4a47a302016-02-29 17:40:23 +0900110 checkPermission(PARTITION_READ);
Madan Jampani15b8ef52016-02-02 17:35:05 -0800111 // TODO: This needs to query metadata to determine currently active
112 // members of partition
113 return getConfiguredMembers(partitionId);
114 }
Madan Jampanie14a09c2016-02-11 10:43:21 -0800115
116 @Override
117 public List<PartitionInfo> partitionInfo() {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700118 checkPermission(PARTITION_READ);
119 return partitionGroup.getPartitions()
120 .stream()
121 .map(partition -> {
122 MemberId primary = partition.primary();
123 return new PartitionInfo(
124 PartitionId.from(partition.id().id()),
125 partition.term(),
126 partition.members().stream().map(member -> member.id()).collect(Collectors.toList()),
127 primary != null ? primary.id() : null);
128 })
129 .collect(Collectors.toList());
Madan Jampani33547452016-02-29 16:45:04 -0800130 }
Madan Jampaniccdf9da2016-05-05 14:37:27 -0700131
132 @Override
133 public List<PartitionClientInfo> partitionClientInfo() {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700134 checkPermission(PARTITION_READ);
135 return partitionGroup.getPartitions()
136 .stream()
137 .map(partition -> new PartitionClientInfo(
138 PartitionId.from(partition.id().id()),
139 partition.members().stream()
140 .map(member -> NodeId.nodeId(member.id()))
141 .collect(Collectors.toList())))
142 .collect(Collectors.toList());
Madan Jampaniccdf9da2016-05-05 14:37:27 -0700143 }
Madan Jampani2f9cc712016-02-15 19:36:21 -0800144}