Bläddra i källkod

AMBARI-6654. Add dependency inheritance for components. (aonishuk)

Andrew Onishuk 10 år sedan
förälder
incheckning
a5576c90ea

+ 44 - 13
ambari-server/src/main/java/org/apache/ambari/server/api/util/StackExtensionHelper.java

@@ -43,13 +43,7 @@ import javax.xml.xpath.XPathFactory;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.metadata.ActionMetadata;
-import org.apache.ambari.server.state.CommandScriptDefinition;
-import org.apache.ambari.server.state.ComponentInfo;
-import org.apache.ambari.server.state.CustomCommandDefinition;
-import org.apache.ambari.server.state.PropertyInfo;
-import org.apache.ambari.server.state.ServiceInfo;
-import org.apache.ambari.server.state.ServiceOsSpecific;
-import org.apache.ambari.server.state.StackInfo;
+import org.apache.ambari.server.state.*;
 import org.apache.ambari.server.state.stack.ConfigurationXml;
 import org.apache.ambari.server.state.stack.RepositoryXml;
 import org.apache.ambari.server.state.stack.ServiceMetainfoXml;
@@ -279,9 +273,12 @@ public class StackExtensionHelper {
   }
 
 
-  private ComponentInfo mergeComponents(ComponentInfo parent, ComponentInfo child) {
+  ComponentInfo mergeComponents(ComponentInfo parent, ComponentInfo child) {
     ComponentInfo result = new ComponentInfo(child); // cloning child
     CommandScriptDefinition commandScript = child.getCommandScript();
+    String category = child.getCategory();
+    String cardinality = child.getCardinality();
+
     if (commandScript != null) {
       result.setCommandScript(child.getCommandScript());
     } else {
@@ -292,15 +289,49 @@ public class StackExtensionHelper {
         child.getConfigDependencies() != null ?
             child.getConfigDependencies() : parent.getConfigDependencies());
 
-    // Merge custom command definitions for service
-    List<CustomCommandDefinition> mergedCustomCommands =
-            mergeCustomCommandLists(parent.getCustomCommands(),
-                    child.getCustomCommands());
-    result.setCustomCommands(mergedCustomCommands);
+    if (category != null) {
+      result.setCategory(child.getCategory());
+    } else {
+      result.setCategory(parent.getCategory());
+    }
+
+    if (cardinality != null) {
+      result.setCardinality(child.getCardinality());
+    } else {
+      result.setCardinality(parent.getCardinality());
+    }
+
+    result.setDependencies(
+        child.getDependencies() == null ?
+            parent.getDependencies() :
+            parent.getDependencies() == null ?
+                child.getDependencies() :
+                mergeComponentDependencies(parent.getDependencies(),
+                    child.getDependencies()));
 
     return result;
   }
 
+  List<DependencyInfo> mergeComponentDependencies(
+      List<DependencyInfo> parentList,
+      List<DependencyInfo> childList) {
+
+    List<DependencyInfo> mergedList =
+        new ArrayList<DependencyInfo>(childList);
+    List<String> existingNames = new ArrayList<String>();
+
+    for (DependencyInfo childDI : childList) {
+      existingNames.add(childDI.getName());
+    }
+    for (DependencyInfo parentsDI : parentList) {
+      if (! existingNames.contains(parentsDI.getName())) {
+        mergedList.add(parentsDI);
+        existingNames.add(parentsDI.getName());
+      }
+    }
+    return mergedList;
+  }
+
 
   private List<CustomCommandDefinition> mergeCustomCommandLists(
           List<CustomCommandDefinition> parentList,

+ 8 - 0
ambari-server/src/main/java/org/apache/ambari/server/state/ComponentInfo.java

@@ -172,10 +172,18 @@ public class ComponentInfo {
     return configDependencies != null && configDependencies.contains(type);
   }
 
+  public void setDependencies(List<DependencyInfo> dependencies) {
+    this.dependencies = dependencies;
+  }
+
   public AutoDeployInfo getAutoDeploy() {
     return autoDeploy;
   }
 
+  public void setCardinality(String cardinality) {
+    this.cardinality = cardinality;
+  }
+
   public String getCardinality() {
     return this.cardinality;
   }

+ 34 - 0
ambari-server/src/test/java/org/apache/ambari/server/api/util/StackExtensionHelperTest.java

@@ -646,5 +646,39 @@ public class StackExtensionHelperTest {
     assertNotNull(merged.getConfigTypes());
     assertEquals(0, merged.getConfigTypes().size());
   }
+
+  @Test
+  public void testMergeComponentInfo() throws Exception {
+    File stackRoot = new File(stackRootStr);
+    StackExtensionHelper helper = new StackExtensionHelper(injector, stackRoot);
+    ComponentInfo child = new ComponentInfo();
+    ComponentInfo parent = new ComponentInfo();
+    DependencyInfo a = new DependencyInfo();
+    a.setName("serviceName/A");
+    DependencyInfo b = new DependencyInfo();
+    b.setName("serviceName/B");
+    List<DependencyInfo> parentDependencies = new ArrayList<DependencyInfo>();
+    parentDependencies.add(a);
+    parentDependencies.add(b);
+    parent.setDependencies(parentDependencies);
+
+    DependencyInfo c = new DependencyInfo();
+    c.setName("serviceName/C");
+    List<DependencyInfo> childDependencies = new ArrayList<DependencyInfo>();
+    childDependencies.add(c);
+    child.setDependencies(childDependencies);
+
+    child.setCardinality("1");
+    parent.setCardinality("1+");
+
+    child.setCategory("CLIENT");
+    parent.setCategory("MASTER");
+
+    ComponentInfo result = helper.mergeComponents(parent, child);
+
+    assertEquals(result.getCardinality(),"1");
+    assertEquals(result.getCategory(), "CLIENT");
+    assertEquals(result.getDependencies().size(), 3);
+  }
 }