| /* |
| * 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.state.kerberos; |
| |
| import com.google.gson.Gson; |
| import junit.framework.Assert; |
| import org.apache.ambari.server.AmbariException; |
| import org.junit.Test; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.TreeMap; |
| import java.util.TreeSet; |
| |
| public class KerberosServiceDescriptorTest { |
| public static final String JSON_VALUE = |
| "{" + |
| " \"name\": \"SERVICE_NAME\"," + |
| " \"identities\": [" + |
| KerberosIdentityDescriptorTest.JSON_VALUE + |
| "]," + |
| " \"components\": [" + |
| KerberosComponentDescriptorTest.JSON_VALUE + |
| "]," + |
| " \"auth_to_local_properties\": [" + |
| " service.name.rules1" + |
| " ]," + |
| " \"configurations\": [" + |
| " {" + |
| " \"service-site\": {" + |
| " \"service.property1\": \"value1\"," + |
| " \"service.property2\": \"value2\"" + |
| " }" + |
| " }" + |
| " ]" + |
| "}"; |
| |
| public static final String JSON_VALUE_SERVICES = |
| "{ " + |
| "\"services\" : [" + |
| "{" + |
| " \"name\": \"SERVICE_NAME\"," + |
| " \"identities\": [" + |
| KerberosIdentityDescriptorTest.JSON_VALUE + |
| "]," + |
| " \"components\": [" + |
| KerberosComponentDescriptorTest.JSON_VALUE + |
| "]," + |
| " \"auth_to_local_properties\": [" + |
| " service.name.rules1" + |
| " ]," + |
| " \"configurations\": [" + |
| " {" + |
| " \"service-site\": {" + |
| " \"service.property1\": \"value1\"," + |
| " \"service.property2\": \"value2\"" + |
| " }" + |
| " }" + |
| " ]" + |
| "}," + |
| "{" + |
| " \"name\": \"A_DIFFERENT_SERVICE_NAME\"," + |
| " \"identities\": [" + |
| KerberosIdentityDescriptorTest.JSON_VALUE + |
| "]," + |
| " \"components\": [" + |
| KerberosComponentDescriptorTest.JSON_VALUE + |
| "]," + |
| " \"configurations\": [" + |
| " {" + |
| " \"service-site\": {" + |
| " \"service.property1\": \"value1\"," + |
| " \"service.property2\": \"value2\"" + |
| " }" + |
| " }" + |
| " ]" + |
| "}" + |
| "]" + |
| "}"; |
| |
| public static final Map<String, Object> MAP_VALUE; |
| |
| static { |
| Map<String, Object> identitiesMap = new TreeMap<String, Object>(); |
| identitiesMap.put((String) KerberosIdentityDescriptorTest.MAP_VALUE.get("name"), KerberosIdentityDescriptorTest.MAP_VALUE); |
| |
| Map<String, Object> componentsMap = new TreeMap<String, Object>(); |
| componentsMap.put((String) KerberosComponentDescriptorTest.MAP_VALUE.get("name"), KerberosComponentDescriptorTest.MAP_VALUE); |
| |
| Map<String, Object> serviceSiteProperties = new TreeMap<String, Object>(); |
| serviceSiteProperties.put("service.property1", "red"); |
| serviceSiteProperties.put("service.property", "green"); |
| |
| Map<String, Map<String, Object>> serviceSiteMap = new TreeMap<String, Map<String, Object>>(); |
| serviceSiteMap.put("service-site", serviceSiteProperties); |
| |
| TreeMap<String, Map<String, Map<String, Object>>> configurationsMap = new TreeMap<String, Map<String, Map<String, Object>>>(); |
| configurationsMap.put("service-site", serviceSiteMap); |
| |
| Collection<String> authToLocalRules = new ArrayList<String>(); |
| authToLocalRules.add("service.name.rules2"); |
| |
| MAP_VALUE = new TreeMap<String, Object>(); |
| MAP_VALUE.put("name", "A_DIFFERENT_SERVICE_NAME"); |
| MAP_VALUE.put(AbstractKerberosDescriptor.Type.IDENTITY.getDescriptorPluralName(), identitiesMap.values()); |
| MAP_VALUE.put(AbstractKerberosDescriptor.Type.COMPONENT.getDescriptorPluralName(), componentsMap.values()); |
| MAP_VALUE.put(AbstractKerberosDescriptor.Type.CONFIGURATION.getDescriptorPluralName(), configurationsMap.values()); |
| MAP_VALUE.put(AbstractKerberosDescriptor.Type.AUTH_TO_LOCAL_PROPERTY.getDescriptorPluralName(), authToLocalRules); |
| } |
| |
| private static final KerberosServiceDescriptorFactory KERBEROS_SERVICE_DESCRIPTOR_FACTORY = new KerberosServiceDescriptorFactory(); |
| |
| public static void validateFromJSON(KerberosServiceDescriptor[] serviceDescriptors) { |
| Assert.assertNotNull(serviceDescriptors); |
| Assert.assertEquals(2, serviceDescriptors.length); |
| |
| validateFromJSON(serviceDescriptors[0]); |
| } |
| |
| public static void validateFromJSON(KerberosServiceDescriptor serviceDescriptor) { |
| Assert.assertNotNull(serviceDescriptor); |
| Assert.assertTrue(serviceDescriptor.isContainer()); |
| |
| Assert.assertEquals("SERVICE_NAME", serviceDescriptor.getName()); |
| |
| Map<String, KerberosComponentDescriptor> componentDescriptors = serviceDescriptor.getComponents(); |
| Assert.assertNotNull(componentDescriptors); |
| Assert.assertEquals(1, componentDescriptors.size()); |
| |
| for (KerberosComponentDescriptor componentDescriptor : componentDescriptors.values()) { |
| KerberosComponentDescriptorTest.validateFromJSON(componentDescriptor); |
| } |
| |
| List<KerberosIdentityDescriptor> identityDescriptors = serviceDescriptor.getIdentities(); |
| Assert.assertNotNull(identityDescriptors); |
| Assert.assertEquals(1, identityDescriptors.size()); |
| |
| for (KerberosIdentityDescriptor identityDescriptor : identityDescriptors) { |
| KerberosIdentityDescriptorTest.validateFromJSON(identityDescriptor); |
| } |
| |
| Map<String, KerberosConfigurationDescriptor> configurations = serviceDescriptor.getConfigurations(); |
| |
| Assert.assertNotNull(configurations); |
| Assert.assertEquals(1, configurations.size()); |
| |
| KerberosConfigurationDescriptor configuration = configurations.get("service-site"); |
| |
| Assert.assertNotNull(configuration); |
| |
| Map<String, String> properties = configuration.getProperties(); |
| |
| Assert.assertEquals("service-site", configuration.getType()); |
| Assert.assertNotNull(properties); |
| Assert.assertEquals(2, properties.size()); |
| Assert.assertEquals("value1", properties.get("service.property1")); |
| Assert.assertEquals("value2", properties.get("service.property2")); |
| |
| Set<String> authToLocalProperties = serviceDescriptor.getAuthToLocalProperties(); |
| Assert.assertNotNull(authToLocalProperties); |
| Assert.assertEquals(1, authToLocalProperties.size()); |
| Assert.assertEquals("service.name.rules1", authToLocalProperties.iterator().next()); |
| } |
| |
| public static void validateFromMap(KerberosServiceDescriptor serviceDescriptor) { |
| Assert.assertNotNull(serviceDescriptor); |
| Assert.assertTrue(serviceDescriptor.isContainer()); |
| |
| Assert.assertEquals("A_DIFFERENT_SERVICE_NAME", serviceDescriptor.getName()); |
| |
| Map<String, KerberosComponentDescriptor> componentDescriptors = serviceDescriptor.getComponents(); |
| Assert.assertNotNull(componentDescriptors); |
| Assert.assertEquals(1, componentDescriptors.size()); |
| |
| for (KerberosComponentDescriptor componentDescriptor : componentDescriptors.values()) { |
| KerberosComponentDescriptorTest.validateFromMap(componentDescriptor); |
| } |
| |
| List<KerberosIdentityDescriptor> identityDescriptors = serviceDescriptor.getIdentities(); |
| Assert.assertNotNull(identityDescriptors); |
| Assert.assertEquals(1, identityDescriptors.size()); |
| |
| for (KerberosIdentityDescriptor identityDescriptor : identityDescriptors) { |
| KerberosIdentityDescriptorTest.validateFromMap(identityDescriptor); |
| } |
| |
| Map<String, KerberosConfigurationDescriptor> configurations = serviceDescriptor.getConfigurations(); |
| |
| Assert.assertNotNull(configurations); |
| Assert.assertEquals(1, configurations.size()); |
| |
| KerberosConfigurationDescriptor configuration = configurations.get("service-site"); |
| |
| Assert.assertNotNull(configuration); |
| |
| Map<String, String> properties = configuration.getProperties(); |
| |
| Assert.assertEquals("service-site", configuration.getType()); |
| Assert.assertNotNull(properties); |
| Assert.assertEquals(2, properties.size()); |
| Assert.assertEquals("red", properties.get("service.property1")); |
| Assert.assertEquals("green", properties.get("service.property")); |
| |
| Set<String> authToLocalProperties = serviceDescriptor.getAuthToLocalProperties(); |
| Assert.assertNotNull(authToLocalProperties); |
| Assert.assertEquals(1, authToLocalProperties.size()); |
| Assert.assertEquals("service.name.rules2", authToLocalProperties.iterator().next()); |
| } |
| |
| public void validateUpdatedData(KerberosServiceDescriptor serviceDescriptor) { |
| Assert.assertNotNull(serviceDescriptor); |
| |
| Assert.assertEquals("A_DIFFERENT_SERVICE_NAME", serviceDescriptor.getName()); |
| |
| Map<String, KerberosComponentDescriptor> componentDescriptors = serviceDescriptor.getComponents(); |
| Assert.assertNotNull(componentDescriptors); |
| Assert.assertEquals(2, componentDescriptors.size()); |
| |
| KerberosComponentDescriptorTest.validateFromJSON(serviceDescriptor.getComponent("COMPONENT_NAME")); |
| KerberosComponentDescriptorTest.validateFromMap(serviceDescriptor.getComponent("A_DIFFERENT_COMPONENT_NAME")); |
| |
| List<KerberosIdentityDescriptor> identityDescriptors = serviceDescriptor.getIdentities(); |
| Assert.assertNotNull(identityDescriptors); |
| Assert.assertEquals(1, identityDescriptors.size()); |
| |
| for (KerberosIdentityDescriptor identityDescriptor : identityDescriptors) { |
| KerberosIdentityDescriptorTest.validateUpdatedData(identityDescriptor); |
| } |
| |
| Map<String, KerberosConfigurationDescriptor> configurations = serviceDescriptor.getConfigurations(); |
| |
| Assert.assertNotNull(configurations); |
| Assert.assertEquals(1, configurations.size()); |
| |
| KerberosConfigurationDescriptor configuration = configurations.get("service-site"); |
| |
| Assert.assertNotNull(configuration); |
| |
| Map<String, String> properties = configuration.getProperties(); |
| |
| Assert.assertEquals("service-site", configuration.getType()); |
| Assert.assertNotNull(properties); |
| Assert.assertEquals(3, properties.size()); |
| Assert.assertEquals("red", properties.get("service.property1")); |
| Assert.assertEquals("value2", properties.get("service.property2")); |
| Assert.assertEquals("green", properties.get("service.property")); |
| |
| Set<String> authToLocalProperties = serviceDescriptor.getAuthToLocalProperties(); |
| Assert.assertNotNull(authToLocalProperties); |
| Assert.assertEquals(2, authToLocalProperties.size()); |
| // guarantee ordering... |
| Iterator<String> iterator = new TreeSet<String>(authToLocalProperties).iterator(); |
| Assert.assertEquals("service.name.rules1", iterator.next()); |
| Assert.assertEquals("service.name.rules2", iterator.next()); |
| |
| } |
| |
| private KerberosServiceDescriptor createFromJSON() throws AmbariException { |
| return KERBEROS_SERVICE_DESCRIPTOR_FACTORY.createInstance("SERVICE_NAME", JSON_VALUE); |
| } |
| |
| private KerberosServiceDescriptor[] createMultipleFromJSON() throws AmbariException { |
| return KERBEROS_SERVICE_DESCRIPTOR_FACTORY.createInstances(JSON_VALUE_SERVICES); |
| } |
| |
| private KerberosServiceDescriptor createFromMap() throws AmbariException { |
| return new KerberosServiceDescriptor(MAP_VALUE); |
| } |
| |
| private KerberosServiceDescriptor[] createFromFile() throws IOException { |
| URL url = getClass().getClassLoader().getResource("service_level_kerberos.json"); |
| File file = (url == null) ? null : new File(url.getFile()); |
| return KERBEROS_SERVICE_DESCRIPTOR_FACTORY.createInstances(file); |
| } |
| |
| @Test |
| public void testJSONDeserialize() throws AmbariException { |
| validateFromJSON(createFromJSON()); |
| } |
| |
| @Test |
| public void testJSONDeserializeMultiple() throws AmbariException { |
| validateFromJSON(createMultipleFromJSON()); |
| } |
| |
| @Test |
| public void testInvalid() { |
| // Invalid JSON syntax |
| try { |
| KERBEROS_SERVICE_DESCRIPTOR_FACTORY.createInstances(JSON_VALUE_SERVICES + "erroneous text"); |
| Assert.fail("Should have thrown AmbariException."); |
| } catch (AmbariException e) { |
| // This is expected |
| } catch (Throwable t) { |
| Assert.fail("Should have thrown AmbariException."); |
| } |
| |
| // Test missing top-level "services" |
| try { |
| KERBEROS_SERVICE_DESCRIPTOR_FACTORY.createInstances(JSON_VALUE); |
| Assert.fail("Should have thrown AmbariException."); |
| } catch (AmbariException e) { |
| // This is expected |
| } catch (Throwable t) { |
| Assert.fail("Should have thrown AmbariException."); |
| } |
| |
| // Test missing top-level "services" in file |
| URL url = getClass().getClassLoader().getResource("service_level_kerberos_invalid.json"); |
| File file = (url == null) ? null : new File(url.getFile()); |
| try { |
| KERBEROS_SERVICE_DESCRIPTOR_FACTORY.createInstances(file); |
| Assert.fail("Should have thrown AmbariException."); |
| } catch (AmbariException e) { |
| // This is expected |
| } catch (Throwable t) { |
| Assert.fail("Should have thrown AmbariException."); |
| } |
| } |
| |
| @Test |
| public void testFileDeserialize() throws IOException { |
| KerberosServiceDescriptor[] descriptors = createFromFile(); |
| Assert.assertNotNull(descriptors); |
| Assert.assertEquals(2, descriptors.length); |
| } |
| |
| @Test |
| public void testMapDeserialize() throws AmbariException { |
| validateFromMap(createFromMap()); |
| } |
| |
| @Test |
| public void testEquals() throws AmbariException { |
| Assert.assertTrue(createFromJSON().equals(createFromJSON())); |
| Assert.assertFalse(createFromJSON().equals(createFromMap())); |
| } |
| |
| @Test |
| public void testToMap() throws AmbariException { |
| Gson gson = new Gson(); |
| KerberosServiceDescriptor descriptor = createFromMap(); |
| Assert.assertNotNull(descriptor); |
| Assert.assertEquals(gson.toJson(MAP_VALUE), gson.toJson(descriptor.toMap())); |
| } |
| |
| @Test |
| public void testUpdate() throws AmbariException { |
| KerberosServiceDescriptor serviceDescriptor = createFromJSON(); |
| KerberosServiceDescriptor updatedServiceDescriptor = createFromMap(); |
| |
| Assert.assertNotNull(serviceDescriptor); |
| Assert.assertNotNull(updatedServiceDescriptor); |
| |
| serviceDescriptor.update(updatedServiceDescriptor); |
| |
| validateUpdatedData(serviceDescriptor); |
| } |
| |
| /** |
| * Test a JSON object in which only only a Service and configs are defined, but no Components. |
| * |
| * @throws AmbariException |
| */ |
| @Test |
| public void testJSONWithOnlyServiceNameAndConfigurations() throws AmbariException { |
| String JSON_VALUE_ONLY_NAME_AND_CONFIGS = |
| "{" + |
| " \"name\": \"SERVICE_NAME\"," + |
| " \"configurations\": [" + |
| " {" + |
| " \"service-site\": {" + |
| " \"service.property1\": \"value1\"," + |
| " \"service.property2\": \"value2\"" + |
| " }" + |
| " }" + |
| " ]" + |
| "}"; |
| |
| TreeMap<String, Object> CHANGE_NAME = new TreeMap<String, Object>() {{ |
| put("name", "A_DIFFERENT_SERVICE_NAME"); |
| }}; |
| |
| KerberosServiceDescriptor serviceDescriptor = KERBEROS_SERVICE_DESCRIPTOR_FACTORY.createInstance("SERVICE_NAME", JSON_VALUE_ONLY_NAME_AND_CONFIGS); |
| KerberosServiceDescriptor updatedServiceDescriptor = new KerberosServiceDescriptor(CHANGE_NAME); |
| |
| Assert.assertNotNull(serviceDescriptor); |
| Assert.assertNotNull(updatedServiceDescriptor); |
| |
| // Update |
| serviceDescriptor.update(updatedServiceDescriptor); |
| |
| // Validate |
| Assert.assertNotNull(serviceDescriptor); |
| Assert.assertEquals("A_DIFFERENT_SERVICE_NAME", serviceDescriptor.getName()); |
| } |
| } |