blob: f67abcbfaca05830202c4da553b049bc49735cd7 [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2014-present Open Networking Laboratory
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.store.flow.impl;
Yuta HIGUCHIb25f4da2014-10-16 15:09:26 -070017
Simon Huntff663742015-05-14 13:33:05 -070018import com.google.common.collect.ImmutableList;
Yuta HIGUCHIb25f4da2014-10-16 15:09:26 -070019import org.apache.felix.scr.annotations.Activate;
20import org.apache.felix.scr.annotations.Component;
21import org.apache.felix.scr.annotations.Deactivate;
22import org.apache.felix.scr.annotations.Reference;
23import org.apache.felix.scr.annotations.ReferenceCardinality;
24import org.apache.felix.scr.annotations.Service;
Brian O'Connorabafb502014-12-02 22:26:20 -080025import org.onosproject.cluster.NodeId;
Madan Jampani86940d92015-05-06 11:47:57 -070026import org.onosproject.cluster.RoleInfo;
Brian O'Connorabafb502014-12-02 22:26:20 -080027import org.onosproject.event.EventDeliveryService;
Simon Huntff663742015-05-14 13:33:05 -070028import org.onosproject.event.ListenerRegistry;
Brian O'Connorabafb502014-12-02 22:26:20 -080029import org.onosproject.mastership.MastershipEvent;
30import org.onosproject.mastership.MastershipListener;
31import org.onosproject.mastership.MastershipService;
32import org.onosproject.net.DeviceId;
33import org.onosproject.store.flow.ReplicaInfo;
34import org.onosproject.store.flow.ReplicaInfoEvent;
35import org.onosproject.store.flow.ReplicaInfoEventListener;
36import org.onosproject.store.flow.ReplicaInfoService;
Yuta HIGUCHIb25f4da2014-10-16 15:09:26 -070037import org.slf4j.Logger;
38
Simon Huntff663742015-05-14 13:33:05 -070039import java.util.Collections;
40import java.util.List;
Simon Huntff663742015-05-14 13:33:05 -070041import static com.google.common.base.Preconditions.checkNotNull;
42import static org.onosproject.store.flow.ReplicaInfoEvent.Type.BACKUPS_CHANGED;
43import static org.onosproject.store.flow.ReplicaInfoEvent.Type.MASTER_CHANGED;
44import static org.slf4j.LoggerFactory.getLogger;
Madan Jampani0f6ad142015-05-13 17:10:04 -070045
Yuta HIGUCHIb25f4da2014-10-16 15:09:26 -070046/**
47 * Manages replica placement information.
48 */
49@Component(immediate = true)
50@Service
51public class ReplicaInfoManager implements ReplicaInfoService {
52
53 private final Logger log = getLogger(getClass());
54
55 private final MastershipListener mastershipListener = new InternalMastershipListener();
56
57 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
58 protected EventDeliveryService eventDispatcher;
59
60 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
61 protected MastershipService mastershipService;
62
Simon Huntff663742015-05-14 13:33:05 -070063 protected final ListenerRegistry<ReplicaInfoEvent, ReplicaInfoEventListener>
64 listenerRegistry = new ListenerRegistry<>();
Yuta HIGUCHIb25f4da2014-10-16 15:09:26 -070065
66 @Activate
67 public void activate() {
68 eventDispatcher.addSink(ReplicaInfoEvent.class, listenerRegistry);
69 mastershipService.addListener(mastershipListener);
70 log.info("Started");
71 }
72
73 @Deactivate
74 public void deactivate() {
75 eventDispatcher.removeSink(ReplicaInfoEvent.class);
76 mastershipService.removeListener(mastershipListener);
77 log.info("Stopped");
78 }
79
80 @Override
81 public ReplicaInfo getReplicaInfoFor(DeviceId deviceId) {
Madan Jampani6bd2d9f2015-05-14 14:10:42 -070082 return buildFromRoleInfo(mastershipService.getNodesFor(deviceId));
Yuta HIGUCHIb25f4da2014-10-16 15:09:26 -070083 }
84
Yuta HIGUCHI4d187952014-10-16 19:59:35 -070085 @Override
86 public void addListener(ReplicaInfoEventListener listener) {
87 listenerRegistry.addListener(checkNotNull(listener));
88 }
89
90 @Override
91 public void removeListener(ReplicaInfoEventListener listener) {
92 listenerRegistry.removeListener(checkNotNull(listener));
93 }
94
Madan Jampani86940d92015-05-06 11:47:57 -070095 private static ReplicaInfo buildFromRoleInfo(RoleInfo roles) {
96 List<NodeId> backups = roles.backups() == null ?
Madan Jampani0f6ad142015-05-13 17:10:04 -070097 Collections.emptyList() : ImmutableList.copyOf(roles.backups());
Madan Jampani86940d92015-05-06 11:47:57 -070098 return new ReplicaInfo(roles.master(), backups);
99 }
100
Yuta HIGUCHIb25f4da2014-10-16 15:09:26 -0700101 final class InternalMastershipListener implements MastershipListener {
102
103 @Override
104 public void event(MastershipEvent event) {
Madan Jampani86940d92015-05-06 11:47:57 -0700105 final ReplicaInfo replicaInfo = buildFromRoleInfo(event.roleInfo());
Yuta HIGUCHId4ab8082014-11-03 11:09:09 -0800106 switch (event.type()) {
107 case MASTER_CHANGED:
108 eventDispatcher.post(new ReplicaInfoEvent(MASTER_CHANGED,
109 event.subject(),
110 replicaInfo));
111 break;
112 case BACKUPS_CHANGED:
113 eventDispatcher.post(new ReplicaInfoEvent(BACKUPS_CHANGED,
114 event.subject(),
115 replicaInfo));
116 break;
117 default:
118 break;
119 }
Yuta HIGUCHIb25f4da2014-10-16 15:09:26 -0700120 }
121 }
122
123}