blob: 6003dcf6c386915b6bdd3ae14db7d8bd6d7caf38 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The ASF licenses this file to you 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.apache.storm.scheduler.utils;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.apache.storm.Config;
import org.apache.storm.DaemonConfig;
import org.apache.storm.utils.Time;
import org.apache.storm.utils.Time.SimulatedTime;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ArtifactoryConfigLoaderTest {
private static final Logger LOG = LoggerFactory.getLogger(ArtifactoryConfigLoaderTest.class);
private static final String ARTIFACTORY_HTTP_SCHEME_PREFIX = "artifactory+http://";
private Path tmpDirPath;
@Before
public void createTempDir() throws Exception {
tmpDirPath = Files.createTempDirectory("TestArtifactoryConfigLoader");
File f = tmpDirPath.toFile();
f.mkdir();
File dir = new File(f, "nimbus");
dir.mkdir();
}
;
@After
public void removeTempDir() throws Exception {
FileUtils.deleteDirectory(tmpDirPath.toFile());
}
@Test
public void testInvalidConfig() {
Config conf = new Config();
ArtifactoryConfigLoaderMock loaderMock = new ArtifactoryConfigLoaderMock(conf);
Map<String, Object> ret = loaderMock.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNull("Unexpectedly returned not null", ret);
}
@Test
public void testPointingAtDirectory() {
// This is a test where we are configured to point right at an artifact dir
Config conf = new Config();
conf.put(DaemonConfig.SCHEDULER_CONFIG_LOADER_URI,
ARTIFACTORY_HTTP_SCHEME_PREFIX + "bogushost.yahoo.com:9999/location/of/this/dir");
conf.put(Config.STORM_LOCAL_DIR, tmpDirPath.toString());
ArtifactoryConfigLoaderMock loaderMock = new ArtifactoryConfigLoaderMock(conf);
loaderMock.setData("Anything", "/location/of/this/dir",
"{\"children\" : [ { \"uri\" : \"/20160621204337.yaml\", \"folder\" : false }]}");
loaderMock
.setData(null, null, "{ \"" + DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS + "\": {one: 1, two: 2, three: 3, four : 4}}");
Map<String, Object> ret = loaderMock.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNotNull("Unexpectedly returned null", ret);
Assert.assertEquals(1, ret.get("one"));
Assert.assertEquals(2, ret.get("two"));
Assert.assertEquals(3, ret.get("three"));
Assert.assertEquals(4, ret.get("four"));
// Now let's load w/o setting up gets and we should still get valid map back
ArtifactoryConfigLoaderMock tc2 = new ArtifactoryConfigLoaderMock(conf);
Map<String, Object> ret2 = tc2.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNotNull("Unexpectedly returned null", ret2);
Assert.assertEquals(1, ret2.get("one"));
Assert.assertEquals(2, ret2.get("two"));
Assert.assertEquals(3, ret2.get("three"));
Assert.assertEquals(4, ret2.get("four"));
}
@Test
public void testArtifactUpdate() {
// This is a test where we are configured to point right at an artifact dir
Config conf = new Config();
conf.put(DaemonConfig.SCHEDULER_CONFIG_LOADER_URI,
ARTIFACTORY_HTTP_SCHEME_PREFIX + "bogushost.yahoo.com:9999/location/of/test/dir");
conf.put(Config.STORM_LOCAL_DIR, tmpDirPath.toString());
try (SimulatedTime t = new SimulatedTime()) {
ArtifactoryConfigLoaderMock loaderMock = new ArtifactoryConfigLoaderMock(conf);
loaderMock.setData("Anything", "/location/of/test/dir",
"{\"children\" : [ { \"uri\" : \"/20160621204337.yaml\", \"folder\" : false }]}");
loaderMock.setData(null, null, "{ \"" + DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS + "\": {one: 1, two: 2, three: 3}}");
Map<String, Object> ret = loaderMock.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNotNull("Unexpectedly returned null", ret);
Assert.assertEquals(1, ret.get("one"));
Assert.assertEquals(2, ret.get("two"));
Assert.assertEquals(3, ret.get("three"));
Assert.assertNull("Unexpectedly contained \"four\"", ret.get("four"));
// Now let's load w/o setting up gets and we should still get valid map back
ArtifactoryConfigLoaderMock tc2 = new ArtifactoryConfigLoaderMock(conf);
Map<String, Object> ret2 = tc2.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNotNull("Unexpectedly returned null", ret2);
Assert.assertEquals(1, ret2.get("one"));
Assert.assertEquals(2, ret2.get("two"));
Assert.assertEquals(3, ret2.get("three"));
Assert.assertNull("Unexpectedly did not return null", ret2.get("four"));
// Now let's update it, but not advance time. Should get old map again.
loaderMock.setData("Anything", "/location/of/test/dir",
"{\"children\" : [ { \"uri\" : \"/20160621204999.yaml\", \"folder\" : false }]}");
loaderMock
.setData(null, null, "{ \"" + DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS + "\": {one: 1, two: 2, three: 3, four : 4}}");
ret = loaderMock.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNotNull("Unexpectedly returned null", ret);
Assert.assertEquals(1, ret.get("one"));
Assert.assertEquals(2, ret.get("two"));
Assert.assertEquals(3, ret.get("three"));
Assert.assertNull("Unexpectedly did not return null, not enough time passed!", ret.get("four"));
// Re-load from cached' file.
ret2 = tc2.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNotNull("Unexpectedly returned null", ret2);
Assert.assertEquals(1, ret2.get("one"));
Assert.assertEquals(2, ret2.get("two"));
Assert.assertEquals(3, ret2.get("three"));
Assert.assertNull("Unexpectedly did not return null, last cached result should not have \"four\"", ret2.get("four"));
// Now, let's advance time.
Time.advanceTime(11 * 60 * 1000);
ret = loaderMock.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNotNull("Unexpectedly returned null", ret);
Assert.assertEquals(1, ret.get("one"));
Assert.assertEquals(2, ret.get("two"));
Assert.assertEquals(3, ret.get("three"));
Assert.assertEquals(4, ret.get("four"));
// Re-load from cached' file.
ret2 = tc2.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNotNull("Unexpectedly returned null", ret2);
Assert.assertEquals(1, ret2.get("one"));
Assert.assertEquals(2, ret2.get("two"));
Assert.assertEquals(3, ret2.get("three"));
Assert.assertEquals(4, ret2.get("four"));
}
}
@Test
public void testPointingAtSpecificArtifact() {
// This is a test where we are configured to point right at a single artifact
Config conf = new Config();
conf.put(DaemonConfig.SCHEDULER_CONFIG_LOADER_URI,
ARTIFACTORY_HTTP_SCHEME_PREFIX + "bogushost.yahoo.com:9999/location/of/this/artifact");
conf.put(Config.STORM_LOCAL_DIR, tmpDirPath.toString());
ArtifactoryConfigLoaderMock loaderMock = new ArtifactoryConfigLoaderMock(conf);
loaderMock.setData("Anything", "/location/of/this/artifact", "{ \"downloadUri\": \"anything\"}");
loaderMock.setData(null, null, "{ \"" + DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS + "\": {one: 1, two: 2, three: 3}}");
Map<String, Object> ret = loaderMock.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNotNull("Unexpectedly returned null", ret);
Assert.assertEquals(1, ret.get("one"));
Assert.assertEquals(2, ret.get("two"));
Assert.assertEquals(3, ret.get("three"));
// Now let's load w/o setting up gets and we should still get valid map back
ArtifactoryConfigLoaderMock tc2 = new ArtifactoryConfigLoaderMock(conf);
Map<String, Object> ret2 = tc2.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNotNull("Unexpectedly returned null", ret2);
Assert.assertEquals(1, ret2.get("one"));
Assert.assertEquals(2, ret2.get("two"));
Assert.assertEquals(3, ret2.get("three"));
}
@Test
public void testMalformedYaml() throws Exception {
// This is a test where we are configured to point right at a single artifact
Config conf = new Config();
conf.put(DaemonConfig.SCHEDULER_CONFIG_LOADER_URI,
ARTIFACTORY_HTTP_SCHEME_PREFIX + "bogushost.yahoo.com:9999/location/of/this/artifact");
conf.put(Config.STORM_LOCAL_DIR, tmpDirPath.toString());
ArtifactoryConfigLoaderMock loaderMock = new ArtifactoryConfigLoaderMock(conf);
loaderMock.setData("Anything", "/location/of/this/artifact", "{ \"downloadUri\": \"anything\"}");
loaderMock.setData(null, null, "ThisIsNotValidYaml");
Map<String, Object> ret = loaderMock.load(DaemonConfig.MULTITENANT_SCHEDULER_USER_POOLS);
Assert.assertNull("Unexpectedly returned a map", ret);
}
private class ArtifactoryConfigLoaderMock extends ArtifactoryConfigLoader {
String getData;
HashMap<String, String> getDataMap = new HashMap<>();
public ArtifactoryConfigLoaderMock(Map<String, Object> conf) {
super(conf);
}
public void setData(String api, String artifact, String data) {
if (api == null) {
getData = data;
} else {
getDataMap.put(artifact, data);
}
}
@Override
protected String doGet(String api, String artifact, String host, Integer port) {
if (api == null) {
return getData;
}
return getDataMap.get(artifact);
}
}
}