blob: be73a50ffda1e17d1461970b85aae4e90112a602 [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 static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.createStrictMock;
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 static org.junit.Assert.assertEquals;
import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
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.entities.AlertDefinitionEntity;
import org.apache.ambari.server.orm.entities.ClusterEntity;
import org.apache.ambari.server.orm.entities.ResourceEntity;
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.AlertDefinition;
import org.apache.ambari.server.state.alert.AlertDefinitionFactory;
import org.apache.ambari.server.state.alert.AlertDefinitionHash;
import org.apache.ambari.server.state.alert.MetricSource;
import org.apache.ambari.server.state.alert.Scope;
import org.apache.ambari.server.state.alert.Source;
import org.apache.ambari.server.state.alert.SourceType;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import com.google.gson.Gson;
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;
/**
* AlertDefinition tests
*/
public class AlertDefinitionResourceProviderTest {
private AlertDefinitionDAO dao = null;
private AlertDefinitionHash definitionHash = null;
private AlertDefinitionFactory m_factory = new AlertDefinitionFactory();
private Injector m_injector;
private static String DEFINITION_UUID = UUID.randomUUID().toString();
@Before
public void before() {
dao = createStrictMock(AlertDefinitionDAO.class);
definitionHash = createNiceMock(AlertDefinitionHash.class);
m_injector = Guice.createInjector(Modules.override(
new InMemoryDefaultTestModule()).with(new MockModule()));
m_injector.injectMembers(m_factory);
AuthorizationHelperInitializer.viewInstanceDAOReturningNull();
}
@After
public void clearAuthentication() {
SecurityContextHolder.getContext().setAuthentication(null);
}
/**
* @throws Exception
*/
@Test
public void testGetResourcesNoPredicate() throws Exception {
AlertDefinitionResourceProvider provider = createProvider(null);
Request request = PropertyHelper.getReadRequest("AlertDefinition/cluster_name",
"AlertDefinition/id");
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(
AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME,
AlertDefinitionResourceProvider.ALERT_DEF_ID,
AlertDefinitionResourceProvider.ALERT_DEF_NAME,
AlertDefinitionResourceProvider.ALERT_DEF_LABEL);
AmbariManagementController amc = createMock(AmbariManagementController.class);
Clusters clusters = createMock(Clusters.class);
Cluster cluster = createMock(Cluster.class);
expect(amc.getClusters()).andReturn(clusters).atLeastOnce();
expect(clusters.getCluster((String) anyObject())).andReturn(cluster).atLeastOnce();
expect(cluster.getClusterId()).andReturn(1L).anyTimes();
expect(cluster.getResourceId()).andReturn(4L).anyTimes();
Predicate predicate = new PredicateBuilder().property(
AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME).equals("c1").toPredicate();
expect(dao.findAll(1L)).andReturn(getMockEntities());
replay(amc, clusters, cluster, dao);
SecurityContextHolder.getContext().setAuthentication(authentication);
AlertDefinitionResourceProvider provider = createProvider(amc);
Set<Resource> results = provider.getResources(request, predicate);
assertEquals(expectResults ? 1 : 0, results.size());
if(expectResults) {
Resource r = results.iterator().next();
Assert.assertEquals("my_def", r.getPropertyValue(AlertDefinitionResourceProvider.ALERT_DEF_NAME));
Assert.assertEquals("Mock Label",
r.getPropertyValue(AlertDefinitionResourceProvider.ALERT_DEF_LABEL));
}
verify(amc, clusters, cluster, dao);
}
@Test
public void testGetSingleResourceAsAdministrator() throws Exception {
testGetSingleResource(TestAuthenticationFactory.createAdministrator());
}
@Test
public void testGetSingleResourceAsClusterAdministrator() throws Exception {
testGetSingleResource(TestAuthenticationFactory.createClusterAdministrator());
}
@Test
public void testGetSingleResourceAsServiceAdministrator() throws Exception {
testGetSingleResource(TestAuthenticationFactory.createServiceAdministrator());
}
@Test
public void testGetSingleResourceAsClusterUser() throws Exception {
testGetSingleResource(TestAuthenticationFactory.createClusterUser());
}
@Test(expected = AuthorizationException.class)
public void testGetSingleResourceAsViewUser() throws Exception {
testGetSingleResource(TestAuthenticationFactory.createViewUser(99L));
}
/**
* @throws Exception
*/
private void testGetSingleResource(Authentication authentication) throws Exception {
Request request = PropertyHelper.getReadRequest(
AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME,
AlertDefinitionResourceProvider.ALERT_DEF_ID,
AlertDefinitionResourceProvider.ALERT_DEF_NAME,
AlertDefinitionResourceProvider.ALERT_DEF_LABEL,
AlertDefinitionResourceProvider.ALERT_DEF_DESCRIPTION,
AlertDefinitionResourceProvider.ALERT_DEF_IGNORE_HOST,
AlertDefinitionResourceProvider.ALERT_DEF_SOURCE,
AlertDefinitionResourceProvider.ALERT_DEF_SOURCE_TYPE,
AlertDefinitionResourceProvider.ALERT_DEF_HELP_URL);
AmbariManagementController amc = createMock(AmbariManagementController.class);
Clusters clusters = createMock(Clusters.class);
Cluster cluster = createMock(Cluster.class);
expect(amc.getClusters()).andReturn(clusters).atLeastOnce();
expect(clusters.getCluster((String) anyObject())).andReturn(cluster).atLeastOnce();
expect(cluster.getClusterId()).andReturn(Long.valueOf(1)).anyTimes();
Predicate predicate = new PredicateBuilder().property(
AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME).equals("c1")
.and().property(AlertDefinitionResourceProvider.ALERT_DEF_ID).equals("1").toPredicate();
expect(dao.findById(1L)).andReturn(getMockEntities().get(0));
replay(amc, clusters, cluster, dao);
SecurityContextHolder.getContext().setAuthentication(authentication);
AlertDefinitionResourceProvider provider = createProvider(amc);
Set<Resource> results = provider.getResources(request, predicate);
assertEquals(1, results.size());
Resource r = results.iterator().next();
Assert.assertEquals("my_def", r.getPropertyValue(AlertDefinitionResourceProvider.ALERT_DEF_NAME));
Assert.assertEquals(
SourceType.METRIC.name(),
r.getPropertyValue(AlertDefinitionResourceProvider.ALERT_DEF_SOURCE_TYPE));
Source source = getMockSource();
String okJson = source.getReporting().getOk().getText();
Object reporting = r.getPropertyValue("AlertDefinition/source/reporting");
Assert.assertTrue(reporting.toString().contains(okJson));
Assert.assertEquals("Mock Label",
r.getPropertyValue(AlertDefinitionResourceProvider.ALERT_DEF_LABEL));
Assert.assertEquals(
"Mock Description",
r.getPropertyValue(AlertDefinitionResourceProvider.ALERT_DEF_DESCRIPTION));
Assert.assertEquals(
Boolean.FALSE,
r.getPropertyValue(AlertDefinitionResourceProvider.ALERT_DEF_IGNORE_HOST));
Assert.assertEquals(
"http://test-help-url",
r.getPropertyValue(AlertDefinitionResourceProvider.ALERT_DEF_HELP_URL));
Assert.assertNotNull(r.getPropertyValue("AlertDefinition/source/type"));
}
@Test
public void testGetResourcesAssertSourceTypeAsAdministrator() throws Exception {
testGetResourcesAssertSourceType(TestAuthenticationFactory.createAdministrator(), true);
}
@Test
public void testGetResourcesAssertSourceTypeAsClusterAdministrator() throws Exception {
testGetResourcesAssertSourceType(TestAuthenticationFactory.createClusterAdministrator(), true);
}
@Test
public void testGetResourcesAssertSourceTypeAsServiceAdministrator() throws Exception {
testGetResourcesAssertSourceType(TestAuthenticationFactory.createServiceAdministrator(), true);
}
@Test
public void testGetResourcesAssertSourceTypeAsClusterUser() throws Exception {
testGetResourcesAssertSourceType(TestAuthenticationFactory.createClusterUser(), true);
}
@Test
public void testGetResourcesAssertSourceTypeAsViewUser() throws Exception {
testGetResourcesAssertSourceType(TestAuthenticationFactory.createViewUser(99L), false);
}
/**
* Tests that the source structure returned has the entire set of
* subproperties on it (such as reporting)
*
* @throws Exception
*/
private void testGetResourcesAssertSourceType(Authentication authentication, boolean expectResults) throws Exception {
Request request = PropertyHelper.getReadRequest(
AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME,
AlertDefinitionResourceProvider.ALERT_DEF_ID,
AlertDefinitionResourceProvider.ALERT_DEF_NAME,
AlertDefinitionResourceProvider.ALERT_DEF_LABEL,
AlertDefinitionResourceProvider.ALERT_DEF_DESCRIPTION,
AlertDefinitionResourceProvider.ALERT_DEF_SOURCE_TYPE);
AmbariManagementController amc = createMock(AmbariManagementController.class);
Clusters clusters = createMock(Clusters.class);
Cluster cluster = createMock(Cluster.class);
expect(amc.getClusters()).andReturn(clusters).atLeastOnce();
expect(clusters.getCluster((String) anyObject())).andReturn(cluster).atLeastOnce();
expect(cluster.getClusterId()).andReturn(1L).anyTimes();
expect(cluster.getResourceId()).andReturn(4L).anyTimes();
Predicate predicate = new PredicateBuilder().property(
AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME).equals("c1").toPredicate();
expect(dao.findAll(1L)).andReturn(getMockEntities()).atLeastOnce();
replay(amc, clusters, cluster, dao);
SecurityContextHolder.getContext().setAuthentication(authentication);
AlertDefinitionResourceProvider provider = createProvider(amc);
Set<Resource> results = provider.getResources(request, predicate);
assertEquals(expectResults ? 1 : 0, results.size());
if(expectResults) {
Resource resource = results.iterator().next();
Assert.assertEquals("my_def",
resource.getPropertyValue(AlertDefinitionResourceProvider.ALERT_DEF_NAME));
Map<String, String> reporting = (Map<String, String>) resource.getPropertyValue("AlertDefinition/source/reporting");
Assert.assertTrue(reporting.containsKey("ok"));
Assert.assertTrue(reporting.containsKey("critical"));
}
verify(amc, clusters, cluster, dao);
// make another request, this time without the source and ensure that no
// source properties come back
request = PropertyHelper.getReadRequest(
AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME,
AlertDefinitionResourceProvider.ALERT_DEF_ID,
AlertDefinitionResourceProvider.ALERT_DEF_NAME);
results = provider.getResources(request, predicate);
if(!results.isEmpty()) {
Resource resource = results.iterator().next();
Assert.assertEquals(
"my_def",
resource.getPropertyValue(AlertDefinitionResourceProvider.ALERT_DEF_NAME));
Map<String, String> reporting = (Map<String, String>) resource.getPropertyValue("AlertDefinition/source/reporting");
Assert.assertNull(reporting);
}
}
@Test
public void testCreateResourcesAsAdministrator() throws Exception {
testCreateResources(TestAuthenticationFactory.createAdministrator());
}
@Test(expected = AuthorizationException.class)
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 {
AmbariManagementController amc = createMock(AmbariManagementController.class);
Clusters clusters = createMock(Clusters.class);
Cluster cluster = createMock(Cluster.class);
expect(amc.getClusters()).andReturn(clusters).atLeastOnce();
expect(clusters.getCluster((String) anyObject())).andReturn(cluster).atLeastOnce();
expect(cluster.getClusterId()).andReturn(Long.valueOf(1)).anyTimes();
Capture<AlertDefinitionEntity> entityCapture = new Capture<AlertDefinitionEntity>();
dao.create(capture(entityCapture));
expectLastCall();
// creating a single definition should invalidate hosts of the definition
expect(
definitionHash.invalidateHosts(EasyMock.anyObject(AlertDefinitionEntity.class))).andReturn(
new HashSet<String>()).once();
replay(amc, clusters, cluster, dao, definitionHash);
SecurityContextHolder.getContext().setAuthentication(authentication);
Gson gson = m_factory.getGson();
MetricSource source = (MetricSource)getMockSource();
AlertDefinitionResourceProvider provider = createProvider(amc);
Map<String, Object> requestProps = new HashMap<String, Object>();
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME, "c1");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_INTERVAL, "1");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_NAME, "my_def");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_SERVICE_NAME,
"HDFS");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_LABEL,
"Mock Label (Create)");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_DESCRIPTION,
"Mock Description (Create)");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_SOURCE_TYPE,
SourceType.METRIC.name());
// JMX
requestProps.put("AlertDefinition/source/jmx/value",
source.getJmxInfo().getValue());
requestProps.put("AlertDefinition/source/jmx/property_list",
source.getJmxInfo().getPropertyList());
// URI
requestProps.put("AlertDefinition/source/uri/http",
source.getUri().getHttpUri());
requestProps.put("AlertDefinition/source/uri/https",
source.getUri().getHttpsUri());
requestProps.put("AlertDefinition/source/uri/https_property",
source.getUri().getHttpsProperty());
requestProps.put("AlertDefinition/source/uri/https_property_value",
source.getUri().getHttpsPropertyValue());
// reporting
requestProps.put("AlertDefinition/source/reporting/critical/text",
source.getReporting().getCritical().getText());
requestProps.put("AlertDefinition/source/reporting/critical/value",
source.getReporting().getCritical().getValue());
requestProps.put("AlertDefinition/source/reporting/ok/text",
source.getReporting().getOk().getText());
requestProps.put("AlertDefinition/source/reporting/warning/text",
source.getReporting().getWarning().getText());
requestProps.put("AlertDefinition/source/reporting/warning/value",
source.getReporting().getWarning().getValue());
requestProps.put("AlertDefinition/source/reporting/units", "Gigabytes");
Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
provider.createResources(request);
Assert.assertTrue(entityCapture.hasCaptured());
AlertDefinitionEntity entity = entityCapture.getValue();
Assert.assertNotNull(entity);
Assert.assertEquals(Long.valueOf(1), entity.getClusterId());
Assert.assertNull(entity.getComponentName());
Assert.assertEquals("my_def", entity.getDefinitionName());
Assert.assertTrue(entity.getEnabled());
Assert.assertNotNull(entity.getHash());
Assert.assertEquals(Integer.valueOf(1), entity.getScheduleInterval());
Assert.assertEquals(Scope.ANY, entity.getScope());
Assert.assertEquals("HDFS", entity.getServiceName());
Assert.assertEquals(SourceType.METRIC, entity.getSourceType());
Assert.assertEquals("Mock Label (Create)", entity.getLabel());
Assert.assertEquals("Mock Description (Create)", entity.getDescription());
Assert.assertEquals(false, entity.isHostIgnored());
// verify Source
Assert.assertNotNull(entity.getSource());
MetricSource actualSource = gson.fromJson(entity.getSource(),
MetricSource.class);
Assert.assertNotNull(actualSource);
assertEquals(source.getReporting().getOk().getText(),
actualSource.getReporting().getOk().getText());
assertEquals(source.getReporting().getWarning().getText(),
actualSource.getReporting().getWarning().getText());
assertEquals(source.getReporting().getCritical().getText(),
actualSource.getReporting().getCritical().getText());
assertEquals("Gigabytes", actualSource.getReporting().getUnits());
Assert.assertNotNull(source.getUri().getHttpUri());
Assert.assertNotNull(source.getUri().getHttpsUri());
assertEquals(source.getUri().getHttpUri(),
actualSource.getUri().getHttpUri());
assertEquals(source.getUri().getHttpsUri(),
actualSource.getUri().getHttpsUri());
verify(amc, clusters, cluster, dao);
}
@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
*/
private void testUpdateResources(Authentication authentication) throws Exception {
AmbariManagementController amc = createMock(AmbariManagementController.class);
Clusters clusters = createMock(Clusters.class);
Cluster cluster = createMock(Cluster.class);
expect(amc.getClusters()).andReturn(clusters).atLeastOnce();
expect(clusters.getCluster((String) anyObject())).andReturn(cluster).atLeastOnce();
expect(cluster.getClusterId()).andReturn(Long.valueOf(1)).atLeastOnce();
Capture<AlertDefinitionEntity> entityCapture = new Capture<AlertDefinitionEntity>();
dao.create(capture(entityCapture));
expectLastCall();
// updateing a single definition should invalidate hosts of the definition
expect(
definitionHash.invalidateHosts(EasyMock.anyObject(AlertDefinitionEntity.class))).andReturn(
new HashSet<String>()).atLeastOnce();
replay(amc, clusters, cluster, dao, definitionHash);
SecurityContextHolder.getContext().setAuthentication(authentication);
MetricSource source = (MetricSource) getMockSource();
Map<String, Object> requestProps = new HashMap<String, Object>();
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME, "c1");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_INTERVAL, "1");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_NAME, "my_def");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_LABEL, "Label");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_DESCRIPTION,"Description");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_SERVICE_NAME, "HDFS");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_SOURCE_TYPE, "METRIC");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_ENABLED,
Boolean.TRUE.toString());
// JMX
requestProps.put("AlertDefinition/source/jmx/value",
source.getJmxInfo().getValue());
requestProps.put("AlertDefinition/source/jmx/property_list",
source.getJmxInfo().getPropertyList());
// URI
requestProps.put("AlertDefinition/source/uri/http",
source.getUri().getHttpUri());
requestProps.put("AlertDefinition/source/uri/https",
source.getUri().getHttpsUri());
requestProps.put("AlertDefinition/source/uri/https_property",
source.getUri().getHttpsProperty());
requestProps.put("AlertDefinition/source/uri/https_property_value",
source.getUri().getHttpsPropertyValue());
// reporting
requestProps.put("AlertDefinition/source/reporting/critical/text",
source.getReporting().getCritical().getText());
requestProps.put("AlertDefinition/source/reporting/critical/value",
source.getReporting().getCritical().getValue());
requestProps.put("AlertDefinition/source/reporting/ok/text",
source.getReporting().getOk().getText());
requestProps.put("AlertDefinition/source/reporting/warning/text",
source.getReporting().getWarning().getText());
requestProps.put("AlertDefinition/source/reporting/warning/value",
source.getReporting().getWarning().getValue());
Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
AlertDefinitionResourceProvider provider = createProvider(amc);
provider.createResources(request);
Assert.assertTrue(entityCapture.hasCaptured());
AlertDefinitionEntity entity = entityCapture.getValue();
Assert.assertNotNull(entity);
Predicate p = new PredicateBuilder().property(AlertDefinitionResourceProvider.ALERT_DEF_ID).equals(
"1").and().property(AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME).equals("c1").toPredicate();
// everything is mocked, there is no DB
entity.setDefinitionId(Long.valueOf(1));
String oldName = entity.getDefinitionName();
String oldHash = entity.getHash();
Integer oldInterval = entity.getScheduleInterval();
boolean oldEnabled = entity.getEnabled();
boolean oldHostIgnore = entity.isHostIgnored();
String oldSource = entity.getSource();
String oldDescription = entity.getDescription();
resetToStrict(dao);
expect(dao.findById(1L)).andReturn(entity).anyTimes();
expect(dao.merge((AlertDefinitionEntity) anyObject())).andReturn(entity).anyTimes();
replay(dao);
requestProps = new HashMap<String, Object>();
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_ID, "1");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME, "c1");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_INTERVAL, "2");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_NAME, "my_def2");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_LABEL, "Label 2");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_DESCRIPTION, "Description 2");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_SERVICE_NAME, "HDFS");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_SOURCE_TYPE, "METRIC");
// new URI
requestProps.put("AlertDefinition/source/uri/http", source.getUri().getHttpUri() + "_foobarbaz");
requestProps.put("AlertDefinition/source/uri/https", source.getUri().getHttpsUri()
+ "_foobarbaz");
requestProps.put("AlertDefinition/source/uri/https_property",
source.getUri().getHttpsProperty() + "_foobarbaz");
requestProps.put("AlertDefinition/source/uri/https_property_value",
source.getUri().getHttpsPropertyValue() + "_foobarbaz");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_ENABLED, Boolean.FALSE.toString());
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_IGNORE_HOST, Boolean.TRUE.toString());
request = PropertyHelper.getUpdateRequest(requestProps, null);
provider.updateResources(request, p);
Assert.assertFalse(oldHash.equals(entity.getHash()));
Assert.assertFalse(oldName.equals(entity.getDefinitionName()));
Assert.assertFalse(oldDescription.equals(entity.getDescription()));
Assert.assertFalse(oldInterval.equals(entity.getScheduleInterval()));
Assert.assertFalse(oldEnabled == entity.getEnabled());
Assert.assertFalse(oldHostIgnore == entity.isHostIgnored());
Assert.assertFalse(oldSource.equals(entity.getSource()));
Assert.assertTrue(entity.getSource().contains("_foobarbaz"));
verify(amc, clusters, cluster, dao);
}
/**
* @throws Exception
*/
@Test
public void testUpdateResourcesWithNumbersAsStrings() throws Exception {
AmbariManagementController amc = createMock(AmbariManagementController.class);
Clusters clusters = createMock(Clusters.class);
Cluster cluster = createMock(Cluster.class);
expect(amc.getClusters()).andReturn(clusters).atLeastOnce();
expect(clusters.getCluster((String) anyObject())).andReturn(cluster).atLeastOnce();
expect(cluster.getClusterId()).andReturn(Long.valueOf(1)).atLeastOnce();
Capture<AlertDefinitionEntity> entityCapture = new Capture<AlertDefinitionEntity>();
dao.create(capture(entityCapture));
expectLastCall();
// updateing a single definition should invalidate hosts of the definition
expect(definitionHash.invalidateHosts(EasyMock.anyObject(AlertDefinitionEntity.class))).andReturn(
new HashSet<String>()).atLeastOnce();
replay(amc, clusters, cluster, dao, definitionHash);
SecurityContextHolder.getContext().setAuthentication(TestAuthenticationFactory.createAdministrator());
MetricSource source = (MetricSource) getMockSource();
Map<String, Object> requestProps = new HashMap<String, Object>();
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME, "c1");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_INTERVAL, "1");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_NAME, "my_def");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_SERVICE_NAME, "HDFS");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_SOURCE_TYPE, "METRIC");
// Ambari converts all request bodies into Map<String,String>, even they are
// numbers - this will ensure that we can convert a string to a number
// properly
requestProps.put("AlertDefinition/source/reporting/critical/text",
source.getReporting().getCritical().getText());
requestProps.put("AlertDefinition/source/reporting/critical/value", "1234.5");
Request request = PropertyHelper.getCreateRequest(
Collections.singleton(requestProps), null);
AlertDefinitionResourceProvider provider = createProvider(amc);
provider.createResources(request);
Assert.assertTrue(entityCapture.hasCaptured());
AlertDefinitionEntity entity = entityCapture.getValue();
Assert.assertNotNull(entity);
String sourceJson = entity.getSource();
Gson gson = new Gson();
source = gson.fromJson(sourceJson, MetricSource.class);
// ensure it's actually a double and NOT a string
assertEquals(new Double(1234.5d), source.getReporting().getCritical().getValue());
verify(amc, clusters, cluster, dao);
}
@Test
public void testDeleteResourcesAsAdministrator() throws Exception {
testDeleteResources(TestAuthenticationFactory.createAdministrator());
}
@Test(expected = AuthorizationException.class)
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
*/
public void testDeleteResources(Authentication authentication) throws Exception {
AmbariManagementController amc = createMock(AmbariManagementController.class);
Clusters clusters = createMock(Clusters.class);
Cluster cluster = createMock(Cluster.class);
expect(amc.getClusters()).andReturn(clusters).atLeastOnce();
expect(clusters.getCluster((String) anyObject())).andReturn(cluster).atLeastOnce();
expect(cluster.getClusterId()).andReturn(Long.valueOf(1)).anyTimes();
Capture<AlertDefinitionEntity> entityCapture = new Capture<AlertDefinitionEntity>();
dao.create(capture(entityCapture));
expectLastCall();
// deleting a single definition should invalidate hosts of the definition
expect(
definitionHash.invalidateHosts(EasyMock.anyObject(AlertDefinitionEntity.class))).andReturn(
new HashSet<String>()).atLeastOnce();
replay(amc, clusters, cluster, dao, definitionHash);
SecurityContextHolder.getContext().setAuthentication(authentication);
AlertDefinitionResourceProvider provider = createProvider(amc);
Map<String, Object> requestProps = new HashMap<String, Object>();
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME, "c1");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_INTERVAL, "1");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_NAME, "my_def");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_SERVICE_NAME, "HDFS");
requestProps.put(AlertDefinitionResourceProvider.ALERT_DEF_SOURCE_TYPE, "METRIC");
Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
provider.createResources(request);
Assert.assertTrue(entityCapture.hasCaptured());
AlertDefinitionEntity entity = entityCapture.getValue();
Assert.assertNotNull(entity);
Predicate p = new PredicateBuilder().property(
AlertDefinitionResourceProvider.ALERT_DEF_ID).equals("1").and().property(
AlertDefinitionResourceProvider.ALERT_DEF_CLUSTER_NAME).equals("c1").toPredicate();
// everything is mocked, there is no DB
entity.setDefinitionId(Long.valueOf(1));
resetToStrict(dao);
expect(dao.findById(1L)).andReturn(entity).anyTimes();
dao.remove(capture(entityCapture));
expectLastCall();
replay(dao);
provider.deleteResources(new RequestImpl(null, null, null, null), p);
AlertDefinitionEntity entity1 = entityCapture.getValue();
Assert.assertEquals(Long.valueOf(1), entity1.getDefinitionId());
verify(amc, clusters, cluster, dao);
}
/**
* @param amc
* @return
*/
private AlertDefinitionResourceProvider createProvider(AmbariManagementController amc) {
return new AlertDefinitionResourceProvider(amc);
}
/**
* @return
*/
private List<AlertDefinitionEntity> getMockEntities() throws Exception {
Source source = getMockSource();
String sourceJson = new Gson().toJson(source);
ResourceEntity clusterResourceEntity = new ResourceEntity();
clusterResourceEntity.setId(4L);
ClusterEntity clusterEntity = new ClusterEntity();
clusterEntity.setResource(clusterResourceEntity);
AlertDefinitionEntity entity = new AlertDefinitionEntity();
entity.setClusterId(Long.valueOf(1L));
entity.setComponentName(null);
entity.setDefinitionId(Long.valueOf(1L));
entity.setDefinitionName("my_def");
entity.setLabel("Mock Label");
entity.setDescription("Mock Description");
entity.setEnabled(true);
entity.setHash(DEFINITION_UUID);
entity.setScheduleInterval(Integer.valueOf(2));
entity.setServiceName(null);
entity.setSourceType(SourceType.METRIC);
entity.setSource(sourceJson);
entity.setCluster(clusterEntity);
entity.setHelpURL("http://test-help-url");
return Arrays.asList(entity);
}
/**
* @return
*/
private Source getMockSource() throws Exception {
File alertsFile = new File(
"src/test/resources/stacks/HDP/2.0.5/services/HDFS/alerts.json");
Assert.assertTrue(alertsFile.exists());
Set<AlertDefinition> set = m_factory.getAlertDefinitions(alertsFile, "HDFS");
AlertDefinition nameNodeCpu = null;
Iterator<AlertDefinition> definitions = set.iterator();
while (definitions.hasNext()) {
AlertDefinition definition = definitions.next();
if (definition.getName().equals("namenode_cpu")) {
nameNodeCpu = definition;
}
}
Assert.assertNotNull(nameNodeCpu.getSource());
return nameNodeCpu.getSource();
}
/**
*
*/
private class MockModule implements Module {
/**
*
*/
@Override
public void configure(Binder binder) {
binder.bind(AlertDefinitionDAO.class).toInstance(dao);
binder.bind(AlertDefinitionHash.class).toInstance(definitionHash);
binder.bind(Clusters.class).toInstance(
EasyMock.createNiceMock(Clusters.class));
binder.bind(Cluster.class).toInstance(
EasyMock.createNiceMock(Cluster.class));
binder.bind(ActionMetadata.class);
}
}
}