Parcourir la source

AMBARI-5708. stacks api returning invalid href's after endpoint renaming

John Speidel il y a 11 ans
Parent
commit
f8d06b4c7c

+ 62 - 0
ambari-server/src/main/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinition.java

@@ -0,0 +1,62 @@
+/**
+ * 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.api.resources;
+
+import org.apache.ambari.server.api.services.Request;
+import org.apache.ambari.server.api.util.TreeNode;
+import org.apache.ambari.server.controller.spi.Resource;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Abstract base class for all stacks related resource definitions.
+ * Because we cloned /stacks from /stacks2 and changed the endpoint names in stacks,
+ * this class is a temporary mechanism to deviate from the standard /stacks2 endpoint names.
+ *
+ */
+public abstract class BaseStacksResourceDefinition extends BaseResourceDefinition {
+  protected BaseStacksResourceDefinition(Resource.Type resourceType) {
+    super(resourceType);
+  }
+
+  @Override
+  public List<PostProcessor> getPostProcessors() {
+    return Collections.<PostProcessor>singletonList(new StacksHrefProcessor());
+  }
+
+  private class StacksHrefProcessor extends BaseHrefPostProcessor {
+    @Override
+    /**
+     * If processing a /stacks endpoint, replace the endpoint names.
+     */
+    public void process(Request request, TreeNode<Resource> resultNode, String href) {
+      super.process(request, resultNode, href);
+
+      String nodeHref = resultNode.getProperty("href");
+      if (nodeHref != null && nodeHref.contains("/stacks/")) {
+        nodeHref = nodeHref.replace("stackServices", "services");
+        nodeHref = nodeHref.replace("serviceComponents", "components");
+        nodeHref = nodeHref.replace("operatingSystems", "operating_systems");
+      }
+
+      resultNode.setProperty("href", nodeHref);
+    }
+  }
+}

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/resources/OperatingSystemResourceDefinition.java

@@ -24,7 +24,7 @@ import java.util.Set;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
 
-public class OperatingSystemResourceDefinition extends BaseResourceDefinition {
+public class OperatingSystemResourceDefinition extends BaseStacksResourceDefinition {
 
   public OperatingSystemResourceDefinition(Type resourceType) {
     super(resourceType);

+ 1 - 2
ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackConfigurationResourceDefinition.java

@@ -22,8 +22,7 @@ package org.apache.ambari.server.api.resources;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
 
-public class StackConfigurationResourceDefinition extends
-    BaseResourceDefinition {
+public class StackConfigurationResourceDefinition extends BaseStacksResourceDefinition {
 
   public StackConfigurationResourceDefinition(Type resourceType) {
     super(resourceType);

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackDependencyResourceDefinition.java

@@ -23,7 +23,7 @@ import org.apache.ambari.server.controller.spi.Resource;
 /**
  * Stack Service Dependency Resource Definition.
  */
-public class StackDependencyResourceDefinition extends BaseResourceDefinition {
+public class StackDependencyResourceDefinition extends BaseStacksResourceDefinition {
 
   /**
    * Constructor.

+ 1 - 2
ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceComponentResourceDefinition.java

@@ -23,8 +23,7 @@ import org.apache.ambari.server.controller.spi.Resource;
 import java.util.Collections;
 import java.util.Set;
 
-public class StackServiceComponentResourceDefinition extends
-    BaseResourceDefinition {
+public class StackServiceComponentResourceDefinition extends BaseStacksResourceDefinition {
 
   public StackServiceComponentResourceDefinition() {
     super(Resource.Type.StackServiceComponent);

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackServiceResourceDefinition.java

@@ -24,7 +24,7 @@ import java.util.Set;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
 
-public class StackServiceResourceDefinition extends BaseResourceDefinition {
+public class StackServiceResourceDefinition extends BaseStacksResourceDefinition {
 
   public StackServiceResourceDefinition(Type resourceType) {
     super(resourceType);

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/api/resources/StackVersionResourceDefinition.java

@@ -24,7 +24,7 @@ import java.util.Set;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
 
-public class StackVersionResourceDefinition extends BaseResourceDefinition {
+public class StackVersionResourceDefinition extends BaseStacksResourceDefinition {
 
   public StackVersionResourceDefinition(Type resourceType) {
     super(Resource.Type.StackVersion);

+ 82 - 0
ambari-server/src/test/java/org/apache/ambari/server/api/resources/BaseStacksResourceDefinitionTest.java

@@ -0,0 +1,82 @@
+/**
+ * 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.api.resources;
+
+import org.apache.ambari.server.api.util.TreeNode;
+import org.apache.ambari.server.api.util.TreeNodeImpl;
+import org.apache.ambari.server.controller.spi.Resource;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertEquals;
+
+
+/**
+ * BaseStacksResourceDefinition unit tests
+ */
+public class BaseStacksResourceDefinitionTest {
+
+  @Test
+  public void testHrefCreation() {
+    TestResourceDefinition resourceDefinition = new TestResourceDefinition();
+    ResourceDefinition.PostProcessor processor = resourceDefinition.getPostProcessors().iterator().next();
+
+    TreeNode<Resource> node = new TreeNodeImpl<Resource>(new TreeNodeImpl<Resource>(null, null, null), null, "test");
+
+    String href = "/stacks/HDP/versions/1.3.2/stackServices/foo";
+    processor.process(null, node, href);
+    assertEquals("/stacks/HDP/versions/1.3.2/services/foo", node.getProperty("href"));
+
+    href = "/stacks2/HDP/versions/1.3.2/stackServices/foo";
+    processor.process(null, node, href);
+    assertEquals("/stacks2/HDP/versions/1.3.2/stackServices/foo", node.getProperty("href"));
+
+    href = "/stacks/HDP/versions/1.3.2/stackServices/foo/serviceComponents";
+    processor.process(null, node, href);
+    assertEquals("/stacks/HDP/versions/1.3.2/services/foo/components", node.getProperty("href"));
+
+    href = "/stacks2/HDP/versions/1.3.2/stackServices/foo/serviceComponents";
+    processor.process(null, node, href);
+    assertEquals("/stacks2/HDP/versions/1.3.2/stackServices/foo/serviceComponents", node.getProperty("href"));
+
+    href = "/stacks/HDP/versions/1.3.2/operatingSystems";
+    processor.process(null, node, href);
+    assertEquals("/stacks/HDP/versions/1.3.2/operating_systems", node.getProperty("href"));
+
+    href = "/stacks2/HDP/versions/1.3.2/operatingSystems";
+    processor.process(null, node, href);
+    assertEquals("/stacks2/HDP/versions/1.3.2/operatingSystems", node.getProperty("href"));
+  }
+
+  private class TestResourceDefinition extends BaseStacksResourceDefinition {
+    private TestResourceDefinition() {
+      super(Resource.Type.StackServiceComponent);
+    }
+
+    @Override
+    public String getPluralName() {
+      return "tests";
+    }
+
+    @Override
+    public String getSingularName() {
+      return "test";
+    }
+  }
+}
+