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].