blob: 2201bb58f1cf26c51fb50447c37958c8b8f80866 [file] [log] [blame]
Madan Jampani15b8ef52016-02-02 17:35:05 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
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
17package org.onosproject.store.primitives.impl;
18
Madan Jampani15b8ef52016-02-02 17:35:05 -080019import java.io.File;
Madan Jampanie14a09c2016-02-11 10:43:21 -080020import java.util.List;
Madan Jampani15b8ef52016-02-02 17:35:05 -080021import java.util.Map;
22import java.util.Set;
23import java.util.concurrent.CompletableFuture;
Madan Jampani33547452016-02-29 16:45:04 -080024import java.util.concurrent.atomic.AtomicReference;
Madan Jampanie14a09c2016-02-11 10:43:21 -080025import java.util.stream.Collectors;
Madan Jampani15b8ef52016-02-02 17:35:05 -080026
Jordan Halterman2bf177c2017-06-29 01:49:08 -070027import com.google.common.collect.ImmutableSet;
28import com.google.common.collect.Maps;
Madan Jampani15b8ef52016-02-02 17:35:05 -080029import org.apache.felix.scr.annotations.Activate;
30import org.apache.felix.scr.annotations.Component;
Madan Jampani86cb2432016-02-17 11:07:56 -080031import org.apache.felix.scr.annotations.Deactivate;
Madan Jampani15b8ef52016-02-02 17:35:05 -080032import org.apache.felix.scr.annotations.Reference;
33import org.apache.felix.scr.annotations.ReferenceCardinality;
34import org.apache.felix.scr.annotations.Service;
35import org.onlab.util.Tools;
Madan Jampani33547452016-02-29 16:45:04 -080036import org.onosproject.cluster.ClusterMetadata;
37import org.onosproject.cluster.ClusterMetadataDiff;
38import org.onosproject.cluster.ClusterMetadataEvent;
39import org.onosproject.cluster.ClusterMetadataEventListener;
Madan Jampani15b8ef52016-02-02 17:35:05 -080040import org.onosproject.cluster.ClusterMetadataService;
41import org.onosproject.cluster.ClusterService;
42import org.onosproject.cluster.NodeId;
Madan Jampani33547452016-02-29 16:45:04 -080043import org.onosproject.cluster.PartitionDiff;
Madan Jampani15b8ef52016-02-02 17:35:05 -080044import org.onosproject.cluster.PartitionId;
45import org.onosproject.event.AbstractListenerManager;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070046import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
Madan Jampani15b8ef52016-02-02 17:35:05 -080047import org.onosproject.store.primitives.DistributedPrimitiveCreator;
48import org.onosproject.store.primitives.PartitionAdminService;
49import org.onosproject.store.primitives.PartitionEvent;
50import org.onosproject.store.primitives.PartitionEventListener;
51import org.onosproject.store.primitives.PartitionService;
Madan Jampaniccdf9da2016-05-05 14:37:27 -070052import org.onosproject.store.service.PartitionClientInfo;
Madan Jampanie14a09c2016-02-11 10:43:21 -080053import org.onosproject.store.service.PartitionInfo;
Madan Jampani15b8ef52016-02-02 17:35:05 -080054import org.slf4j.Logger;
55
Heedo Kang4a47a302016-02-29 17:40:23 +090056import static org.onosproject.security.AppGuard.checkPermission;
57import static org.onosproject.security.AppPermission.Type.PARTITION_READ;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070058import static org.slf4j.LoggerFactory.getLogger;
Heedo Kang4a47a302016-02-29 17:40:23 +090059
Madan Jampani15b8ef52016-02-02 17:35:05 -080060/**
61 * Implementation of {@code PartitionService} and {@code PartitionAdminService}.
62 */
63@Component
64@Service
65public class PartitionManager extends AbstractListenerManager<PartitionEvent, PartitionEventListener>
66 implements PartitionService, PartitionAdminService {
67
68 private final Logger log = getLogger(getClass());
69
70 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jordan Halterman2bf177c2017-06-29 01:49:08 -070071 protected ClusterCommunicationService clusterCommunicator;
Madan Jampani15b8ef52016-02-02 17:35:05 -080072
73 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
74 protected ClusterMetadataService metadataService;
75
76 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
77 protected ClusterService clusterService;
78
Madan Jampani33547452016-02-29 16:45:04 -080079 private final Map<PartitionId, StoragePartition> partitions = Maps.newConcurrentMap();
80 private final AtomicReference<ClusterMetadata> currentClusterMetadata = new AtomicReference<>();
81 private final InternalClusterMetadataListener metadataListener = new InternalClusterMetadataListener();
Madan Jampani15b8ef52016-02-02 17:35:05 -080082
83 @Activate
84 public void activate() {
85 eventDispatcher.addSink(PartitionEvent.class, listenerRegistry);
Madan Jampani33547452016-02-29 16:45:04 -080086 currentClusterMetadata.set(metadataService.getClusterMetadata());
87 metadataService.addListener(metadataListener);
88 currentClusterMetadata.get()
Madan Jampani15b8ef52016-02-02 17:35:05 -080089 .getPartitions()
Madan Jampani15b8ef52016-02-02 17:35:05 -080090 .forEach(partition -> partitions.put(partition.getId(), new StoragePartition(partition,
Jordan Halterman2bf177c2017-06-29 01:49:08 -070091 clusterCommunicator,
Madan Jampani15b8ef52016-02-02 17:35:05 -080092 clusterService,
Madan Jampani832686d2016-04-04 21:57:26 -070093 new File(System.getProperty("karaf.data") + "/partitions/" + partition.getId()))));
Madan Jampani15b8ef52016-02-02 17:35:05 -080094
95 CompletableFuture<Void> openFuture = CompletableFuture.allOf(partitions.values()
96 .stream()
97 .map(StoragePartition::open)
98 .toArray(CompletableFuture[]::new));
99 openFuture.join();
100 log.info("Started");
101 }
102
Madan Jampani86cb2432016-02-17 11:07:56 -0800103 @Deactivate
Madan Jampani15b8ef52016-02-02 17:35:05 -0800104 public void deactivate() {
Madan Jampani33547452016-02-29 16:45:04 -0800105 metadataService.removeListener(metadataListener);
Madan Jampani15b8ef52016-02-02 17:35:05 -0800106 eventDispatcher.removeSink(PartitionEvent.class);
107
108 CompletableFuture<Void> closeFuture = CompletableFuture.allOf(partitions.values()
109 .stream()
110 .map(StoragePartition::close)
111 .toArray(CompletableFuture[]::new));
112 closeFuture.join();
113 log.info("Stopped");
114 }
115
116 @Override
Madan Jampani15b8ef52016-02-02 17:35:05 -0800117 public int getNumberOfPartitions() {
Heedo Kang4a47a302016-02-29 17:40:23 +0900118 checkPermission(PARTITION_READ);
Madan Jampani15b8ef52016-02-02 17:35:05 -0800119 return partitions.size();
120 }
121
122 @Override
123 public Set<PartitionId> getAllPartitionIds() {
Heedo Kang4a47a302016-02-29 17:40:23 +0900124 checkPermission(PARTITION_READ);
Madan Jampani15b8ef52016-02-02 17:35:05 -0800125 return partitions.keySet();
126 }
127
128 @Override
129 public DistributedPrimitiveCreator getDistributedPrimitiveCreator(PartitionId partitionId) {
Heedo Kang4a47a302016-02-29 17:40:23 +0900130 checkPermission(PARTITION_READ);
Madan Jampani15b8ef52016-02-02 17:35:05 -0800131 return partitions.get(partitionId).client();
132 }
133
134 @Override
135 public Set<NodeId> getConfiguredMembers(PartitionId partitionId) {
Heedo Kang4a47a302016-02-29 17:40:23 +0900136 checkPermission(PARTITION_READ);
Madan Jampani15b8ef52016-02-02 17:35:05 -0800137 StoragePartition partition = partitions.get(partitionId);
138 return ImmutableSet.copyOf(partition.getMembers());
139 }
140
141 @Override
142 public Set<NodeId> getActiveMembersMembers(PartitionId partitionId) {
Heedo Kang4a47a302016-02-29 17:40:23 +0900143 checkPermission(PARTITION_READ);
Madan Jampani15b8ef52016-02-02 17:35:05 -0800144 // TODO: This needs to query metadata to determine currently active
145 // members of partition
146 return getConfiguredMembers(partitionId);
147 }
Madan Jampanie14a09c2016-02-11 10:43:21 -0800148
149 @Override
150 public List<PartitionInfo> partitionInfo() {
151 return partitions.values()
152 .stream()
Sho SHIMIZU5fab6e52016-02-15 11:54:15 -0800153 .flatMap(x -> Tools.stream(x.info()))
Madan Jampanie14a09c2016-02-11 10:43:21 -0800154 .collect(Collectors.toList());
155 }
Madan Jampani33547452016-02-29 16:45:04 -0800156
157 private void processMetadataUpdate(ClusterMetadata clusterMetadata) {
158 ClusterMetadataDiff diffExaminer =
159 new ClusterMetadataDiff(currentClusterMetadata.get(), clusterMetadata);
160 diffExaminer.partitionDiffs()
161 .values()
162 .stream()
Madan Jampani33547452016-02-29 16:45:04 -0800163 .filter(PartitionDiff::hasChanged)
164 .forEach(diff -> partitions.get(diff.partitionId()).onUpdate(diff.newValue()));
165 }
166
167 private class InternalClusterMetadataListener implements ClusterMetadataEventListener {
168 @Override
169 public void event(ClusterMetadataEvent event) {
170 processMetadataUpdate(event.subject());
171 }
172 }
Madan Jampaniccdf9da2016-05-05 14:37:27 -0700173
174 @Override
175 public List<PartitionClientInfo> partitionClientInfo() {
176 return partitions.values()
177 .stream()
178 .map(StoragePartition::client)
179 .map(StoragePartitionClient::clientInfo)
180 .collect(Collectors.toList());
181 }
Madan Jampani2f9cc712016-02-15 19:36:21 -0800182}