blob: e1f664ea12d747a9319ae27002adf5fc4d145bcd [file] [log] [blame]
Madan Jampaniec1df022015-10-13 21:23:03 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Madan Jampaniec1df022015-10-13 21:23:03 -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 */
16package org.onosproject.cluster;
17
David K. Bainbridgee676dab2015-10-23 16:13:07 -070018import java.util.Arrays;
Madan Jampaniec1df022015-10-13 21:23:03 -070019import java.util.Collection;
Jordan Halterman00e92da2018-05-22 23:05:52 -070020import java.util.Collections;
Ray Milkey74e59132018-01-17 15:24:52 -080021import java.util.Objects;
Madan Jampaniec1df022015-10-13 21:23:03 -070022import java.util.Set;
Madan Jampaniec1df022015-10-13 21:23:03 -070023
24import com.google.common.base.MoreObjects;
Madan Jampaniec1df022015-10-13 21:23:03 -070025import com.google.common.collect.ImmutableSet;
David K. Bainbridgee676dab2015-10-23 16:13:07 -070026import com.google.common.collect.Sets;
Ayaka Koshibe48229222016-05-16 18:04:26 -070027import com.google.common.hash.Funnel;
28import com.google.common.hash.PrimitiveSink;
Jordan Halterman00e92da2018-05-22 23:05:52 -070029import org.onosproject.net.Provided;
30import org.onosproject.net.provider.ProviderId;
31
32import static com.google.common.base.Charsets.UTF_8;
33import static com.google.common.base.Preconditions.checkNotNull;
Madan Jampaniec1df022015-10-13 21:23:03 -070034
35/**
36 * Cluster metadata.
37 * <p>
Madan Jampaniab7e7cd2016-01-14 14:02:32 -080038 * Metadata specifies how a ONOS cluster is constituted and is made up of the collection
Madan Jampaniec1df022015-10-13 21:23:03 -070039 * of {@link org.onosproject.cluster.ControllerNode nodes} and the collection of data
40 * {@link org.onosproject.cluster.Partition partitions}.
41 */
Madan Jampaniad3c5262016-01-20 00:50:17 -080042public final class ClusterMetadata implements Provided {
Madan Jampaniec1df022015-10-13 21:23:03 -070043
Madan Jampaniad3c5262016-01-20 00:50:17 -080044 private final ProviderId providerId;
45 private final String name;
Jordan Halterman00e92da2018-05-22 23:05:52 -070046 private final ControllerNode localNode;
Jordan Halterman19c123a2018-07-30 13:57:19 -070047 private final Set<ControllerNode> controllerNodes;
48 private final Set<Node> storageNodes;
Madan Jampaniec1df022015-10-13 21:23:03 -070049
Ayaka Koshibe48229222016-05-16 18:04:26 -070050 public static final Funnel<ClusterMetadata> HASH_FUNNEL = new Funnel<ClusterMetadata>() {
51 @Override
52 public void funnel(ClusterMetadata cm, PrimitiveSink into) {
53 into.putString(cm.name, UTF_8);
54 }
55 };
56
Madan Jampani931e97d2016-02-26 12:20:44 -080057 @SuppressWarnings("unused")
Madan Jampaniad3c5262016-01-20 00:50:17 -080058 private ClusterMetadata() {
59 providerId = null;
60 name = null;
Jordan Halterman00e92da2018-05-22 23:05:52 -070061 localNode = null;
Jordan Halterman19c123a2018-07-30 13:57:19 -070062 controllerNodes = null;
63 storageNodes = null;
Madan Jampaniad3c5262016-01-20 00:50:17 -080064 }
65
Jordan Halterman00e92da2018-05-22 23:05:52 -070066 public ClusterMetadata(
67 ProviderId providerId,
68 String name,
69 ControllerNode localNode,
Jordan Halterman19c123a2018-07-30 13:57:19 -070070 Set<ControllerNode> controllerNodes,
71 Set<Node> storageNodes) {
Madan Jampaniad3c5262016-01-20 00:50:17 -080072 this.providerId = checkNotNull(providerId);
73 this.name = checkNotNull(name);
Jordan Halterman00e92da2018-05-22 23:05:52 -070074 this.localNode = localNode;
Jordan Halterman19c123a2018-07-30 13:57:19 -070075 this.controllerNodes = ImmutableSet.copyOf(checkNotNull(controllerNodes));
76 this.storageNodes = ImmutableSet.copyOf(checkNotNull(storageNodes));
Madan Jampaniad3c5262016-01-20 00:50:17 -080077 }
78
Jordan Halterman19c123a2018-07-30 13:57:19 -070079 public ClusterMetadata(
80 String name, ControllerNode localNode, Set<ControllerNode> controllerNodes, Set<Node> storageNodes) {
81 this(new ProviderId("none", "none"), name, localNode, controllerNodes, storageNodes);
Madan Jampaniad3c5262016-01-20 00:50:17 -080082 }
83
84 @Override
85 public ProviderId providerId() {
86 return providerId;
Madan Jampaniec1df022015-10-13 21:23:03 -070087 }
88
89 /**
90 * Returns the name of the cluster.
91 *
92 * @return cluster name
93 */
94 public String getName() {
95 return this.name;
96 }
97
98 /**
Jordan Halterman00e92da2018-05-22 23:05:52 -070099 * Returns the local controller node.
100 * @return the local controller node
101 */
102 public ControllerNode getLocalNode() {
103 return localNode;
104 }
105
106 /**
Madan Jampaniec1df022015-10-13 21:23:03 -0700107 * Returns the collection of {@link org.onosproject.cluster.ControllerNode nodes} that make up the cluster.
108 * @return cluster nodes
109 */
Jordan Halterman19c123a2018-07-30 13:57:19 -0700110 @Deprecated
Madan Jampaniec1df022015-10-13 21:23:03 -0700111 public Collection<ControllerNode> getNodes() {
Jordan Halterman19c123a2018-07-30 13:57:19 -0700112 return getControllerNodes();
113 }
114
115 /**
116 * Returns the collection of {@link org.onosproject.cluster.ControllerNode nodes} that make up the cluster.
117 * @return controller nodes
118 */
119 public Collection<ControllerNode> getControllerNodes() {
120 return controllerNodes;
Jordan Halterman00e92da2018-05-22 23:05:52 -0700121 }
122
123 /**
124 * Returns the collection of storage nodes.
125 *
126 * @return the collection of storage nodes
127 */
128 public Collection<Node> getStorageNodes() {
Jordan Halterman19c123a2018-07-30 13:57:19 -0700129 return storageNodes;
Madan Jampaniec1df022015-10-13 21:23:03 -0700130 }
131
132 /**
Madan Jampaniab7e7cd2016-01-14 14:02:32 -0800133 * Returns the collection of {@link org.onosproject.cluster.Partition partitions} that make
134 * up the cluster.
Madan Jampaniec1df022015-10-13 21:23:03 -0700135 * @return collection of partitions.
Jordan Halterman00e92da2018-05-22 23:05:52 -0700136 * @deprecated since 1.14
Madan Jampaniec1df022015-10-13 21:23:03 -0700137 */
Jordan Halterman00e92da2018-05-22 23:05:52 -0700138 @Deprecated
Madan Jampaniec1df022015-10-13 21:23:03 -0700139 public Collection<Partition> getPartitions() {
Jordan Halterman00e92da2018-05-22 23:05:52 -0700140 return Collections.emptySet();
Madan Jampaniec1df022015-10-13 21:23:03 -0700141 }
142
143 @Override
144 public String toString() {
145 return MoreObjects.toStringHelper(ClusterMetadata.class)
Madan Jampaniad3c5262016-01-20 00:50:17 -0800146 .add("providerId", providerId)
Madan Jampaniec1df022015-10-13 21:23:03 -0700147 .add("name", name)
Jordan Halterman19c123a2018-07-30 13:57:19 -0700148 .add("controllerNodes", controllerNodes)
149 .add("storageNodes", storageNodes)
Madan Jampaniec1df022015-10-13 21:23:03 -0700150 .toString();
151 }
152
David K. Bainbridgee676dab2015-10-23 16:13:07 -0700153 @Override
154 public int hashCode() {
Jordan Halterman19c123a2018-07-30 13:57:19 -0700155 return Arrays.deepHashCode(new Object[] {providerId, name, controllerNodes, storageNodes});
David K. Bainbridgee676dab2015-10-23 16:13:07 -0700156 }
157
158 /*
Madan Jampaniab7e7cd2016-01-14 14:02:32 -0800159 * Provide a deep equality check of the cluster metadata (non-Javadoc)
David K. Bainbridgee676dab2015-10-23 16:13:07 -0700160 *
161 * @see java.lang.Object#equals(java.lang.Object)
162 */
163 @Override
164 public boolean equals(Object object) {
Ray Milkey74e59132018-01-17 15:24:52 -0800165 if (object == null) {
166 return false;
167 }
168
David K. Bainbridgee676dab2015-10-23 16:13:07 -0700169 if (!ClusterMetadata.class.isInstance(object)) {
170 return false;
171 }
172 ClusterMetadata that = (ClusterMetadata) object;
173
Ray Milkey74e59132018-01-17 15:24:52 -0800174 return Objects.equals(this.name, that.name) &&
Jordan Halterman19c123a2018-07-30 13:57:19 -0700175 this.localNode.equals(that.localNode) &&
176 Objects.equals(this.controllerNodes.size(), that.controllerNodes.size()) &&
177 Sets.symmetricDifference(this.controllerNodes, that.controllerNodes).isEmpty() &&
178 Objects.equals(this.storageNodes.size(), that.storageNodes.size()) &&
179 Sets.symmetricDifference(this.storageNodes, that.storageNodes).isEmpty();
David K. Bainbridgee676dab2015-10-23 16:13:07 -0700180 }
Madan Jampanif6c6a302016-01-18 14:33:45 -0800181}