blob: 9054e4fe19d3845bf2f180930c45257fbe68f627 [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.ambari.server.controller.internal;
import com.google.common.collect.Lists;
import org.apache.ambari.server.controller.spi.Predicate;
import org.apache.ambari.server.controller.spi.Request;
import org.apache.ambari.server.controller.spi.RequestStatus;
import org.apache.ambari.server.controller.spi.Resource;
import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
import org.apache.ambari.server.controller.utilities.PredicateBuilder;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.apache.ambari.server.orm.dao.SettingDAO;
import org.apache.ambari.server.orm.entities.SettingEntity;
import org.apache.ambari.server.security.TestAuthenticationFactory;
import org.apache.ambari.server.security.authorization.AuthorizationException;
import org.apache.ambari.server.security.authorization.AuthorizationHelper;
import org.apache.commons.lang.RandomStringUtils;
import org.easymock.Capture;
import org.easymock.IMocksControl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.security.core.context.SecurityContextHolder;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import static org.apache.ambari.server.controller.internal.SettingResourceProvider.SETTING_NAME_PROPERTY_ID;
import static org.apache.ambari.server.controller.internal.SettingResourceProvider.SETTING_SETTING_TYPE_PROPERTY_ID;
import static org.apache.ambari.server.controller.internal.SettingResourceProvider.SETTING_CONTENT_PROPERTY_ID;
import static org.apache.ambari.server.controller.internal.SettingResourceProvider.SETTING_UPDATED_BY_PROPERTY_ID;
import static org.apache.ambari.server.controller.internal.SettingResourceProvider.SETTING_UPDATE_TIMESTAMP_PROPERTY_ID;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.createControl;
import static org.junit.Assert.assertEquals;
public class SettingResourceProviderTest {
IMocksControl mockControl;
SettingDAO dao;
SettingResourceProvider resourceProvider;
@Before
public void setUp() throws Exception {
mockControl = createControl();
dao = mockControl.createMock(SettingDAO.class);
resourceProvider = new SettingResourceProvider();
setPrivateField(resourceProvider, "dao", dao);
}
@After
public void tearDown() {
mockControl.verify();
SecurityContextHolder.getContext().setAuthentication(null);
mockControl.reset();
}
@Test(expected = AuthorizationException.class)
public void testGetResources_instance_noAuth() throws Exception {
getResources_instance(newEntity("motd"), readRequest());
}
@Test
public void testGetResources_instance_clusterUser() throws Exception {
setupAuthenticationForClusterUser();
String name = "motd";
SettingEntity entity = newEntity(name);
Set<Resource> response = getResources_instance(entity, readRequest());
assertEquals(1, response.size());
Resource resource = response.iterator().next();
assertEqualsEntityAndResource(entity, resource);
}
@Test
public void testGetResources_instance_admin() throws Exception {
setupAuthenticationForAdmin();
SettingEntity entity = newEntity("motd");
Set<Resource> response = getResources_instance(entity, readRequest());
assertEquals(1, response.size());
Resource resource = response.iterator().next();
assertEqualsEntityAndResource(entity, resource);
}
@Test(expected = AuthorizationException.class)
public void testGetResources_collection_noAuth() throws Exception {
mockControl.replay();
Request request = PropertyHelper.getReadRequest(
SETTING_NAME_PROPERTY_ID,
SETTING_CONTENT_PROPERTY_ID,
SETTING_SETTING_TYPE_PROPERTY_ID,
SETTING_UPDATED_BY_PROPERTY_ID,
SETTING_UPDATE_TIMESTAMP_PROPERTY_ID);
resourceProvider.getResources(request, null);
}
@Test
public void testGetResources_collection_clusterUser() throws Exception {
setupAuthenticationForClusterUser();
SettingEntity entity1 = newEntity("motd");
SettingEntity entity2 = newEntity("ldap");
Request request = PropertyHelper.getReadRequest(
SETTING_NAME_PROPERTY_ID,
SETTING_CONTENT_PROPERTY_ID,
SETTING_SETTING_TYPE_PROPERTY_ID,
SETTING_UPDATED_BY_PROPERTY_ID,
SETTING_UPDATE_TIMESTAMP_PROPERTY_ID);
expect(dao.findAll()).andReturn(Lists.newArrayList(entity1, entity2));
mockControl.replay();
Set<Resource> response = resourceProvider.getResources(request, null);
assertEquals(2, response.size());
Map<Object, Resource> resourceMap = new HashMap<>();
Iterator<Resource> resourceIterator = response.iterator();
Resource nextResource = resourceIterator.next();
resourceMap.put(nextResource.getPropertyValue(SETTING_NAME_PROPERTY_ID), nextResource);
nextResource = resourceIterator.next();
resourceMap.put(nextResource.getPropertyValue(SETTING_NAME_PROPERTY_ID), nextResource);
assertEqualsEntityAndResource(entity1, resourceMap.get(entity1.getName()));
assertEqualsEntityAndResource(entity2, resourceMap.get(entity2.getName()));
}
@Test
public void testGetResources_collection_admin() throws Exception {
setupAuthenticationForAdmin();
SettingEntity entity1 = newEntity("motd");
SettingEntity entity2 = newEntity("ldap");
Request request = PropertyHelper.getReadRequest(
SETTING_NAME_PROPERTY_ID,
SETTING_CONTENT_PROPERTY_ID,
SETTING_SETTING_TYPE_PROPERTY_ID,
SETTING_UPDATED_BY_PROPERTY_ID,
SETTING_UPDATE_TIMESTAMP_PROPERTY_ID);
expect(dao.findAll()).andReturn(Lists.newArrayList(entity1, entity2));
mockControl.replay();
Set<Resource> response = resourceProvider.getResources(request, null);
assertEquals(2, response.size());
Map<Object, Resource> resourceMap = new HashMap<>();
Iterator<Resource> resourceIterator = response.iterator();
Resource nextResource = resourceIterator.next();
resourceMap.put(nextResource.getPropertyValue(SETTING_NAME_PROPERTY_ID), nextResource);
nextResource = resourceIterator.next();
resourceMap.put(nextResource.getPropertyValue(SETTING_NAME_PROPERTY_ID), nextResource);
assertEqualsEntityAndResource(entity1, resourceMap.get(entity1.getName()));
assertEqualsEntityAndResource(entity2, resourceMap.get(entity2.getName()));
}
@Test(expected = AuthorizationException.class)
public void testCreateResource_noAuth() throws Exception {
mockControl.replay();
resourceProvider.createResources(createRequest(newEntity("moted")));
}
@Test(expected = AuthorizationException.class)
public void testCreateResource_clusterUser() throws Exception {
setupAuthenticationForClusterUser();
mockControl.replay();
resourceProvider.createResources(createRequest(newEntity("motd")));
}
@Test
public void testCreateResource_admin() throws Exception {
setupAuthenticationForAdmin();
SettingEntity entity = newEntity("motd");
Capture<SettingEntity> entityCapture = Capture.newInstance();
Request request = createRequest(entity);
expect(dao.findByName(entity.getName())).andReturn(null);
dao.create(capture(entityCapture));
mockControl.replay();
RequestStatus response = resourceProvider.createResources(request);
assertEquals(RequestStatus.Status.Complete, response.getStatus());
Set<Resource> associatedResources = response.getAssociatedResources();
assertEquals(1, associatedResources.size());
SettingEntity capturedEntity = entityCapture.getValue();
assertEquals(entity.getName(), capturedEntity.getName());
assertEquals(entity.getContent(), capturedEntity.getContent());
assertEquals(entity.getSettingType(), capturedEntity.getSettingType());
assertEquals(AuthorizationHelper.getAuthenticatedName(), capturedEntity.getUpdatedBy());
}
@Test(expected = ResourceAlreadyExistsException.class)
public void testCreateDuplicateResource() throws Exception {
setupAuthenticationForAdmin();
SettingEntity entity = newEntity("motd");
Request request = createRequest(entity);
expect(dao.findByName(entity.getName())).andReturn(entity);
mockControl.replay();
resourceProvider.createResources(request);
}
@Test(expected = AuthorizationException.class)
public void testUpdateResources_noAuth() throws Exception {
mockControl.replay();
resourceProvider.updateResources(updateRequest(newEntity("motd")), null);
}
@Test(expected = AuthorizationException.class)
public void testUpdateResources_clusterUser() throws Exception {
setupAuthenticationForClusterUser();
mockControl.replay();
resourceProvider.updateResources(updateRequest(newEntity("motd")), null);
}
@Test
public void testUpdateResources_admin() throws Exception {
setupAuthenticationForAdmin();
String name = "motd";
SettingEntity oldEntity = newEntity(name);
SettingEntity updatedEntity = oldEntity.clone();
updatedEntity.setContent("{text}");
updatedEntity.setSettingType("new-type");
PredicateBuilder pb = new PredicateBuilder();
Predicate predicate = pb.begin().property(SETTING_NAME_PROPERTY_ID).equals(name).end().toPredicate();
Capture<SettingEntity> capture = Capture.newInstance();
expect(dao.findByName(name)).andReturn(oldEntity);
expect(dao.merge(capture(capture))).andReturn(updatedEntity);
mockControl.replay();
RequestStatus response = resourceProvider.updateResources(updateRequest(updatedEntity), predicate);
SettingEntity capturedEntity = capture.getValue();
assertEquals(RequestStatus.Status.Complete, response.getStatus());
assertEquals(updatedEntity.getId(), capturedEntity.getId());
assertEquals(updatedEntity.getName(), capturedEntity.getName());
assertEquals(updatedEntity.getSettingType(), capturedEntity.getSettingType());
assertEquals(updatedEntity.getContent(), capturedEntity.getContent());
assertEquals(AuthorizationHelper.getAuthenticatedName(), capturedEntity.getUpdatedBy());
}
@Test(expected = AuthorizationException.class)
public void testDeleteResources_noAuth() throws Exception {
mockControl.replay();
resourceProvider.deleteResources(new RequestImpl(null, null, null, null), null);
}
@Test(expected = AuthorizationException.class)
public void testDeleteResources_clusterUser() throws Exception {
setupAuthenticationForClusterUser();
mockControl.replay();
resourceProvider.deleteResources(new RequestImpl(null, null, null, null), null);
}
@Test
public void testDeleteResources() throws Exception {
setupAuthenticationForAdmin();
String name = "motd";
PredicateBuilder pb = new PredicateBuilder();
Predicate predicate = pb.begin().property(SETTING_NAME_PROPERTY_ID).equals(name).end().toPredicate();
dao.removeByName(name);
mockControl.replay();
resourceProvider.deleteResources(new RequestImpl(null, null, null, null), predicate);
}
private Set<Resource> getResources_instance(SettingEntity entity, Request request) throws Exception {
String name = entity.getName();
PredicateBuilder pb = new PredicateBuilder();
Predicate predicate = pb.begin().property(SETTING_NAME_PROPERTY_ID).equals(name).end().toPredicate();
expect(dao.findByName(name)).andReturn(entity).anyTimes();
mockControl.replay();
return resourceProvider.getResources(request, predicate);
}
private Request readRequest() {
return PropertyHelper.getReadRequest(
SETTING_NAME_PROPERTY_ID,
SETTING_CONTENT_PROPERTY_ID,
SETTING_SETTING_TYPE_PROPERTY_ID,
SETTING_UPDATED_BY_PROPERTY_ID,
SETTING_UPDATE_TIMESTAMP_PROPERTY_ID);
}
private Request createRequest(SettingEntity entity) {
Map<String, Object> properties = new HashMap<>();
properties.put(SETTING_NAME_PROPERTY_ID, entity.getName());
properties.put(SETTING_CONTENT_PROPERTY_ID, entity.getContent());
properties.put(SETTING_UPDATED_BY_PROPERTY_ID, entity.getUpdatedBy());
properties.put(SETTING_SETTING_TYPE_PROPERTY_ID, entity.getSettingType());
return PropertyHelper.getCreateRequest(Collections.singleton(properties), null);
}
private Request updateRequest(SettingEntity entity) {
Map<String, Object> properties = new HashMap<>();
properties.put(SETTING_NAME_PROPERTY_ID, entity.getName());
properties.put(SETTING_CONTENT_PROPERTY_ID, entity.getContent());
properties.put(SETTING_SETTING_TYPE_PROPERTY_ID, entity.getSettingType());
return PropertyHelper.getUpdateRequest(properties, null);
}
private void setupAuthenticationForClusterUser() {
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createClusterUser());
}
private void setupAuthenticationForAdmin() {
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
}
private SettingEntity newEntity(String name) {
SettingEntity entity = new SettingEntity();
entity.setName(name);
entity.setContent(RandomStringUtils.randomAlphabetic(10));
entity.setSettingType(RandomStringUtils.randomAlphabetic(5));
entity.setUpdatedBy("ambari");
entity.setUpdateTimestamp(System.currentTimeMillis());
return entity;
}
private void assertEqualsEntityAndResource(SettingEntity entity, Resource resource) {
assertEquals(entity.getName(), resource.getPropertyValue(SETTING_NAME_PROPERTY_ID));
assertEquals(entity.getSettingType(), resource.getPropertyValue(SETTING_SETTING_TYPE_PROPERTY_ID));
assertEquals(entity.getContent(), resource.getPropertyValue(SETTING_CONTENT_PROPERTY_ID));
assertEquals(entity.getUpdatedBy(), resource.getPropertyValue(SETTING_UPDATED_BY_PROPERTY_ID));
assertEquals(entity.getUpdateTimestamp(), resource.getPropertyValue(SETTING_UPDATE_TIMESTAMP_PROPERTY_ID));
}
private void setPrivateField(Object o, String field, Object value) throws Exception{
Class<?> c = o.getClass();
Field f = c.getDeclaredField(field);
f.setAccessible(true);
f.set(o, value);
}
}