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));