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

aonishuk pushed a commit to branch branch-2.6
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/branch-2.6 by this push:
     new cad4b63  AMBARI-22934. [API] Updating current stack repo without GPL 
repos in the body does not throw any error. (mpapirkovkyy)
cad4b63 is described below

commit cad4b63ec782e34b2b9a77b0ee56f20602a198ab
Author: Myroslav Papirkovskyi <mpapirkovs...@apache.org>
AuthorDate: Mon Feb 5 19:40:06 2018 +0200

    AMBARI-22934. [API] Updating current stack repo without GPL repos in the 
body does not throw any error. (mpapirkovkyy)
---
 .../controller/AmbariManagementControllerImpl.java |  3 +-
 .../RepositoryVersionResourceProvider.java         | 30 +++++++++++++
 .../stack/upgrade/RepositoryVersionHelper.java     | 36 +++++++++++++++-
 .../RepositoryVersionResourceProviderTest.java     | 49 ++++++++++++++++++++++
 .../stack/upgrade/RepositoryVersionHelperTest.java | 43 +++++++++++++++++++
 5 files changed, 158 insertions(+), 3 deletions(-)

diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 2f49bf3..f7d4d7a 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -190,7 +190,6 @@ import 
org.apache.ambari.server.state.quicklinksprofile.QuickLinksProfile;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
 import org.apache.ambari.server.state.scheduler.RequestExecutionFactory;
 import org.apache.ambari.server.state.stack.OsFamily;
-import org.apache.ambari.server.state.stack.RepoTag;
 import org.apache.ambari.server.state.stack.RepositoryXml;
 import org.apache.ambari.server.state.stack.WidgetLayout;
 import org.apache.ambari.server.state.stack.WidgetLayoutInfo;
@@ -4506,7 +4505,7 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
         for (RepositoryXml.Repo repo : os.getRepos()) {
           RepositoryResponse resp = new RepositoryResponse(repo.getBaseUrl(), 
os.getFamily(),
               repo.getRepoId(), repo.getRepoName(), repo.getDistribution(), 
repo.getComponents(), repo.getMirrorsList(),
-              repo.getBaseUrl(), repo.getLatestUri(), 
Collections.<String>emptyList(), Collections.<RepoTag>emptySet());
+              repo.getBaseUrl(), repo.getLatestUri(), 
Collections.<String>emptyList(), repo.getTags());
 
           resp.setVersionDefinitionId(versionDefinitionId);
           resp.setStackName(stackId.getStackName());
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 73336ae..a3fe56e 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
@@ -63,6 +63,7 @@ import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.StackInfo;
 import org.apache.ambari.server.state.repository.ManifestServiceInfo;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
+import org.apache.ambari.server.state.stack.RepoTag;
 import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.ObjectUtils;
@@ -496,6 +497,10 @@ public class RepositoryVersionResourceProvider extends 
AbstractAuthorizedResourc
       }
     }
 
+    if 
(RepositoryVersionHelper.shouldContainGPLRepo(repositoryVersion.getStackId(), 
repositoryVersion.getVersion())) {
+      validateGPLRepoPresence(repositoryVersion);
+    }
+
     if 
