You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by dm...@apache.org on 2015/09/04 12:20:54 UTC
ambari git commit: AMBARI-12934. Stop-and-Start Upgrade: If using HDP
2.x,
can only register repo for HDP 2.y since need an upgrade pack to support it
(dgrinenko via dlysnichenko)
Repository: ambari
Updated Branches:
refs/heads/branch-dev-stop-all-upgrade ddd5d928e -> 54146bb60
AMBARI-12934. Stop-and-Start Upgrade: If using HDP 2.x, can only register repo for HDP 2.y since need an upgrade pack to support it (dgrinenko via dlysnichenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/54146bb6
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/54146bb6
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/54146bb6
Branch: refs/heads/branch-dev-stop-all-upgrade
Commit: 54146bb601d666d7d4c064f249eda61a6b0c6fe4
Parents: ddd5d92
Author: Lisnichenko Dmitro <dl...@hortonworks.com>
Authored: Fri Sep 4 13:20:31 2015 +0300
Committer: Lisnichenko Dmitro <dl...@hortonworks.com>
Committed: Fri Sep 4 13:20:31 2015 +0300
----------------------------------------------------------------------
.../RepositoryVersionResourceProvider.java | 68 +++++++++++++++-----
.../ambari/server/state/stack/UpgradePack.java | 11 ++++
.../stack/upgrade/RepositoryVersionHelper.java | 10 +--
.../RepositoryVersionResourceProviderTest.java | 28 +++++---
4 files changed, 83 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/54146bb6/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
----------------------------------------------------------------------
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 1c2328d..60210c3 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
@@ -19,12 +19,14 @@ package org.apache.ambari.server.controller.internal;
import java.text.MessageFormat;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import com.google.inject.Provider;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.ObjectNotFoundException;
import org.apache.ambari.server.api.resources.OperatingSystemResourceDefinition;
@@ -49,10 +51,13 @@ import org.apache.ambari.server.orm.entities.OperatingSystemEntity;
import org.apache.ambari.server.orm.entities.RepositoryEntity;
import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
import org.apache.ambari.server.orm.entities.StackEntity;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.OperatingSystemInfo;
import org.apache.ambari.server.state.RepositoryVersionState;
import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.state.StackInfo;
+import org.apache.ambari.server.state.stack.UpgradePack;
import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
@@ -119,6 +124,9 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider
@Inject
private RepositoryVersionHelper repositoryVersionHelper;
+ @Inject
+ private Provider<Clusters> clusters;
+
/**
* Data access object used for lookup up stacks.
*/
@@ -146,13 +154,13 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider
@Override
public Void invoke() throws AmbariException {
final String[] requiredProperties = {
- REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID,
- SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID,
- REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID,
- REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID,
- REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID
+ REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID,
+ SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID,
+ REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID,
+ REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID,
+ REPOSITORY_VERSION_REPOSITORY_VERSION_PROPERTY_ID
};
- for (String propertyName: requiredProperties) {
+ for (String propertyName : requiredProperties) {
if (properties.get(propertyName) == null) {
throw new AmbariException("Property " + propertyName + " should be provided");
}
@@ -341,14 +349,13 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider
*/
protected void validateRepositoryVersion(RepositoryVersionEntity repositoryVersion) throws AmbariException {
final StackId requiredStack = new StackId(repositoryVersion.getStack());
- final String stackName = requiredStack.getStackName();
- final String stackMajorVersion = requiredStack.getStackVersion();
- final String stackFullName = requiredStack.getStackId();
-
- // check that stack exists
- final StackInfo stackInfo = ambariMetaInfo.getStack(stackName, stackMajorVersion);
- if (stackInfo.getUpgradePacks() == null) {
- throw new AmbariException("Stack " + stackFullName + " doesn't have upgrade packages");
+
+ final String requiredStackName = requiredStack.getStackName();
+ final String requiredStackVersion = requiredStack.getStackVersion();
+ final String requiredStackId = requiredStack.getStackId();
+
+ if (!upgradePackExists(repositoryVersion.getVersion())) {
+ throw new AmbariException("Stack " + requiredStackId + " doesn't have upgrade packages");
}
// List of all repo urls that are already added at stack
@@ -367,7 +374,7 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider
// check that repositories contain only supported operating systems
final Set<String> osSupported = new HashSet<String>();
- for (OperatingSystemInfo osInfo: ambariMetaInfo.getOperatingSystems(stackName, stackMajorVersion)) {
+ for (OperatingSystemInfo osInfo: ambariMetaInfo.getOperatingSystems(requiredStackName, requiredStackVersion)) {
osSupported.add(osInfo.getOsType());
}
final Set<String> osRepositoryVersion = new HashSet<String>();
@@ -387,7 +394,7 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider
}
for (String os: osRepositoryVersion) {
if (!osSupported.contains(os)) {
- throw new AmbariException("Operating system type " + os + " is not supported by stack " + stackFullName);
+ throw new AmbariException("Operating system type " + os + " is not supported by stack " + requiredStackId);
}
}
@@ -398,6 +405,35 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider
}
/**
+ * Check for required upgrade pack across all stack definitions
+ * @param checkVersion version to check (e.g. 2.2.3.0-1111)
+ * @return existence flag
+ */
+ private boolean upgradePackExists(String checkVersion) throws AmbariException{
+ Collection<StackInfo> stacks = new ArrayList<StackInfo>();
+
+ // Search results only in the installed stacks
+ for (Cluster cluster:clusters.get().getClusters().values()){
+ stacks.add(ambariMetaInfo.getStack(cluster.getCurrentStackVersion().getStackName(),
+ cluster.getCurrentStackVersion().getStackVersion()));
+ }
+
+ for (StackInfo si: stacks){
+ Map<String, UpgradePack> upgradePacks = si.getUpgradePacks();
+ if (upgradePacks!=null) {
+ for (UpgradePack upgradePack: upgradePacks.values()){
+ if (upgradePack.canBeApplied(checkVersion)) {
+ // If we found at least one match, the rest could be skipped
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+
+ /**
* Transforms map of json properties to repository version entity.
*
* @param properties json map
http://git-wip-us.apache.org/repos/asf/ambari/blob/54146bb6/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
index bd06ea8..e57bfef 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/UpgradePack.java
@@ -22,6 +22,7 @@ import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.regex.Pattern;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@@ -135,6 +136,16 @@ public class UpgradePack {
return checked;
}
+ public boolean canBeApplied(String targetVersion){
+ // check that upgrade pack can be applied to selected stack
+ // converting 2.2.*.* -> 2\.2(\.\d+)?(\.\d+)?(-\d+)?
+
+ String regexPattern = getTarget().replaceAll("\\.", "\\\\."); // . -> \.
+ regexPattern = regexPattern.replaceAll("\\\\\\.\\*", "(\\\\\\.\\\\d+)?"); // \.* -> (\.\d+)?
+ regexPattern = regexPattern.concat("(-\\d+)?");
+ return Pattern.matches(regexPattern, targetVersion);
+ }
+
/**
* Calculates the group orders when performing a rolling downgrade
* <ul>
http://git-wip-us.apache.org/repos/asf/ambari/blob/54146bb6/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
----------------------------------------------------------------------
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 615029d..6a36522 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
@@ -22,7 +22,6 @@ import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.regex.Pattern;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
@@ -177,14 +176,7 @@ public class RepositoryVersionHelper {
LOG.error("Upgrade pack " + upgradePackName + " is corrupted, it should contain <target> node");
continue;
}
-
- // check that upgrade pack can be applied to selected stack
- // converting 2.2.*.* -> 2\.2(\.\d+)?(\.\d+)?(-\d+)?
- String regexPattern = upgradePack.getTarget();
- regexPattern = regexPattern.replaceAll("\\.", "\\\\."); // . -> \.
- regexPattern = regexPattern.replaceAll("\\\\\\.\\*", "(\\\\\\.\\\\d+)?"); // \.* -> (\.\d+)?
- regexPattern = regexPattern.concat("(-\\d+)?");
- if (Pattern.matches(regexPattern, repositoryVersion)) {
+ if (upgradePack.canBeApplied(repositoryVersion)) {
return upgradePackName;
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/54146bb6/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProviderTest.java
----------------------------------------------------------------------
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 c01dcd2..493cfbb 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
@@ -46,8 +46,10 @@ import org.apache.ambari.server.orm.entities.ClusterEntity;
import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
import org.apache.ambari.server.orm.entities.StackEntity;
+import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.OperatingSystemInfo;
import org.apache.ambari.server.state.RepositoryVersionState;
+import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.state.StackInfo;
import org.apache.ambari.server.state.stack.UpgradePack;
import org.junit.After;
@@ -100,6 +102,8 @@ public class RepositoryVersionResourceProviderTest {
@Before
public void before() throws Exception {
final Set<String> validVersions = Sets.newHashSet("1.1", "1.1-17", "1.1.1.1", "1.1.343432.2", "1.1.343432.2-234234324");
+ final Set<StackInfo> stacks = new HashSet<StackInfo>();
+
final AmbariMetaInfo ambariMetaInfo = Mockito.mock(AmbariMetaInfo.class);
clusterVersionDAO = Mockito.mock(ClusterVersionDAO.class);
@@ -144,6 +148,9 @@ public class RepositoryVersionResourceProviderTest {
return map;
}
};
+ stackInfo.setName("HDP");
+ stackInfo.setVersion("1.1");
+ stacks.add(stackInfo);
Mockito.when(ambariMetaInfo.getStack(Mockito.anyString(), Mockito.anyString())).thenAnswer(new Answer<StackInfo>() {
@Override
@@ -158,7 +165,7 @@ public class RepositoryVersionResourceProviderTest {
}
});
-
+ Mockito.when(ambariMetaInfo.getStacks()).thenReturn(stacks);
Mockito.when(ambariMetaInfo.getUpgradePacks(Mockito.anyString(), Mockito.anyString())).thenAnswer(new Answer<Map<String, UpgradePack>>() {
@Override
@@ -211,6 +218,9 @@ public class RepositoryVersionResourceProviderTest {
stackEntity.setStackName("HDP");
stackEntity.setStackVersion("1.1");
stackDAO.create(stackEntity);
+
+ Clusters clusters = injector.getInstance(Clusters.class);
+ clusters.addCluster("c1", new StackId("HDP", "1.1"));
}
@Test
@@ -387,8 +397,8 @@ public class RepositoryVersionResourceProviderTest {
final Predicate predicateStackName = new PredicateBuilder().property(RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID).equals("HDP").toPredicate();
final Predicate predicateStackVersion = new PredicateBuilder().property(RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID).equals("1.1").toPredicate();
final Request getRequest = PropertyHelper.getReadRequest(
- RepositoryVersionResourceProvider.REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID,
- RepositoryVersionResourceProvider.SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID);
+ RepositoryVersionResourceProvider.REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID,
+ RepositoryVersionResourceProvider.SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID);
Assert.assertEquals(0, provider.getResources(getRequest, new AndPredicate(predicateStackName, predicateStackVersion)).size());
final Request createRequest = PropertyHelper.getCreateRequest(propertySet, null);
@@ -409,12 +419,12 @@ public class RepositoryVersionResourceProviderTest {
// Now, insert a cluster version whose state is INSTALL_FAILED, so the operation will not be permitted.
Mockito.when(clusterVersionDAO.findByStackAndVersion(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenAnswer(
- new Answer<List<ClusterVersionEntity>>() {
- @Override
- public List<ClusterVersionEntity> answer(InvocationOnMock invocation) throws Throwable {
- return getInstallFailedClusterVersions();
- }
- });
+ new Answer<List<ClusterVersionEntity>>() {
+ @Override
+ public List<ClusterVersionEntity> answer(InvocationOnMock invocation) throws Throwable {
+ return getInstallFailedClusterVersions();
+ }
+ });
try {
provider.updateResources(updateRequest, new AndPredicate(predicateStackName, predicateStackVersion));