You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ad...@apache.org on 2018/12/12 19:20:37 UTC

[ambari] branch trunk updated: AMBARI-25040. Handle blueprint/VDF stack version mismatch (#2719)

This is an automated email from the ASF dual-hosted git repository.

adoroszlai pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 6c9c06c  AMBARI-25040. Handle blueprint/VDF stack version mismatch (#2719)
6c9c06c is described below

commit 6c9c06c34bd31562962e5e956c201db3990fc8db
Author: Doroszlai, Attila <64...@users.noreply.github.com>
AuthorDate: Wed Dec 12 20:20:31 2018 +0100

    AMBARI-25040. Handle blueprint/VDF stack version mismatch (#2719)
---
 .../ambari/server/topology/AmbariContext.java      | 43 +++++++----
 .../ambari/server/topology/AmbariContextTest.java  | 84 ++++++++++++++++++----
 .../topology/addservice/RequestValidatorTest.java  | 14 +---
 .../org/apache/ambari/server/utils/Assertions.java | 35 +++++++++
 4 files changed, 136 insertions(+), 40 deletions(-)

diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
index dcb4739..34268ca 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
@@ -25,6 +25,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
@@ -265,23 +266,35 @@ public class AmbariContext {
         repoVersion = stackRepoVersions.get(0);
         LOG.warn("Cluster is being provisioned using the single matching repository version {}", repoVersion.getVersion());
       }
-    } else if (null != repoVersionId){
-      repoVersion = repositoryVersionDAO.findByPK(repoVersionId);
-
-      if (null == repoVersion) {
-        throw new IllegalArgumentException(String.format(
-          "Could not identify repository version with repository version id %s for installing services. "
-            + "Specify a valid repository version id with '%s'",
-          repoVersionId, ProvisionClusterRequest.REPO_VERSION_ID_PROPERTY));
-      }
     } else {
-      repoVersion = repositoryVersionDAO.findByStackAndVersion(stackId, repoVersionString);
+      if (null != repoVersionId) {
+        repoVersion = repositoryVersionDAO.findByPK(repoVersionId);
+
+        if (null == repoVersion) {
+          throw new IllegalArgumentException(String.format(
+            "Could not identify repository version with repository version id %s for installing services. "
+              + "Specify a valid repository version id with '%s'",
+            repoVersionId, ProvisionClusterRequest.REPO_VERSION_ID_PROPERTY));
+        }
+      } else {
+        repoVersion = repositoryVersionDAO.findByStackAndVersion(stackId, repoVersionString);
+
+        if (null == repoVersion) {
+          throw new IllegalArgumentException(String.format(
+            "Could not identify repository version with stack %s and version %s for installing services. "
+              + "Specify a valid version with '%s'",
+            stackId, repoVersionString, ProvisionClusterRequest.REPO_VERSION_PROPERTY));
+        }
+      }
 
-      if (null == repoVersion) {
-        throw new IllegalArgumentException(String.format(
-          "Could not identify repository version with stack %s and version %s for installing services. "
-            + "Specify a valid version with '%s'",
-          stackId, repoVersionString, ProvisionClusterRequest.REPO_VERSION_PROPERTY));
+      if (!Objects.equals(repoVersion.getStackId(), stackId)) {
+        String repoVersionPair = repoVersionId != null
+          ? String.format("'%s' = %d", ProvisionClusterRequest.REPO_VERSION_ID_PROPERTY, repoVersionId)
+          : String.format("'%s' = '%s'", ProvisionClusterRequest.REPO_VERSION_PROPERTY, repoVersionString);
+        String msg = String.format(
+          "The stack specified in the blueprint (%s) and the repository version (%s for %s) should match",
+          stackId, repoVersion.getStackId(), repoVersionPair);
+        throw new IllegalArgumentException(msg);
       }
     }
 
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
index ab0c152..dbab576 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.topology;
 
 import static java.util.Collections.singletonList;
+import static org.apache.ambari.server.utils.Assertions.assertThrows;
 import static org.easymock.EasyMock.anyObject;
 import static org.easymock.EasyMock.capture;
 import static org.easymock.EasyMock.createMock;
@@ -103,7 +104,7 @@ public class AmbariContextTest {
   private static final String HOST_GROUP_2 = "group2";
   private static final String HOST1 = "host1";
   private static final String HOST2 = "host2";
-  StackId stackId = new StackId(STACK_NAME, STACK_VERSION);
+  private static final StackId STACK_ID = new StackId(STACK_NAME, STACK_VERSION);
 
   private static final AmbariContext context = new AmbariContext();
   private static final AmbariManagementController controller = createNiceMock(AmbariManagementController.class);
@@ -735,17 +736,7 @@ public class AmbariContextTest {
 
     context.repositoryVersionDAO = repositoryVersionDAO;
 
-    controller.createCluster(capture(Capture.<ClusterRequest>newInstance()));
-    expectLastCall().once();
-    expect(cluster.getServices()).andReturn(clusterServices).anyTimes();
-
-    serviceResourceProvider.createServices(capture(Capture.<Set<ServiceRequest>>newInstance()));
-    expectLastCall().once();
-    componentResourceProvider.createComponents(capture(Capture.<Set<ServiceComponentRequest>>newInstance()));
-    expectLastCall().once();
-
-    expect(serviceResourceProvider.updateResources(
-        capture(Capture.<Request>newInstance()), capture(Capture.<Predicate>newInstance()))).andReturn(null).atLeastOnce();
+    expectAmbariResourceCreation();
 
     replayAll();
 
@@ -753,6 +744,23 @@ public class AmbariContextTest {
     context.createAmbariResources(topology, CLUSTER_NAME, null, null, null);
   }
 
+  private void expectAmbariResourceCreation() {
+    try {
+      controller.createCluster(capture(Capture.newInstance()));
+      expectLastCall().once();
+      expect(cluster.getServices()).andReturn(clusterServices).anyTimes();
+
+      serviceResourceProvider.createServices(capture(Capture.newInstance()));
+      expectLastCall().once();
+      componentResourceProvider.createComponents(capture(Capture.newInstance()));
+      expectLastCall().once();
+
+      expect(serviceResourceProvider.updateResources(capture(Capture.newInstance()), capture(Capture.newInstance()))).andReturn(null).atLeastOnce();
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
   @Test
   public void testCreateAmbariResourcesManyVersions() throws Exception {
 
@@ -807,4 +815,56 @@ public class AmbariContextTest {
     }
   }
 
+  @Test
+  public void testCreateAmbariResourcesVersionOK() {
+    RepositoryVersionEntity repoVersion = repositoryInClusterCreationRequest(1L, "3.0.1.2-345", STACK_ID);
+    expectAmbariResourceCreation();
+    replayAll();
+
+    context.createAmbariResources(topology, CLUSTER_NAME, null, repoVersion.getVersion(), null);
+  }
+
+  @Test
+  public void testCreateAmbariResourcesVersionByIdOK() {
+    RepositoryVersionEntity repoVersion = repositoryInClusterCreationRequest(1L, "3.0.1.2-345", STACK_ID);
+    expectAmbariResourceCreation();
+    replayAll();
+
+    context.createAmbariResources(topology, CLUSTER_NAME, null, null, repoVersion.getId());
+  }
+
+  @Test
+  public void testCreateAmbariResourcesVersionMismatch() {
+    RepositoryVersionEntity repoVersion = repositoryInClusterCreationRequest(1L, "3.0.1.2-345", new StackId("HDP", "3.0"));
+    replayAll();
+
+    IllegalArgumentException e = assertThrows(IllegalArgumentException.class,
+      () -> context.createAmbariResources(topology, CLUSTER_NAME, null, repoVersion.getVersion(), null));
+    assertTrue(e.getMessage(), e.getMessage().contains("should match"));
+  }
+
+  @Test
+  public void testCreateAmbariResourcesVersionMismatchById() {
+    RepositoryVersionEntity repoVersion = repositoryInClusterCreationRequest(1L, "3.0.1.2-345", new StackId("HDP", "3.0"));
+    replayAll();
+
+    IllegalArgumentException e = assertThrows(IllegalArgumentException.class,
+      () -> context.createAmbariResources(topology, CLUSTER_NAME, null, null, repoVersion.getId()));
+    assertTrue(e.getMessage(), e.getMessage().contains("should match"));
+  }
+
+  private RepositoryVersionEntity repositoryInClusterCreationRequest(Long id, String version, StackId stackId) {
+    RepositoryVersionEntity repoEntity = createNiceMock(RepositoryVersionEntity.class);
+    expect(repoEntity.getStackId()).andStubReturn(stackId);
+    expect(repoEntity.getId()).andStubReturn(id);
+    expect(repoEntity.getType()).andStubReturn(RepositoryType.STANDARD);
+    expect(repoEntity.getVersion()).andStubReturn(version);
+    RepositoryVersionDAO repositoryVersionDAO = createNiceMock(RepositoryVersionDAO.class);
+    expect(repositoryVersionDAO.findByPK(1L)).andStubReturn(repoEntity);
+    expect(repositoryVersionDAO.findByStackAndVersion(EasyMock.anyObject(StackId.class), EasyMock.anyString())).andStubReturn(repoEntity);
+    replay(repositoryVersionDAO, repoEntity);
+    context.repositoryVersionDAO = repositoryVersionDAO;
+    return repoEntity;
+  }
+
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/topology/addservice/RequestValidatorTest.java b/ambari-server/src/test/java/org/apache/ambari/server/topology/addservice/RequestValidatorTest.java
index 6b285dc..d0ab25c 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/topology/addservice/RequestValidatorTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/topology/addservice/RequestValidatorTest.java
@@ -20,6 +20,7 @@ package org.apache.ambari.server.topology.addservice;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toMap;
 import static java.util.stream.Collectors.toSet;
+import static org.apache.ambari.server.utils.Assertions.assertThrows;
 import static org.easymock.EasyMock.expect;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -604,17 +605,4 @@ public class RequestValidatorTest extends EasyMockSupport {
     ));
   }
 
-  private static <T extends Throwable> T assertThrows(Class<T> expectedException, Runnable code) {
-    try {
-      code.run();
-    } catch (Throwable t) {
-      if (expectedException.isInstance(t)) {
-        return expectedException.cast(t);
-      }
-      throw new AssertionError("Expected exception: " + expectedException + " but " + t.getClass() + " was thrown instead");
-    }
-
-    throw new AssertionError("Expected exception: " + expectedException + ", but was not thrown");
-  }
-
 }
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/utils/Assertions.java b/ambari-server/src/test/java/org/apache/ambari/server/utils/Assertions.java
new file mode 100644
index 0000000..8599185
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/utils/Assertions.java
@@ -0,0 +1,35 @@
+/*
+ * 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.utils;
+
+public class Assertions {
+
+  public static <T extends Exception> T assertThrows(Class<T> expectedException, Runnable code) {
+    try {
+      code.run();
+    } catch (Exception e) {
+      if (expectedException.isInstance(e)) {
+        return expectedException.cast(e);
+      }
+      throw new AssertionError("Expected exception: " + expectedException + " but " + e.getClass() + " was thrown instead", e);
+    }
+
+    throw new AssertionError("Expected exception: " + expectedException + ", but was not thrown");
+  }
+
+}