Repository: ambari Updated Branches: refs/heads/trunk b3fc39395 -> 6b5ef474b
AMBARI-10349. RU: Block users from installing a Version with the same existing Version (dlysnichenko) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6b5ef474 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6b5ef474 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6b5ef474 Branch: refs/heads/trunk Commit: 6b5ef474b0b43a4b8d9fa49b76ff55c85a04c52d Parents: b3fc393 Author: Lisnichenko Dmitro <[email protected]> Authored: Fri Apr 3 19:07:27 2015 +0300 Committer: Lisnichenko Dmitro <[email protected]> Committed: Fri Apr 3 19:07:27 2015 +0300 ---------------------------------------------------------------------- .../RepositoryVersionResourceProvider.java | 24 +++++++++++++++++ .../RepositoryVersionResourceProviderTest.java | 27 ++++++++++++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/6b5ef474/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 dbad19a..ada207a 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 @@ -44,11 +44,13 @@ import org.apache.ambari.server.orm.dao.ClusterVersionDAO; import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; import org.apache.ambari.server.orm.entities.ClusterVersionEntity; 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.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; @@ -339,6 +341,20 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider throw new AmbariException("Stack " + stackFullName + " doesn't have upgrade packages"); } + // List of all repo urls that are already added at stack + Set<String> existingRepoUrls = new HashSet<String>(); + List<RepositoryVersionEntity> existingRepoVersions = repositoryVersionDAO.findByStack(requiredStack.getStackId()); + for (RepositoryVersionEntity existingRepoVersion : existingRepoVersions) { + for (OperatingSystemEntity operatingSystemEntity : existingRepoVersion.getOperatingSystems()) { + for (RepositoryEntity repositoryEntity : operatingSystemEntity.getRepositories()) { + if (! repositoryEntity.getRepositoryId().startsWith("HDP-UTILS") && // HDP-UTILS is shared between repo versions + ! existingRepoVersion.getId().equals(repositoryVersion.getId())) { // Allow modifying already defined repo version + existingRepoUrls.add(repositoryEntity.getBaseUrl()); + } + } + } + } + // check that repositories contain only supported operating systems final Set<String> osSupported = new HashSet<String>(); for (OperatingSystemInfo osInfo: ambariMetaInfo.getOperatingSystems(stackName, stackMajorVersion)) { @@ -347,6 +363,14 @@ public class RepositoryVersionResourceProvider extends AbstractResourceProvider final Set<String> osRepositoryVersion = new HashSet<String>(); for (OperatingSystemEntity os: repositoryVersion.getOperatingSystems()) { osRepositoryVersion.add(os.getOsType()); + + for (RepositoryEntity repositoryEntity : os.getRepositories()) { + String baseUrl = repositoryEntity.getBaseUrl(); + if (existingRepoUrls.contains(baseUrl)) { + throw new AmbariException("Base url " + baseUrl + " is already defined for another repository version. " + + "Setting up base urls that contain the same versions of components will cause rolling upgrade to fail."); + } + } } if (osRepositoryVersion.isEmpty()) { throw new AmbariException("At least one set of repositories for OS should be provided"); http://git-wip-us.apache.org/repos/asf/ambari/blob/6b5ef474/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 4efdb0c..6e50df6 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 @@ -232,7 +232,7 @@ public class RepositoryVersionResourceProviderTest { entity.setStack("HDP-1.1"); entity.setUpgradePackage("pack1"); entity.setVersion("1.1"); - entity.setOperatingSystems("[{\"OperatingSystems/os_type\":\"redhat6\",\"repositories\":[{\"Repositories/repo_id\":\"1\",\"Repositories/repo_name\":\"1\",\"Repositories/base_url\":\"1\"}]}]"); + entity.setOperatingSystems("[{\"OperatingSystems/os_type\":\"redhat6\",\"repositories\":[{\"Repositories/repo_id\":\"1\",\"Repositories/repo_name\":\"1\",\"Repositories/base_url\":\"http://example.com/repo1\"}]}]"); // test valid usecases provider.validateRepositoryVersion(entity); @@ -273,6 +273,29 @@ public class RepositoryVersionResourceProviderTest { Assert.fail("Should throw exception"); } catch (Exception ex) { } + + final RepositoryVersionDAO repositoryVersionDAO = injector.getInstance(RepositoryVersionDAO.class); + entity.setDisplayName("name"); + entity.setStack("HDP-1.1"); + entity.setUpgradePackage("pack1"); + entity.setVersion("1.1"); + entity.setOperatingSystems("[{\"OperatingSystems/os_type\":\"redhat6\",\"repositories\":[{\"Repositories/repo_id\":\"1\",\"Repositories/repo_name\":\"1\",\"Repositories/base_url\":\"http://example.com/repo1\"}]}]"); + repositoryVersionDAO.create(entity); + + final RepositoryVersionEntity entity2 = new RepositoryVersionEntity(); + entity2.setId(2l); + entity2.setDisplayName("name2"); + entity2.setStack("HDP-1.1"); + entity2.setUpgradePackage("pack1"); + entity2.setVersion("1.2"); + entity2.setOperatingSystems("[{\"OperatingSystems/os_type\":\"redhat6\",\"repositories\":[{\"Repositories/repo_id\":\"1\",\"Repositories/repo_name\":\"1\",\"Repositories/base_url\":\"http://example.com/repo1\"}]}]"); + + try { + provider.validateRepositoryVersion(entity2); + Assert.fail("Should throw exception: Base url http://example.com/repo1 is already defined for another repository version"); + } catch (Exception ex) { + } + } @Test @@ -312,7 +335,7 @@ public class RepositoryVersionResourceProviderTest { final Set<Map<String, Object>> propertySet = new LinkedHashSet<Map<String, Object>>(); final Map<String, Object> properties = new LinkedHashMap<String, Object>(); properties.put(RepositoryVersionResourceProvider.REPOSITORY_VERSION_DISPLAY_NAME_PROPERTY_ID, "name"); - properties.put(RepositoryVersionResourceProvider.SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID, new Gson().fromJson("[{\"OperatingSystems/os_type\":\"redhat6\",\"repositories\":[{\"Repositories/repo_id\":\"1\",\"Repositories/repo_name\":\"1\",\"Repositories/base_url\":\"1\"}]}]", Object.class)); + properties.put(RepositoryVersionResourceProvider.SUBRESOURCE_OPERATING_SYSTEMS_PROPERTY_ID, new Gson().fromJson("[{\"OperatingSystems/os_type\":\"redhat6\",\"repositories\":[{\"Repositories/repo_id\":\"1\",\"Repositories/repo_name\":\"1\",\"Repositories/base_url\":\"http://example.com/repo1\"}]}]", Object.class)); properties.put(RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_NAME_PROPERTY_ID, "HDP"); properties.put(RepositoryVersionResourceProvider.REPOSITORY_VERSION_UPGRADE_PACK_PROPERTY_ID, "pack1"); properties.put(RepositoryVersionResourceProvider.REPOSITORY_VERSION_STACK_VERSION_PROPERTY_ID, "1.1");
