blob: eaf496c270208c586871df77023e218d74e994c1 [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
*
* 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.apache.slider.providers.agent;
import com.google.common.io.Files;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.slider.common.params.ActionCreateArgs;
import org.apache.slider.common.params.AddonArgsDelegate;
import org.apache.slider.common.tools.SliderFileSystem;
import org.apache.slider.core.conf.ConfTree;
import org.apache.slider.core.conf.ConfTreeOperations;
import org.apache.slider.core.exceptions.BadConfigException;
import org.apache.slider.core.persist.AppDefinitionPersister;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
public class TestAppDefinitionPersister {
protected static final Logger log =
LoggerFactory.getLogger(TestAppDefinitionPersister.class);
@Rule
public TemporaryFolder folder = new TemporaryFolder();
/**
* @BeforeClass public static void initialize() { BasicConfigurator.resetConfiguration();
* BasicConfigurator.configure(); }*
*/
@Test
public void testAppDefinitionPersister() throws Exception {
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.getLocal(configuration);
log.info("fs working dir is {}", fs.getWorkingDirectory().toString());
SliderFileSystem sliderFileSystem = new SliderFileSystem(fs, configuration);
AppDefinitionPersister adp = new AppDefinitionPersister(sliderFileSystem);
String clustername = "c1";
ActionCreateArgs buildInfo = new ActionCreateArgs();
buildInfo.appMetaInfo = null;
buildInfo.appDef = null;
buildInfo.addonDelegate = new AddonArgsDelegate();
// nothing to do
adp.processSuppliedDefinitions(clustername, buildInfo, null);
adp.persistPackages();
List<AppDefinitionPersister.AppDefinition> appDefinitions = adp.getAppDefinitions();
Assert.assertTrue(appDefinitions.size() == 0);
ConfTree ct = new ConfTree();
ConfTreeOperations appConf = new ConfTreeOperations(ct);
final File tempDir = Files.createTempDir();
final File metainfo = new File(tempDir, "metainfo.json");
// unreadable metainfo
buildInfo.appMetaInfo = metainfo;
try {
adp.processSuppliedDefinitions(clustername, buildInfo, appConf);
} catch (BadConfigException bce) {
log.info(bce.getMessage());
Assert.assertTrue(bce.getMessage().contains("--metainfo file cannot be read"));
}
try (PrintWriter writer = new PrintWriter(metainfo.getAbsolutePath(), "UTF-8")) {
writer.println("{");
writer.println("}");
}
buildInfo.appDef = metainfo;
try {
adp.processSuppliedDefinitions(clustername, buildInfo, appConf);
} catch (BadConfigException bce) {
log.info(bce.getMessage());
Assert.assertTrue(bce.getMessage().contains("both --metainfo and --appdef may not be specified"));
}
buildInfo.appDef = null;
appConf.getGlobalOptions().set(AgentKeys.APP_DEF, metainfo.getAbsolutePath());
try {
adp.processSuppliedDefinitions(clustername, buildInfo, appConf);
} catch (BadConfigException bce) {
log.info(bce.getMessage());
Assert.assertTrue(bce.getMessage().contains("application.def must not be set if --metainfo is provided"));
}
appConf.getGlobalOptions().remove(AgentKeys.APP_DEF);
adp.processSuppliedDefinitions(clustername, buildInfo, appConf);
appDefinitions = adp.getAppDefinitions();
Assert.assertTrue(appDefinitions.size() == 1);
Assert.assertTrue(appConf.getGlobalOptions().get(AgentKeys.APP_DEF).contains("appdef/appPkg.zip"));
log.info(appDefinitions.get(0).toString());
Assert.assertTrue(appDefinitions.get(0).appDefPkgOrFolder.toString().endsWith("default"));
Assert.assertTrue(appDefinitions.get(0).targetFolderInFs.toString().contains("cluster/c1/appdef"));
Assert.assertEquals("appPkg.zip", appDefinitions.get(0).pkgName);
buildInfo.appDef = tempDir;
buildInfo.appMetaInfo = null;
appConf.getGlobalOptions().set(AgentKeys.APP_DEF, metainfo.getAbsolutePath());
try {
adp.processSuppliedDefinitions(clustername, buildInfo, appConf);
} catch (BadConfigException bce) {
log.info(bce.getMessage());
Assert.assertTrue(bce.getMessage().contains("application.def must not be set if --appdef is provided"));
}
adp.getAppDefinitions().clear();
appConf.getGlobalOptions().remove(AgentKeys.APP_DEF);
adp.processSuppliedDefinitions(clustername, buildInfo, appConf);
appDefinitions = adp.getAppDefinitions();
Assert.assertTrue(appDefinitions.size() == 1);
Assert.assertTrue(appConf.getGlobalOptions().get(AgentKeys.APP_DEF).contains("appdef/appPkg.zip"));
log.info(appDefinitions.get(0).toString());
Assert.assertTrue(appDefinitions.get(0).appDefPkgOrFolder.toString().endsWith(tempDir.toString()));
Assert.assertTrue(appDefinitions.get(0).targetFolderInFs.toString().contains("cluster/c1/appdef"));
Assert.assertEquals("appPkg.zip", appDefinitions.get(0).pkgName);
adp.getAppDefinitions().clear();
buildInfo.appDef = null;
buildInfo.appMetaInfo = null;
appConf.getGlobalOptions().remove(AgentKeys.APP_DEF);
ArrayList<String> list = new ArrayList<String>() {{
add("addon1");
add("");
add("addon2");
add(metainfo.getAbsolutePath());
}};
buildInfo.addonDelegate.addonTuples = list;
try {
adp.processSuppliedDefinitions(clustername, buildInfo, appConf);
} catch (BadConfigException bce) {
log.info(bce.getMessage());
Assert.assertTrue(bce.getMessage().contains("addon package can only be specified if main app package is specified"));
}
buildInfo.appMetaInfo = metainfo;
try {
adp.processSuppliedDefinitions(clustername, buildInfo, appConf);
} catch (BadConfigException bce) {
log.info(bce.getMessage());
Assert.assertTrue(bce.getMessage().contains("Invalid path for addon package addon1"));
}
appConf.getGlobalOptions().remove(AgentKeys.APP_DEF);
list = new ArrayList<String>() {{
add("addon1");
add(tempDir.getAbsolutePath());
add("addon2");
add(metainfo.getAbsolutePath());
}};
buildInfo.addonDelegate.addonTuples = list;
adp.getAppDefinitions().clear();
adp.processSuppliedDefinitions(clustername, buildInfo, appConf);
appDefinitions = adp.getAppDefinitions();
Assert.assertTrue(appDefinitions.size() == 3);
Assert.assertTrue(appConf.getGlobalOptions().get(AgentKeys.APP_DEF).contains("appdef/appPkg.zip"));
Assert.assertTrue(appConf.getGlobalOptions().get("application.addon.addon1").contains(
"addons/addon1/addon_addon1.zip"));
Assert.assertTrue(appConf.getGlobalOptions().get("application.addon.addon2").contains(
"addons/addon2/addon_addon2.zip"));
log.info(appConf.getGlobalOptions().get("application.addons"));
Assert.assertTrue(appConf.getGlobalOptions().get("application.addons").contains(
"application.addon.addon2,application.addon.addon1")
|| appConf.getGlobalOptions().get("application.addons").contains(
"application.addon.addon1,application.addon.addon2"));
int seen = 0;
for (AppDefinitionPersister.AppDefinition adp_ad : appDefinitions) {
if (adp_ad.pkgName.equals("appPkg.zip")) {
log.info(adp_ad.toString());
Assert.assertTrue(adp_ad.appDefPkgOrFolder.toString().endsWith("default"));
Assert.assertTrue(adp_ad.targetFolderInFs.toString().contains("cluster/c1/appdef"));
seen++;
}
if (adp_ad.pkgName.equals("addon_addon1.zip")) {
log.info(adp_ad.toString());
Assert.assertTrue(adp_ad.appDefPkgOrFolder.toString().endsWith(tempDir.toString()));
Assert.assertTrue(adp_ad.targetFolderInFs.toString().contains("addons/addon1"));
seen++;
}
if (adp_ad.pkgName.equals("addon_addon2.zip")) {
log.info(adp_ad.toString());
Assert.assertTrue(adp_ad.appDefPkgOrFolder.toString().endsWith("metainfo.json"));
Assert.assertTrue(adp_ad.targetFolderInFs.toString().contains("addons/addon2"));
seen++;
}
}
Assert.assertEquals(3, seen);
}
}