(!RepositoryVersionEntity.isVersionInStack(repositoryVersion.getStackId(), 
repositoryVersion.getVersion())) {
       throw new AmbariException(MessageFormat.format("Version {0} needs to 
belong to stack {1}",
           repositoryVersion.getVersion(), repositoryVersion.getStackName() + 
"-" + repositoryVersion.getStackVersion()));
@@ -503,6 +508,31 @@ public class RepositoryVersionResourceProvider extends 
AbstractAuthorizedResourc
   }
 
   /**
+   * Checks HDP repository version contains GPL repo for each os.
+   * @param repositoryVersion repository version to check.
+   * @throws AmbariException in case repository version id HDP and should 
contain GPL repo, bug shouldn't.
+   */
+  private static void validateGPLRepoPresence(RepositoryVersionEntity 
repositoryVersion) throws AmbariException {
+    if (!repositoryVersion.getStackName().equals("HDP")) {
+      return;
+    }
+    for (OperatingSystemEntity os : repositoryVersion.getOperatingSystems()) {
+      boolean hasGPLRepo = false;
+      for (RepositoryEntity repositoryEntity : os.getRepositories()) {
+        if (repositoryEntity.getTags().contains(RepoTag.GPL)) {
+          hasGPLRepo = true;
+        }
+      }
+      if (!hasGPLRepo) {
+        throw new AmbariException("Operating system type " + os.getOsType()
+            + " for repository with id " + repositoryVersion.getId()
+            + " should contain GPL repo for HDP repository version greater 
than "
+            + RepositoryVersionHelper.GPL_MINIMAL_VERSION);
+      }
+    }
+  }
+
+  /**
    * Transforms map of json properties to repository version entity.
    *
    * @param properties json map
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
index 5c12922..3f7ccaf 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
@@ -100,6 +100,9 @@ public class RepositoryVersionHelper {
 
   @Inject Provider<Clusters> clusters;
 
+  public static final String GPL_MINIMAL_VERSION = "2.6.4.0";
+  private static final String ZERO_VERSION = "0.0.0.0";
+  private static final String VERSION_SPLITTER = "\\.";
 
   /**
    * Checks repo URLs against the current version for the cluster and make
@@ -716,5 +719,36 @@ public class RepositoryVersionHelper {
     });
   }
 
+  /**
+   * Checks repository version is HDP and should contain repo with GPL tag.
+   * @param stackId stack id
+   * @param version repository version as x.x.x.x, x.x.x.x-x, x.x-x, x.x
+   * @return true if stack is HDP and version is younger than {@value 
#GPL_MINIMAL_VERSION}
+   */
+  public static boolean shouldContainGPLRepo(StackId stackId, String version) {
+    if (!stackId.getStackName().equals("HDP")) {
+      return false;
+    }
+    if (version.contains("-")) {
+      version = version.split("-")[0];
+    }
+    String[] versionItems = ZERO_VERSION.split(VERSION_SPLITTER);
+    int versionIndex = 0;
+    for (String versionItem : version.split(VERSION_SPLITTER)) {
+      versionItems[versionIndex++] = versionItem;
+    }
+    String[] gplMinimalItems = GPL_MINIMAL_VERSION.split(VERSION_SPLITTER);
+
+    for (versionIndex = 0; versionIndex < versionItems.length; versionIndex++) 
{
+      Integer versionItem = Integer.parseInt(versionItems[versionIndex]);
+      Integer gplMinimalItem = Integer.parseInt(gplMinimalItems[versionIndex]);
+      if (versionItem < gplMinimalItem) {
+        return false;
+      } else if (versionItem > gplMinimalItem) {
+        return true;
+      }
+    }
+    return true;
+  }
 
-}
\ No newline at end of file
+}
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProviderTest.java
index 243b060..11b8d8b 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProviderTest.java
@@ -18,6 +18,8 @@
 
 package org.apache.ambari.server.controller.internal;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.sql.SQLException;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -563,6 +565,53 @@ public class RepositoryVersionResourceProviderTest {
     Assert.assertEquals(false, RepositoryVersionEntity.isVersionInStack(sid3, 
"HDF-2.1"));
   }
 
