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()); + } + } }
