Browse Source

AMBARI-9275. Cannot delete registered-version with invalid repo URLs (Yurii Shylov via ncole)

Nate Cole 10 năm trước cách đây
mục cha
commit
14852dc8a7

+ 13 - 8
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java

@@ -18,18 +18,14 @@
 package org.apache.ambari.server.controller.internal;
 
 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.Map.Entry;
 import java.util.Set;
-import java.util.regex.Pattern;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ObjectNotFoundException;
-import org.apache.ambari.server.StaticallyInject;
 import org.apache.ambari.server.api.resources.RepositoryResourceDefinition;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
@@ -49,12 +45,14 @@ import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
 import org.apache.ambari.server.orm.entities.OperatingSystemEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 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.upgrade.RepositoryVersionHelper;
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
 
+import com.google.common.collect.Lists;
 import com.google.gson.Gson;
 import com.google.inject.Inject;
 
@@ -294,10 +292,17 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider
       final List<ClusterVersionEntity> clusterVersionEntities =
           clusterVersionDAO.findByStackAndVersion(entity.getStack(), entity.getVersion());
 
-      if (!clusterVersionEntities.isEmpty()) {
-        final ClusterVersionEntity firstClusterVersion = clusterVersionEntities.get(0);
-        throw new SystemException("Repository version can't be deleted as it is " +
-          firstClusterVersion.getState().name() + " on cluster " + firstClusterVersion.getClusterEntity().getClusterName());
+      final List<RepositoryVersionState> forbiddenToDeleteStates = Lists.newArrayList(
+          RepositoryVersionState.CURRENT,
+          RepositoryVersionState.INSTALLED,
+          RepositoryVersionState.INSTALLING,
+          RepositoryVersionState.UPGRADED,
+          RepositoryVersionState.UPGRADING);
+      for (ClusterVersionEntity clusterVersionEntity : clusterVersionEntities) {
+        if (clusterVersionEntity.getRepositoryVersion().getId().equals(id) && forbiddenToDeleteStates.contains(clusterVersionEntity.getState())) {
+          throw new SystemException("Repository version can't be deleted as it is " +
+              clusterVersionEntity.getState().name() + " on cluster " + clusterVersionEntity.getClusterEntity().getClusterName());
+        }
       }
 
       entitiesToBeRemoved.add(entity);

+ 9 - 1
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProviderTest.java

@@ -44,6 +44,7 @@ import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.OperatingSystemInfo;
+import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.StackInfo;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.junit.After;
@@ -160,7 +161,14 @@ public class RepositoryVersionResourceProviderTest {
           notEmptyList.add(null);
           return notEmptyList;
         } else {
-          return new ArrayList<ClusterVersionEntity>();
+          final List<ClusterVersionEntity> clusterVersions = new ArrayList<ClusterVersionEntity>();
+          final RepositoryVersionEntity repositoryVersion = new RepositoryVersionEntity();
+          repositoryVersion.setId(1L);
+          final ClusterVersionEntity installFailedVersion = new ClusterVersionEntity();
+          installFailedVersion.setState(RepositoryVersionState.INSTALL_FAILED);
+          installFailedVersion.setRepositoryVersion(repositoryVersion);
+          clusterVersions.add(installFailedVersion);
+          return clusterVersions;
         }
       }
     });