/*
* 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 static org.easymock.EasyMock.anyString;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import org.apache.ambari.server.configuration.Configuration;
import org.apache.ambari.server.orm.DBAccessor;
import org.apache.ambari.server.orm.dao.DaoUtils;
import org.apache.ambari.server.orm.dao.PermissionDAO;
import org.apache.ambari.server.orm.dao.ResourceTypeDAO;
import org.apache.ambari.server.orm.dao.RoleAuthorizationDAO;
import org.apache.ambari.server.orm.entities.PermissionEntity;
import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
import org.apache.ambari.server.orm.entities.RoleAuthorizationEntity;
import org.apache.ambari.server.state.stack.OsFamily;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.easymock.EasyMockSupport;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
/**
* UpgradeCatalog230 tests.
*/
public class UpgradeCatalog230Test extends EasyMockSupport {
private Injector injector;
@Before
public void setup() {
resetAll();
Module module = new Module() {
@Override
public void configure(Binder binder) {
binder.bind(DBAccessor.class).toInstance(createMock(DBAccessor.class));
binder.bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class));
binder.bind(EntityManager.class).toInstance(createNiceMock(EntityManager.class));
binder.bind(DaoUtils.class).toInstance(createNiceMock(DaoUtils.class));
binder.bind(PermissionDAO.class).toInstance(createMock(PermissionDAO.class));
binder.bind(ResourceTypeDAO.class).toInstance(createMock(ResourceTypeDAO.class));
binder.bind(RoleAuthorizationDAO.class).toInstance(createMock(RoleAuthorizationDAO.class));
}
};
injector = Guice.createInjector(module);
}
@Test
public void testExecuteDDLUpdates() throws Exception {
final DBAccessor dbAccessor = injector.getInstance(DBAccessor.class);
Configuration configuration = createNiceMock(Configuration.class);
expect(configuration.getDatabaseUrl()).andReturn(Configuration.JDBC_IN_MEMORY_URL).anyTimes();
Capture<DBAccessor.DBColumnInfo> columnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> columnCaptureUserType = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> columnCapturePermissionLabel = EasyMock.newCapture();
Capture<List<DBAccessor.DBColumnInfo>> columnsCaptureRoleAuthorization = EasyMock.newCapture();
Capture<List<DBAccessor.DBColumnInfo>> columnsCapturePermissionRoleAuthorization = EasyMock.newCapture();
dbAccessor.alterColumn(eq("host_role_command"), capture(columnCapture));
expectLastCall();
dbAccessor.executeQuery("UPDATE users SET user_type='LDAP' WHERE ldap_user=1");
expectLastCall();
dbAccessor.addUniqueConstraint("users", "UNQ_users_0", "user_name", "user_type");
expectLastCall();
dbAccessor.addColumn(eq("users"), capture(columnCaptureUserType));
expectLastCall();
dbAccessor.addColumn(eq("adminpermission"), capture(columnCapturePermissionLabel));
expectLastCall();
dbAccessor.createTable(eq("roleauthorization"), capture(columnsCaptureRoleAuthorization), eq("authorization_id"));
expectLastCall();
dbAccessor.createTable(eq("permission_roleauthorization"), capture(columnsCapturePermissionRoleAuthorization), eq("permission_id"), eq("authorization_id"));
expectLastCall();
dbAccessor.addFKConstraint("permission_roleauthorization", "FK_permission_roleauth_pid",
"permission_id", "adminpermission", "permission_id", false);
expectLastCall();
dbAccessor.addFKConstraint("permission_roleauthorization", "FK_permission_roleauth_aid",
"authorization_id", "roleauthorization", "authorization_id", false);
expectLastCall();
replayAll();
AbstractUpgradeCatalog upgradeCatalog = injector.getInstance(UpgradeCatalog230.class);
Class<?> c = AbstractUpgradeCatalog.class;
Field f = c.getDeclaredField("configuration");
f.setAccessible(true);
f.set(upgradeCatalog, configuration);
upgradeCatalog.executeDDLUpdates();
verifyAll();
assertTrue(columnCapture.getValue().isNullable());
assertEquals(columnCaptureUserType.getValue().getName(), "user_type");
assertEquals(columnCaptureUserType.getValue().getType(), String.class);
assertEquals(columnCaptureUserType.getValue().getLength(), null);
assertEquals(columnCaptureUserType.getValue().getDefaultValue(), "LOCAL");
assertEquals(columnCaptureUserType.getValue().isNullable(), true);
assertEquals(columnCapturePermissionLabel.getValue().getName(), "permission_label");
assertEquals(columnCapturePermissionLabel.getValue().getType(), String.class);
assertEquals(columnCapturePermissionLabel.getValue().getLength(), Integer.valueOf(255));
assertEquals(columnCapturePermissionLabel.getValue().isNullable(), true);
List<DBAccessor.DBColumnInfo> columnInfos;
DBAccessor.DBColumnInfo columnInfo;
// Verify roleauthorization table
columnInfos = columnsCaptureRoleAuthorization.getValue();
assertEquals(2, columnInfos.size());
columnInfo = columnInfos.get(0);
assertEquals("authorization_id", columnInfo.getName());
assertEquals(String.class, columnInfo.getType());
assertEquals(Integer.valueOf(100), columnInfo.getLength());
columnInfo = columnInfos.get(1);
assertEquals("authorization_name", columnInfo.getName());
assertEquals(String.class, columnInfo.getType());
assertEquals(Integer.valueOf(255), columnInfo.getLength());
// Verify permission_roleauthorization table
columnInfos = columnsCapturePermissionRoleAuthorization.getValue();
assertEquals(2, columnInfos.size());
columnInfo = columnInfos.get(0);
assertEquals("permission_id", columnInfo.getName());
assertEquals(Long.class, columnInfo.getType());
assertEquals(null, columnInfo.getLength());
columnInfo = columnInfos.get(1);
assertEquals("authorization_id", columnInfo.getName());
assertEquals(String.class, columnInfo.getType());
assertEquals(Integer.valueOf(100), columnInfo.getLength());
}
@Test
public void testExecuteDMLUpdates() throws Exception {
final DBAccessor dbAccessor = injector.getInstance(DBAccessor.class);
UpgradeCatalog230 upgradeCatalog = injector.getInstance(UpgradeCatalog230.class);
final ResourceTypeEntity ambariResourceTypeEntity = createMock(ResourceTypeEntity.class);
expect(ambariResourceTypeEntity.getId()).andReturn(1).anyTimes();
final ResourceTypeEntity clusterResourceTypeEntity = createMock(ResourceTypeEntity.class);
expect(clusterResourceTypeEntity.getId()).andReturn(2).anyTimes();
final ResourceTypeEntity viewResourceTypeEntity = createMock(ResourceTypeEntity.class);
expect(viewResourceTypeEntity.getId()).andReturn(3).anyTimes();
final ResourceTypeDAO resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class);
expect(resourceTypeDAO.findByName("AMBARI")).andReturn(ambariResourceTypeEntity).anyTimes();
expect(resourceTypeDAO.findByName("CLUSTER")).andReturn(clusterResourceTypeEntity).anyTimes();
expect(resourceTypeDAO.findByName("VIEW")).andReturn(viewResourceTypeEntity).anyTimes();
final PermissionEntity viewUserPermissionEntity = createMock(PermissionEntity.class);
expect(viewUserPermissionEntity.getId()).andReturn(1).anyTimes();
final PermissionEntity ambariAdministratorPermissionEntity = createMock(PermissionEntity.class);
expect(ambariAdministratorPermissionEntity.getId()).andReturn(2).anyTimes();
final PermissionEntity clusterUserPermissionEntity = createMock(PermissionEntity.class);
expect(clusterUserPermissionEntity.getId()).andReturn(3).anyTimes();
final PermissionEntity clusterOperatorPermissionEntity = createMock(PermissionEntity.class);
expect(clusterOperatorPermissionEntity.getId()).andReturn(4).anyTimes();
final PermissionEntity clusterAdministratorPermissionEntity = createMock(PermissionEntity.class);
expect(clusterAdministratorPermissionEntity.getId()).andReturn(5).anyTimes();
final PermissionEntity serviceAdministratorPermissionEntity = createMock(PermissionEntity.class);
expect(serviceAdministratorPermissionEntity.getId()).andReturn(6).anyTimes();
final PermissionEntity serviceOperatorPermissionEntity = createMock(PermissionEntity.class);
expect(serviceOperatorPermissionEntity.getId()).andReturn(7).anyTimes();
final PermissionDAO permissionDAO = injector.getInstance(PermissionDAO.class);
expect(permissionDAO.findPermissionByNameAndType("VIEW.USER", viewResourceTypeEntity))
.andReturn(viewUserPermissionEntity)
.anyTimes();
expect(permissionDAO.findPermissionByNameAndType("AMBARI.ADMINISTRATOR", ambariResourceTypeEntity))
.andReturn(ambariAdministratorPermissionEntity)
.anyTimes();
expect(permissionDAO.findPermissionByNameAndType("CLUSTER.USER", clusterResourceTypeEntity))
.andReturn(clusterUserPermissionEntity)
.anyTimes();
expect(permissionDAO.findPermissionByNameAndType("CLUSTER.OPERATOR", clusterResourceTypeEntity))
.andReturn(clusterOperatorPermissionEntity)
.anyTimes();
expect(permissionDAO.findPermissionByNameAndType("CLUSTER.ADMINISTRATOR", clusterResourceTypeEntity))
.andReturn(clusterAdministratorPermissionEntity)
.anyTimes();
expect(permissionDAO.findPermissionByNameAndType("SERVICE.ADMINISTRATOR", clusterResourceTypeEntity))
.andReturn(serviceAdministratorPermissionEntity)
.anyTimes();
expect(permissionDAO.findPermissionByNameAndType("SERVICE.OPERATOR", clusterResourceTypeEntity))
.andReturn(serviceOperatorPermissionEntity)
.anyTimes();
String updateQueryPattern;
// Set permission labels
updateQueryPattern = "UPDATE adminpermission SET permission_label='%s' WHERE permission_id=%d";
expect(dbAccessor.executeUpdate(String.format(updateQueryPattern,
"Ambari Administrator", PermissionEntity.AMBARI_ADMINISTRATOR_PERMISSION)))
.andReturn(1).once();
expect(dbAccessor.executeUpdate(String.format(updateQueryPattern,
"Cluster User", PermissionEntity.CLUSTER_USER_PERMISSION)))
.andReturn(1).once();
expect(dbAccessor.executeUpdate(String.format(updateQueryPattern,
"Cluster Administrator", PermissionEntity.CLUSTER_ADMINISTRATOR_PERMISSION)))
.andReturn(1).once();
expect(dbAccessor.executeUpdate(String.format(updateQueryPattern,
"View User", PermissionEntity.VIEW_USER_PERMISSION)))
.andReturn(1).once();
// Update permissions names
updateQueryPattern = "UPDATE adminpermission SET permission_name='%s' WHERE permission_id=%d";
expect(dbAccessor.executeUpdate(String.format(updateQueryPattern,
PermissionEntity.AMBARI_ADMINISTRATOR_PERMISSION_NAME, PermissionEntity.AMBARI_ADMINISTRATOR_PERMISSION)))
.andReturn(1).once();
expect(dbAccessor.executeUpdate(String.format(updateQueryPattern,
PermissionEntity.CLUSTER_USER_PERMISSION_NAME, PermissionEntity.CLUSTER_USER_PERMISSION)))
.andReturn(1).once();
expect(dbAccessor.executeUpdate(String.format(updateQueryPattern,
PermissionEntity.CLUSTER_ADMINISTRATOR_PERMISSION_NAME, PermissionEntity.CLUSTER_ADMINISTRATOR_PERMISSION)))
.andReturn(1).once();
expect(dbAccessor.executeUpdate(String.format(updateQueryPattern,
PermissionEntity.VIEW_USER_PERMISSION_NAME, PermissionEntity.VIEW_USER_PERMISSION)))
.andReturn(1).once();
RoleAuthorizationEntity roleAuthorization = createMock(RoleAuthorizationEntity.class);
RoleAuthorizationDAO roleAuthorizationDAO = injector.getInstance(RoleAuthorizationDAO.class);
expect(roleAuthorizationDAO.findById(anyString())).andReturn(roleAuthorization).anyTimes();
Collection<RoleAuthorizationEntity> authorizations = new ArrayList<>();
expect(ambariAdministratorPermissionEntity.getAuthorizations()).andReturn(authorizations).atLeastOnce();
expect(clusterAdministratorPermissionEntity.getAuthorizations()).andReturn(authorizations).atLeastOnce();
expect(clusterOperatorPermissionEntity.getAuthorizations()).andReturn(authorizations).atLeastOnce();
expect(serviceAdministratorPermissionEntity.getAuthorizations()).andReturn(authorizations).atLeastOnce();
expect(serviceOperatorPermissionEntity.getAuthorizations()).andReturn(authorizations).atLeastOnce();
expect(clusterUserPermissionEntity.getAuthorizations()).andReturn(authorizations).atLeastOnce();
expect(viewUserPermissionEntity.getAuthorizations()).andReturn(authorizations).atLeastOnce();
expect(permissionDAO.merge(ambariAdministratorPermissionEntity)).andReturn(ambariAdministratorPermissionEntity).atLeastOnce();
expect(permissionDAO.merge(clusterAdministratorPermissionEntity)).andReturn(clusterAdministratorPermissionEntity).atLeastOnce();
expect(permissionDAO.merge(clusterOperatorPermissionEntity)).andReturn(clusterOperatorPermissionEntity).atLeastOnce();
expect(permissionDAO.merge(serviceAdministratorPermissionEntity)).andReturn(serviceAdministratorPermissionEntity).atLeastOnce();
expect(permissionDAO.merge(serviceOperatorPermissionEntity)).andReturn(serviceOperatorPermissionEntity).atLeastOnce();
expect(permissionDAO.merge(clusterUserPermissionEntity)).andReturn(clusterUserPermissionEntity).atLeastOnce();
expect(permissionDAO.merge(viewUserPermissionEntity)).andReturn(viewUserPermissionEntity).atLeastOnce();
replayAll();
upgradeCatalog.executeDMLUpdates();
verifyAll();
}
@Test
public void testGetTargetVersion() throws Exception {
UpgradeCatalog upgradeCatalog = injector.getInstance(UpgradeCatalog230.class);
Assert.assertEquals("2.3.0", upgradeCatalog.getTargetVersion());
}
@Test
public void testGetSourceVersion() {
UpgradeCatalog upgradeCatalog = injector.getInstance(UpgradeCatalog230.class);
Assert.assertEquals("2.2.1", upgradeCatalog.getSourceVersion());
}
}