/**
* 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.ambari.server.state.stack;
import static org.apache.ambari.server.state.stack.ConfigUpgradePack.AffectedComponent;
import static org.apache.ambari.server.state.stack.ConfigUpgradePack.AffectedService;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Map;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.H2DatabaseCleaner;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.orm.GuiceJpaInitializer;
import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
import org.apache.ambari.server.state.stack.upgrade.ConfigUpgradeChangeDefinition;
import org.apache.ambari.server.state.stack.upgrade.TransferOperation;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import com.google.inject.Guice;
import com.google.inject.Injector;
/**
* Tests for the config upgrade pack
*/
@Category({ category.StackUpgradeTest.class})
public class ConfigUpgradePackTest {
private Injector injector;
private AmbariMetaInfo ambariMetaInfo;
@Before
public void before() throws Exception {
injector = Guice.createInjector(new InMemoryDefaultTestModule());
injector.getInstance(GuiceJpaInitializer.class);
ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class);
}
@After
public void teardown() throws AmbariException, SQLException {
H2DatabaseCleaner.clearDatabaseAndStopPersistenceService(injector);
}
@Test
public void testMerge() {
// Generate test data - 3 config upgrade packs, 2 services, 2 components, 2 config changes each
ArrayList<ConfigUpgradePack> cups = new ArrayList<>();
for (int cupIndex = 0; cupIndex < 3; cupIndex++) {
ArrayList<AffectedService> services = new ArrayList<>();
for (int serviceIndex = 0; serviceIndex < 2; serviceIndex++) {
String serviceName;
if (serviceIndex == 0) {
serviceName = "HDFS"; // For checking merge of existing services
} else {
serviceName = String.format("SOME_SERVICE_%s", cupIndex);
}
ArrayList<AffectedComponent> components = new ArrayList<>();
for (int componentIndex = 0; componentIndex < 2; componentIndex++) {
String componentName;
if (componentIndex == 0) {
componentName = "NAMENODE"; // For checking merge of existing components
} else {
componentName = "SOME_COMPONENT_" + cupIndex;
}
ArrayList<ConfigUpgradeChangeDefinition> changeDefinitions = new ArrayList<>();
for (int changeIndex = 0; changeIndex < 2; changeIndex++) {
String change_id = String.format(
"CHANGE_%s_%s_%s_%s", cupIndex, serviceIndex, componentIndex, changeIndex);
ConfigUpgradeChangeDefinition changeDefinition = new ConfigUpgradeChangeDefinition();
changeDefinition.id = change_id;
changeDefinitions.add(changeDefinition);
}
AffectedComponent component = new AffectedComponent();
component.name = componentName;
component.changes = changeDefinitions;
components.add(component);
}
AffectedService service = new AffectedService();
service.name = serviceName;
service.components = components;
services.add(service);
}
ConfigUpgradePack cupI = new ConfigUpgradePack();
cupI.services = services;
cups.add(cupI);
}
// Merge
ConfigUpgradePack result = ConfigUpgradePack.merge(cups);
// Check test results
assertEquals(result.enumerateConfigChangesByID().entrySet().size(), 24);
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("NAMENODE").changes.get(0).id, "CHANGE_0_0_0_0");
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("NAMENODE").changes.get(1).id, "CHANGE_0_0_0_1");
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("NAMENODE").changes.get(2).id, "CHANGE_1_0_0_0");
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("NAMENODE").changes.get(3).id, "CHANGE_1_0_0_1");
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("NAMENODE").changes.get(4).id, "CHANGE_2_0_0_0");
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("NAMENODE").changes.get(5).id, "CHANGE_2_0_0_1");
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("SOME_COMPONENT_0").changes.get(0).id, "CHANGE_0_0_1_0");
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("SOME_COMPONENT_0").changes.get(1).id, "CHANGE_0_0_1_1");
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("SOME_COMPONENT_1").changes.get(0).id, "CHANGE_1_0_1_0");
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("SOME_COMPONENT_1").changes.get(1).id, "CHANGE_1_0_1_1");
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("SOME_COMPONENT_2").changes.get(0).id, "CHANGE_2_0_1_0");
assertEquals(result.getServiceMap().get("HDFS").getComponentMap().get("SOME_COMPONENT_2").changes.get(1).id, "CHANGE_2_0_1_1");
assertEquals(result.getServiceMap().get("SOME_SERVICE_0").getComponentMap().get("NAMENODE").changes.get(0).id, "CHANGE_0_1_0_0");
assertEquals(result.getServiceMap().get("SOME_SERVICE_0").getComponentMap().get("NAMENODE").changes.get(1).id, "CHANGE_0_1_0_1");
assertEquals(result.getServiceMap().get("SOME_SERVICE_0").getComponentMap().get("SOME_COMPONENT_0").changes.get(0).id, "CHANGE_0_1_1_0");
assertEquals(result.getServiceMap().get("SOME_SERVICE_0").getComponentMap().get("SOME_COMPONENT_0").changes.get(1).id, "CHANGE_0_1_1_1");
assertEquals(result.getServiceMap().get("SOME_SERVICE_1").getComponentMap().get("NAMENODE").changes.get(0).id, "CHANGE_1_1_0_0");
assertEquals(result.getServiceMap().get("SOME_SERVICE_1").getComponentMap().get("NAMENODE").changes.get(1).id, "CHANGE_1_1_0_1");
assertEquals(result.getServiceMap().get("SOME_SERVICE_1").getComponentMap().get("SOME_COMPONENT_1").changes.get(0).id, "CHANGE_1_1_1_0");
assertEquals(result.getServiceMap().get("SOME_SERVICE_1").getComponentMap().get("SOME_COMPONENT_1").changes.get(1).id, "CHANGE_1_1_1_1");
assertEquals(result.getServiceMap().get("SOME_SERVICE_2").getComponentMap().get("NAMENODE").changes.get(0).id, "CHANGE_2_1_0_0");
assertEquals(result.getServiceMap().get("SOME_SERVICE_2").getComponentMap().get("NAMENODE").changes.get(1).id, "CHANGE_2_1_0_1");
assertEquals(result.getServiceMap().get("SOME_SERVICE_2").getComponentMap().get("SOME_COMPONENT_2").changes.get(0).id, "CHANGE_2_1_1_0");
assertEquals(result.getServiceMap().get("SOME_SERVICE_2").getComponentMap().get("SOME_COMPONENT_2").changes.get(1).id, "CHANGE_2_1_1_1");
}
@Test
public void testConfigUpgradeDefinitionParsing() throws Exception {
ConfigUpgradePack cup = ambariMetaInfo.getConfigUpgradePack("HDP", "2.1.1");
Map<String, ConfigUpgradeChangeDefinition> changesByID = cup.enumerateConfigChangesByID();
ConfigUpgradeChangeDefinition hdp_2_1_1_nm_pre_upgrade = changesByID.get("hdp_2_1_1_nm_pre_upgrade");
assertEquals("core-site", hdp_2_1_1_nm_pre_upgrade.getConfigType());
assertEquals(4, hdp_2_1_1_nm_pre_upgrade.getTransfers().size());
/*
<transfer operation="COPY" from-key="copy-key" to-key="copy-key-to" />
<transfer operation="COPY" from-type="my-site" from-key="my-copy-key" to-key="my-copy-key-to" />
<transfer operation="MOVE" from-key="move-key" to-key="move-key-to" />
<transfer operation="DELETE" delete-key="delete-key">
<keep-key>important-key</keep-key>
</transfer>
*/
ConfigUpgradeChangeDefinition.Transfer t1 = hdp_2_1_1_nm_pre_upgrade.getTransfers().get(0);
assertEquals(TransferOperation.COPY, t1.operation);
assertEquals("copy-key", t1.fromKey);
assertEquals("copy-key-to", t1.toKey);
ConfigUpgradeChangeDefinition.Transfer t2 = hdp_2_1_1_nm_pre_upgrade.getTransfers().get(1);
assertEquals(TransferOperation.COPY, t2.operation);
assertEquals("my-site", t2.fromType);
assertEquals("my-copy-key", t2.fromKey);
assertEquals("my-copy-key-to", t2.toKey);
assertTrue(t2.keepKeys.isEmpty());
ConfigUpgradeChangeDefinition.Transfer t3 = hdp_2_1_1_nm_pre_upgrade.getTransfers().get(2);
assertEquals(TransferOperation.MOVE, t3.operation);
assertEquals("move-key", t3.fromKey);
assertEquals("move-key-to", t3.toKey);
ConfigUpgradeChangeDefinition.Transfer t4 = hdp_2_1_1_nm_pre_upgrade.getTransfers().get(3);
assertEquals(TransferOperation.DELETE, t4.operation);
assertEquals("delete-key", t4.deleteKey);
assertNull(t4.toKey);
assertTrue(t4.preserveEdits);
assertEquals(1, t4.keepKeys.size());
assertEquals("important-key", t4.keepKeys.get(0));
}
}