blob: 08a6f9d0780ad7cb8d8a5090c0491c41d41ab911 [file] [log] [blame]
Ray Milkey83200882017-11-13 19:18:21 -08001/*
2 * Copyright 2017-present Open Networking Foundation
3 *
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.impl;
17
18import com.google.common.collect.ImmutableSet;
19import org.apache.commons.io.FileUtils;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.junit.HttpResourceUrlInterceptor;
24import org.onlab.junit.LoggerAdapter;
25import org.onlab.junit.TestUtils;
26import org.onosproject.cluster.ClusterMetadata;
27import org.onosproject.cluster.ControllerNode;
28import org.onosproject.cluster.Partition;
29import org.onosproject.common.event.impl.TestEventDispatcher;
30import org.onosproject.core.VersionServiceAdapter;
31import org.slf4j.helpers.MessageFormatter;
32
33import java.io.File;
34import java.io.IOException;
35import java.net.URL;
36
37import static org.hamcrest.CoreMatchers.equalTo;
38import static org.hamcrest.CoreMatchers.is;
39import static org.hamcrest.CoreMatchers.notNullValue;
40import static org.hamcrest.Matchers.hasSize;
41import static org.junit.Assert.assertThat;
42
43/**
44 * Unit tests for the cluster metadata manager.
45 */
46
47public class ClusterMetadataManagerTest {
48
49 private static final String CLUSTER_NAME = "MyCluster";
50 private static final String NODE_ID = "MyId";
51 private static final String NODE_IP = "11.22.33.44";
52 private static final int NODE_PORT = 4523;
53
54 private static final String CLUSTER_METADATA_FORMAT =
55 "{\"nodes\": [" +
56 " {\"ip\": \"{}\", \"id\": \"{}\", \"port\": {}}]," +
57 "\"name\": \"{}\"," +
58 "\"partitions\": [{\"id\": 1, \"members\": [\"{}\"]}]}";
59
60 private static final String CLUSTER_METADATA =
61 format(CLUSTER_METADATA_FORMAT, NODE_IP, NODE_ID, NODE_PORT, CLUSTER_NAME, NODE_ID);
62
63 private ClusterMetadataManager mgr;
64 private ConfigFileBasedClusterMetadataProvider fileProvider;
65 private DefaultClusterMetadataProvider defaultProvider;
66
67 private static String format(String format, Object... params) {
68 return MessageFormatter.arrayFormat(format, params).getMessage();
69 }
70
71 private class TrackingLogger extends LoggerAdapter {
72 int errors = 0;
73 StringBuilder messages = new StringBuilder();
74
75 public final void error(String msg, Throwable t) {
76 messages.append(msg);
77 messages.append(t);
78 errors++;
79 }
80 }
81
82 @Before
83 public void setUp() {
84 System.clearProperty("onos.cluster.metadata.uri");
85 mgr = new ClusterMetadataManager();
86 TestUtils.setField(mgr, "eventDispatcher", new TestEventDispatcher());
87 fileProvider = new ConfigFileBasedClusterMetadataProvider();
88 fileProvider.providerRegistry = mgr;
89
90 defaultProvider = new DefaultClusterMetadataProvider();
91 defaultProvider.providerRegistry = mgr;
92 defaultProvider.versionService = new VersionServiceAdapter();
93
94 mgr.activate();
95 defaultProvider.activate();
96
97 pause(200);
98 }
99
100 @After
101 public void tearDown() {
102 defaultProvider.deactivate();
103 fileProvider.deactivate();
104 mgr.deactivate();
105 }
106
107 private void pause(long millis) {
108 try {
109 Thread.sleep(millis);
110 } catch (InterruptedException ie) {
111 throw new IllegalStateException(ie);
112 }
113 }
114
115 /**
116 * Tests that the file provider functions correctly when no metadata is present.
117 */
118 @Test
119 public void testNoMetadata() {
120 fileProvider.activate();
121 TrackingLogger log = new TrackingLogger();
122 TestUtils.setField(fileProvider, "log", log);
123
124 assertThat(fileProvider.isAvailable(), is(false));
125
126 boolean exceptionSeen;
127 try {
128 fileProvider.getClusterMetadata();
129 exceptionSeen = false;
130 } catch (Throwable t) {
131 exceptionSeen = true;
132 }
133 assertThat(exceptionSeen, is(true));
134
135 assertThat("Logger errors detected: " + log.messages.toString(), log.errors, is(0));
136 }
137
138 /**
139 * Tests the default provider.
140 */
141 @Test
142 public void testDefaultProvider() {
143 fileProvider.activate();
144 ClusterMetadata metadata = mgr.getClusterMetadata();
145
146 assertThat(metadata, notNullValue());
147 assertThat(metadata.getName(), is(defaultProvider.id().scheme()));
148 assertThat(metadata.getNodes(), hasSize(1));
149 assertThat(metadata.getPartitions(), hasSize(1));
150
151 String localAddress = mgr.getLocalNode().ip().toString();
152
153 ControllerNode node = metadata.getNodes().iterator().next();
154 assertThat(node.ip().toString(), is(localAddress));
155 assertThat(node.id().id(), is(localAddress));
156
157 Partition partition = metadata.getPartitions().iterator().next();
158 assertThat(partition.getId().asInt(), is(1));
159 assertThat(partition.getMembers(), hasSize(1));
160 assertThat(partition.getMembers().iterator().next().id(), is(localAddress));
161 }
162
163 /**
164 * Tests the file based cluster metadata provider.
165 */
166 @Test
167 public void testFileBasedProvider() {
168 File jsonFile;
169
170 try {
171 jsonFile = File.createTempFile("cluster", "json");
172 FileUtils.writeStringToFile(jsonFile, CLUSTER_METADATA);
173 } catch (IOException ioe) {
174 throw new IllegalStateException(ioe);
175 }
176
177 System.setProperty("onos.cluster.metadata.uri", "file://" + jsonFile.getAbsolutePath());
178 fileProvider.activate();
179
180 ClusterMetadata metadata = fileProvider.getClusterMetadata().value();
181 assertThat(metadata, notNullValue());
182
183 assertThat(metadata.getName(), is(CLUSTER_NAME));
184
185 ControllerNode node = metadata.getNodes().iterator().next();
186 assertThat(node.ip().toString(), is(NODE_IP));
187 assertThat(node.id().id(), is(NODE_ID));
188
189 Partition partition = metadata.getPartitions().iterator().next();
190 assertThat(partition.getId().asInt(), is(1));
191 assertThat(partition.getMembers(), hasSize(1));
192 assertThat(partition.getMembers().iterator().next().id(), is(NODE_ID));
193
194 ClusterMetadata newMetadata = new ClusterMetadata(metadata.providerId(),
195 "NewMetadata",
196 ImmutableSet.of(node),
197 ImmutableSet.of(partition));
198 mgr.setClusterMetadata(newMetadata);
199
200 assertThat(fileProvider.getClusterMetadata().value(), equalTo(newMetadata));
201
202 assertThat(jsonFile.delete(), is(true));
203 }
204
205 /**
206 * Tests fetching metadata from an HTTP source.
207 */
208 @Test
209 public void testUrlFetch() {
210 URL.setURLStreamHandlerFactory(
211 new HttpResourceUrlInterceptor.HttpResourceUrlInterceptorFactory("cluster-info.json"));
212 System.setProperty("onos.cluster.metadata.uri", "http://opennetworking.org");
213
214 fileProvider.activate();
215 pause(400);
216
217
218 ClusterMetadata metadata = fileProvider.getClusterMetadata().value();
219 assertThat(metadata, notNullValue());
220
221 assertThat(metadata.getName(), is(CLUSTER_NAME));
222 assertThat(metadata.getNodes(), hasSize(1));
223 assertThat(metadata.getPartitions(), hasSize(1));
224 }
225}