Repository: ambari Updated Branches: refs/heads/branch-dev-patch-upgrade 964808275 -> 784c7e456
Revert "AMBARI-18355: Introduce conditional dependencies in stack defition to handle blueprint validation gracefully (Amruta Borkar via dili)" This reverts commit f6124a056d2a8ed16bec917775b9d3554ab5d74d. Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e0d4a871 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e0d4a871 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e0d4a871 Branch: refs/heads/branch-dev-patch-upgrade Commit: e0d4a8713ed0ffe86acd18bd798c317d5e51a61c Parents: f6124a0 Author: Jonathan Hurley <[email protected]> Authored: Fri Oct 7 15:36:00 2016 -0400 Committer: Jonathan Hurley <[email protected]> Committed: Fri Oct 7 15:36:00 2016 -0400 ---------------------------------------------------------------------- .../server/state/DependencyConditionInfo.java | 102 ------------------- .../ambari/server/state/DependencyInfo.java | 36 +------ .../server/topology/BlueprintValidatorImpl.java | 13 --- .../common-services/HDFS/2.1.0.2.0/metainfo.xml | 44 -------- .../topology/BlueprintValidatorImplTest.java | 75 +------------- 5 files changed, 2 insertions(+), 268 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/e0d4a871/ambari-server/src/main/java/org/apache/ambari/server/state/DependencyConditionInfo.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/DependencyConditionInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/DependencyConditionInfo.java deleted file mode 100644 index 84e186f..0000000 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/DependencyConditionInfo.java +++ /dev/null @@ -1,102 +0,0 @@ -/** - * 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; - -import java.util.Map; -import java.util.Objects; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.adapters.XmlAdapter; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; - -import org.apache.commons.lang.NotImplementedException; - -/** - * Represents stack component dependency condition information. - */ -@XmlJavaTypeAdapter(DependencyConditionAdapter.class) -public abstract class DependencyConditionInfo { - public abstract boolean isResolved(Map<String, Map<String, String>> properties); -} - -class PropertyExistsDependencyCondition extends DependencyConditionInfo{ - - protected final String configType; - protected final String property; - public PropertyExistsDependencyCondition( String configType, String property) { - this.configType = Objects.requireNonNull(configType, "Config Type must not be null."); - this.property = Objects.requireNonNull(property, "Property Name must not be null."); - } - - @Override - public boolean isResolved(Map<String, Map<String, String>> properties) { - return (properties.get(configType).containsKey(property)); - } -} - -class PropertyValueEqualsDependencyCondition extends PropertyExistsDependencyCondition { - - protected final String propertyValue; - public PropertyValueEqualsDependencyCondition(String configType, String property, String propertyValue) { - super(configType, property); - this.propertyValue = Objects.requireNonNull(propertyValue, "Property value must not be null."); - } - - @Override - public boolean isResolved(Map<String, Map<String, String>> properties) { - return (super.isResolved(properties) && propertyValue.equals(properties.get(configType).get(property))); - } -} - -class DependencyConditionAdapter extends XmlAdapter<DependencyConditionAdapter.AdaptedDependencyCondition, DependencyConditionInfo> { - - static class AdaptedDependencyCondition{ - @XmlElement - private String configType; - @XmlElement - private String property; - @XmlElement - private String propertyValue; - @XmlElement(name="condition-type") - private String conditionType; - } - - @Override - public AdaptedDependencyCondition marshal(DependencyConditionInfo arg0) throws Exception { - throw new NotImplementedException(); - } - - @Override - public DependencyConditionInfo unmarshal(AdaptedDependencyCondition adaptedDependencyCondition) throws Exception { - if (null == adaptedDependencyCondition) { - return null; - } - DependencyConditionInfo dependencyConditionInfo = null; - switch (adaptedDependencyCondition.conditionType) { - case "IF-PROPERTY-EXISTS": - dependencyConditionInfo = new PropertyExistsDependencyCondition(adaptedDependencyCondition.configType, adaptedDependencyCondition.property); - break; - case "PROPERTY-VALUE-EQUALS": - dependencyConditionInfo = new PropertyValueEqualsDependencyCondition(adaptedDependencyCondition.configType, adaptedDependencyCondition.property, adaptedDependencyCondition.propertyValue); - break; - default: - throw new IllegalArgumentException("Specified condition type is not not supported " + adaptedDependencyCondition.conditionType); - } - return dependencyConditionInfo; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/e0d4a871/ambari-server/src/main/java/org/apache/ambari/server/state/DependencyInfo.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/DependencyInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/DependencyInfo.java index 3c88401..e3db662 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/DependencyInfo.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/DependencyInfo.java @@ -20,10 +20,6 @@ package org.apache.ambari.server.state; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlElements; -import java.util.ArrayList; -import java.util.List; /** * Represents stack component dependency information. @@ -58,10 +54,7 @@ public class DependencyInfo { @XmlElement(name="auto-deploy") private AutoDeployInfo m_autoDeploy; - /** - * Conditions for Component dependency to other components. - */ - private List<DependencyConditionInfo> dependencyConditions = new ArrayList<DependencyConditionInfo>(); + /** * Setter for name property. * @@ -142,33 +135,6 @@ public class DependencyInfo { public String getServiceName() { return serviceName; } - /** - * Get the dependencyConditions list - * - * @return dependencyConditions - */ - @XmlElementWrapper(name="conditions") - @XmlElements(@XmlElement(name="condition")) - public List<DependencyConditionInfo> getDependencyConditions() { - return dependencyConditions; - } - - /** - * Set dependencyConditions - * - * @param dependencyConditions - */ - public void setDependencyConditions(List<DependencyConditionInfo> dependencyConditions) { - this.dependencyConditions = dependencyConditions; - } - - /** - * Confirms if dependency have any condition or not - * @return true if dependencies are based on a condition - */ - public boolean hasDependencyConditions(){ - return !(dependencyConditions == null || dependencyConditions.isEmpty()); - } @Override public String toString() { http://git-wip-us.apache.org/repos/asf/ambari/blob/e0d4a871/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintValidatorImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintValidatorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintValidatorImpl.java index 7bbe0db..a5f33ff 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintValidatorImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/BlueprintValidatorImpl.java @@ -30,7 +30,6 @@ import java.util.regex.Pattern; import org.apache.ambari.server.controller.internal.Stack; import org.apache.ambari.server.state.AutoDeployInfo; -import org.apache.ambari.server.state.DependencyConditionInfo; import org.apache.ambari.server.state.DependencyInfo; import org.apache.ambari.server.utils.SecretReference; import org.apache.ambari.server.utils.VersionUtils; @@ -290,18 +289,6 @@ public class BlueprintValidatorImpl implements BlueprintValidator { AutoDeployInfo autoDeployInfo = dependency.getAutoDeploy(); boolean resolved = false; - //check if conditions are met, if any - if(dependency.hasDependencyConditions()) { - boolean conditionsSatisfied = true; - for (DependencyConditionInfo dependencyCondition : dependency.getDependencyConditions()) { - if (!dependencyCondition.isResolved(blueprint.getConfiguration().getFullProperties())) { - conditionsSatisfied = false; - } - } - if(!conditionsSatisfied){ - continue; - } - } if (dependencyScope.equals("cluster")) { Collection<String> missingDependencyInfo = verifyComponentCardinalityCount( componentName, new Cardinality("1+"), autoDeployInfo); http://git-wip-us.apache.org/repos/asf/ambari/blob/e0d4a871/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metainfo.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metainfo.xml b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metainfo.xml index dfbbd55..65d166a 100644 --- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metainfo.xml +++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/metainfo.xml @@ -32,50 +32,6 @@ <cardinality>1-2</cardinality> <versionAdvertised>true</versionAdvertised> <reassignAllowed>true</reassignAllowed> - <dependencies> - <dependency> - <name>HDFS/ZKFC</name> - <scope>host</scope> - <auto-deploy> - <enabled>false</enabled> - </auto-deploy> - <conditions> - <condition> - <condition-type>IF-PROPERTY-EXISTS</condition-type> - <configType>hdfs-site</configType> - <property>dfs.nameservices</property> - </condition> - </conditions> - </dependency> - <dependency> - <name>ZOOKEEPER/ZOOKEEPER_SERVER</name> - <scope>host</scope> - <auto-deploy> - <enabled>false</enabled> - </auto-deploy> - <conditions> - <condition> - <condition-type>IF-PROPERTY-EXISTS</condition-type> - <configType>hdfs-site</configType> - <property>dfs.nameservices</property> - </condition> - </conditions> - </dependency> - <dependency> - <name>HDFS/JOURNALNODE</name> - <scope>host</scope> - <auto-deploy> - <enabled>false</enabled> - </auto-deploy> - <conditions> - <condition> - <condition-type>IF-PROPERTY-EXISTS</condition-type> - <configType>hdfs-site</configType> - <property>dfs.nameservices</property> - </condition> - </conditions> - </dependency> - </dependencies> <commandScript> <script>scripts/namenode.py</script> <scriptType>PYTHON</scriptType> http://git-wip-us.apache.org/repos/asf/ambari/blob/e0d4a871/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintValidatorImplTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintValidatorImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintValidatorImplTest.java index 1501c53..b1de8ef 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintValidatorImplTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/BlueprintValidatorImplTest.java @@ -34,9 +34,7 @@ import java.util.Map; import org.apache.ambari.server.controller.internal.Stack; import org.apache.ambari.server.state.AutoDeployInfo; import org.apache.ambari.server.state.ComponentInfo; -import org.apache.ambari.server.state.DependencyConditionInfo; import org.apache.ambari.server.state.DependencyInfo; -import org.easymock.EasyMock; import org.easymock.EasyMockRule; import org.easymock.Mock; import org.easymock.MockType; @@ -68,22 +66,15 @@ public class BlueprintValidatorImplTest { @Mock(type = MockType.NICE) private DependencyInfo dependency1; - @Mock(type = MockType.NICE) - private DependencyInfo dependency2; @Mock(type = MockType.NICE) private ComponentInfo dependencyComponentInfo; - @Mock(type = MockType.NICE) - private DependencyConditionInfo dependencyConditionInfo1; - @Mock(type = MockType.NICE) - private DependencyConditionInfo dependencyConditionInfo2; private final Collection<String> group1Components = new ArrayList<String>(); private final Collection<String> group2Components = new ArrayList<String>(); private final Collection<String> services = new ArrayList<String>(); private Collection<DependencyInfo> dependencies1 = new ArrayList<DependencyInfo>(); - private List<DependencyConditionInfo> dependenciesConditionInfos1 = new ArrayList<DependencyConditionInfo>(); private AutoDeployInfo autoDeploy = new AutoDeployInfo(); private Map<String, Map<String, String>> configProperties = new HashMap<String, Map<String, String>>(); private Configuration configuration = new Configuration(configProperties, Collections.<String, Map<String, Map<String, String>>>emptyMap()); @@ -114,15 +105,13 @@ public class BlueprintValidatorImplTest { expect(stack.getCardinality("component1")).andReturn(new Cardinality("1")); expect(stack.getCardinality("component2")).andReturn(new Cardinality("1+")); expect(stack.getCardinality("component3")).andReturn(new Cardinality("1+")); - dependenciesConditionInfos1.add(dependencyConditionInfo1); - dependenciesConditionInfos1.add(dependencyConditionInfo2); expect(blueprint.getConfiguration()).andReturn(configuration).anyTimes(); } @After public void tearDown() { - reset(blueprint, stack, group1, group2, dependency1, dependency2, dependencyConditionInfo1, dependencyConditionInfo2); + reset(blueprint, stack, group1, group2, dependency1); } @Test @@ -352,66 +341,4 @@ public class BlueprintValidatorImplTest { verify(group1); } - @Test(expected=InvalidTopologyException.class) - public void testWhenComponentIsConditionallyDependentAndOnlyOneOfTheConditionsIsSatisfied() throws Exception { - // GIVEN - hostGroups.clear(); - hostGroups.put("group1", group1); - - group1Components.add("component-1"); - dependencies1.add(dependency1); - dependencies1.add(dependency2); - services.addAll(Collections.singleton("service-1")); - - - expect(blueprint.getHostGroupsForComponent("component-1")).andReturn(Arrays.asList(group1)).anyTimes(); - expect(blueprint.getName()).andReturn("blueprint-1").anyTimes(); - Map<String, Map<String, String>> properties = new HashMap<String, Map<String, String>>(); - Map<String, String> typeProps = new HashMap<String, String>(); - typeProps.put("yarn.resourcemanager.hostname", "testhost"); - properties.put("yarn-site", typeProps); - - Configuration clusterConfig = new Configuration(properties, - Collections.<String, Map<String, Map<String, String>>>emptyMap()); - - Cardinality cardinality = new Cardinality("1"); - - expect(stack.getComponents("service-1")).andReturn(Arrays.asList("component-1")).anyTimes(); - expect(stack.getAutoDeployInfo("component-1")).andReturn(autoDeploy).anyTimes(); - expect(stack.getDependenciesForComponent("component-1")).andReturn(dependencies1).anyTimes(); - expect(stack.getCardinality("component-1")).andReturn(cardinality).anyTimes(); - - AutoDeployInfo dependencyAutoDeploy = null; - - expect(dependency1.getScope()).andReturn("host").anyTimes(); - expect(dependency1.getAutoDeploy()).andReturn(dependencyAutoDeploy).anyTimes(); - expect(dependency1.getComponentName()).andReturn("component-d").anyTimes(); - expect(dependency1.getServiceName()).andReturn("service-d").anyTimes(); - expect(dependency1.getName()).andReturn("dependency-1").anyTimes(); - expect(dependency1.hasDependencyConditions()).andReturn(true).anyTimes(); - expect(dependency1.getDependencyConditions()).andReturn(dependenciesConditionInfos1).anyTimes(); - expect(dependency2.getScope()).andReturn("host").anyTimes(); - expect(dependency2.getAutoDeploy()).andReturn(dependencyAutoDeploy).anyTimes(); - expect(dependency2.getComponentName()).andReturn("component-d").anyTimes(); - expect(dependency2.getServiceName()).andReturn("service-d").anyTimes(); - expect(dependency2.getName()).andReturn("dependency-2").anyTimes(); - expect(dependency2.hasDependencyConditions()).andReturn(false).anyTimes(); - - expect(dependencyConditionInfo1.isResolved(EasyMock.anyObject(Map.class))).andReturn(true).anyTimes(); - expect(dependencyConditionInfo2.isResolved(EasyMock.anyObject(Map.class))).andReturn(false).anyTimes(); - - - expect(dependencyComponentInfo.isClient()).andReturn(false).anyTimes(); - expect(stack.getComponentInfo("component-d")).andReturn(dependencyComponentInfo).anyTimes(); - - replay(blueprint, stack, group1, group2, dependency1, dependency2, dependencyComponentInfo,dependencyConditionInfo1,dependencyConditionInfo2); - - // WHEN - BlueprintValidator validator = new BlueprintValidatorImpl(blueprint); - validator.validateTopology(); - - // THEN - verify(group1); - - } }
