blob: 0e6c11c42767ff601f3a0e46996852a437d39ad1 [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.PartitionAdminService;
27import org.onosproject.store.primitives.PartitionEvent;
28import org.onosproject.store.primitives.PartitionEventListener;
29import org.onosproject.store.primitives.PartitionService;
Madan Jampaniccdf9da2016-05-05 14:37:27 -070030import org.onosproject.store.service.PartitionClientInfo;
Madan Jampanie14a09c2016-02-11 10:43:21 -080031import org.onosproject.store.service.PartitionInfo;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070032import org.osgi.service.component.annotations.Activate;
33import org.osgi.service.component.annotations.Component;
34import org.osgi.service.component.annotations.Deactivate;
35import org.osgi.service.component.annotations.Reference;
36import org.osgi.service.component.annotations.ReferenceCardinality;
Madan Jampani15b8ef52016-02-02 17:35:05 -080037import org.slf4j.Logger;
38
Ray Milkeyd84f89b2018-08-17 14:54:17 -070039import java.util.List;
40import java.util.Set;
41import java.util.stream.Collectors;
42
Heedo Kang4a47a302016-02-29 17:40:23 +090043import static org.onosproject.security.AppGuard.checkPermission;
44import static org.onosproject.security.AppPermission.Type.PARTITION_READ;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070045import static org.slf4j.LoggerFactory.getLogger;
Heedo Kang4a47a302016-02-29 17:40:23 +090046
Madan Jampani15b8ef52016-02-02 17:35:05 -080047/**
48 * Implementation of {@code PartitionService} and {@code PartitionAdminService}.
49 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070050@Component(service = { PartitionService.class, PartitionAdminService.class })
Madan Jampani15b8ef52016-02-02 17:35:05 -080051public class PartitionManager extends AbstractListenerManager<PartitionEvent, PartitionEventListener>
52 implements PartitionService, PartitionAdminService {
53
54 private final Logger log = getLogger(getClass());
55
Ray Milkeyd84f89b2018-08-17 14:54:17 -070056 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Jordan Halterman00e92da2018-05-22 23:05:52 -070057 protected AtomixManager atomixManager;
Madan Jampani15b8ef52016-02-02 17:35:05 -080058
Jordan Halterman00e92da2018-05-22 23:05:52 -070059 private PartitionGroup partitionGroup;
Madan Jampani15b8ef52016-02-02 17:35:05 -080060
61 @Activate
62 public void activate() {
Jordan Halterman00e92da2018-05-22 23:05:52 -070063 partitionGroup = atomixManager.getAtomix().getPartitionService().getPartitionGroup(MultiRaftProtocol.TYPE);
Madan Jampani15b8ef52016-02-02 17:35:05 -080064 eventDispatcher.addSink(PartitionEvent.class, listenerRegistry);
Madan Jampani15b8ef52016-02-02 17:35:05 -080065 log.info("Started");
66 }
67
Madan Jampani86cb2432016-02-17 11:07:56 -080068 @Deactivate
Madan Jampani15b8ef52016-02-02 17:35:05 -080069 public void deactivate() {
70 eventDispatcher.removeSink(PartitionEvent.class);
Madan Jampani15b8ef52016-02-02 17:35:05 -080071 log.info("Stopped");
72 }
73
74 @Override
Madan Jampani15b8ef52016-02-02 17:35:05 -080075 public int getNumberOfPartitions() {
Heedo Kang4a47a302016-02-29 17:40:23 +090076 checkPermission(PARTITION_READ);
Jordan Halterman00e92da2018-05-22 23:05:52 -070077 return partitionGroup.getPartitions().size();
Madan Jampani15b8ef52016-02-02 17:35:05 -080078 }
79
80 @Override
81 public Set<PartitionId> getAllPartitionIds() {
Heedo Kang4a47a302016-02-29 17:40:23 +090082 checkPermission(PARTITION_READ);
Jordan Halterman00e92da2018-05-22 23:05:52 -070083 return partitionGroup.getPartitionIds().stream()
84 .map(partitionId -> PartitionId.from(partitionId.id()))
85 .collect(Collectors.toSet());
Madan Jampani15b8ef52016-02-02 17:35:05 -080086 }
87
88 @Override
Madan Jampani15b8ef52016-02-02 17:35:05 -080089 public Set<NodeId> getConfiguredMembers(PartitionId partitionId) {
Heedo Kang4a47a302016-02-29 17:40:23 +090090 checkPermission(PARTITION_READ);
Jordan Halterman00e92da2018-05-22 23:05:52 -070091 io.atomix.primitive.partition.PartitionId atomixPartitionId =
92 io.atomix.primitive.partition.PartitionId.from(partitionGroup.name(), partitionId.id());
93 return partitionGroup.getPartition(atomixPartitionId).members()
94 .stream()
95 .map(member -> NodeId.nodeId(member.id()))
96 .collect(Collectors.toSet());
Madan Jampani15b8ef52016-02-02 17:35:05 -080097 }
98
99 @Override
Madan Jampanie14a09c2016-02-11 10:43:21 -0800100 public List<PartitionInfo> partitionInfo() {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700101 checkPermission(PARTITION_READ);
102 return partitionGroup.getPartitions()
103 .stream()
104 .map(partition -> {
105 MemberId primary = partition.primary();
106 return new PartitionInfo(
107 PartitionId.from(partition.id().id()),
108 partition.term(),
109 partition.members().stream().map(member -> member.id()).collect(Collectors.toList()),
110 primary != null ? primary.id() : null);
111 })
112 .collect(Collectors.toList());
Madan Jampani33547452016-02-29 16:45:04 -0800113 }
Madan Jampaniccdf9da2016-05-05 14:37:27 -0700114
115 @Override
116 public List<PartitionClientInfo> partitionClientInfo() {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700117 checkPermission(PARTITION_READ);
118 return partitionGroup.getPartitions()
119 .stream()
120 .map(partition -> new PartitionClientInfo(
121 PartitionId.from(partition.id().id()),
122 partition.members().stream()
123 .map(member -> NodeId.nodeId(member.id()))
124 .collect(Collectors.toList())))
125 .collect(Collectors.toList());
Madan Jampaniccdf9da2016-05-05 14:37:27 -0700126 }
Madan Jampani2f9cc712016-02-15 19:36:21 -0800127}