blob: 100e7f6f893a26736bcde02025300dfa7b2afcab [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 junit.framework.Assert;
import org.apache.ambari.server.controller.spi.*;
import org.apache.ambari.server.controller.utilities.PredicateHelper;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
import org.apache.ambari.server.controller.utilities.PredicateBuilder;
import org.junit.Test;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Cluster controller tests
*/
public class ClusterControllerImplTest {
private static final Set<String> propertyProviderProperties = new HashSet<String>();
private static final String UNSUPPORTED_PROPERTY = PropertyHelper.getPropertyId("c1", "unsupported");
static {
propertyProviderProperties.add(PropertyHelper.getPropertyId("c3", "p5"));
propertyProviderProperties.add(PropertyHelper.getPropertyId("c3", "p6"));
propertyProviderProperties.add(PropertyHelper.getPropertyId("c4", "p7"));
propertyProviderProperties.add(PropertyHelper.getPropertyId("c4", "p8"));
}
private static final PropertyProvider propertyProvider = new PropertyProvider() {
@Override
public Set<Resource> populateResources(Set<Resource> resources, Request request, Predicate predicate) {
int cnt = 0;
for (Resource resource : resources){
resource.setProperty(PropertyHelper.getPropertyId("c3", "p5"), cnt + 100);
resource.setProperty(PropertyHelper.getPropertyId("c3", "p6"), cnt % 2);
resource.setProperty(PropertyHelper.getPropertyId("c4", "p7"), "monkey");
resource.setProperty(PropertyHelper.getPropertyId("c4", "p8"), "runner");
++cnt;
}
return resources;
}
@Override
public Set<String> checkPropertyIds(Set<String> propertyIds) {
if (!propertyProviderProperties.containsAll(propertyIds)) {
Set<String> unsupportedPropertyIds = new HashSet<String>(propertyIds);
unsupportedPropertyIds.removeAll(propertyProviderProperties);
return unsupportedPropertyIds;
}
return Collections.emptySet();
}
};
private static final List<PropertyProvider> propertyProviders = new LinkedList<PropertyProvider>();
static {
propertyProviders.add(propertyProvider);
}
private static final Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
static {
keyPropertyIds.put(Resource.Type.Cluster, PropertyHelper.getPropertyId("c1", "p1"));
keyPropertyIds.put(Resource.Type.Host, PropertyHelper.getPropertyId("c1", "p2"));
}
private static final Set<String> resourceProviderProperties = new HashSet<String>();
static {
resourceProviderProperties.add(PropertyHelper.getPropertyId("c1", "p1"));
resourceProviderProperties.add(PropertyHelper.getPropertyId("c1", "p2"));
resourceProviderProperties.add(PropertyHelper.getPropertyId("c1", "p3"));
resourceProviderProperties.add(PropertyHelper.getPropertyId("c2", "p4"));
}
@Test
public void testGetResources() throws Exception{
ClusterController controller = new ClusterControllerImpl(new TestProviderModule());
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(PropertyHelper.getPropertyId("c1", "p1"));
propertyIds.add(PropertyHelper.getPropertyId("c1", "p3"));
Request request = PropertyHelper.getReadRequest(propertyIds);
Iterable<Resource> iterable = controller.getResources(Resource.Type.Host, request, null);
int cnt = 0;
for (Resource resource : iterable) {
Assert.assertEquals(Resource.Type.Host, resource.getType());
++cnt;
}
Assert.assertEquals(4, cnt);
}
@Test
public void testGetResourcesEmptyRequest() throws Exception{
ClusterController controller = new ClusterControllerImpl(new TestProviderModule());
Set<String> propertyIds = new HashSet<String>();
Request request = PropertyHelper.getReadRequest(propertyIds);
Iterable<Resource> iterable = controller.getResources(Resource.Type.Host, request, null);
int cnt = 0;
for (Resource resource : iterable) {
Assert.assertEquals(Resource.Type.Host, resource.getType());
++cnt;
}
Assert.assertEquals(4, cnt);
}
@Test
public void testGetResourcesWithPredicate() throws Exception{
ClusterController controller = new ClusterControllerImpl(new TestProviderModule());
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(PropertyHelper.getPropertyId("c1", "p1"));
propertyIds.add(PropertyHelper.getPropertyId("c1", "p2"));
propertyIds.add(PropertyHelper.getPropertyId("c1", "p3"));
propertyIds.add(PropertyHelper.getPropertyId("c2", "p4"));
Request request = PropertyHelper.getReadRequest(propertyIds);
Predicate predicate = new PredicateBuilder().property("c1/p2").equals(1).toPredicate();
Iterable<Resource> iterable = controller.getResources(Resource.Type.Host, request, predicate);
int cnt = 0;
for (Resource resource : iterable) {
Assert.assertEquals(Resource.Type.Host, resource.getType());
++cnt;
}
Assert.assertEquals(2, cnt);
}
@Test
public void testGetResourcesWithUnsupportedPropertyPredicate() throws Exception{
ClusterController controller = new ClusterControllerImpl(new TestProviderModule());
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(PropertyHelper.getPropertyId("c1", "p1"));
propertyIds.add(PropertyHelper.getPropertyId("c1", "p2"));
propertyIds.add(PropertyHelper.getPropertyId("c1", "p3"));
propertyIds.add(PropertyHelper.getPropertyId("c2", "p4"));
Request request = PropertyHelper.getReadRequest(propertyIds);
Predicate predicate = new PredicateBuilder().property(UNSUPPORTED_PROPERTY).equals(1).toPredicate();
try {
controller.getResources(Resource.Type.Host, request, predicate);
Assert.fail("Expected an UnsupportedPropertyException for the unsupported properties.");
} catch (UnsupportedPropertyException e) {
// Expected
}
}
@Test
public void testGetResourcesWithUnsupportedPropertyRequest() throws Exception{
ClusterController controller = new ClusterControllerImpl(new TestProviderModule());
Set<String> propertyIds = new HashSet<String>();
propertyIds.add(PropertyHelper.getPropertyId("c1", "p1"));
propertyIds.add(PropertyHelper.getPropertyId("c1", "p2"));
propertyIds.add(PropertyHelper.getPropertyId("c1", "p3"));
propertyIds.add(UNSUPPORTED_PROPERTY);
Request request = PropertyHelper.getReadRequest(propertyIds);
Predicate predicate = new PredicateBuilder().property("c1/p2").equals(1).toPredicate();
try {
controller.getResources(Resource.Type.Host, request, predicate);
Assert.fail("Expected an UnsupportedPropertyException for the unsupported properties.");
} catch (UnsupportedPropertyException e) {
// Expected
}
}
@Test
public void testCreateResources() throws Exception{
TestProviderModule providerModule = new TestProviderModule();
TestResourceProvider resourceProvider = (TestResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
ClusterController controller = new ClusterControllerImpl(providerModule);
Set<Map<String, Object>> properties = new HashSet<Map<String, Object>>();
Map<String, Object> propertyMap = new HashMap<String, Object>();
propertyMap.put(PropertyHelper.getPropertyId("c1", "p1"), 99);
propertyMap.put(PropertyHelper.getPropertyId("c1", "p2"), 2);
properties.add(propertyMap);
Request request = PropertyHelper.getCreateRequest(properties);
controller.createResources(Resource.Type.Host, request);
Assert.assertEquals(TestResourceProvider.Action.Create, resourceProvider.getLastAction());
Assert.assertSame(request, resourceProvider.getLastRequest());
Assert.assertNull(resourceProvider.getLastPredicate());
}
@Test
public void testCreateResourcesWithUnsupportedProperty() throws Exception{
TestProviderModule providerModule = new TestProviderModule();
ClusterController controller = new ClusterControllerImpl(providerModule);
Set<Map<String, Object>> properties = new HashSet<Map<String, Object>>();
Map<String, Object> propertyMap = new HashMap<String, Object>();
propertyMap.put(PropertyHelper.getPropertyId("c1", "p1"), 99);
propertyMap.put(UNSUPPORTED_PROPERTY, 2);
properties.add(propertyMap);
Request request = PropertyHelper.getCreateRequest(properties);
try {
controller.createResources(Resource.Type.Host, request);
Assert.fail("Expected an UnsupportedPropertyException for the unsupported properties.");
} catch (UnsupportedPropertyException e) {
// Expected
}
}
@Test
public void testUpdateResources() throws Exception{
TestProviderModule providerModule = new TestProviderModule();
TestResourceProvider resourceProvider = (TestResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
ClusterController controller = new ClusterControllerImpl(providerModule);
Map<String, Object> propertyMap = new HashMap<String, Object>();
propertyMap.put(PropertyHelper.getPropertyId("c1", "p1"), 99);
propertyMap.put(PropertyHelper.getPropertyId("c1", "p2"), 2);
Request request = PropertyHelper.getUpdateRequest(propertyMap);
Predicate predicate = new PredicateBuilder().property("c1/p2").equals(1).toPredicate();
controller.updateResources(Resource.Type.Host, request, predicate);
Assert.assertEquals(TestResourceProvider.Action.Update, resourceProvider.getLastAction());
Assert.assertSame(request, resourceProvider.getLastRequest());
Assert.assertSame(predicate, resourceProvider.getLastPredicate());
}
@Test
public void testUpdateResourcesWithUnsupportedPropertyRequest() throws Exception{
TestProviderModule providerModule = new TestProviderModule();
ClusterController controller = new ClusterControllerImpl(providerModule);
Map<String, Object> propertyMap = new HashMap<String, Object>();
propertyMap.put(PropertyHelper.getPropertyId("c1", "p1"), 99);
propertyMap.put(UNSUPPORTED_PROPERTY, 2);
Request request = PropertyHelper.getUpdateRequest(propertyMap);
Predicate predicate = new PredicateBuilder().property("c1/p2").equals(1).toPredicate();
try {
controller.updateResources(Resource.Type.Host, request, predicate);
Assert.fail("Expected an UnsupportedPropertyException for the unsupported properties.");
} catch (UnsupportedPropertyException e) {
// Expected
}
}
@Test
public void testUpdateResourcesWithUnsupportedPropertyPredicate() throws Exception{
TestProviderModule providerModule = new TestProviderModule();
ClusterController controller = new ClusterControllerImpl(providerModule);
Map<String, Object> propertyMap = new HashMap<String, Object>();
propertyMap.put(PropertyHelper.getPropertyId("c1", "p1"), 99);
propertyMap.put(PropertyHelper.getPropertyId("c1", "p2"), 2);
Request request = PropertyHelper.getUpdateRequest(propertyMap);
Predicate predicate = new PredicateBuilder().property(UNSUPPORTED_PROPERTY).equals(1).toPredicate();
try {
controller.updateResources(Resource.Type.Host, request, predicate);
Assert.fail("Expected an UnsupportedPropertyException for the unsupported properties.");
} catch (UnsupportedPropertyException e) {
// Expected
}
}
@Test
public void testUpdateResourcesResolvePredicate() throws Exception{
TestProviderModule providerModule = new TestProviderModule();
TestResourceProvider resourceProvider = (TestResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
ClusterController controller = new ClusterControllerImpl(providerModule);
Map<String, Object> propertyMap = new HashMap<String, Object>();
propertyMap.put(PropertyHelper.getPropertyId("c1", "p1"), 99);
propertyMap.put(PropertyHelper.getPropertyId("c1", "p2"), 2);
Request request = PropertyHelper.getUpdateRequest(propertyMap);
Predicate predicate = new PredicateBuilder().property("c3/p6").equals(1).toPredicate();
controller.updateResources(Resource.Type.Host, request, predicate);
Assert.assertEquals(TestResourceProvider.Action.Update, resourceProvider.getLastAction());
Assert.assertSame(request, resourceProvider.getLastRequest());
Predicate lastPredicate = resourceProvider.getLastPredicate();
Assert.assertFalse(predicate.equals(lastPredicate));
Set<String> predicatePropertyIds = PredicateHelper.getPropertyIds(lastPredicate);
Collection<String> keyPropertyIds = resourceProvider.getKeyPropertyIds().values();
Assert.assertEquals(predicatePropertyIds.size(), keyPropertyIds.size());
Assert.assertTrue(keyPropertyIds.containsAll(predicatePropertyIds));
}
@Test
public void testDeleteResources() throws Exception{
TestProviderModule providerModule = new TestProviderModule();
TestResourceProvider resourceProvider = (TestResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
ClusterController controller = new ClusterControllerImpl(providerModule);
Predicate predicate = new PredicateBuilder().property("c1/p2").equals(1).toPredicate();
controller.deleteResources(Resource.Type.Host, predicate);
Assert.assertEquals(TestResourceProvider.Action.Delete, resourceProvider.getLastAction());
Assert.assertNull(resourceProvider.getLastRequest());
Assert.assertSame(predicate, resourceProvider.getLastPredicate());
}
@Test
public void testDeleteResourcesWithUnsupportedProperty() throws Exception{
TestProviderModule providerModule = new TestProviderModule();
ClusterController controller = new ClusterControllerImpl(providerModule);
Predicate predicate = new PredicateBuilder().property(UNSUPPORTED_PROPERTY).equals(1).toPredicate();
try {
controller.deleteResources(Resource.Type.Host, predicate);
Assert.fail("Expected an UnsupportedPropertyException for the unsupported properties.");
} catch (UnsupportedPropertyException e) {
// Expected
}
}
@Test
public void testDeleteResourcesResolvePredicate() throws Exception{
TestProviderModule providerModule = new TestProviderModule();
TestResourceProvider resourceProvider = (TestResourceProvider) providerModule.getResourceProvider(Resource.Type.Host);
ClusterController controller = new ClusterControllerImpl(providerModule);
Predicate predicate = new PredicateBuilder().property("c3/p6").equals(1).toPredicate();
controller.deleteResources(Resource.Type.Host, predicate);
Assert.assertEquals(TestResourceProvider.Action.Delete, resourceProvider.getLastAction());
Assert.assertNull(resourceProvider.getLastRequest());
Predicate lastPredicate = resourceProvider.getLastPredicate();
Assert.assertFalse(predicate.equals(lastPredicate));
Set<String> predicatePropertyIds = PredicateHelper.getPropertyIds(lastPredicate);
Collection<String> keyPropertyIds = resourceProvider.getKeyPropertyIds().values();
Assert.assertEquals(predicatePropertyIds.size(), keyPropertyIds.size());
Assert.assertTrue(keyPropertyIds.containsAll(predicatePropertyIds));
}
// @Test
// public void testGetSchema() {
// ProviderModule module = new TestProviderModule();
//
// ClusterController controller = new ClusterControllerImpl(module);
// Schema schema = controller.getSchema(Resource.Type.Host);
//
// ResourceProvider resourceProvider = module.getResourceProvider(Resource.Type.Host);
//
// Map<Resource.Type, String> keyPropertyIds = resourceProvider.getKeyPropertyIds();
// for (Map.Entry<Resource.Type, String> entry : keyPropertyIds.entrySet()) {
// Assert.assertEquals(entry.getValue(), schema.getKeyPropertyId(entry.getKey()));
// }
//
// Map<String, Set<String>> categories = schema.getCategoryProperties();
// for (String propertyId : resourceProvider.getPropertyIdsForSchema()) {
// String category = PropertyHelper.getPropertyCategory(propertyId);
// Set<String> properties = categories.get(category);
// Assert.assertNotNull(properties);
// Assert.assertTrue(properties.contains(PropertyHelper.getPropertyName(propertyId)));
// }
//
// List<PropertyProvider> propertyProviders = module.getPropertyProviders(Resource.Type.Host);
//
// for (PropertyProvider propertyProvider : propertyProviders) {
// for (String propertyId : propertyProvider.getPropertyIds()) {
// String category = PropertyHelper.getPropertyCategory(propertyId);
// Set<String> properties = categories.get(category);
// Assert.assertNotNull(properties);
// Assert.assertTrue(properties.contains(PropertyHelper.getPropertyName(propertyId)));
// }
// }
// }
private static class TestProviderModule implements ProviderModule {
private Map<Resource.Type, ResourceProvider> providers = new HashMap<Resource.Type, ResourceProvider>();
private TestProviderModule() {
providers.put(Resource.Type.Cluster, new TestResourceProvider());
providers.put(Resource.Type.Service, new TestResourceProvider());
providers.put(Resource.Type.Component, new TestResourceProvider());
providers.put(Resource.Type.Host, new TestResourceProvider());
providers.put(Resource.Type.HostComponent, new TestResourceProvider());
}
@Override
public ResourceProvider getResourceProvider(Resource.Type type) {
return providers.get(type);
}
@Override
public List<PropertyProvider> getPropertyProviders(Resource.Type type) {
return propertyProviders;
}
}
private static class TestResourceProvider implements ResourceProvider {
private Action lastAction = null;
private Request lastRequest = null;
private Predicate lastPredicate = null;
@Override
public Set<Resource> getResources(Request request, Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
Set<Resource> resources = new HashSet<Resource>();
for (int cnt = 0; cnt < 4; ++ cnt) {
ResourceImpl resource = new ResourceImpl(Resource.Type.Host);
resource.setProperty(PropertyHelper.getPropertyId("c1", "p1"), cnt);
resource.setProperty(PropertyHelper.getPropertyId("c1", "p2"), cnt % 2);
resource.setProperty(PropertyHelper.getPropertyId("c1", "p3"), "foo");
resource.setProperty(PropertyHelper.getPropertyId("c2", "p4"), "bar");
resources.add(resource);
}
return resources;
}
@Override
public RequestStatus createResources(Request request) {
lastAction = Action.Create;
lastRequest = request;
lastPredicate = null;
return new RequestStatusImpl(null);
}
@Override
public RequestStatus updateResources(Request request, Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
lastAction = Action.Update;
lastRequest = request;
lastPredicate = predicate;
return new RequestStatusImpl(null);
}
@Override
public RequestStatus deleteResources(Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
lastAction = Action.Delete;
lastRequest = null;
lastPredicate = predicate;
return new RequestStatusImpl(null);
}
@Override
public Set<String> checkPropertyIds(Set<String> propertyIds) {
if (!resourceProviderProperties.containsAll(propertyIds)) {
Set<String> unsupportedPropertyIds = new HashSet<String>(propertyIds);
unsupportedPropertyIds.removeAll(resourceProviderProperties);
return unsupportedPropertyIds;
}
return Collections.emptySet();
}
@Override
public Map<Resource.Type, String> getKeyPropertyIds() {
return keyPropertyIds;
}
public Action getLastAction() {
return lastAction;
}
public Request getLastRequest() {
return lastRequest;
}
public Predicate getLastPredicate() {
return lastPredicate;
}
public enum Action {
Create,
Update,
Delete
}
}
}