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

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


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

commit c414b2554ac47a2327f62da37ab2637ad128219b
Author: Myroslav Papirkovskyi <[email protected]>
AuthorDate: Thu Feb 8 13:54:28 2018 +0200

    AMBARI-22934. [API] Updating current stack repo without GPL repos in the 
body does not throw any error. (mpapirkovskyy)
---
 .../controller/AmbariManagementControllerImpl.java |  3 +-
 .../RepositoryVersionResourceProvider.java         | 30 ++++++++++
 .../stack/upgrade/RepositoryVersionHelper.java     | 34 +++++++++++
 .../RepositoryVersionResourceProviderTest.java     | 58 ++++++++++++++++++
 .../stack/upgrade/RepositoryVersionHelperTest.java | 70 ++++++++++++++++++++++
 5 files changed, 193 insertions(+), 2 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 0cb961a..c6e3978 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
@@ -189,7 +189,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;
@@ -4258,7 +4257,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(), Collections.<RepoTag>emptySet());
+              repo.getBaseUrl(), 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 8704cb7..ac961d0 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;
@@ -494,6 +495,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()));
@@ -501,6 +506,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 (RepoOsEntity os : repositoryVersion.getRepoOsEntities()) {
+      boolean hasGPLRepo = false;
+      for (RepoDefinitionEntity repositoryEntity : 
os.getRepoDefinitionEntities()) {
+        if (repositoryEntity.getTags().contains(RepoTag.GPL)) {
+          hasGPLRepo = true;
+        }
+      }
+      if (!hasGPLRepo) {
+        throw new AmbariException("Operating system type " + os.getFamily()
+            + " 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 c5c19d2..4743cd6 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
@@ -95,6 +95,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
@@ -621,5 +624,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;
+  }
 
 }
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 e897f50..f50e49a 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,8 +18,11 @@
 
 package org.apache.ambari.server.controller.internal;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -54,6 +57,7 @@ import org.apache.ambari.server.state.RepositoryInfo;
 import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.StackInfo;
+import org.apache.ambari.server.state.stack.RepoTag;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.junit.After;
@@ -581,6 +585,60 @@ 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();
+    RepoOsEntity osWithoutGPLRepo = new RepoOsEntity();
+    osWithoutGPLRepo.setFamily("debian7");
+    RepoDefinitionEntity repoDefinitionEntityWithoutGPL = new 
RepoDefinitionEntity();
+    
osWithoutGPLRepo.addRepoDefinitionEntities(Collections.singletonList(repoDefinitionEntityWithoutGPL));
+    
repositoryVersionEntity.addRepoOsEntities(Collections.singletonList(osWithoutGPLRepo));//"[{\"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);
+
+    RepoOsEntity osWithoutGPLRepo = new RepoOsEntity();
+    osWithoutGPLRepo.setFamily("debian7");
+    RepoDefinitionEntity repoDefinitionEntityWithoutGPL = new 
RepoDefinitionEntity();
+    repoDefinitionEntityWithoutGPL.setTags(Collections.singleton(RepoTag.GPL));
+    
osWithoutGPLRepo.addRepoDefinitionEntities(Collections.singletonList(repoDefinitionEntityWithoutGPL));
+    
newRepositoryVersion.addRepoOsEntities(Collections.singletonList(osWithoutGPLRepo));
+
+    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
new file mode 100644
index 0000000..a4116db
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelperTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.state.stack.upgrade;
+
+import org.apache.ambari.server.state.StackId;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests the {@link RepositoryVersionHelper} class
+ */
+public class RepositoryVersionHelperTest {
+
+  @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
[email protected].

Reply via email to