Repository: ambari
Updated Branches:
  refs/heads/branch-feature-AMBARI-21450 ba15d80e2 -> 99484dccd


AMBARI-21721. Blueprint deployments failing without version string (ncole)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/297704d9
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/297704d9
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/297704d9

Branch: refs/heads/branch-feature-AMBARI-21450
Commit: 297704d99ad51be7a9152b931d736eeae24dc851
Parents: 2d52cfb
Author: Nate Cole <[email protected]>
Authored: Mon Aug 14 16:54:22 2017 -0400
Committer: Nate Cole <[email protected]>
Committed: Mon Aug 14 16:54:22 2017 -0400

----------------------------------------------------------------------
 .../ambari/server/topology/AmbariContext.java   | 39 ++++++++-
 .../server/topology/AmbariContextTest.java      | 92 ++++++++++++++++++--
 2 files changed, 122 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/297704d9/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
----------------------------------------------------------------------
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 6332fbf..d77d13c 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
@@ -57,6 +57,7 @@ import 
org.apache.ambari.server.controller.internal.ComponentResourceProvider;
 import 
org.apache.ambari.server.controller.internal.ConfigGroupResourceProvider;
 import 
org.apache.ambari.server.controller.internal.HostComponentResourceProvider;
 import org.apache.ambari.server.controller.internal.HostResourceProvider;
+import org.apache.ambari.server.controller.internal.ProvisionClusterRequest;
 import org.apache.ambari.server.controller.internal.RequestImpl;
 import org.apache.ambari.server.controller.internal.ServiceResourceProvider;
 import org.apache.ambari.server.controller.internal.Stack;
@@ -79,9 +80,12 @@ import org.apache.ambari.server.state.SecurityType;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.configgroup.ConfigGroup;
 import org.apache.ambari.server.utils.RetryHelper;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Striped;