+  private void testGPLRepoCheck(RepositoryVersionEntity 
repositoryVersionEntity) throws NoSuchMethodException,
+      InvocationTargetException, IllegalAccessException {
+    final ResourceProvider provider = 
injector.getInstance(ResourceProviderFactory.class)
+        .getRepositoryVersionResourceProvider();
+
+    Method validateGPLRepoMethod = 
RepositoryVersionResourceProvider.class.getDeclaredMethod("validateGPLRepoPresence",
+        RepositoryVersionEntity.class);
+    validateGPLRepoMethod.setAccessible(true);
+    validateGPLRepoMethod.invoke(provider, repositoryVersionEntity);
+  }
+
+  @Test
+  public void testGPLRepoCheckWithUnsatisfiedGPLRepoRequirement() throws 
NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+    RepositoryVersionEntity repositoryVersionEntity = new 
RepositoryVersionEntity();
+    
repositoryVersionEntity.setOperatingSystems("[{\"repositories\":[],\"OperatingSystems/os_type\":\"debian7\"}]");
+
+    // check should not be failed for no-HDP stack
+    StackEntity hdpStackEntity = new StackEntity();
+    hdpStackEntity.setStackName("NOTHDP");
+    repositoryVersionEntity.setStack(hdpStackEntity);
+    testGPLRepoCheck(repositoryVersionEntity);
+
+    // should be failed for HDP only
+    hdpStackEntity.setStackName("HDP");
+    try {
+      testGPLRepoCheck(repositoryVersionEntity);
+    } catch (InvocationTargetException e) {
+      Assert.assertTrue(e.getTargetException() instanceof AmbariException);
+    }
+  }
+
+  @Test
+  public void testGPLRepoCheckWithSatisfiedGPLRepoRequirement() throws 
NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+    RepositoryVersionEntity newRepositoryVersion = new 
RepositoryVersionEntity();
+    StackEntity hdpStackEntity = new StackEntity();
+    hdpStackEntity.setStackName("HDP");
+    newRepositoryVersion.setStack(hdpStackEntity);
+    
newRepositoryVersion.setOperatingSystems("[{\"repositories\":[{\"Repositories/repo_id\":\"\""
 +
+        
",\"Repositories/tags\":[\"GPL\"],\"Repositories/base_url\":\"\",\"Repositories/repo_name\":\"\"}"
 +
+        
",{\"Repositories/repo_id\":\"\",\"Repositories/tags\":[],\"Repositories/base_url\":\"\""
 +
+        
",\"Repositories/repo_name\":\"\"}],\"OperatingSystems/os_type\":\"debian7\"}]");
+
+    testGPLRepoCheck(newRepositoryVersion);
+
+    hdpStackEntity.setStackName("NOTHDP");
+    testGPLRepoCheck(newRepositoryVersion);
+  }
 
   @After
   public void after() throws AmbariException, SQLException {
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelperTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelperTest.java
index 171eb88..909cecb 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelperTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelperTest.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.ambari.server.state.RepositoryInfo;
+import org.apache.ambari.server.state.StackId;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -55,4 +56,46 @@ public class RepositoryVersionHelperTest {
     final String serialized = helper.serializeOperatingSystems(repositories);
     
Assert.assertEquals("[{\"OperatingSystems/ambari_managed_repositories\":true,\"repositories\":[{\"Repositories/base_url\":\"baseurl\",\"Repositories/repo_id\":\"repoId\",\"Repositories/unique\":true,\"Repositories/tags\":[],\"Repositories/applicable_services\":[]}],\"OperatingSystems/os_type\":\"os\"}]",
 serialized);
   }
+
+  @Test
+  public void testGPLRepoIsRequired(){
+    String versionGreater1 = "2.7.0.3-75";
+    String versionGreater2 = "2.7.0.3";
+    String versionGreater3 = "2.7";
+    String versionEquals1 = "2.6.4.0-75";
+    String versionEquals2 = "2.6.4.0";
+    String versionEquals3 = "2.6.4";
+    String versionLower1 = "2.1.0.3-75";
+    String versionLower2 = "2.1.0.3";
+    String versionLower3 = "2.1";
+    StackId hdpStackId = new StackId();
+    hdpStackId.setStackId("HDP-x.x");
+
+    Assert.assertEquals(true, 
RepositoryVersionHelper.shouldContainGPLRepo(hdpStackId, versionGreater1));
+    Assert.assertEquals(true, 
RepositoryVersionHelper.shouldContainGPLRepo(hdpStackId, versionGreater2));
+    Assert.assertEquals(true, 
RepositoryVersionHelper.shouldContainGPLRepo(hdpStackId, versionGreater3));
+
+    Assert.assertEquals(true, 
RepositoryVersionHelper.shouldContainGPLRepo(hdpStackId, versionEquals1));
+    Assert.assertEquals(true, 
RepositoryVersionHelper.shouldContainGPLRepo(hdpStackId, versionEquals2));
+    Assert.assertEquals(true, 
RepositoryVersionHelper.shouldContainGPLRepo(hdpStackId, versionEquals3));
+
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(hdpStackId, versionLower1));
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(hdpStackId, versionLower2));
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(hdpStackId, versionLower3));
+
+    StackId nonHDPStackId = new StackId();
+    hdpStackId.setStackId("NOTHDP-x.x");
+
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(nonHDPStackId, versionGreater1));
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(nonHDPStackId, versionGreater2));
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(nonHDPStackId, versionGreater3));
+
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(nonHDPStackId, versionEquals1));
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(nonHDPStackId, versionEquals2));
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(nonHDPStackId, versionEquals3));
+
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(nonHDPStackId, versionLower1));
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(nonHDPStackId, versionLower2));
+    Assert.assertEquals(false, 
RepositoryVersionHelper.shouldContainGPLRepo(nonHDPStackId, versionLower3));
+  }
 }

-- 
To stop receiving notification emails like this one, please contact
aonis...@apache.org.

Reply via email to