| /* |
| * 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.upgrade; |
| |
| import java.io.File; |
| import java.lang.reflect.Field; |
| import java.lang.reflect.Method; |
| import java.net.URL; |
| import java.sql.Connection; |
| import java.sql.ResultSet; |
| import java.sql.SQLException; |
| import java.sql.Statement; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import javax.persistence.EntityManager; |
| |
| import org.apache.ambari.server.AmbariException; |
| import org.apache.ambari.server.api.services.AmbariMetaInfo; |
| import org.apache.ambari.server.configuration.Configuration; |
| import org.apache.ambari.server.controller.AmbariManagementController; |
| import org.apache.ambari.server.controller.ServiceConfigVersionResponse; |
| import org.apache.ambari.server.orm.DBAccessor; |
| import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo; |
| import org.apache.ambari.server.orm.GuiceJpaInitializer; |
| import org.apache.ambari.server.orm.InMemoryDefaultTestModule; |
| import org.apache.ambari.server.orm.dao.ArtifactDAO; |
| import org.apache.ambari.server.orm.dao.ClusterDAO; |
| import org.apache.ambari.server.orm.dao.ClusterStateDAO; |
| import org.apache.ambari.server.orm.dao.HostComponentDesiredStateDAO; |
| import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO; |
| import org.apache.ambari.server.orm.dao.StackDAO; |
| import org.apache.ambari.server.orm.entities.ArtifactEntity; |
| import org.apache.ambari.server.orm.entities.ClusterEntity; |
| import org.apache.ambari.server.orm.entities.ClusterServiceEntity; |
| import org.apache.ambari.server.orm.entities.ClusterStateEntity; |
| import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity; |
| import org.apache.ambari.server.orm.entities.HostEntity; |
| import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity; |
| import org.apache.ambari.server.orm.entities.StackEntity; |
| import org.apache.ambari.server.state.Cluster; |
| import org.apache.ambari.server.state.Clusters; |
| import org.apache.ambari.server.state.Config; |
| import org.apache.ambari.server.state.ConfigHelper; |
| import org.apache.ambari.server.state.Host; |
| import org.apache.ambari.server.state.HostComponentAdminState; |
| import org.apache.ambari.server.state.Service; |
| import org.apache.ambari.server.state.kerberos.KerberosDescriptor; |
| import org.apache.ambari.server.state.kerberos.KerberosDescriptorFactory; |
| import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptor; |
| import org.apache.ambari.server.state.stack.OsFamily; |
| import org.easymock.Capture; |
| import org.easymock.CaptureType; |
| import org.easymock.EasyMockSupport; |
| import org.junit.After; |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| import com.google.inject.AbstractModule; |
| import com.google.inject.Binder; |
| import com.google.inject.Guice; |
| import com.google.inject.Injector; |
| import com.google.inject.Module; |
| import com.google.inject.Provider; |
| import com.google.inject.persist.PersistService; |
| |
| import static junit.framework.Assert.assertEquals; |
| import static junit.framework.Assert.assertNotNull; |
| import static junit.framework.Assert.assertNull; |
| import static junit.framework.Assert.assertTrue; |
| import static org.easymock.EasyMock.anyObject; |
| import static org.easymock.EasyMock.anyString; |
| import static org.easymock.EasyMock.capture; |
| import static org.easymock.EasyMock.createMockBuilder; |
| import static org.easymock.EasyMock.createNiceMock; |
| import static org.easymock.EasyMock.createStrictMock; |
| import static org.easymock.EasyMock.eq; |
| import static org.easymock.EasyMock.expect; |
| import static org.easymock.EasyMock.expectLastCall; |
| import static org.easymock.EasyMock.replay; |
| import static org.easymock.EasyMock.reset; |
| import static org.easymock.EasyMock.verify; |
| |
| /** |
| * {@link org.apache.ambari.server.upgrade.UpgradeCatalog210} unit tests. |
| */ |
| public class UpgradeCatalog210Test { |
| private Injector injector; |
| private Provider<EntityManager> entityManagerProvider = createStrictMock(Provider.class); |
| private EntityManager entityManager = createNiceMock(EntityManager.class); |
| private UpgradeCatalogHelper upgradeCatalogHelper; |
| private StackEntity desiredStackEntity; |
| |
| @Before |
| public void init() { |
| reset(entityManagerProvider); |
| expect(entityManagerProvider.get()).andReturn(entityManager).anyTimes(); |
| replay(entityManagerProvider); |
| injector = Guice.createInjector(new InMemoryDefaultTestModule()); |
| injector.getInstance(GuiceJpaInitializer.class); |
| |
| upgradeCatalogHelper = injector.getInstance(UpgradeCatalogHelper.class); |
| // inject AmbariMetaInfo to ensure that stacks get populated in the DB |
| injector.getInstance(AmbariMetaInfo.class); |
| // load the stack entity |
| StackDAO stackDAO = injector.getInstance(StackDAO.class); |
| desiredStackEntity = stackDAO.find("HDP", "2.2.0"); |
| } |
| |
| @After |
| public void tearDown() { |
| injector.getInstance(PersistService.class).stop(); |
| } |
| |
| @Test |
| public void testExecuteDDLUpdates() throws Exception { |
| final DBAccessor dbAccessor = createNiceMock(DBAccessor.class); |
| Configuration configuration = createNiceMock(Configuration.class); |
| Connection connection = createNiceMock(Connection.class); |
| Statement statement = createNiceMock(Statement.class); |
| ResultSet resultSet = createNiceMock(ResultSet.class); |
| expect(configuration.getDatabaseUrl()).andReturn(Configuration.JDBC_IN_MEMORY_URL).anyTimes(); |
| dbAccessor.getConnection(); |
| expectLastCall().andReturn(connection).anyTimes(); |
| connection.createStatement(); |
| expectLastCall().andReturn(statement).anyTimes(); |
| statement.executeQuery(anyObject(String.class)); |
| expectLastCall().andReturn(resultSet).anyTimes(); |
| |
| // Create DDL sections with their own capture groups |
| AlertSectionDDL alertSectionDDL = new AlertSectionDDL(); |
| HostSectionDDL hostSectionDDL = new HostSectionDDL(); |
| WidgetSectionDDL widgetSectionDDL = new WidgetSectionDDL(); |
| ViewSectionDDL viewSectionDDL = new ViewSectionDDL(); |
| |
| // Execute any DDL schema changes |
| alertSectionDDL.execute(dbAccessor); |
| hostSectionDDL.execute(dbAccessor); |
| widgetSectionDDL.execute(dbAccessor); |
| viewSectionDDL.execute(dbAccessor); |
| |
| // Replay sections |
| replay(dbAccessor, configuration, resultSet, connection, statement); |
| |
| AbstractUpgradeCatalog upgradeCatalog = getUpgradeCatalog(dbAccessor); |
| Class<?> c = AbstractUpgradeCatalog.class; |
| Field f = c.getDeclaredField("configuration"); |
| f.setAccessible(true); |
| f.set(upgradeCatalog, configuration); |
| |
| upgradeCatalog.executeDDLUpdates(); |
| verify(dbAccessor, configuration, resultSet, connection, statement); |
| |
| // Verify sections |
| alertSectionDDL.verify(dbAccessor); |
| hostSectionDDL.verify(dbAccessor); |
| widgetSectionDDL.verify(dbAccessor); |
| viewSectionDDL.verify(dbAccessor); |
| } |
| |
| @Test |
| public void testExecutePreDMLUpdates() throws Exception { |
| Method executeStackPreDMLUpdates = UpgradeCatalog210.class.getDeclaredMethod("executeStackPreDMLUpdates"); |
| Method cleanupStackUpdates = UpgradeCatalog210.class.getDeclaredMethod("cleanupStackUpdates"); |
| |
| final UpgradeCatalog210 upgradeCatalog210 = createMockBuilder(UpgradeCatalog210.class) |
| .addMockedMethod(executeStackPreDMLUpdates) |
| .addMockedMethod(cleanupStackUpdates).createMock(); |
| |
| final Injector mockInjector = Guice.createInjector(new AbstractModule() { |
| @Override |
| protected void configure() { |
| bind(UpgradeCatalog210.class).toInstance(upgradeCatalog210); |
| bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); |
| bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| } |
| }); |
| |
| upgradeCatalog210.executeStackPreDMLUpdates(); |
| expectLastCall().once(); |
| |
| replay(upgradeCatalog210); |
| mockInjector.getInstance(UpgradeCatalog210.class).executePreDMLUpdates(); |
| |
| verify(upgradeCatalog210); |
| } |
| |
| @Test |
| public void testExecuteDMLUpdates() throws Exception { |
| Method addNewConfigurationsFromXml = |
| AbstractUpgradeCatalog.class.getDeclaredMethod("addNewConfigurationsFromXml"); |
| |
| Method initializeClusterAndServiceWidgets = |
| UpgradeCatalog210.class.getDeclaredMethod("initializeClusterAndServiceWidgets"); |
| |
| Method addMissingConfigs = UpgradeCatalog210.class.getDeclaredMethod("addMissingConfigs"); |
| |
| Method updateAlertDefinitions = UpgradeCatalog210.class.getDeclaredMethod("updateAlertDefinitions"); |
| |
| Method removeStormRestApiServiceComponent = |
| UpgradeCatalog210.class.getDeclaredMethod("removeStormRestApiServiceComponent"); |
| |
| Method updateKerberosDescriptorArtifacts = |
| AbstractUpgradeCatalog.class.getDeclaredMethod("updateKerberosDescriptorArtifacts"); |
| |
| UpgradeCatalog210 upgradeCatalog210 = createMockBuilder(UpgradeCatalog210.class) |
| .addMockedMethod(addNewConfigurationsFromXml) |
| .addMockedMethod(initializeClusterAndServiceWidgets) |
| .addMockedMethod(addMissingConfigs) |
| .addMockedMethod(updateAlertDefinitions) |
| .addMockedMethod(removeStormRestApiServiceComponent) |
| .addMockedMethod(updateKerberosDescriptorArtifacts) |
| .createMock(); |
| |
| upgradeCatalog210.addNewConfigurationsFromXml(); |
| expectLastCall().once(); |
| |
| upgradeCatalog210.initializeClusterAndServiceWidgets(); |
| expectLastCall().once(); |
| |
| upgradeCatalog210.addMissingConfigs(); |
| expectLastCall().once(); |
| |
| upgradeCatalog210.updateAlertDefinitions(); |
| expectLastCall().once(); |
| |
| upgradeCatalog210.removeStormRestApiServiceComponent(); |
| expectLastCall().once(); |
| |
| upgradeCatalog210.updateKerberosDescriptorArtifacts(); |
| expectLastCall().once(); |
| |
| replay(upgradeCatalog210); |
| |
| upgradeCatalog210.executeDMLUpdates(); |
| |
| verify(upgradeCatalog210); |
| } |
| |
| @Test |
| public void testUpdateRangerHiveConfigs() throws Exception{ |
| EasyMockSupport easyMockSupport = new EasyMockSupport(); |
| final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock( |
| AmbariManagementController.class); |
| final ConfigHelper mockConfigHelper = easyMockSupport.createMock(ConfigHelper.class); |
| |
| final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class); |
| final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class); |
| |
| final Config mockRangerPlugin = easyMockSupport.createNiceMock(Config.class); |
| final Config mockHiveEnv = easyMockSupport.createNiceMock(Config.class); |
| final Config mockHiveServer = easyMockSupport.createNiceMock(Config.class); |
| |
| final Map<String, String> propertiesExpectedRangerPlugin = new HashMap<String, String>(); |
| propertiesExpectedRangerPlugin.put("ranger-hive-plugin-enabled", "yes"); |
| final Map<String, String> propertiesExpectedHiveEnv = new HashMap<String, String>(); |
| final Map<String, String> propertiesExpectedHiveServer2 = new HashMap<String, String>(); |
| final Injector mockInjector = Guice.createInjector(new AbstractModule() { |
| @Override |
| protected void configure() { |
| bind(AmbariManagementController.class).toInstance(mockAmbariManagementController); |
| bind(ConfigHelper.class).toInstance(mockConfigHelper); |
| bind(Clusters.class).toInstance(mockClusters); |
| |
| bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); |
| bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| } |
| }); |
| |
| expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).once(); |
| expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{ |
| put("normal", mockClusterExpected); |
| }}).once(); |
| |
| expect(mockClusterExpected.getDesiredConfigByType("ranger-hive-plugin-properties")).andReturn(mockRangerPlugin).atLeastOnce(); |
| expect(mockClusterExpected.getDesiredConfigByType("hive-env")).andReturn(mockHiveEnv).atLeastOnce(); |
| expect(mockClusterExpected.getDesiredConfigByType("hiveserver2-site")).andReturn(mockHiveServer).atLeastOnce(); |
| expect(mockRangerPlugin.getProperties()).andReturn(propertiesExpectedRangerPlugin).anyTimes(); |
| expect(mockHiveEnv.getProperties()).andReturn(propertiesExpectedHiveEnv).anyTimes(); |
| expect(mockHiveServer.getProperties()).andReturn(propertiesExpectedHiveServer2).anyTimes(); |
| |
| ServiceConfigVersionResponse r = null; |
| expect(mockClusterExpected.getConfig(anyObject(String.class), anyObject(String.class))). |
| andReturn(mockHiveServer).anyTimes(); |
| expect(mockClusterExpected.addDesiredConfig("ambari-upgrade", Collections.singleton(mockHiveServer))). |
| andReturn(r).times(3); |
| |
| easyMockSupport.replayAll(); |
| mockInjector.getInstance(UpgradeCatalog210.class).updateRangerHiveConfigs(); |
| easyMockSupport.verifyAll(); |
| } |
| |
| @Test |
| public void testUpdateHiveConfigs() throws Exception { |
| EasyMockSupport easyMockSupport = new EasyMockSupport(); |
| final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class); |
| final ConfigHelper mockConfigHelper = easyMockSupport.createMock(ConfigHelper.class); |
| |
| final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class); |
| final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class); |
| final ServiceConfigVersionResponse mockServiceConfigVersionResponse = easyMockSupport.createNiceMock(ServiceConfigVersionResponse.class); |
| final Config mockHiveEnv = easyMockSupport.createNiceMock(Config.class); |
| final Config mockHiveServerSite = easyMockSupport.createNiceMock(Config.class); |
| final Config mockHiveSite = easyMockSupport.createNiceMock(Config.class); |
| |
| final Map<String, String> propertiesExpectedHiveEnv = new HashMap<String, String>() {{ |
| put("hive_security_authorization", "none"); |
| }}; |
| final Map<String, String> propertiesExpectedHiveSite = new HashMap<String, String>() {{ |
| put("hive.server2.authentication", "pam"); |
| put("hive.server2.custom.authentication.class", ""); |
| }}; |
| final Map<String, String> propertiesExpectedHiveServerSite = new HashMap<String, String>() {{ |
| put("hive.security.authorization.manager", ""); |
| put("hive.security.authenticator.manager", ""); |
| }}; |
| final Map<String, Service> servicesExpected = new HashMap<String, Service>(); |
| |
| final Injector mockInjector = Guice.createInjector(new AbstractModule() { |
| @Override |
| protected void configure() { |
| bind(AmbariManagementController.class).toInstance(mockAmbariManagementController); |
| bind(ConfigHelper.class).toInstance(mockConfigHelper); |
| bind(Clusters.class).toInstance(mockClusters); |
| |
| bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); |
| bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| } |
| }); |
| |
| expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).once(); |
| expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{ |
| put("normal", mockClusterExpected); |
| }}).once(); |
| |
| Capture<String> configTypeEnv = new Capture<String>(); |
| Capture<String> configTypeSite = new Capture<String>(); |
| Capture<String> configTypeServerSite = new Capture<String>(); |
| |
| expect(mockClusterExpected.getDesiredConfigByType("hive-env")).andReturn(mockHiveEnv).atLeastOnce(); |
| expect(mockClusterExpected.getDesiredConfigByType("hiveserver2-site")).andReturn(mockHiveServerSite).atLeastOnce(); |
| expect(mockHiveEnv.getProperties()).andReturn(propertiesExpectedHiveEnv).anyTimes(); |
| expect(mockHiveServerSite.getProperties()).andReturn(propertiesExpectedHiveServerSite).anyTimes(); |
| expect(mockClusterExpected.getConfig(capture(configTypeEnv), anyObject(String.class))).andReturn(mockHiveEnv).once(); |
| expect(mockClusterExpected.getConfig(capture(configTypeServerSite), anyObject(String.class))).andReturn(mockHiveServerSite).once(); |
| expect(mockClusterExpected.addDesiredConfig("ambari-upgrade", Collections.singleton(mockHiveEnv))).andReturn(mockServiceConfigVersionResponse).once(); |
| expect(mockClusterExpected.addDesiredConfig("ambari-upgrade", Collections.singleton(mockHiveServerSite))).andReturn(mockServiceConfigVersionResponse).once(); |
| |
| expect(mockClusterExpected.getDesiredConfigByType("hive-site")).andReturn(mockHiveSite).atLeastOnce(); |
| expect(mockHiveSite.getProperties()).andReturn(propertiesExpectedHiveSite).anyTimes(); |
| expect(mockClusterExpected.getServices()).andReturn(servicesExpected).once(); |
| expect(mockClusterExpected.getConfig(capture(configTypeSite), anyObject(String.class))).andReturn(mockHiveSite).once(); |
| expect(mockClusterExpected.addDesiredConfig("ambari-upgrade", Collections.singleton(mockHiveSite))).andReturn(mockServiceConfigVersionResponse).once(); |
| |
| easyMockSupport.replayAll(); |
| mockInjector.getInstance(UpgradeCatalog210.class).updateHiveConfigs(); |
| easyMockSupport.verifyAll(); |
| |
| assertEquals("hive-env", configTypeEnv.getValue()); |
| assertEquals("hive-site", configTypeSite.getValue()); |
| assertEquals("hiveserver2-site", configTypeServerSite.getValue()); |
| } |
| |
| @Test |
| public void TestRangerSitePropertyConversion() throws Exception{ |
| EasyMockSupport easyMockSupport = new EasyMockSupport(); |
| final String clusterName = "c1"; |
| final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class); |
| final ConfigHelper mockConfigHelper = easyMockSupport.createMock(ConfigHelper.class); |
| final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class); |
| final Cluster cluster = easyMockSupport.createStrictMock(Cluster.class); |
| final Config config = easyMockSupport.createNiceMock(Config.class); |
| final Map<String,Cluster> clusters = new HashMap<String,Cluster>(){{ |
| put(clusterName, cluster); |
| }}; |
| final Map<String,String> properties = new HashMap<String, String>() {{ |
| put("HTTPS_CLIENT_AUTH", "test123"); |
| put("HTTPS_KEYSTORE_FILE", "test123"); |
| put("HTTPS_KEYSTORE_PASS", "test123"); |
| put("HTTPS_KEY_ALIAS", "test123"); |
| put("HTTPS_SERVICE_PORT", "test123"); |
| put("HTTP_ENABLED", "test123"); |
| put("HTTP_SERVICE_PORT", "test123"); |
| }}; |
| |
| final Map<String, String> expectedPropertyMap = new HashMap<String, String>() {{ |
| put("HTTPS_CLIENT_AUTH", "https.attrib.clientAuth"); |
| put("HTTPS_KEYSTORE_FILE", "https.attrib.keystoreFile"); |
| put("HTTPS_KEYSTORE_PASS", "https.attrib.keystorePass"); |
| put("HTTPS_KEY_ALIAS", "https.attrib.keyAlias"); |
| put("HTTP_SERVICE_PORT", "http.service.port"); |
| put("HTTPS_SERVICE_PORT", "https.service.port"); |
| put("HTTP_ENABLED", "http.enabled"); |
| }}; |
| |
| final Map<String,String> convertedProperties = new HashMap<>(); |
| final Set<String> removedProperties = new HashSet<>(); |
| |
| final Injector mockInjector = Guice.createInjector(new AbstractModule() { |
| @Override |
| protected void configure() { |
| bind(AmbariManagementController.class).toInstance(mockAmbariManagementController); |
| bind(Clusters.class).toInstance(mockClusters); |
| bind(ConfigHelper.class).toInstance(mockConfigHelper); |
| |
| bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); |
| bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| } |
| }); |
| |
| UpgradeCatalog210 upgradeCatalog210 = new UpgradeCatalog210(mockInjector) { |
| |
| @Override |
| protected void updateConfigurationPropertiesForCluster(Cluster cluster, String configType, |
| Map<String, String> properties, boolean updateIfExists, boolean createNewConfigType) throws AmbariException { |
| convertedProperties.putAll(properties); |
| } |
| |
| @Override |
| protected void removeConfigurationPropertiesFromCluster(Cluster cluster, String configType, Set<String> removePropertiesList) |
| throws AmbariException { |
| removedProperties.addAll(removePropertiesList); |
| } |
| }; |
| |
| expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).atLeastOnce(); |
| expect(mockClusters.getClusters()).andReturn(clusters).atLeastOnce(); |
| expect(config.getProperties()).andReturn(properties).atLeastOnce(); |
| expect(cluster.getDesiredConfigByType("ranger-site")).andReturn(config).atLeastOnce(); |
| |
| replay(mockAmbariManagementController, mockClusters, cluster, config); |
| |
| upgradeCatalog210.updateRangerSiteConfigs(); |
| |
| |
| for (Map.Entry<String,String> propertyEntry: expectedPropertyMap.entrySet()){ |
| String oldKey = propertyEntry.getKey(); |
| String newKey = propertyEntry.getValue(); |
| assertTrue(String.format("Old property %s doesn't migrated to new name %s", oldKey, newKey), convertedProperties.containsKey(newKey)); |
| assertTrue(String.format("Property value %s doesn't preserved after renaming: %s",properties.get(oldKey), convertedProperties.get(newKey)), |
| convertedProperties.get(newKey).equals(properties.get(oldKey))); |
| assertTrue(String.format("Old property %s doesn't removed after renaming", oldKey), removedProperties.contains(oldKey)); |
| } |
| } |
| |
| @Test |
| public void testUpdateHiveConfigsWithKerberos() throws Exception { |
| EasyMockSupport easyMockSupport = new EasyMockSupport(); |
| final ConfigHelper mockConfigHelper = easyMockSupport.createMock(ConfigHelper.class); |
| final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class); |
| |
| final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class); |
| final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class); |
| final Config mockHiveEnv = easyMockSupport.createNiceMock(Config.class); |
| final Config mockHiveSite = easyMockSupport.createNiceMock(Config.class); |
| final Config mockHiveServerSite = easyMockSupport.createNiceMock(Config.class); |
| |
| final Map<String, String> propertiesExpectedHiveEnv = new HashMap<String, String>(); |
| final Map<String, String> propertiesExpectedHiveSite = new HashMap<String, String>() {{ |
| put("hive.server2.authentication", "kerberos"); |
| }}; |
| final Map<String, String> propertiesExpectedHiveServerSite = new HashMap<String, String>() {{ |
| }}; |
| final Map<String, Service> servicesExpected = new HashMap<String, Service>(){{ |
| put("KERBEROS", null); |
| }}; |
| |
| final Injector mockInjector = Guice.createInjector(new AbstractModule() { |
| @Override |
| protected void configure() { |
| bind(AmbariManagementController.class).toInstance(mockAmbariManagementController); |
| bind(ConfigHelper.class).toInstance(mockConfigHelper); |
| bind(Clusters.class).toInstance(mockClusters); |
| bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); |
| } |
| }); |
| |
| final UpgradeCatalog210 upgradeCatalog210 = mockInjector.getInstance(UpgradeCatalog210.class); |
| |
| expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).once(); |
| expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{ |
| put("normal", mockClusterExpected); |
| }}).once(); |
| |
| Capture<Map<String,String>> configCreation = Capture.newInstance(CaptureType.ALL); |
| |
| expect(mockClusterExpected.getDesiredConfigByType("hive-env")).andReturn(mockHiveEnv).atLeastOnce(); |
| expect(mockClusterExpected.getDesiredConfigByType("hiveserver2-site")).andReturn(mockHiveServerSite).atLeastOnce(); |
| expect(mockHiveEnv.getProperties()).andReturn(propertiesExpectedHiveEnv).anyTimes(); |
| expect(mockHiveServerSite.getProperties()).andReturn(propertiesExpectedHiveServerSite).anyTimes(); |
| |
| expect(mockClusterExpected.getDesiredConfigByType("hive-site")).andReturn(mockHiveSite).atLeastOnce(); |
| expect(mockHiveSite.getProperties()).andReturn(propertiesExpectedHiveSite).anyTimes(); |
| expect(mockClusterExpected.getServices()).andReturn(servicesExpected).atLeastOnce(); |
| expect(mockAmbariManagementController.createConfig((Cluster)anyObject(), |
| anyString(), |
| capture(configCreation), |
| anyString(), |
| (Map<String, Map<String, String>>)anyObject())).andReturn(null).atLeastOnce(); |
| |
| easyMockSupport.replayAll(); |
| upgradeCatalog210.updateHiveConfigs(); |
| easyMockSupport.verifyAll(); |
| |
| Assert.assertEquals(2, configCreation.getValues().size()); |
| |
| boolean hiveSecFound = false; |
| |
| for (Map<String, String> cfg: configCreation.getValues()){ |
| if (cfg.containsKey("hive_security_authorization")) { |
| hiveSecFound = true; |
| Assert.assertTrue("sqlstdauth".equalsIgnoreCase(cfg.get("hive_security_authorization"))); |
| break; |
| } |
| } |
| |
| Assert.assertTrue(hiveSecFound); |
| } |
| |
| @Test |
| public void testUpdateHiveConfigsWithRangerPlugin() throws Exception { |
| EasyMockSupport easyMockSupport = new EasyMockSupport(); |
| final ConfigHelper mockConfigHelper = easyMockSupport.createMock(ConfigHelper.class); |
| final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class); |
| |
| final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class); |
| final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class); |
| final Config mockHiveEnv = easyMockSupport.createNiceMock(Config.class); |
| final Config mockHiveSite = easyMockSupport.createNiceMock(Config.class); |
| final Config mockHiveServerSite = easyMockSupport.createNiceMock(Config.class); |
| final Config mockHivePluginProperies = easyMockSupport.createNiceMock(Config.class); |
| |
| final Map<String, String> propertiesExpectedHiveEnv = new HashMap<String, String>() {{ |
| put("hive_security_authorization", "none"); |
| }}; |
| final Map<String, String> propertiesExpectedHiveSite = new HashMap<String, String>() {{ |
| }}; |
| |
| final Map<String, String> propertiesExpectedPluginProperies = new HashMap<String, String>() {{ |
| put("ranger-hive-plugin-enabled", "yes"); |
| }}; |
| final Map<String, String> propertiesExpectedHiveServerSite = new HashMap<String, String>() {{ |
| put("hive.security.authorization.manager", "test"); |
| put("hive.security.authenticator.manager", "test"); |
| }}; |
| final Map<String, Service> servicesExpected = new HashMap<String, Service>() {{ |
| put("RANGER", null); |
| }}; |
| |
| final Injector mockInjector = Guice.createInjector(new AbstractModule() { |
| @Override |
| protected void configure() { |
| bind(AmbariManagementController.class).toInstance(mockAmbariManagementController); |
| bind(ConfigHelper.class).toInstance(mockConfigHelper); |
| bind(Clusters.class).toInstance(mockClusters); |
| bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); |
| } |
| }); |
| |
| final UpgradeCatalog210 upgradeCatalog210 = mockInjector.getInstance(UpgradeCatalog210.class); |
| |
| expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).once(); |
| expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{ |
| put("normal", mockClusterExpected); |
| }}).once(); |
| |
| Capture<Map<String, String>> configCreation = Capture.newInstance(CaptureType.ALL); |
| |
| expect(mockClusterExpected.getDesiredConfigByType("hive-env")).andReturn(mockHiveEnv).atLeastOnce(); |
| expect(mockClusterExpected.getDesiredConfigByType("hiveserver2-site")).andReturn(mockHiveServerSite).atLeastOnce(); |
| expect(mockHiveEnv.getProperties()).andReturn(propertiesExpectedHiveEnv).anyTimes(); |
| expect(mockHiveServerSite.getProperties()).andReturn(propertiesExpectedHiveServerSite).anyTimes(); |
| |
| expect(mockClusterExpected.getDesiredConfigByType("ranger-hive-plugin-properties")).andReturn(mockHivePluginProperies).once(); |
| expect(mockClusterExpected.getDesiredConfigByType("hive-site")).andReturn(mockHiveSite).atLeastOnce(); |
| expect(mockHiveSite.getProperties()).andReturn(propertiesExpectedHiveSite).anyTimes(); |
| expect(mockHivePluginProperies.getProperties()).andReturn(propertiesExpectedPluginProperies).anyTimes(); |
| expect(mockClusterExpected.getServices()).andReturn(servicesExpected).atLeastOnce(); |
| expect(mockAmbariManagementController.createConfig((Cluster) anyObject(), |
| anyString(), |
| capture(configCreation), |
| anyString(), |
| (Map<String, Map<String, String>>) anyObject())).andReturn(null).atLeastOnce(); |
| |
| easyMockSupport.replayAll(); |
| upgradeCatalog210.updateHiveConfigs(); |
| easyMockSupport.verifyAll(); |
| Assert.assertEquals(1, configCreation.getValues().size()); |
| |
| boolean result = false; |
| for (Map<String, String> cfg : configCreation.getValues()) { |
| if (cfg.containsKey("hive.security.authorization.manager")) { |
| result = true; |
| break; |
| } |
| } |
| Assert.assertFalse(result); |
| result = false; |
| for (Map<String, String> cfg : configCreation.getValues()) { |
| if (cfg.containsKey("hive.security.authenticator.manager")) { |
| result = true; |
| break; |
| } |
| } |
| Assert.assertFalse(result); |
| } |
| |
| |
| @Test |
| public void TestUpdateHiveEnvContent() { |
| EasyMockSupport easyMockSupport = new EasyMockSupport(); |
| final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class); |
| final ConfigHelper mockConfigHelper = easyMockSupport.createMock(ConfigHelper.class); |
| final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class); |
| |
| final Injector mockInjector = Guice.createInjector(new AbstractModule() { |
| @Override |
| protected void configure() { |
| bind(AmbariManagementController.class).toInstance(mockAmbariManagementController); |
| bind(ConfigHelper.class).toInstance(mockConfigHelper); |
| bind(Clusters.class).toInstance(mockClusters); |
| |
| bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); |
| bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| } |
| }); |
| String content = "# Start HIVE_AUX_JARS_PATH \n" + |
| "if [ \"${HIVE_AUX_JARS_PATH}\" != \"\" ]; then\n" + |
| " export HIVE_AUX_JARS_PATH=${HIVE_AUX_JARS_PATH}\n" + |
| "elif [ -d \"/usr/hdp/current/hive-webhcat/share/hcatalog\" ]; then \n" + |
| " export HIVE_AUX_JARS_PATH=/usr/hdp/current/hive-webhcat/share/hcatalog\n" + |
| "fi\n" + |
| "#End HIVE_AUX_JARS_PATH"; |
| String expectedContent = "# Start HIVE_AUX_JARS_PATH \n" + |
| "if [ \"${HIVE_AUX_JARS_PATH}\" != \"\" ]; then\n" + |
| " if [ -f \"${HIVE_AUX_JARS_PATH}\" ]; then \n" + |
| " export HIVE_AUX_JARS_PATH=${HIVE_AUX_JARS_PATH}\n" + |
| " elif [ -d \"/usr/hdp/current/hive-webhcat/share/hcatalog\" ]; then\n" + |
| " export HIVE_AUX_JARS_PATH=/usr/hdp/current/hive-webhcat/share/hcatalog/hive-hcatalog-core.jar\n" + |
| " fi\n" + |
| "elif [ -d \"/usr/hdp/current/hive-webhcat/share/hcatalog\" ]; then\n" + |
| " export HIVE_AUX_JARS_PATH=/usr/hdp/current/hive-webhcat/share/hcatalog/hive-hcatalog-core.jar\n" + |
| "fi\n" + |
| "#End HIVE_AUX_JARS_PATH"; |
| |
| String modifiedContent = mockInjector.getInstance(UpgradeCatalog210.class).updateHiveEnvContent(content); |
| Assert.assertEquals(modifiedContent, expectedContent); |
| } |
| |
| @Test |
| public void testInitializeClusterAndServiceWidgets() throws Exception { |
| final AmbariManagementController controller = createStrictMock(AmbariManagementController.class); |
| final Clusters clusters = createStrictMock(Clusters.class); |
| final Cluster cluster = createStrictMock(Cluster.class); |
| final Service service = createStrictMock(Service.class); |
| final Map<String, Cluster> clusterMap = Collections.singletonMap("c1", cluster); |
| final Map<String, Service> services = Collections.singletonMap("HBASE", service); |
| |
| |
| Module module = new Module() { |
| @Override |
| public void configure(Binder binder) { |
| binder.bind(AmbariManagementController.class).toInstance(controller); |
| binder.bind(Clusters.class).toInstance(clusters); |
| binder.bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); |
| binder.bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| } |
| }; |
| |
| expect(controller.getClusters()).andReturn(clusters).anyTimes(); |
| expect(clusters.getClusters()).andReturn(clusterMap).anyTimes(); |
| controller.initializeWidgetsAndLayouts(cluster, null); |
| expectLastCall().once(); |
| |
| expect(cluster.getServices()).andReturn(services).once(); |
| controller.initializeWidgetsAndLayouts(cluster, service); |
| expectLastCall().once(); |
| |
| replay(controller, clusters, cluster); |
| |
| Injector injector = Guice.createInjector(module); |
| injector.getInstance(UpgradeCatalog210.class).initializeClusterAndServiceWidgets(); |
| |
| verify(controller, clusters, cluster); |
| } |
| |
| @Test |
| public void testUpdateStormConfiguration() throws Exception { |
| EasyMockSupport easyMockSupport = new EasyMockSupport(); |
| final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock( |
| AmbariManagementController.class); |
| final ConfigHelper mockConfigHelper = easyMockSupport.createMock(ConfigHelper.class); |
| |
| final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class); |
| final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class); |
| |
| final Config mockClusterEnv = easyMockSupport.createNiceMock(Config.class); |
| final Config mockStormSite = easyMockSupport.createNiceMock(Config.class); |
| |
| final Map<String, String> propertiesExpectedClusterEnv = new HashMap<String, String>(); |
| propertiesExpectedClusterEnv.put("security_enabled", "true"); |
| final Map<String, String> propertiesExpectedStormSite = new HashMap<String, String>(); |
| final Injector mockInjector = Guice.createInjector(new AbstractModule() { |
| @Override |
| protected void configure() { |
| bind(AmbariManagementController.class).toInstance(mockAmbariManagementController); |
| bind(ConfigHelper.class).toInstance(mockConfigHelper); |
| bind(Clusters.class).toInstance(mockClusters); |
| |
| bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); |
| bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| } |
| }); |
| |
| expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).once(); |
| expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{ |
| put("normal", mockClusterExpected); |
| }}).once(); |
| |
| expect(mockClusterExpected.getDesiredConfigByType("cluster-env")).andReturn(mockClusterEnv).atLeastOnce(); |
| expect(mockClusterExpected.getDesiredConfigByType("storm-site")).andReturn(mockStormSite).atLeastOnce(); |
| expect(mockClusterEnv.getProperties()).andReturn(propertiesExpectedClusterEnv).anyTimes(); |
| expect(mockStormSite.getProperties()).andReturn(propertiesExpectedStormSite).anyTimes(); |
| |
| easyMockSupport.replayAll(); |
| mockInjector.getInstance(UpgradeCatalog210.class).updateStormConfigs(); |
| easyMockSupport.verifyAll(); |
| } |
| |
| @Test |
| public void testUpdateHBaseConfiguration() throws Exception { |
| EasyMockSupport easyMockSupport = new EasyMockSupport(); |
| final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class); |
| final ConfigHelper mockConfigHelper = easyMockSupport.createMock(ConfigHelper.class); |
| |
| final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class); |
| final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class); |
| final Host mockHost = easyMockSupport.createNiceMock(Host.class); |
| |
| final Config mockHBaseSite = easyMockSupport.createNiceMock(Config.class); |
| final Config mockHBaseEnv = easyMockSupport.createNiceMock(Config.class); |
| |
| final Map<String, String> propertiesExpectedHBaseSite = new HashMap<String, String>(); |
| propertiesExpectedHBaseSite.put("hbase.region.server.rpc.scheduler.factory.class", |
| "org.apache.phoenix.hbase.index.ipc.PhoenixIndexRpcSchedulerFactory"); |
| propertiesExpectedHBaseSite.put("hbase.security.authorization", "true"); |
| |
| final Map<String, String> propertiesExpectedHBaseEnv = new HashMap<String, String>(); |
| propertiesExpectedHBaseEnv.put("phoenix_sql_enabled", "false"); |
| |
| final Injector mockInjector = Guice.createInjector(new AbstractModule() { |
| @Override |
| protected void configure() { |
| bind(AmbariManagementController.class).toInstance(mockAmbariManagementController); |
| bind(ConfigHelper.class).toInstance(mockConfigHelper); |
| bind(Clusters.class).toInstance(mockClusters); |
| |
| bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); |
| bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| } |
| }); |
| |
| expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).once(); |
| expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{ |
| put("normal", mockClusterExpected); |
| }}).once(); |
| |
| expect(mockClusterExpected.getDesiredConfigByType("hbase-site")).andReturn(mockHBaseSite).atLeastOnce(); |
| expect(mockClusterExpected.getDesiredConfigByType("hbase-env")).andReturn(mockHBaseEnv).atLeastOnce(); |
| expect(mockHBaseSite.getProperties()).andReturn(propertiesExpectedHBaseSite).anyTimes(); |
| expect(mockHBaseEnv.getProperties()).andReturn(propertiesExpectedHBaseEnv).anyTimes(); |
| |
| Capture<String> configType = new Capture<String>(); |
| Capture<String> configTag = new Capture<String>(); |
| expect(mockClusterExpected.getConfig(capture(configType), capture(configTag))). |
| andReturn(mockHBaseSite).atLeastOnce(); |
| |
| easyMockSupport.replayAll(); |
| mockInjector.getInstance(UpgradeCatalog210.class).updateHBaseConfigs(); |
| easyMockSupport.verifyAll(); |
| } |
| |
| @Test |
| public void testDeleteStormRestApiServiceComponent() throws Exception { |
| ClusterEntity clusterEntity = upgradeCatalogHelper.createCluster(injector, |
| "c1", desiredStackEntity); |
| ClusterServiceEntity clusterServiceEntity = upgradeCatalogHelper.createService( |
| injector, clusterEntity, "STORM"); |
| HostEntity hostEntity = upgradeCatalogHelper.createHost(injector, |
| clusterEntity, "h1"); |
| |
| // Set current stack version |
| ClusterDAO clusterDAO = injector.getInstance(ClusterDAO.class); |
| ClusterStateDAO clusterStateDAO = injector.getInstance(ClusterStateDAO.class); |
| ClusterStateEntity clusterStateEntity = new ClusterStateEntity(); |
| clusterStateEntity.setClusterId(clusterEntity.getClusterId()); |
| clusterStateEntity.setClusterEntity(clusterEntity); |
| clusterStateEntity.setCurrentStack(desiredStackEntity); |
| clusterStateDAO.create(clusterStateEntity); |
| clusterEntity.setClusterStateEntity(clusterStateEntity); |
| clusterDAO.merge(clusterEntity); |
| |
| ServiceComponentDesiredStateEntity componentDesiredStateEntity = new ServiceComponentDesiredStateEntity(); |
| componentDesiredStateEntity.setClusterId(clusterEntity.getClusterId()); |
| componentDesiredStateEntity.setServiceName(clusterServiceEntity.getServiceName()); |
| componentDesiredStateEntity.setClusterServiceEntity(clusterServiceEntity); |
| componentDesiredStateEntity.setComponentName("STORM_REST_API"); |
| componentDesiredStateEntity.setDesiredStack(desiredStackEntity); |
| |
| ServiceComponentDesiredStateDAO componentDesiredStateDAO = |
| injector.getInstance(ServiceComponentDesiredStateDAO.class); |
| |
| componentDesiredStateDAO.create(componentDesiredStateEntity); |
| |
| HostComponentDesiredStateDAO hostComponentDesiredStateDAO = |
| injector.getInstance(HostComponentDesiredStateDAO.class); |
| |
| HostComponentDesiredStateEntity hostComponentDesiredStateEntity = new HostComponentDesiredStateEntity(); |
| |
| hostComponentDesiredStateEntity.setClusterId(clusterEntity.getClusterId()); |
| hostComponentDesiredStateEntity.setComponentName("STORM_REST_API"); |
| hostComponentDesiredStateEntity.setAdminState(HostComponentAdminState.INSERVICE); |
| hostComponentDesiredStateEntity.setServiceName(clusterServiceEntity.getServiceName()); |
| hostComponentDesiredStateEntity.setServiceComponentDesiredStateEntity(componentDesiredStateEntity); |
| hostComponentDesiredStateEntity.setHostEntity(hostEntity); |
| hostComponentDesiredStateEntity.setDesiredStack(desiredStackEntity); |
| |
| hostComponentDesiredStateDAO.create(hostComponentDesiredStateEntity); |
| |
| HostComponentDesiredStateEntity entity = hostComponentDesiredStateDAO.findAll().get(0); |
| |
| Assert.assertEquals(HostComponentAdminState.INSERVICE.name(), entity.getAdminState().name()); |
| |
| // ensure the desired state exists |
| Assert.assertNotNull(componentDesiredStateDAO.findByName(clusterEntity.getClusterId(), "STORM", |
| "STORM_REST_API")); |
| |
| UpgradeCatalog210 upgradeCatalog210 = injector.getInstance(UpgradeCatalog210.class); |
| upgradeCatalog210.removeStormRestApiServiceComponent(); |
| |
| Assert.assertNull(componentDesiredStateDAO.findByName(clusterEntity.getClusterId(), "STORM", |
| "STORM_REST_API")); |
| } |
| |
| |
| @Test |
| public void testUpdateHDFSConfiguration() throws Exception { |
| EasyMockSupport easyMockSupport = new EasyMockSupport(); |
| final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class); |
| final ConfigHelper mockConfigHelper = easyMockSupport.createMock(ConfigHelper.class); |
| |
| final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class); |
| final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class); |
| |
| final Config mockHdfsSite = easyMockSupport.createNiceMock(Config.class); |
| final Config mockCoreSite = easyMockSupport.createStrictMock(Config.class); |
| |
| final Map<String, String> propertiesExpectedHdfs = new HashMap<String, String>(); |
| final Map<String, String> propertiesExpectedCoreSite = new HashMap<String, String>(); |
| propertiesExpectedCoreSite.put("fs.defaultFS", "hdfs://EXAMPLE.COM:8020"); |
| final Injector mockInjector = Guice.createInjector(new AbstractModule() { |
| @Override |
| protected void configure() { |
| bind(AmbariManagementController.class).toInstance(mockAmbariManagementController); |
| bind(ConfigHelper.class).toInstance(mockConfigHelper); |
| bind(Clusters.class).toInstance(mockClusters); |
| |
| bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class)); |
| bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| } |
| }); |
| |
| expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).once(); |
| expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{ |
| put("normal", mockClusterExpected); |
| }}).once(); |
| |
| // Expected operation |
| expect(mockClusterExpected.getDesiredConfigByType("hadoop-env")).andReturn(null).once(); |
| |
| // Expected operation |
| expect(mockClusterExpected.getDesiredConfigByType("hdfs-site")).andReturn(mockHdfsSite).atLeastOnce(); |
| expect(mockClusterExpected.getHosts("HDFS", "NAMENODE")).andReturn( new HashSet<String>() {{ |
| add("host1"); |
| }}).atLeastOnce(); |
| expect(mockHdfsSite.getProperties()).andReturn(propertiesExpectedHdfs).anyTimes(); |
| |
| expect(mockClusterExpected.getDesiredConfigByType("core-site")).andReturn(mockCoreSite).anyTimes(); |
| expect(mockCoreSite.getProperties()).andReturn(propertiesExpectedCoreSite).anyTimes(); |
| |
| easyMockSupport.replayAll(); |
| mockInjector.getInstance(UpgradeCatalog210.class).updateHdfsConfigs(); |
| easyMockSupport.verifyAll(); |
| } |
| |
| /** |
| * @param dbAccessor |
| * @return |
| */ |
| private AbstractUpgradeCatalog getUpgradeCatalog(final DBAccessor dbAccessor) { |
| Module module = new Module() { |
| @Override |
| public void configure(Binder binder) { |
| binder.bind(DBAccessor.class).toInstance(dbAccessor); |
| binder.bind(EntityManager.class).toInstance(entityManager); |
| binder.bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class)); |
| } |
| }; |
| |
| Injector injector = Guice.createInjector(module); |
| return injector.getInstance(UpgradeCatalog210.class); |
| } |
| |
| @Test |
| public void testGetSourceVersion() { |
| final DBAccessor dbAccessor = createNiceMock(DBAccessor.class); |
| UpgradeCatalog upgradeCatalog = getUpgradeCatalog(dbAccessor); |
| Assert.assertEquals("2.0.0", upgradeCatalog.getSourceVersion()); |
| } |
| |
| @Test |
| public void testGetTargetVersion() throws Exception { |
| final DBAccessor dbAccessor = createNiceMock(DBAccessor.class); |
| UpgradeCatalog upgradeCatalog = getUpgradeCatalog(dbAccessor); |
| |
| Assert.assertEquals("2.1.0", upgradeCatalog.getTargetVersion()); |
| } |
| |
| @Test |
| public void testUpdateKerberosDescriptorArtifact_Simple() throws Exception { |
| final KerberosDescriptorFactory kerberosDescriptorFactory = new KerberosDescriptorFactory(); |
| |
| KerberosServiceDescriptor serviceDescriptor; |
| |
| URL systemResourceURL = ClassLoader.getSystemResource("kerberos/test_kerberos_descriptor_simple.json"); |
| assertNotNull(systemResourceURL); |
| |
| final KerberosDescriptor kerberosDescriptorOrig = kerberosDescriptorFactory.createInstance(new File(systemResourceURL.getFile())); |
| assertNotNull(kerberosDescriptorOrig); |
| assertNotNull(kerberosDescriptorOrig.getIdentity("hdfs")); |
| |
| serviceDescriptor = kerberosDescriptorOrig.getService("HDFS"); |
| assertNotNull(serviceDescriptor); |
| assertNotNull(serviceDescriptor.getIdentity("/hdfs")); |
| assertNull(serviceDescriptor.getIdentity("hdfs")); |
| |
| serviceDescriptor = kerberosDescriptorOrig.getService("OOZIE"); |
| assertNotNull(serviceDescriptor); |
| assertNotNull(serviceDescriptor.getIdentity("/hdfs")); |
| assertNull(serviceDescriptor.getIdentity("/HDFS/hdfs")); |
| |
| UpgradeCatalog210 upgradeMock = createMockBuilder(UpgradeCatalog210.class).createMock(); |
| |
| Capture<Map<String, Object>> updatedData = new Capture<Map<String, Object>>(); |
| |
| ArtifactEntity artifactEntity = createNiceMock(ArtifactEntity.class); |
| expect(artifactEntity.getArtifactData()) |
| .andReturn(kerberosDescriptorOrig.toMap()) |
| .once(); |
| |
| artifactEntity.setArtifactData(capture(updatedData)); |
| expectLastCall().once(); |
| |
| replay(artifactEntity, upgradeMock); |
| upgradeMock.updateKerberosDescriptorArtifact(createNiceMock(ArtifactDAO.class), artifactEntity); |
| verify(artifactEntity, upgradeMock); |
| |
| KerberosDescriptor kerberosDescriptorUpdated = new KerberosDescriptorFactory().createInstance(updatedData.getValue()); |
| assertNotNull(kerberosDescriptorUpdated); |
| assertNull(kerberosDescriptorUpdated.getIdentity("/hdfs")); |
| |
| serviceDescriptor = kerberosDescriptorUpdated.getService("HDFS"); |
| assertNotNull(serviceDescriptor); |
| assertNull(serviceDescriptor.getIdentity("/hdfs")); |
| assertNotNull(serviceDescriptor.getIdentity("hdfs")); |
| |
| serviceDescriptor = kerberosDescriptorUpdated.getService("OOZIE"); |
| assertNotNull(serviceDescriptor); |
| assertNull(serviceDescriptor.getIdentity("/hdfs")); |
| assertNotNull(serviceDescriptor.getIdentity("/HDFS/hdfs")); |
| } |
| |
| @Test |
| public void testUpdateKerberosDescriptorArtifact_NoHDFSService() throws Exception { |
| final KerberosDescriptorFactory kerberosDescriptorFactory = new KerberosDescriptorFactory(); |
| |
| KerberosServiceDescriptor serviceDescriptor; |
| |
| URL systemResourceURL = ClassLoader.getSystemResource("kerberos/test_kerberos_descriptor_no_hdfs.json"); |
| assertNotNull(systemResourceURL); |
| |
| final KerberosDescriptor kerberosDescriptorOrig = kerberosDescriptorFactory.createInstance(new File(systemResourceURL.getFile())); |
| assertNotNull(kerberosDescriptorOrig); |
| assertNotNull(kerberosDescriptorOrig.getIdentity("hdfs")); |
| |
| serviceDescriptor = kerberosDescriptorOrig.getService("HDFS"); |
| assertNull(serviceDescriptor); |
| |
| serviceDescriptor = kerberosDescriptorOrig.getService("OOZIE"); |
| assertNotNull(serviceDescriptor); |
| assertNotNull(serviceDescriptor.getIdentity("/hdfs")); |
| assertNull(serviceDescriptor.getIdentity("/HDFS/hdfs")); |
| |
| UpgradeCatalog210 upgradeMock = createMockBuilder(UpgradeCatalog210.class).createMock(); |
| |
| Capture<Map<String, Object>> updatedData = new Capture<Map<String, Object>>(); |
| |
| ArtifactEntity artifactEntity = createNiceMock(ArtifactEntity.class); |
| expect(artifactEntity.getArtifactData()) |
| .andReturn(kerberosDescriptorOrig.toMap()) |
| .once(); |
| |
| artifactEntity.setArtifactData(capture(updatedData)); |
| expectLastCall().once(); |
| |
| replay(artifactEntity, upgradeMock); |
| upgradeMock.updateKerberosDescriptorArtifact(createNiceMock(ArtifactDAO.class), artifactEntity); |
| verify(artifactEntity, upgradeMock); |
| |
| KerberosDescriptor kerberosDescriptorUpdated = new KerberosDescriptorFactory().createInstance(updatedData.getValue()); |
| assertNotNull(kerberosDescriptorUpdated); |
| assertNull(kerberosDescriptorUpdated.getIdentity("/hdfs")); |
| |
| serviceDescriptor = kerberosDescriptorUpdated.getService("HDFS"); |
| assertNotNull(serviceDescriptor); |
| assertNull(serviceDescriptor.getIdentity("/hdfs")); |
| assertNotNull(serviceDescriptor.getIdentity("hdfs")); |
| |
| serviceDescriptor = kerberosDescriptorUpdated.getService("OOZIE"); |
| assertNotNull(serviceDescriptor); |
| assertNull(serviceDescriptor.getIdentity("/hdfs")); |
| assertNotNull(serviceDescriptor.getIdentity("/HDFS/hdfs")); |
| } |
| |
| // *********** Inner Classes that represent sections of the DDL *********** |
| // ************************************************************************ |
| |
| /** |
| * Verify that all of the host-related tables added a column for the host_id |
| */ |
| class HostSectionDDL implements SectionDDL { |
| |
| HashMap<String, Capture<DBColumnInfo>> captures; |
| |
| public HostSectionDDL() { |
| // Capture all tables that will have the host_id column added to it. |
| captures = new HashMap<String, Capture<DBColumnInfo>>(); |
| |
| // Column Capture section |
| // Hosts |
| Capture<DBAccessor.DBColumnInfo> clusterHostMappingColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> configGroupHostMappingColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> hostConfigMappingColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> hostsColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> hostComponentStateColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> hostComponentDesiredStateColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> hostRoleCommandColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> hostStateColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> hostVersionColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> kerberosPrincipalHostColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> requestOperationLevelColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> serviceConfigHostsColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| |
| captures.put("ClusterHostMapping", clusterHostMappingColumnCapture); |
| captures.put("configgrouphostmapping", configGroupHostMappingColumnCapture); |
| captures.put("hostconfigmapping", hostConfigMappingColumnCapture); |
| captures.put("hosts", hostsColumnCapture); |
| captures.put("hostcomponentstate", hostComponentStateColumnCapture); |
| captures.put("hostcomponentdesiredstate", hostComponentDesiredStateColumnCapture); |
| captures.put("host_role_command", hostRoleCommandColumnCapture); |
| captures.put("hoststate", hostStateColumnCapture); |
| captures.put("host_version", hostVersionColumnCapture); |
| captures.put("kerberos_principal_host", kerberosPrincipalHostColumnCapture); |
| captures.put("requestoperationlevel", requestOperationLevelColumnCapture); |
| captures.put("serviceconfighosts", serviceConfigHostsColumnCapture); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void execute(DBAccessor dbAccessor) throws SQLException { |
| // Add columns and alter table section |
| dbAccessor.addColumn(eq("ClusterHostMapping"), capture(captures.get("ClusterHostMapping"))); |
| dbAccessor.addColumn(eq("configgrouphostmapping"), capture(captures.get("configgrouphostmapping"))); |
| dbAccessor.addColumn(eq("hostconfigmapping"), capture(captures.get("hostconfigmapping"))); |
| dbAccessor.addColumn(eq("hosts"), capture(captures.get("hosts"))); |
| dbAccessor.addColumn(eq("hostcomponentstate"), capture(captures.get("hostcomponentstate"))); |
| dbAccessor.addColumn(eq("hostcomponentdesiredstate"), capture(captures.get("hostcomponentdesiredstate"))); |
| dbAccessor.addColumn(eq("host_role_command"), capture(captures.get("host_role_command"))); |
| dbAccessor.addColumn(eq("hoststate"), capture(captures.get("hoststate"))); |
| dbAccessor.addColumn(eq("host_version"), capture(captures.get("host_version"))); |
| dbAccessor.addColumn(eq("kerberos_principal_host"), capture(captures.get("kerberos_principal_host"))); |
| dbAccessor.addColumn(eq("requestoperationlevel"), capture(captures.get("requestoperationlevel"))); |
| dbAccessor.addColumn(eq("serviceconfighosts"), capture(captures.get("serviceconfighosts"))); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void verify(DBAccessor dbAccessor) throws SQLException { |
| // Verification section |
| for (Capture<DBColumnInfo> columnCapture : captures.values()) { |
| verifyContainsHostIdColumn(columnCapture); |
| } |
| } |
| |
| /** |
| * Verify that the column capture of the table contains a host_id column of type Long. |
| * This is needed for all of the host-related tables that are switching from the |
| * host_name to the host_id. |
| * @param columnCapture |
| */ |
| private void verifyContainsHostIdColumn(Capture<DBAccessor.DBColumnInfo> columnCapture) { |
| DBColumnInfo idColumn = columnCapture.getValue(); |
| Assert.assertEquals(Long.class, idColumn.getType()); |
| Assert.assertEquals("host_id", idColumn.getName()); |
| } |
| } |
| |
| /** |
| * Verify that the widget, widget_layout, and widget_layout_user_widget tables are created correctly. |
| */ |
| class WidgetSectionDDL implements SectionDDL { |
| |
| HashMap<String, Capture<List<DBColumnInfo>>> captures; |
| Capture<DBColumnInfo> userActiveLayoutsColumnCapture; |
| |
| public WidgetSectionDDL() { |
| captures = new HashMap<String, Capture<List<DBColumnInfo>>>(); |
| |
| Capture<List<DBColumnInfo>> userWidgetColumnsCapture = new Capture<List<DBColumnInfo>>(); |
| Capture<List<DBColumnInfo>> widgetLayoutColumnsCapture = new Capture<List<DBColumnInfo>>(); |
| Capture<List<DBColumnInfo>> widgetLayoutUserWidgetColumnsCapture = new Capture<List<DBColumnInfo>>(); |
| |
| captures.put("widget", userWidgetColumnsCapture); |
| captures.put("widget_layout", widgetLayoutColumnsCapture); |
| captures.put("widget_layout_user_widget", widgetLayoutUserWidgetColumnsCapture); |
| userActiveLayoutsColumnCapture = new Capture<DBColumnInfo>(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void execute(DBAccessor dbAccessor) throws SQLException { |
| Capture<List<DBColumnInfo>> userWidgetColumnsCapture = captures.get("widget"); |
| Capture<List<DBColumnInfo>> widgetLayoutColumnsCapture = captures.get("widget_layout"); |
| Capture<List<DBColumnInfo>> widgetLayoutUserWidgetColumnsCapture = captures.get("widget_layout_user_widget"); |
| |
| // User Widget |
| dbAccessor.createTable(eq("widget"), |
| capture(userWidgetColumnsCapture), eq("id")); |
| |
| // Widget Layout |
| dbAccessor.createTable(eq("widget_layout"), |
| capture(widgetLayoutColumnsCapture), eq("id")); |
| |
| // Widget Layout User Widget |
| dbAccessor.createTable(eq("widget_layout_user_widget"), |
| capture(widgetLayoutUserWidgetColumnsCapture), eq("widget_layout_id"), eq("widget_id")); |
| |
| dbAccessor.addColumn(eq("users"), capture(userActiveLayoutsColumnCapture)); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void verify(DBAccessor dbAccessor) throws SQLException { |
| Capture<List<DBColumnInfo>> widgetColumnsCapture = captures.get("widget"); |
| Capture<List<DBColumnInfo>> widgetLayoutColumnsCapture = captures.get("widget_layout"); |
| Capture<List<DBColumnInfo>> widgetLayoutUserWidgetColumnsCapture = captures.get("widget_layout_user_widget"); |
| |
| // Verify widget tables |
| assertEquals(12, widgetColumnsCapture.getValue().size()); |
| assertEquals(7, widgetLayoutColumnsCapture.getValue().size()); |
| assertEquals(3, widgetLayoutUserWidgetColumnsCapture.getValue().size()); |
| |
| DBColumnInfo idColumn = userActiveLayoutsColumnCapture.getValue(); |
| Assert.assertEquals(String.class, idColumn.getType()); |
| Assert.assertEquals("active_widget_layouts", idColumn.getName()); |
| } |
| } |
| |
| /** |
| * Verify view changes |
| */ |
| class ViewSectionDDL implements SectionDDL { |
| |
| HashMap<String, Capture<DBColumnInfo>> captures; |
| |
| public ViewSectionDDL() { |
| captures = new HashMap<String, Capture<DBColumnInfo>>(); |
| |
| Capture<DBAccessor.DBColumnInfo> viewInstanceColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> viewInstanceAlterNamesColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> viewParamColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| Capture<DBAccessor.DBColumnInfo> viewBuildColumnCapture = new Capture<DBAccessor.DBColumnInfo>(); |
| |
| captures.put("viewinstance", viewInstanceColumnCapture); |
| captures.put("viewinstance_alter_names", viewInstanceAlterNamesColumnCapture); |
| captures.put("viewparameter", viewParamColumnCapture); |
| captures.put("viewmain", viewBuildColumnCapture); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void execute(DBAccessor dbAccessor) throws SQLException { |
| Capture<DBColumnInfo> viewInstanceColumnCapture = captures.get("viewinstance"); |
| Capture<DBColumnInfo> viewInstanceAlterNamesColumnCapture = captures.get("viewinstance_alter_names"); |
| Capture<DBColumnInfo> viewParamColumnCapture = captures.get("viewparameter"); |
| Capture<DBColumnInfo> viewBuildColumnCapture = captures.get("viewmain"); |
| |
| dbAccessor.addColumn(eq("viewinstance"), capture(viewInstanceColumnCapture)); |
| dbAccessor.addColumn(eq("viewinstance"), capture(viewInstanceAlterNamesColumnCapture)); |
| dbAccessor.addColumn(eq("viewparameter"), capture(viewParamColumnCapture)); |
| dbAccessor.addColumn(eq("viewmain"), capture(viewBuildColumnCapture)); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void verify(DBAccessor dbAccessor) throws SQLException { |
| verifyViewInstance(captures.get("viewinstance")); |
| verifyViewInstanceAlterNames(captures.get("viewinstance_alter_names")); |
| verifyViewParameter(captures.get("viewparameter")); |
| verifyViewBuild(captures.get("viewmain")); |
| } |
| |
| private void verifyViewInstance(Capture<DBAccessor.DBColumnInfo> viewInstanceColumnCapture) { |
| DBColumnInfo clusterIdColumn = viewInstanceColumnCapture.getValue(); |
| Assert.assertEquals(String.class, clusterIdColumn.getType()); |
| Assert.assertEquals("cluster_handle", clusterIdColumn.getName()); |
| } |
| |
| private void verifyViewInstanceAlterNames(Capture<DBAccessor.DBColumnInfo> viewInstanceAlterNamesColumnCapture) { |
| DBColumnInfo clusterIdColumn = viewInstanceAlterNamesColumnCapture.getValue(); |
| Assert.assertEquals(Integer.class, clusterIdColumn.getType()); |
| Assert.assertEquals("alter_names", clusterIdColumn.getName()); |
| } |
| |
| private void verifyViewParameter(Capture<DBAccessor.DBColumnInfo> viewParamColumnCapture) { |
| DBColumnInfo clusterConfigColumn = viewParamColumnCapture.getValue(); |
| Assert.assertEquals(String.class, clusterConfigColumn.getType()); |
| Assert.assertEquals("cluster_config", clusterConfigColumn.getName()); |
| } |
| |
| private void verifyViewBuild(Capture<DBAccessor.DBColumnInfo> viewBuildColumnCapture) { |
| DBColumnInfo clusterConfigColumn = viewBuildColumnCapture.getValue(); |
| Assert.assertEquals(String.class, clusterConfigColumn.getType()); |
| Assert.assertEquals("build", clusterConfigColumn.getName()); |
| } |
| } |
| |
| /** |
| * Verify alert changes |
| */ |
| class AlertSectionDDL implements SectionDDL { |
| HashMap<String, Capture<String>> stringCaptures; |
| HashMap<String, Capture<Class>> classCaptures; |
| |
| |
| public AlertSectionDDL() { |
| stringCaptures = new HashMap<String, Capture<String>>(); |
| classCaptures = new HashMap<String, Capture<Class>>(); |
| |
| Capture<String> textCaptureC = new Capture<String>(); |
| Capture<String> textCaptureH = new Capture<String>(); |
| Capture<Class> classFromC = new Capture<Class>(); |
| Capture<Class> classFromH = new Capture<Class>(); |
| Capture<Class> classToC = new Capture<Class>(); |
| Capture<Class> classToH = new Capture<Class>(); |
| |
| stringCaptures.put("textCaptureC", textCaptureC); |
| stringCaptures.put("textCaptureH", textCaptureH); |
| classCaptures.put("classFromC", classFromC); |
| classCaptures.put("classFromH", classFromH); |
| classCaptures.put("classToC", classToC); |
| classCaptures.put("classToH", classToH); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void execute(DBAccessor dbAccessor) throws SQLException { |
| Capture<String> textCaptureC = stringCaptures.get("textCaptureC"); |
| Capture<String> textCaptureH = stringCaptures.get("textCaptureH"); |
| Capture<Class> classFromC = classCaptures.get("classFromC"); |
| Capture<Class> classFromH = classCaptures.get("classFromH"); |
| Capture<Class> classToC = classCaptures.get("classToC"); |
| Capture<Class> classToH = classCaptures.get("classToH"); |
| |
| dbAccessor.changeColumnType(eq("alert_current"), capture(textCaptureC), capture(classFromC), capture(classToC)); |
| dbAccessor.changeColumnType(eq("alert_history"), capture(textCaptureH), capture(classFromH), capture(classToH)); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void verify(DBAccessor dbAccessor) throws SQLException { |
| Capture<String> textCaptureC = stringCaptures.get("textCaptureC"); |
| Capture<String> textCaptureH = stringCaptures.get("textCaptureH"); |
| Capture<Class> classFromC = classCaptures.get("classFromC"); |
| Capture<Class> classFromH = classCaptures.get("classFromH"); |
| Capture<Class> classToC = classCaptures.get("classToC"); |
| Capture<Class> classToH = classCaptures.get("classToH"); |
| |
| Assert.assertEquals("latest_text", textCaptureC.getValue()); |
| Assert.assertEquals(String.class, classFromC.getValue()); |
| Assert.assertEquals(char[].class, classToC.getValue()); |
| |
| Assert.assertEquals("alert_text", textCaptureH.getValue()); |
| Assert.assertEquals(String.class, classFromH.getValue()); |
| Assert.assertEquals(char[].class, classToH.getValue()); |
| } |
| } |
| } |