@@ -195,11 +199,38 @@ public class AmbariContext {
     Stack stack = topology.getBlueprint().getStack();
     StackId stackId = new StackId(stack.getName(), stack.getVersion());
 
-    RepositoryVersionEntity repoVersion = 
repositoryVersionDAO.findByStackAndVersion(stackId, repoVersionString);
+    RepositoryVersionEntity repoVersion = null;
+    if (null == repoVersionString) {
+      List<RepositoryVersionEntity> stackRepoVersions = 
repositoryVersionDAO.findByStack(stackId);
 
-    if (null == repoVersion) {
-      throw new IllegalArgumentException(String.format("Could not identify 
repository version with stack %s and version %s for installing services",
-          stackId, repoVersionString));
+      if (stackRepoVersions.isEmpty()) {
+        throw new IllegalArgumentException(String.format("No repositories were 
found for %s", stackId));
+      } else if (stackRepoVersions.size() > 1) {
+
+        Function<RepositoryVersionEntity, String> function = new 
Function<RepositoryVersionEntity, String>() {
+          @Override
+          public String apply(RepositoryVersionEntity input) {
+            return input.getVersion();
+          }
+        };
+
+        Collection<String> versions = 
Collections2.transform(stackRepoVersions, function);
+
+        throw new IllegalArgumentException(String.format("Several repositories 
were found for %s:  %s.  Specify the version"
+            + " with '%s'", stackId, StringUtils.join(versions, ", "), 
ProvisionClusterRequest.REPO_VERSION_PROPERTY));
+      } else {
+        repoVersion = stackRepoVersions.get(0);
+        LOG.warn("Cluster is being provisioned using the single matching 
repository version {}", repoVersion.getVersion());
+      }
+    } 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));
+      }
     }
 
     createAmbariClusterResource(clusterName, stack.getName(), 
stack.getVersion(), securityType);

http://git-wip-us.apache.org/repos/asf/ambari/blob/297704d9/ambari-server/src/test/java/org/apache/ambari/server/topology/AmbariContextTest.java
----------------------------------------------------------------------
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 e92a619..fc4fa86 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
@@ -31,6 +31,7 @@ import static org.easymock.EasyMock.verify;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
@@ -204,12 +205,15 @@ public class AmbariContextTest {
             type1Service1).anyTimes();
     replay(type1Service1);
 
-    RepositoryVersionDAO repositoryVersionDAO = 
createStrictMock(RepositoryVersionDAO.class);
-    RepositoryVersionEntity repositoryVersion = 
createStrictMock(RepositoryVersionEntity.class);
-    expect(repositoryVersion.getId()).andReturn(1L).anyTimes();
-    
expect(repositoryVersionDAO.findByStackAndVersion(EasyMock.anyObject(StackId.class),
-        EasyMock.anyString())).andReturn(repositoryVersion).anyTimes();
+    RepositoryVersionDAO repositoryVersionDAO = 
createNiceMock(RepositoryVersionDAO.class);
+    RepositoryVersionEntity repositoryVersion = 
createNiceMock(RepositoryVersionEntity.class);
+    expect(repositoryVersion.getId()).andReturn(1L).atLeastOnce();
+    expect(repositoryVersion.getVersion()).andReturn("1.1.1.1").atLeastOnce();
+
+    
expect(repositoryVersionDAO.findByStack(EasyMock.anyObject(StackId.class))).andReturn(
+        Collections.singletonList(repositoryVersion)).atLeastOnce();
     replay(repositoryVersionDAO, repositoryVersion);
+
     context.repositoryVersionDAO = repositoryVersionDAO;
 
     context.configFactory = configFactory;
@@ -689,5 +693,83 @@ public class AmbariContextTest {
     assertFalse(topologyResolved);
   }
 
+  @Test
+  public void testCreateAmbariResourcesNoVersions() throws Exception {
+
+    RepositoryVersionDAO repositoryVersionDAO = 
createNiceMock(RepositoryVersionDAO.class);
+    RepositoryVersionEntity repositoryVersion = 
createNiceMock(RepositoryVersionEntity.class);
+    expect(repositoryVersion.getId()).andReturn(1L).atLeastOnce();
+    expect(repositoryVersion.getVersion()).andReturn("1.1.1.1").atLeastOnce();
+
+    
expect(repositoryVersionDAO.findByStack(EasyMock.anyObject(StackId.class))).andReturn(
+        Collections.<RepositoryVersionEntity>emptyList()).atLeastOnce();
+    replay(repositoryVersionDAO, repositoryVersion);
+
+    context.repositoryVersionDAO = repositoryVersionDAO;
+
+    replayAll();
+
+    // test
+    try {
+      context.createAmbariResources(topology, CLUSTER_NAME, null, null);
+      fail("Expected failure when no versions are found");
+    } catch (IllegalArgumentException e) {
+      assertEquals("No repositories were found for testStack-testVersion", 
e.getMessage());
+    }
+  }
+
+  @Test
+  public void testCreateAmbariResourcesManyVersions() throws Exception {
+
+    RepositoryVersionDAO repositoryVersionDAO = 
createNiceMock(RepositoryVersionDAO.class);
+    RepositoryVersionEntity repositoryVersion1 = 
createNiceMock(RepositoryVersionEntity.class);
+    expect(repositoryVersion1.getId()).andReturn(1L).atLeastOnce();
+    expect(repositoryVersion1.getVersion()).andReturn("1.1.1.1").atLeastOnce();
+
+    RepositoryVersionEntity repositoryVersion2 = 
createNiceMock(RepositoryVersionEntity.class);
+    expect(repositoryVersion2.getId()).andReturn(2L).atLeastOnce();
+    expect(repositoryVersion2.getVersion()).andReturn("1.1.2.2").atLeastOnce();
+
+    
expect(repositoryVersionDAO.findByStack(EasyMock.anyObject(StackId.class))).andReturn(
+        Arrays.asList(repositoryVersion1, repositoryVersion2)).atLeastOnce();
+    replay(repositoryVersionDAO, repositoryVersion1, repositoryVersion2);
+
+    context.repositoryVersionDAO = repositoryVersionDAO;
+
+    replayAll();
+
+    // test
+    try {
+      context.createAmbariResources(topology, CLUSTER_NAME, null, null);
+      fail("Expected failure when several versions are found");
+    } catch (IllegalArgumentException e) {
+      assertEquals(
+          "Several repositories were found for testStack-testVersion:  
1.1.1.1, 1.1.2.2.  Specify the version with 'repository_version'",
+          e.getMessage());
+    }
+  }
+
+  @Test
+  public void testCreateAmbariResourcesBadVersion() throws Exception {
+
+    RepositoryVersionDAO repositoryVersionDAO = 
createNiceMock(RepositoryVersionDAO.class);
+    
expect(repositoryVersionDAO.findByStackAndVersion(EasyMock.anyObject(StackId.class),
+        EasyMock.anyString())).andReturn(null).atLeastOnce();
+    replay(repositoryVersionDAO);
+
+    context.repositoryVersionDAO = repositoryVersionDAO;
+
+    replayAll();
+
+    // test
+    try {
+      context.createAmbariResources(topology, CLUSTER_NAME, null, "xyz");
+      fail("Expected failure when a bad version is provided");
+    } catch (IllegalArgumentException e) {
+      assertEquals(
+          "Could not identify repository version with stack 
testStack-testVersion and version xyz for installing services. Specify a valid 
version with 'repository_version'",
+          e.getMessage());
+    }
+  }
 
 }

Reply via email to