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.