| /** |
| * 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 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.capture; |
| import static org.easymock.EasyMock.createMock; |
| import static org.easymock.EasyMock.expect; |
| import static org.easymock.EasyMock.expectLastCall; |
| import static org.easymock.EasyMock.replay; |
| import static org.easymock.EasyMock.resetToStrict; |
| import static org.easymock.EasyMock.verify; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| 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 java.util.UUID; |
| |
| import org.apache.ambari.server.controller.AlertDefinitionResponse; |
| import org.apache.ambari.server.controller.AmbariManagementController; |
| import org.apache.ambari.server.controller.spi.Predicate; |
| import org.apache.ambari.server.controller.spi.Request; |
| import org.apache.ambari.server.controller.spi.Resource; |
| import org.apache.ambari.server.controller.utilities.PredicateBuilder; |
| import org.apache.ambari.server.controller.utilities.PropertyHelper; |
| import org.apache.ambari.server.metadata.ActionMetadata; |
| import org.apache.ambari.server.orm.InMemoryDefaultTestModule; |
| import org.apache.ambari.server.orm.dao.AlertDefinitionDAO; |
| import org.apache.ambari.server.orm.dao.AlertDispatchDAO; |
| import org.apache.ambari.server.orm.entities.AlertDefinitionEntity; |
| import org.apache.ambari.server.orm.entities.AlertGroupEntity; |
| import org.apache.ambari.server.orm.entities.AlertTargetEntity; |
| import org.apache.ambari.server.security.TestAuthenticationFactory; |
| import org.apache.ambari.server.security.authorization.AuthorizationException; |
| import org.apache.ambari.server.security.authorization.AuthorizationHelperInitializer; |
| import org.apache.ambari.server.state.Cluster; |
| import org.apache.ambari.server.state.Clusters; |
| import org.apache.ambari.server.state.alert.AlertTarget; |
| import org.apache.ambari.server.state.alert.SourceType; |
| import org.apache.ambari.server.state.alert.TargetType; |
| import org.easymock.Capture; |
| import org.easymock.EasyMock; |
| import org.junit.After; |
| 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; |
| import com.google.inject.util.Modules; |
| import org.springframework.security.core.Authentication; |
| import org.springframework.security.core.context.SecurityContextHolder; |
| |
| /** |
| * {@link AlertGroupResourceProvider} tests. |
| */ |
| public class AlertGroupResourceProviderTest { |
| |
| private static final Long ALERT_GROUP_ID = Long.valueOf(28); |
| private static final String ALERT_GROUP_NAME = "Important Alerts"; |
| private static final long ALERT_GROUP_CLUSTER_ID = 1L; |
| private static final String ALERT_GROUP_CLUSTER_NAME = "c1"; |
| |
| private static final Long ALERT_TARGET_ID = Long.valueOf(28); |
| private static final String ALERT_TARGET_NAME = "The Administrators"; |
| private static final String ALERT_TARGET_DESC = "Admins and Others"; |
| private static final String ALERT_TARGET_TYPE = TargetType.EMAIL.name(); |
| |
| private static final Long ALERT_DEF_ID = 10L; |
| private static final String ALERT_DEF_NAME = "Mock Definition"; |
| private static final String ALERT_DEF_LABEL = "Mock Label"; |
| private static final String ALERT_DEF_DESCRIPTION = "Mock Description"; |
| |
| private static String DEFINITION_UUID = UUID.randomUUID().toString(); |
| |
| private AlertDispatchDAO m_dao; |
| private AlertDefinitionDAO m_definitionDao; |
| private Injector m_injector; |
| |
| private AmbariManagementController m_amc; |
| private Clusters m_clusters; |
| private Cluster m_cluster; |
| |
| @Before |
| public void before() throws Exception { |
| m_dao = createMock(AlertDispatchDAO.class); |
| m_definitionDao = createMock(AlertDefinitionDAO.class); |
| |
| m_amc = createMock(AmbariManagementController.class); |
| m_clusters = createMock(Clusters.class); |
| m_cluster = createMock(Cluster.class); |
| |
| // create an injector which will inject the mocks |
| m_injector = Guice.createInjector(Modules.override( |
| new InMemoryDefaultTestModule()).with(new MockModule())); |
| |
| assertNotNull(m_injector); |
| |
| expect(m_amc.getClusters()).andReturn(m_clusters).anyTimes(); |
| expect(m_clusters.getCluster((String) anyObject())).andReturn(m_cluster).anyTimes(); |
| expect(m_clusters.getClusterById(1L)).andReturn(m_cluster).anyTimes(); |
| expect(m_cluster.getClusterId()).andReturn(1L).anyTimes(); |
| expect(m_cluster.getResourceId()).andReturn(4L).anyTimes(); |
| AuthorizationHelperInitializer.viewInstanceDAOReturningNull(); |
| } |
| |
| @After |
| public void clearAuthentication() { |
| SecurityContextHolder.getContext().setAuthentication(null); |
| } |
| |
| @Test |
| public void testGetResourcesNoPredicateAsAdministrator() throws Exception { |
| testGetResourcesNoPredicate(TestAuthenticationFactory.createAdministrator()); |
| } |
| |
| @Test |
| public void testGetResourcesNoPredicateAsClusterAdministrator() throws Exception { |
| testGetResourcesNoPredicate(TestAuthenticationFactory.createClusterAdministrator()); |
| } |
| |
| @Test |
| public void testGetResourcesNoPredicateAsServiceAdministrator() throws Exception { |
| testGetResourcesNoPredicate(TestAuthenticationFactory.createServiceAdministrator()); |
| } |
| |
| @Test |
| public void testGetResourcesNoPredicateAsClusterUser() throws Exception { |
| testGetResourcesNoPredicate(TestAuthenticationFactory.createClusterUser()); |
| } |
| |
| @Test |
| public void testGetResourcesNoPredicateAsViewUser() throws Exception { |
| testGetResourcesNoPredicate(TestAuthenticationFactory.createViewUser(99L)); |
| } |
| |
| /** |
| * @throws Exception |
| */ |
| private void testGetResourcesNoPredicate(Authentication authentication) throws Exception { |
| AlertGroupResourceProvider provider = createProvider(m_amc); |
| |
| Request request = PropertyHelper.getReadRequest("AlertGroup/cluster_name", |
| "AlertGroup/id"); |
| |
| SecurityContextHolder.getContext().setAuthentication(authentication); |
| |
| Set<Resource> results = provider.getResources(request, null); |
| |
| assertEquals(0, results.size()); |
| } |
| |
| @Test |
| public void testGetResourcesClusterPredicateAsAdministrator() throws Exception { |
| testGetResourcesClusterPredicate(TestAuthenticationFactory.createAdministrator(), true); |
| } |
| |
| @Test |
| public void testGetResourcesClusterPredicateAsClusterAdministrator() throws Exception { |
| testGetResourcesClusterPredicate(TestAuthenticationFactory.createClusterAdministrator(), true); |
| } |
| |
| @Test |
| public void testGetResourcesClusterPredicateAsServiceAdministrator() throws Exception { |
| testGetResourcesClusterPredicate(TestAuthenticationFactory.createServiceAdministrator(), true); |
| } |
| |
| @Test |
| public void testGetResourcesClusterPredicateAsClusterUser() throws Exception { |
| testGetResourcesClusterPredicate(TestAuthenticationFactory.createClusterUser(), true); |
| } |
| |
| @Test |
| public void testGetResourcesClusterPredicateAsViewUser() throws Exception { |
| testGetResourcesClusterPredicate(TestAuthenticationFactory.createViewUser(99L), false); |
| } |
| |
| /** |
| * @throws Exception |
| */ |
| private void testGetResourcesClusterPredicate(Authentication authentication, boolean expectResults) throws Exception { |
| Request request = PropertyHelper.getReadRequest( |
| AlertGroupResourceProvider.ALERT_GROUP_ID, |
| AlertGroupResourceProvider.ALERT_GROUP_NAME, |
| AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME, |
| AlertGroupResourceProvider.ALERT_GROUP_DEFAULT); |
| |
| Predicate predicate = new PredicateBuilder().property( |
| AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME).equals("c1").toPredicate(); |
| |
| expect(m_dao.findAllGroups(ALERT_GROUP_CLUSTER_ID)).andReturn( |
| getMockEntities()); |
| |
| replay(m_amc, m_clusters, m_cluster, m_dao); |
| |
| SecurityContextHolder.getContext().setAuthentication(authentication); |
| |
| AlertGroupResourceProvider provider = createProvider(m_amc); |
| Set<Resource> results = provider.getResources(request, predicate); |
| |
| assertEquals(expectResults ? 1 : 0, results.size()); |
| |
| if(expectResults) { |
| Resource r = results.iterator().next(); |
| |
| assertEquals(ALERT_GROUP_NAME, |
| r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_NAME)); |
| |
| assertEquals(ALERT_GROUP_ID, |
| r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_ID)); |
| |
| assertEquals(ALERT_GROUP_CLUSTER_NAME, |
| r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME)); |
| |
| // verify definitions do not come back when not requested |
| assertNull(r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_DEFINITIONS)); |
| |
| // verify alerts do not come back when not requested |
| assertNull(r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_TARGETS)); |
| } |
| |
| verify(m_amc, m_clusters, m_cluster, m_dao); |
| } |
| |
| @Test |
| public void testGetResourcesAllPropertiesAsAdministrator() throws Exception { |
| testGetResourcesAllProperties(TestAuthenticationFactory.createAdministrator(), true); |
| } |
| |
| @Test |
| public void testGetResourcesAllPropertiesAsClusterAdministrator() throws Exception { |
| testGetResourcesAllProperties(TestAuthenticationFactory.createClusterAdministrator(), true); |
| } |
| |
| @Test |
| public void testGetResourcesAllPropertiesAsServiceAdministrator() throws Exception { |
| testGetResourcesAllProperties(TestAuthenticationFactory.createServiceAdministrator(), true); |
| } |
| |
| @Test |
| public void testGetResourcesAllPropertiesAsClusterUser() throws Exception { |
| testGetResourcesAllProperties(TestAuthenticationFactory.createClusterUser(), true); |
| } |
| |
| @Test |
| public void testGetResourcesAllPropertiesAsViewUser() throws Exception { |
| testGetResourcesAllProperties(TestAuthenticationFactory.createViewUser(99L), false); |
| } |
| |
| /** |
| * @throws Exception |
| */ |
| private void testGetResourcesAllProperties(Authentication authentication, boolean expectResults) throws Exception { |
| Request request = PropertyHelper.getReadRequest(); |
| |
| Predicate predicate = new PredicateBuilder().property( |
| AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME).equals("c1").toPredicate(); |
| |
| expect(m_dao.findAllGroups(ALERT_GROUP_CLUSTER_ID)).andReturn( |
| getMockEntities()); |
| |
| replay(m_amc, m_clusters, m_cluster, m_dao); |
| |
| SecurityContextHolder.getContext().setAuthentication(authentication); |
| |
| AlertGroupResourceProvider provider = createProvider(m_amc); |
| Set<Resource> results = provider.getResources(request, predicate); |
| |
| assertEquals(expectResults ? 1 : 0, results.size()); |
| |
| if(expectResults) { |
| Resource r = results.iterator().next(); |
| |
| assertEquals(ALERT_GROUP_NAME, |
| r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_NAME)); |
| |
| assertEquals(ALERT_GROUP_ID, |
| r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_ID)); |
| |
| assertEquals(ALERT_GROUP_CLUSTER_NAME, |
| r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME)); |
| |
| |
| // verify definitions and targets come back when requested |
| List<AlertDefinitionResponse> definitions = (List<AlertDefinitionResponse>) r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_DEFINITIONS); |
| List<AlertTarget> targets = (List<AlertTarget>) r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_TARGETS); |
| |
| assertNotNull(definitions); |
| assertEquals(1, definitions.size()); |
| assertEquals(ALERT_DEF_NAME, definitions.get(0).getName()); |
| assertEquals(SourceType.METRIC, definitions.get(0).getSourceType()); |
| assertNotNull(targets); |
| assertEquals(1, targets.size()); |
| } |
| |
| verify(m_amc, m_clusters, m_cluster, m_dao); |
| } |
| |
| @Test |
| public void testGetSingleResourceAsAdministrator() throws Exception { |
| testGetSingleResource(TestAuthenticationFactory.createAdministrator(), true); |
| } |
| |
| @Test |
| public void testGetSingleResourceAsClusterAdministrator() throws Exception { |
| testGetSingleResource(TestAuthenticationFactory.createClusterAdministrator(), true); |
| } |
| |
| @Test |
| public void testGetSingleResourceAsServiceAdministrator() throws Exception { |
| testGetSingleResource(TestAuthenticationFactory.createServiceAdministrator(), true); |
| } |
| |
| @Test |
| public void testGetSingleResourceAsClusterUser() throws Exception { |
| testGetSingleResource(TestAuthenticationFactory.createClusterUser(), true); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testGetSingleResourceAsViewUser() throws Exception { |
| testGetSingleResource(TestAuthenticationFactory.createViewUser(99L), false); |
| } |
| /** |
| * @throws Exception |
| */ |
| @SuppressWarnings("unchecked") |
| private void testGetSingleResource(Authentication authentication, boolean expectResults) throws Exception { |
| Request request = PropertyHelper.getReadRequest(); |
| |
| AmbariManagementController amc = createMock(AmbariManagementController.class); |
| |
| Predicate predicate = new PredicateBuilder().property( |
| AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME).equals( |
| ALERT_GROUP_CLUSTER_NAME).and().property( |
| AlertGroupResourceProvider.ALERT_GROUP_ID).equals( |
| ALERT_GROUP_ID.toString()).toPredicate(); |
| |
| expect(m_dao.findGroupById(ALERT_GROUP_ID.longValue())).andReturn( |
| getMockEntities().get(0)); |
| |
| expect(amc.getClusters()).andReturn(m_clusters).atLeastOnce(); |
| |
| replay(amc, m_dao, m_clusters, m_cluster); |
| |
| SecurityContextHolder.getContext().setAuthentication(authentication); |
| |
| AlertGroupResourceProvider provider = createProvider(amc); |
| Set<Resource> results = provider.getResources(request, predicate); |
| |
| assertEquals(expectResults ? 1 : 0, results.size()); |
| |
| if(expectResults) { |
| Resource r = results.iterator().next(); |
| |
| assertEquals(ALERT_GROUP_NAME, |
| r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_NAME)); |
| |
| assertEquals(ALERT_GROUP_ID, |
| r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_ID)); |
| |
| assertEquals(ALERT_GROUP_CLUSTER_NAME, |
| r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME)); |
| |
| // verify definitions and targets are returned on single instances |
| List<AlertDefinitionResponse> definitions = (List<AlertDefinitionResponse>) r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_DEFINITIONS); |
| List<AlertTarget> targets = (List<AlertTarget>) r.getPropertyValue(AlertGroupResourceProvider.ALERT_GROUP_TARGETS); |
| |
| assertNotNull(definitions); |
| assertNotNull(targets); |
| |
| assertEquals(1, definitions.size()); |
| assertEquals(ALERT_DEF_NAME, definitions.get(0).getName()); |
| assertEquals(SourceType.METRIC, definitions.get(0).getSourceType()); |
| |
| assertEquals(1, targets.size()); |
| assertEquals(ALERT_TARGET_NAME, targets.get(0).getName()); |
| } |
| |
| verify(amc, m_dao); |
| } |
| |
| @Test |
| public void testCreateResourcesAsAdministrator() throws Exception { |
| testCreateResources(TestAuthenticationFactory.createAdministrator()); |
| } |
| |
| @Test |
| public void testCreateResourcesAsClusterAdministrator() throws Exception { |
| testCreateResources(TestAuthenticationFactory.createClusterAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testCreateResourcesAsServiceAdministrator() throws Exception { |
| testCreateResources(TestAuthenticationFactory.createServiceAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testCreateResourcesAsClusterUser() throws Exception { |
| testCreateResources(TestAuthenticationFactory.createClusterUser()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testCreateResourcesAsViewUser() throws Exception { |
| testCreateResources(TestAuthenticationFactory.createViewUser(99L)); |
| } |
| |
| /** |
| * @throws Exception |
| */ |
| public void testCreateResources(Authentication authentication) throws Exception { |
| Capture<List<AlertGroupEntity>> listCapture = new Capture<List<AlertGroupEntity>>(); |
| |
| // the definition IDs to associate with the group |
| List<Long> definitionIds = new ArrayList<Long>(); |
| definitionIds.add(ALERT_DEF_ID); |
| |
| // the target IDs to associate with the group |
| List<Long> targetIds = new ArrayList<Long>(); |
| targetIds.add(ALERT_TARGET_ID); |
| |
| // definition entities to return from DAO |
| List<AlertDefinitionEntity> definitionEntities = new ArrayList<AlertDefinitionEntity>(); |
| definitionEntities.addAll(getMockDefinitions()); |
| |
| // target entities to return from DAO |
| List<AlertTargetEntity> targetEntities = new ArrayList<AlertTargetEntity>(); |
| targetEntities.addAll(getMockTargets()); |
| |
| // expect create group |
| m_dao.createGroups(capture(listCapture)); |
| expectLastCall().once(); |
| |
| // expect target entity lookup for association |
| expect(m_dao.findTargetsById(EasyMock.eq(targetIds))).andReturn( |
| targetEntities).times(1); |
| |
| // expect definition entity lookup for association |
| expect(m_definitionDao.findByIds(definitionIds)).andReturn( |
| definitionEntities).times(1); |
| |
| replay(m_amc, m_clusters, m_cluster, m_dao, m_definitionDao); |
| |
| SecurityContextHolder.getContext().setAuthentication(authentication); |
| |
| AlertGroupResourceProvider provider = createProvider(m_amc); |
| |
| Map<String, Object> requestProps = new HashMap<String, Object>(); |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_NAME, |
| ALERT_GROUP_NAME); |
| |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME, |
| ALERT_GROUP_CLUSTER_NAME); |
| |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_DEFINITIONS, |
| definitionIds); |
| |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_TARGETS, targetIds); |
| |
| Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null); |
| provider.createResources(request); |
| |
| assertTrue(listCapture.hasCaptured()); |
| AlertGroupEntity entity = listCapture.getValue().get(0); |
| assertNotNull(entity); |
| |
| assertEquals(ALERT_GROUP_NAME, entity.getGroupName()); |
| assertEquals(ALERT_GROUP_CLUSTER_ID, |
| entity.getClusterId().longValue()); |
| |
| verify(m_amc, m_clusters, m_cluster, m_dao, m_definitionDao); |
| } |
| |
| @Test |
| public void testUpdateResourcesAsAdministrator() throws Exception { |
| testUpdateResources(TestAuthenticationFactory.createAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testUpdateResourcesAsClusterAdministrator() throws Exception { |
| testUpdateResources(TestAuthenticationFactory.createClusterAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testUpdateResourcesAsServiceAdministrator() throws Exception { |
| testUpdateResources(TestAuthenticationFactory.createServiceAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testUpdateResourcesAsClusterUser() throws Exception { |
| testUpdateResources(TestAuthenticationFactory.createClusterUser()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testUpdateResourcesAsViewUser() throws Exception { |
| testUpdateResources(TestAuthenticationFactory.createViewUser(99L)); |
| } |
| |
| /** |
| * @throws Exception |
| */ |
| @SuppressWarnings("unchecked") |
| public void testUpdateResources(Authentication authentication) throws Exception { |
| Capture<AlertGroupEntity> entityCapture = new Capture<AlertGroupEntity>(); |
| |
| // the definition IDs to associate with the group |
| List<Long> definitionIds = new ArrayList<Long>(); |
| definitionIds.add(ALERT_DEF_ID); |
| |
| // the target IDs to associate with the group |
| List<Long> targetIds = new ArrayList<Long>(); |
| targetIds.add(ALERT_TARGET_ID); |
| |
| // definition entities to return from DAO |
| List<AlertDefinitionEntity> definitionEntities = new ArrayList<AlertDefinitionEntity>(); |
| definitionEntities.addAll(getMockDefinitions()); |
| |
| // target entities to return from DAO |
| List<AlertTargetEntity> targetEntities = new ArrayList<AlertTargetEntity>(); |
| targetEntities.addAll(getMockTargets()); |
| |
| m_dao.createGroups(EasyMock.anyObject(List.class)); |
| expectLastCall().times(1); |
| |
| AlertGroupEntity group = new AlertGroupEntity(); |
| expect(m_dao.findGroupById(ALERT_GROUP_ID)).andReturn( |
| group).times(1); |
| |
| expect(m_dao.merge(capture(entityCapture))).andReturn(group).once(); |
| |
| // expect target entity lookup for association |
| expect(m_dao.findTargetsById(EasyMock.eq(targetIds))).andReturn( |
| targetEntities).once(); |
| |
| // expect definition entity lookup for association |
| expect(m_definitionDao.findByIds(definitionIds)).andReturn( |
| definitionEntities).once(); |
| |
| replay(m_amc, m_clusters, m_cluster, m_dao, m_definitionDao); |
| |
| SecurityContextHolder.getContext().setAuthentication(authentication); |
| |
| AlertGroupResourceProvider provider = createProvider(m_amc); |
| Map<String, Object> requestProps = new HashMap<String, Object>(); |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_NAME, |
| ALERT_GROUP_NAME); |
| |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME, |
| ALERT_GROUP_CLUSTER_NAME); |
| |
| Request request = PropertyHelper.getCreateRequest( |
| Collections.singleton(requestProps), null); |
| |
| provider.createResources(request); |
| |
| // create new properties, and include the ID since we're not going through |
| // a service layer which would add it for us automatically |
| requestProps = new HashMap<String, Object>(); |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_ID, |
| ALERT_GROUP_ID.toString()); |
| |
| String newName = ALERT_GROUP_NAME + " Foo"; |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_NAME, newName); |
| |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_DEFINITIONS, |
| definitionIds); |
| |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_TARGETS, targetIds); |
| |
| Predicate predicate = new PredicateBuilder().property( |
| AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME).equals( |
| ALERT_GROUP_CLUSTER_NAME).and().property( |
| AlertGroupResourceProvider.ALERT_GROUP_ID).equals( |
| ALERT_GROUP_ID.toString()).toPredicate(); |
| |
| request = PropertyHelper.getUpdateRequest(requestProps, null); |
| provider.updateResources(request, predicate); |
| |
| assertTrue(entityCapture.hasCaptured()); |
| |
| AlertGroupEntity entity = entityCapture.getValue(); |
| assertEquals(newName, entity.getGroupName()); |
| verify(m_amc, m_clusters, m_cluster, m_dao, m_definitionDao); |
| } |
| |
| @Test |
| public void testUpdateDefaultGroupAsAdministrator() throws Exception { |
| testUpdateDefaultGroup(TestAuthenticationFactory.createAdministrator()); |
| } |
| |
| @Test |
| public void testUpdateDefaultGroupAsClusterAdministrator() throws Exception { |
| testUpdateDefaultGroup(TestAuthenticationFactory.createClusterAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testUpdateDefaultGroupAsServiceAdministrator() throws Exception { |
| testUpdateDefaultGroup(TestAuthenticationFactory.createServiceAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testUpdateDefaultGroupAsClusterUser() throws Exception { |
| testUpdateDefaultGroup(TestAuthenticationFactory.createClusterUser()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testUpdateDefaultGroupAsViewUser() throws Exception { |
| testUpdateDefaultGroup(TestAuthenticationFactory.createViewUser(99L)); |
| } |
| |
| /** |
| * Tests that updating a default group doesn't change read-only properties |
| * |
| * @throws Exception |
| */ |
| @SuppressWarnings("unchecked") |
| private void testUpdateDefaultGroup(Authentication authentication) throws Exception { |
| Capture<AlertGroupEntity> entityCapture = new Capture<AlertGroupEntity>(); |
| |
| // the definition IDs to associate with the group |
| List<Long> definitionIds = new ArrayList<Long>(); |
| definitionIds.add(ALERT_DEF_ID); |
| |
| // the target IDs to associate with the group |
| List<Long> targetIds = new ArrayList<Long>(); |
| targetIds.add(ALERT_TARGET_ID); |
| |
| // definition entities to return from DAO |
| List<AlertDefinitionEntity> definitionEntities = new ArrayList<AlertDefinitionEntity>(); |
| definitionEntities.addAll(getMockDefinitions()); |
| |
| // target entities to return from DAO |
| List<AlertTargetEntity> newTargetEntities = new ArrayList<AlertTargetEntity>(); |
| newTargetEntities.addAll(getMockTargets()); |
| |
| Set<AlertTargetEntity> mockTargets2 = getMockTargets(); |
| AlertTargetEntity target2 = mockTargets2.iterator().next(); |
| target2.setTargetId(29L); |
| |
| newTargetEntities.add(target2); |
| |
| AlertGroupEntity group = new AlertGroupEntity(); |
| group.setDefault(true); |
| group.setClusterId(1L); |
| group.setGroupName(ALERT_GROUP_NAME); |
| group.setAlertDefinitions(getMockDefinitions()); |
| group.setAlertTargets(getMockTargets()); |
| |
| expect(m_dao.findGroupById(ALERT_GROUP_ID)).andReturn(group).times(1); |
| expect(m_dao.merge(capture(entityCapture))).andReturn(group).once(); |
| |
| // expect target entity lookup for association |
| List<Long> newTargets = Arrays.asList(28L, 29L); |
| expect(m_dao.findTargetsById(EasyMock.eq(newTargets))).andReturn( |
| newTargetEntities).once(); |
| |
| replay(m_dao, m_definitionDao, m_amc, m_clusters, m_cluster); |
| |
| SecurityContextHolder.getContext().setAuthentication(authentication); |
| |
| AlertGroupResourceProvider provider = createProvider(m_amc); |
| |
| // create new properties, and include the ID since we're not going through |
| // a service layer which would add it for us automatically |
| Map<String, Object> requestProps = new HashMap<String, Object>(); |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_ID, |
| ALERT_GROUP_ID.toString()); |
| |
| // try to change the name (it should not work) |
| String newName = ALERT_GROUP_NAME + " Foo"; |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_NAME, newName); |
| |
| // try to change the definitions (it should not work) |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_DEFINITIONS, |
| new ArrayList<Long>()); |
| |
| // try to change the targets (it should work) |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_TARGETS, |
| newTargets); |
| |
| Predicate predicate = new PredicateBuilder().property( |
| AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME).equals( |
| ALERT_GROUP_CLUSTER_NAME).and().property( |
| AlertGroupResourceProvider.ALERT_GROUP_ID).equals( |
| ALERT_GROUP_ID.toString()).toPredicate(); |
| |
| Request request = PropertyHelper.getUpdateRequest(requestProps, null); |
| provider.updateResources(request, predicate); |
| |
| assertTrue(entityCapture.hasCaptured()); |
| |
| AlertGroupEntity entity = entityCapture.getValue(); |
| assertEquals(ALERT_GROUP_NAME, entity.getGroupName()); |
| assertEquals(2, entity.getAlertTargets().size()); |
| assertEquals(1, entity.getAlertDefinitions().size()); |
| |
| verify(m_dao, m_definitionDao); |
| } |
| |
| @Test |
| public void testDeleteResourcesAsAdministrator() throws Exception { |
| testDeleteResources(TestAuthenticationFactory.createAdministrator()); |
| } |
| |
| @Test |
| public void testDeleteResourcesAsClusterAdministrator() throws Exception { |
| testDeleteResources(TestAuthenticationFactory.createClusterAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testDeleteResourcesAsServiceAdministrator() throws Exception { |
| testDeleteResources(TestAuthenticationFactory.createServiceAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testDeleteResourcesAsClusterUser() throws Exception { |
| testDeleteResources(TestAuthenticationFactory.createClusterUser()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testDeleteResourcesAsViewUser() throws Exception { |
| testDeleteResources(TestAuthenticationFactory.createViewUser(99L)); |
| } |
| |
| /** |
| * @throws Exception |
| */ |
| private void testDeleteResources(Authentication authentication) throws Exception { |
| Capture<AlertGroupEntity> entityCapture = new Capture<AlertGroupEntity>(); |
| Capture<List<AlertGroupEntity>> listCapture = new Capture<List<AlertGroupEntity>>(); |
| |
| m_dao.createGroups(capture(listCapture)); |
| expectLastCall(); |
| |
| replay(m_amc, m_clusters, m_cluster, m_dao); |
| |
| SecurityContextHolder.getContext().setAuthentication(authentication); |
| |
| AlertGroupResourceProvider provider = createProvider(m_amc); |
| |
| Map<String, Object> requestProps = new HashMap<String, Object>(); |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_NAME, |
| ALERT_GROUP_NAME); |
| |
| requestProps.put(AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME, |
| ALERT_GROUP_CLUSTER_NAME); |
| |
| Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null); |
| provider.createResources(request); |
| |
| assertTrue(listCapture.hasCaptured()); |
| AlertGroupEntity entity = listCapture.getValue().get(0); |
| assertNotNull(entity); |
| |
| Predicate predicate = new PredicateBuilder().property( |
| AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME).equals( |
| ALERT_GROUP_CLUSTER_NAME).and().property( |
| AlertGroupResourceProvider.ALERT_GROUP_ID).equals( |
| ALERT_GROUP_ID.toString()).toPredicate(); |
| |
| // everything is mocked, there is no DB |
| entity.setGroupId(ALERT_GROUP_ID); |
| |
| resetToStrict(m_dao); |
| expect(m_dao.findGroupById(ALERT_GROUP_ID.longValue())).andReturn(entity).anyTimes(); |
| m_dao.remove(capture(entityCapture)); |
| expectLastCall(); |
| replay(m_dao); |
| |
| provider.deleteResources(new RequestImpl(null, null, null, null), predicate); |
| |
| AlertGroupEntity entity1 = entityCapture.getValue(); |
| assertEquals(ALERT_GROUP_ID, entity1.getGroupId()); |
| |
| verify(m_amc, m_clusters, m_cluster, m_dao); |
| } |
| |
| @Test |
| public void testDeleteDefaultGroupAsAdministrator() throws Exception { |
| testDeleteDefaultGroup(TestAuthenticationFactory.createAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testDeleteDefaultGroupAsClusterAdministrator() throws Exception { |
| testDeleteDefaultGroup(TestAuthenticationFactory.createClusterAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testDeleteDefaultGroupAsServiceAdministrator() throws Exception { |
| testDeleteDefaultGroup(TestAuthenticationFactory.createServiceAdministrator()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testDeleteDefaultGroupAsClusterUser() throws Exception { |
| testDeleteDefaultGroup(TestAuthenticationFactory.createClusterUser()); |
| } |
| |
| @Test(expected = AuthorizationException.class) |
| public void testDeleteDefaultGroupAsViewUser() throws Exception { |
| testDeleteDefaultGroup(TestAuthenticationFactory.createViewUser(99L)); |
| } |
| |
| /** |
| * Tests that a default group cannot be deleted via the resource provider. |
| * |
| * @throws Exception |
| */ |
| private void testDeleteDefaultGroup(Authentication authentication) throws Exception { |
| AlertGroupEntity group = new AlertGroupEntity(); |
| group.setGroupId(ALERT_GROUP_ID); |
| group.setDefault(true); |
| group.setGroupName(ALERT_GROUP_NAME); |
| group.setAlertDefinitions(getMockDefinitions()); |
| group.setAlertTargets(getMockTargets()); |
| |
| resetToStrict(m_dao); |
| expect(m_dao.findGroupById(ALERT_GROUP_ID)).andReturn(group).anyTimes(); |
| |
| replay(m_dao, m_amc, m_clusters, m_cluster); |
| |
| SecurityContextHolder.getContext().setAuthentication(authentication); |
| |
| AlertGroupResourceProvider provider = createProvider(m_amc); |
| |
| Predicate predicate = new PredicateBuilder().property( |
| AlertGroupResourceProvider.ALERT_GROUP_CLUSTER_NAME).equals( |
| ALERT_GROUP_CLUSTER_NAME).and().property( |
| AlertGroupResourceProvider.ALERT_GROUP_ID).equals( |
| ALERT_GROUP_ID.toString()).toPredicate(); |
| |
| provider.deleteResources(new RequestImpl(null, null, null, null), predicate); |
| verify(m_dao, m_amc); |
| } |
| |
| /** |
| * @param amc |
| * @return |
| */ |
| private AlertGroupResourceProvider createProvider( |
| AmbariManagementController amc) { |
| |
| return new AlertGroupResourceProvider(amc); |
| } |
| |
| /** |
| * @return |
| */ |
| private List<AlertGroupEntity> getMockEntities() throws Exception { |
| AlertGroupEntity entity = new AlertGroupEntity(); |
| entity.setGroupId(ALERT_GROUP_ID); |
| entity.setGroupName(ALERT_GROUP_NAME); |
| entity.setClusterId(ALERT_GROUP_CLUSTER_ID); |
| entity.setDefault(false); |
| |
| entity.setAlertTargets(getMockTargets()); |
| entity.setAlertDefinitions(getMockDefinitions()); |
| return Arrays.asList(entity); |
| } |
| |
| /** |
| * Gets some mock {@link AlertDefinitionEntity} instances. |
| * |
| * @return |
| * @throws Exception |
| */ |
| private Set<AlertDefinitionEntity> getMockDefinitions() throws Exception { |
| AlertDefinitionEntity entity = new AlertDefinitionEntity(); |
| entity.setClusterId(Long.valueOf(1L)); |
| entity.setComponentName(null); |
| entity.setDefinitionId(ALERT_DEF_ID); |
| entity.setDefinitionName(ALERT_DEF_NAME); |
| entity.setLabel(ALERT_DEF_LABEL); |
| entity.setDescription(ALERT_DEF_DESCRIPTION); |
| entity.setEnabled(true); |
| entity.setHash(DEFINITION_UUID); |
| entity.setScheduleInterval(Integer.valueOf(2)); |
| entity.setServiceName(null); |
| entity.setSourceType(SourceType.METRIC); |
| entity.setSource("{\"type\" : \"METRIC\"}"); |
| |
| Set<AlertDefinitionEntity> definitions = new HashSet<AlertDefinitionEntity>(); |
| definitions.add(entity); |
| |
| return definitions; |
| } |
| |
| /** |
| * Gets some mock {@link AlertTargetEntity} instances. |
| * |
| * @return |
| */ |
| private Set<AlertTargetEntity> getMockTargets() throws Exception { |
| AlertTargetEntity entity = new AlertTargetEntity(); |
| entity.setTargetId(ALERT_TARGET_ID); |
| entity.setDescription(ALERT_TARGET_DESC); |
| entity.setTargetName(ALERT_TARGET_NAME); |
| entity.setNotificationType(ALERT_TARGET_TYPE); |
| |
| Set<AlertTargetEntity> targets = new HashSet<AlertTargetEntity>(); |
| targets.add(entity); |
| |
| return targets; |
| } |
| |
| /** |
| * |
| */ |
| private class MockModule implements Module { |
| /** |
| * |
| */ |
| @Override |
| public void configure(Binder binder) { |
| binder.bind(AlertDispatchDAO.class).toInstance(m_dao); |
| binder.bind(AlertDefinitionDAO.class).toInstance(m_definitionDao); |
| binder.bind(Clusters.class).toInstance(m_clusters); |
| binder.bind(Cluster.class).toInstance(m_cluster); |
| binder.bind(ActionMetadata.class); |
| } |
| } |
| } |