Bladeren bron

AMBARI-17173. Allow option to skip duplicate URL checking when creating VDF (ncole)

Nate Cole 9 jaren geleden
bovenliggende
commit
08bc4c465e

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

+ 22 - 9
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.");
+          }
         }
       }
     }

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

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