Repository: ambari Updated Branches: refs/heads/branch-2.4 fba361aa2 -> 08bc4c465
AMBARI-17173. Allow option to skip duplicate URL checking when creating VDF (ncole) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/08bc4c46 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/08bc4c46 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/08bc4c46 Branch: refs/heads/branch-2.4 Commit: 08bc4c465e6a77787eceb7abc907821cdcd97194 Parents: fba361a Author: Nate Cole <[email protected]> Authored: Fri Jun 10 15:17:26 2016 -0400 Committer: Nate Cole <[email protected]> Committed: Fri Jun 10 15:17:26 2016 -0400 ---------------------------------------------------------------------- .../VersionDefinitionResourceDefinition.java | 5 ++- .../RepositoryVersionResourceProvider.java | 31 ++++++++++----- .../VersionDefinitionResourceProvider.java | 23 ++++++----- .../VersionDefinitionResourceProviderTest.java | 41 ++++++++++++++++++-- 4 files changed, 78 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/08bc4c46/ambari-server/src/main/java/org/apache/ambari/server/api/resources/VersionDefinitionResourceDefinition.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/VersionDefinitionResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/VersionDefinitionResourceDefinition.java index 30afa69..6f2815e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/VersionDefinitionResourceDefinition.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/VersionDefinitionResourceDefinition.java @@ -26,6 +26,8 @@ import org.apache.ambari.server.controller.spi.Request; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.spi.Resource.Type; +import com.google.common.collect.Sets; + /** * The Resource Definition used for Version Definition files. */ @@ -52,7 +54,8 @@ public class VersionDefinitionResourceDefinition extends BaseResourceDefinition @Override public Collection<String> getCreateDirectives() { - return Collections.singleton(Request.DIRECTIVE_DRY_RUN); + return Sets.newHashSet(Request.DIRECTIVE_DRY_RUN, + VersionDefinitionResourceProvider.DIRECTIVE_SKIP_URL_CHECK); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/08bc4c46/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java index fae279d..62568cf 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java @@ -434,11 +434,21 @@ public class RepositoryVersionResourceProvider extends AbstractAuthorizedResourc /** * Validates newly created repository versions to contain actual information. * - * @param repositoryVersion repository version * @throws AmbariException exception with error message */ protected static void validateRepositoryVersion(RepositoryVersionDAO dao, AmbariMetaInfo metaInfo, RepositoryVersionEntity repositoryVersion) throws AmbariException { + validateRepositoryVersion(dao, metaInfo, repositoryVersion, false); + } + + /** + * Validates newly created repository versions to contain actual information. Optionally + * skip url duplication. + * + * @throws AmbariException exception with error message + */ + protected static void validateRepositoryVersion(RepositoryVersionDAO dao, + AmbariMetaInfo metaInfo, RepositoryVersionEntity repositoryVersion, boolean skipUrlCheck) throws AmbariException { final StackId requiredStack = new StackId(repositoryVersion.getStack()); final String requiredStackName = requiredStack.getStackName(); @@ -466,14 +476,17 @@ public class RepositoryVersionResourceProvider extends AbstractAuthorizedResourc } final Set<String> osRepositoryVersion = new HashSet<String>(); - for (OperatingSystemEntity os: repositoryVersion.getOperatingSystems()) { - osRepositoryVersion.add(os.getOsType()); - - for (RepositoryEntity repositoryEntity : os.getRepositories()) { - String baseUrl = repositoryEntity.getBaseUrl(); - if (os.isAmbariManagedRepos() && existingRepoUrls.contains(baseUrl)) { - throw new AmbariException("Base url " + baseUrl + " is already defined for another repository version. " + - "Setting up base urls that contain the same versions of components will cause stack upgrade to fail."); + + if (!skipUrlCheck) { + for (OperatingSystemEntity os: repositoryVersion.getOperatingSystems()) { + osRepositoryVersion.add(os.getOsType()); + + for (RepositoryEntity repositoryEntity : os.getRepositories()) { + String baseUrl = repositoryEntity.getBaseUrl(); + if (os.isAmbariManagedRepos() && existingRepoUrls.contains(baseUrl)) { + throw new AmbariException("Base url " + baseUrl + " is already defined for another repository version. " + + "Setting up base urls that contain the same versions of components will cause stack upgrade to fail."); + } } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/08bc4c46/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java index c18d722..4a061c5 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java @@ -23,7 +23,6 @@ import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -62,6 +61,7 @@ import org.apache.ambari.server.state.repository.VersionDefinitionXml; import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; @@ -103,6 +103,8 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc protected static final String VERSION_DEF_VALIDATION = "VersionDefinition/validation"; protected static final String SHOW_AVAILABLE = "VersionDefinition/show_available"; + public static final String DIRECTIVE_SKIP_URL_CHECK = "skip_url_check"; + public static final String SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID = new OperatingSystemResourceDefinition().getPluralName(); @Inject @@ -127,8 +129,7 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc VERSION_DEF_ID, VERSION_DEF_STACK_NAME, VERSION_DEF_STACK_VERSION, - VERSION_DEF_FULL_VERSION - ); + VERSION_DEF_FULL_VERSION); /** * The property ids for an version definition resource. @@ -157,11 +158,8 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc /** * The key property ids for an version definition resource. */ - private static final Map<Resource.Type, String> KEY_PROPERTY_IDS = new HashMap<Resource.Type, String>(); - - static { - KEY_PROPERTY_IDS.put(Resource.Type.VersionDefinition, VERSION_DEF_ID); - } + private static final Map<Resource.Type, String> KEY_PROPERTY_IDS = + Collections.singletonMap(Resource.Type.VersionDefinition, VERSION_DEF_ID); /** * Constructor. @@ -205,6 +203,13 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc final Set<String> validations = new HashSet<>(); final boolean dryRun = request.isDryRunRequest(); + final boolean skipUrlCheck; + if (null != request.getRequestInfoProperties()) { + skipUrlCheck = BooleanUtils.toBoolean(request.getRequestInfoProperties().get(DIRECTIVE_SKIP_URL_CHECK)); + } else { + skipUrlCheck = false; + } + XmlHolder xmlHolder = createResources(new Command<XmlHolder>() { @Override public XmlHolder invoke() throws AmbariException { @@ -239,7 +244,7 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc try { RepositoryVersionResourceProvider.validateRepositoryVersion(s_repoVersionDAO, - s_metaInfo.get(), holder.entity); + s_metaInfo.get(), holder.entity, skipUrlCheck); } catch (AmbariException e) { if (dryRun) { validations.add(e.getMessage()); http://git-wip-us.apache.org/repos/asf/ambari/blob/08bc4c46/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java index e0ff2b3..3bc4aec 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProviderTest.java @@ -471,7 +471,8 @@ public class VersionDefinitionResourceProviderTest { // !!! create one, but a dry run to make sure we get two validation errors - Map<String, String> infoProps = Collections.singletonMap(Request.DIRECTIVE_DRY_RUN, "true"); + Map<String, String> infoProps = new HashMap<>(); + infoProps.put(Request.DIRECTIVE_DRY_RUN, "true"); createRequest = PropertyHelper.getCreateRequest(Collections.singleton(createMap), infoProps); RequestStatus status = versionProvider.createResources(createRequest); @@ -493,7 +494,42 @@ public class VersionDefinitionResourceProviderTest { Set<String> validation = (Set<String>) res.getPropertyValue("VersionDefinition/validation"); Assert.assertEquals(3, validation.size()); - // dry-run with a changed name. should get one validation error about version + validation = (Set<String>) res.getPropertyValue("VersionDefinition/validation"); + Assert.assertEquals(3, validation.size()); + + boolean found = false; + for (String reason : validation) { + if (reason.contains("http://baseurl1")) { + found = true; + } + } + + Assert.assertTrue("URL validation should be checked", found); + + + // !!! test url validation + infoProps.put(VersionDefinitionResourceProvider.DIRECTIVE_SKIP_URL_CHECK, "true"); + createRequest = PropertyHelper.getCreateRequest(Collections.singleton(createMap), infoProps); + status = versionProvider.createResources(createRequest); + + Assert.assertEquals(1, status.getAssociatedResources().size()); + + res = status.getAssociatedResources().iterator().next(); + Assert.assertTrue(res.getPropertiesMap().containsKey("VersionDefinition")); + Assert.assertEquals("2.2.1.0", res.getPropertyValue("VersionDefinition/repository_version")); + Assert.assertNotNull(res.getPropertyValue("VersionDefinition/show_available")); + Assert.assertNotNull(res.getPropertyValue("VersionDefinition/validation")); + + validation = (Set<String>) res.getPropertyValue("VersionDefinition/validation"); + Assert.assertEquals(3, validation.size()); + for (String reason : validation) { + if (reason.contains("http://baseurl1")) { + Assert.fail("URL validation should be skipped for http://baseurl1"); + } + } + + // dry-run with a changed name + infoProps.remove(VersionDefinitionResourceProvider.DIRECTIVE_SKIP_URL_CHECK); createMap.put(VersionDefinitionResourceProvider.VERSION_DEF_DISPLAY_NAME, "HDP-2.2.0.4-a"); createRequest = PropertyHelper.getCreateRequest(Collections.singleton(createMap), infoProps); status = versionProvider.createResources(createRequest); @@ -509,6 +545,5 @@ public class VersionDefinitionResourceProviderTest { validation = (Set<String>) res.getPropertyValue("VersionDefinition/validation"); Assert.assertEquals(2, validation.size()); - } }
