| /* |
| * Copyright 2017-present Open Networking Foundation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.onosproject.cluster.impl; |
| |
| import com.google.common.collect.ImmutableSet; |
| import org.apache.commons.io.FileUtils; |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.onlab.junit.HttpResourceUrlInterceptor; |
| import org.onlab.junit.LoggerAdapter; |
| import org.onlab.junit.TestUtils; |
| import org.onosproject.cluster.ClusterMetadata; |
| import org.onosproject.cluster.ControllerNode; |
| import org.onosproject.cluster.Partition; |
| import org.onosproject.common.event.impl.TestEventDispatcher; |
| import org.onosproject.core.VersionServiceAdapter; |
| import org.slf4j.helpers.MessageFormatter; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.URL; |
| |
| import static org.hamcrest.CoreMatchers.equalTo; |
| import static org.hamcrest.CoreMatchers.is; |
| import static org.hamcrest.CoreMatchers.notNullValue; |
| import static org.hamcrest.Matchers.hasSize; |
| import static org.junit.Assert.assertThat; |
| |
| /** |
| * Unit tests for the cluster metadata manager. |
| */ |
| |
| public class ClusterMetadataManagerTest { |
| |
| private static final String CLUSTER_NAME = "MyCluster"; |
| private static final String NODE_ID = "MyId"; |
| private static final String NODE_IP = "11.22.33.44"; |
| private static final int NODE_PORT = 4523; |
| |
| private static final String CLUSTER_METADATA_FORMAT = |
| "{\"nodes\": [" + |
| " {\"ip\": \"{}\", \"id\": \"{}\", \"port\": {}}]," + |
| "\"name\": \"{}\"," + |
| "\"partitions\": [{\"id\": 1, \"members\": [\"{}\"]}]}"; |
| |
| private static final String CLUSTER_METADATA = |
| format(CLUSTER_METADATA_FORMAT, NODE_IP, NODE_ID, NODE_PORT, CLUSTER_NAME, NODE_ID); |
| |
| private ClusterMetadataManager mgr; |
| private ConfigFileBasedClusterMetadataProvider fileProvider; |
| private DefaultClusterMetadataProvider defaultProvider; |
| |
| private static String format(String format, Object... params) { |
| return MessageFormatter.arrayFormat(format, params).getMessage(); |
| } |
| |
| private class TrackingLogger extends LoggerAdapter { |
| int errors = 0; |
| StringBuilder messages = new StringBuilder(); |
| |
| public final void error(String msg, Throwable t) { |
| messages.append(msg); |
| messages.append(t); |
| errors++; |
| } |
| } |
| |
| @Before |
| public void setUp() { |
| System.clearProperty("onos.cluster.metadata.uri"); |
| mgr = new ClusterMetadataManager(); |
| TestUtils.setField(mgr, "eventDispatcher", new TestEventDispatcher()); |
| fileProvider = new ConfigFileBasedClusterMetadataProvider(); |
| fileProvider.providerRegistry = mgr; |
| |
| defaultProvider = new DefaultClusterMetadataProvider(); |
| defaultProvider.providerRegistry = mgr; |
| defaultProvider.versionService = new VersionServiceAdapter(); |
| |
| mgr.activate(); |
| defaultProvider.activate(); |
| |
| pause(200); |
| } |
| |
| @After |
| public void tearDown() { |
| defaultProvider.deactivate(); |
| fileProvider.deactivate(); |
| mgr.deactivate(); |
| } |
| |
| private void pause(long millis) { |
| try { |
| Thread.sleep(millis); |
| } catch (InterruptedException ie) { |
| throw new IllegalStateException(ie); |
| } |
| } |
| |
| /** |
| * Tests that the file provider functions correctly when no metadata is present. |
| */ |
| @Test |
| public void testNoMetadata() { |
| fileProvider.activate(); |
| TrackingLogger log = new TrackingLogger(); |
| TestUtils.setField(fileProvider, "log", log); |
| |
| assertThat(fileProvider.isAvailable(), is(false)); |
| |
| boolean exceptionSeen; |
| try { |
| fileProvider.getClusterMetadata(); |
| exceptionSeen = false; |
| } catch (Throwable t) { |
| exceptionSeen = true; |
| } |
| assertThat(exceptionSeen, is(true)); |
| |
| assertThat("Logger errors detected: " + log.messages.toString(), log.errors, is(0)); |
| } |
| |
| /** |
| * Tests the default provider. |
| */ |
| @Test |
| public void testDefaultProvider() { |
| fileProvider.activate(); |
| ClusterMetadata metadata = mgr.getClusterMetadata(); |
| |
| assertThat(metadata, notNullValue()); |
| assertThat(metadata.getName(), is(defaultProvider.id().scheme())); |
| assertThat(metadata.getNodes(), hasSize(1)); |
| assertThat(metadata.getPartitions(), hasSize(1)); |
| |
| String localAddress = mgr.getLocalNode().ip().toString(); |
| |
| ControllerNode node = metadata.getNodes().iterator().next(); |
| assertThat(node.ip().toString(), is(localAddress)); |
| assertThat(node.id().id(), is(localAddress)); |
| |
| Partition partition = metadata.getPartitions().iterator().next(); |
| assertThat(partition.getId().asInt(), is(1)); |
| assertThat(partition.getMembers(), hasSize(1)); |
| assertThat(partition.getMembers().iterator().next().id(), is(localAddress)); |
| } |
| |
| /** |
| * Tests the file based cluster metadata provider. |
| */ |
| @Test |
| public void testFileBasedProvider() { |
| File jsonFile; |
| |
| try { |
| jsonFile = File.createTempFile("cluster", "json"); |
| FileUtils.writeStringToFile(jsonFile, CLUSTER_METADATA); |
| } catch (IOException ioe) { |
| throw new IllegalStateException(ioe); |
| } |
| |
| System.setProperty("onos.cluster.metadata.uri", "file://" + jsonFile.getAbsolutePath()); |
| fileProvider.activate(); |
| |
| ClusterMetadata metadata = fileProvider.getClusterMetadata().value(); |
| assertThat(metadata, notNullValue()); |
| |
| assertThat(metadata.getName(), is(CLUSTER_NAME)); |
| |
| ControllerNode node = metadata.getNodes().iterator().next(); |
| assertThat(node.ip().toString(), is(NODE_IP)); |
| assertThat(node.id().id(), is(NODE_ID)); |
| |
| Partition partition = metadata.getPartitions().iterator().next(); |
| assertThat(partition.getId().asInt(), is(1)); |
| assertThat(partition.getMembers(), hasSize(1)); |
| assertThat(partition.getMembers().iterator().next().id(), is(NODE_ID)); |
| |
| ClusterMetadata newMetadata = new ClusterMetadata(metadata.providerId(), |
| "NewMetadata", |
| ImmutableSet.of(node), |
| ImmutableSet.of(partition)); |
| mgr.setClusterMetadata(newMetadata); |
| |
| assertThat(fileProvider.getClusterMetadata().value(), equalTo(newMetadata)); |
| |
| assertThat(jsonFile.delete(), is(true)); |
| } |
| |
| /** |
| * Tests fetching metadata from an HTTP source. |
| */ |
| @Test |
| public void testUrlFetch() { |
| URL.setURLStreamHandlerFactory( |
| new HttpResourceUrlInterceptor.HttpResourceUrlInterceptorFactory("cluster-info.json")); |
| System.setProperty("onos.cluster.metadata.uri", "http://opennetworking.org"); |
| |
| fileProvider.activate(); |
| pause(400); |
| |
| |
| ClusterMetadata metadata = fileProvider.getClusterMetadata().value(); |
| assertThat(metadata, notNullValue()); |
| |
| assertThat(metadata.getName(), is(CLUSTER_NAME)); |
| assertThat(metadata.getNodes(), hasSize(1)); |
| assertThat(metadata.getPartitions(), hasSize(1)); |
| } |
| } |