From 7b831a7df787d6127b64d4896bb0b35594b2fd03 Mon Sep 17 00:00:00 2001 From: Jonathan Hurley Date: Thu, 1 Mar 2018 10:57:20 -0500 Subject: [PATCH 1/3] AMBARI-23107 - Deprecate Repo Versions And Start Tracking Repo OS's For MPacks --- .../libraries/functions/repository_util.py | 13 +- .../annotations/ExperimentalFeature.java | 8 +- .../ambari/server/StateRecoveryManager.java | 61 +- .../ExecutionCommandWrapper.java | 109 ++-- .../server/agent/CommandRepository.java | 53 +- .../ambari/server/agent/ExecutionCommand.java | 33 +- .../server/agent/HeartbeatProcessor.java | 8 +- .../alerts/ComponentVersionAlertRunnable.java | 26 +- .../controller/ActionExecutionContext.java | 26 + .../AmbariActionExecutionHelper.java | 14 - .../AmbariCustomCommandExecutionHelper.java | 9 - .../AmbariManagementController.java | 8 - .../AmbariManagementControllerImpl.java | 108 +--- .../server/controller/AmbariServer.java | 4 +- .../server/controller/ServiceResponse.java | 14 +- .../ClientConfigResourceProvider.java | 1 - .../ClusterStackVersionResourceProvider.java | 4 +- .../VersionDefinitionResourceProvider.java | 13 +- .../HostComponentVersionAdvertisedEvent.java | 4 + .../upgrade/StackVersionListener.java | 2 - .../ambari/server/mpack/MpackManager.java | 37 +- .../ambari/server/orm/dao/HostVersionDAO.java | 8 +- .../server/orm/dao/MpackHostStateDAO.java | 109 ++++ .../server/orm/dao/RepositoryVersionDAO.java | 6 +- .../dao/ServiceComponentDesiredStateDAO.java | 50 -- .../orm/entities/HostVersionEntity.java | 4 + .../server/orm/entities/MpackEntity.java | 32 + .../orm/entities/MpackHostStateEntity.java | 206 ++++++ .../server/orm/entities/RepoOsEntity.java | 69 +- .../orm/entities/RepositoryVersionEntity.java | 2 + .../ServiceComponentDesiredStateEntity.java | 45 +- .../ServiceComponentVersionEntity.java | 181 ------ .../entities/ServiceDesiredStateEntity.java | 14 +- .../apache/ambari/server/stack/RepoUtil.java | 25 +- .../ambari/server/stack/StackDirectory.java | 5 - .../UpdateActiveRepoVersionOnStartup.java | 112 ---- .../apache/ambari/server/state/Module.java | 19 +- .../org/apache/ambari/server/state/Mpack.java | 145 ++++- .../apache/ambari/server/state/Service.java | 8 + .../ambari/server/state/ServiceComponent.java | 22 +- .../server/state/ServiceComponentImpl.java | 162 +---- .../ambari/server/state/ServiceGroup.java | 7 + .../ambari/server/state/ServiceGroupImpl.java | 21 +- .../ambari/server/state/ServiceImpl.java | 21 +- .../repository/VersionDefinitionXml.java | 4 + .../upgrade/RepositoryVersionHelper.java | 345 +++------- .../svccomphost/ServiceComponentHostImpl.java | 24 - .../resources/Ambari-DDL-Postgres-CREATE.sql | 69 +- .../main/resources/META-INF/persistence.xml | 2 +- .../scripts/install_packages.py | 2 +- .../server/StateRecoveryManagerTest.java | 2 +- ...mbariCustomCommandExecutionHelperTest.java | 6 - .../AmbariManagementControllerImplTest.java | 8 +- .../ClientConfigResourceProviderTest.java | 4 - .../server/orm/dao/HostVersionDAOTest.java | 356 ---------- .../UpdateActiveRepoVersionOnStartupTest.java | 206 ------ .../server/state/ServiceComponentTest.java | 215 ------ .../repository/VersionDefinitionTest.java | 611 ------------------ 58 files changed, 1076 insertions(+), 2606 deletions(-) create mode 100644 ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackHostStateDAO.java create mode 100644 ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackHostStateEntity.java delete mode 100644 ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceComponentVersionEntity.java delete mode 100644 ambari-server/src/main/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartup.java delete mode 100644 ambari-server/src/test/java/org/apache/ambari/server/orm/dao/HostVersionDAOTest.java delete mode 100644 ambari-server/src/test/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartupTest.java delete mode 100644 ambari-server/src/test/java/org/apache/ambari/server/state/repository/VersionDefinitionTest.java diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py b/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py index 8a7e57779c2..47720b8fcda 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py @@ -51,13 +51,13 @@ def create_repo_files(self): Creates repositories in a consistent manner for all types :return: a dictionary with repo ID => repo file name mapping """ - if self.command_repository.version_id is None: + if self.command_repository.mpack_id is None: raise Fail("The command repository was not parsed correctly") if 0 == len(self.command_repository.items): Logger.warning( "Repository for {0}/{1} has no repositories. Ambari may not be managing this version.".format( - self.command_repository.stack_name, self.command_repository.version_string)) + self.command_repository.mpack_name, self.command_repository.version_string)) return {} append_to_file = False # initialize to False to create the file anew. @@ -73,7 +73,7 @@ def create_repo_files(self): if not repository.ambari_managed: Logger.warning( "Repository for {0}/{1}/{2} is not managed by Ambari".format( - self.command_repository.stack_name, self.command_repository.version_string, repository.repo_id)) + self.command_repository.mpack_name, self.command_repository.version_string, repository.repo_id)) else: Repository(repository.repo_id, action="create", @@ -133,10 +133,9 @@ def __init__(self, repo_object): else: raise Fail("Cannot deserialize command repository {0}".format(str(repo_object))) - # version_id is the primary id of the repo_version table in the database - self.version_id = _find_value(json_dict, 'repoVersionId') - self.stack_name = _find_value(json_dict, 'stackName') - self.version_string = _find_value(json_dict, 'repoVersion') + self.mpack_id = _find_value(json_dict, 'mpackId') + self.mpack_name = _find_value(json_dict, 'mpackName') + self.version_string = _find_value(json_dict, 'mpackVersion') self.repo_filename = _find_value(json_dict, 'repoFileName') self.feat = CommandRepositoryFeature(_find_value(json_dict, "feature", default={})) self.items = [] diff --git a/ambari-server/src/main/java/org/apache/ambari/annotations/ExperimentalFeature.java b/ambari-server/src/main/java/org/apache/ambari/annotations/ExperimentalFeature.java index 94be1774267..9b88a9d7800 100644 --- a/ambari-server/src/main/java/org/apache/ambari/annotations/ExperimentalFeature.java +++ b/ambari-server/src/main/java/org/apache/ambari/annotations/ExperimentalFeature.java @@ -51,5 +51,11 @@ public enum ExperimentalFeature { * For code that is for upgrading Mpacks. Use this to mark code that may ultimately * be removed. */ - MPACK_UPGRADES + MPACK_UPGRADES, + + /** + * Used to mark code that is required for successful removal and refactoring + * when repo versions are dropped. + */ + REPO_VERSION_REMOVAL; } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java b/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java index 94a6e085dbd..8d32dd6d98b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java @@ -20,10 +20,10 @@ import java.util.List; -import org.apache.ambari.server.orm.dao.HostVersionDAO; -import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO; -import org.apache.ambari.server.orm.entities.HostVersionEntity; -import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity; +import org.apache.ambari.server.api.services.AmbariMetaInfo; +import org.apache.ambari.server.orm.dao.MpackHostStateDAO; +import org.apache.ambari.server.orm.entities.MpackHostStateEntity; +import org.apache.ambari.server.state.Mpack; import org.apache.ambari.server.state.RepositoryVersionState; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,48 +39,41 @@ public class StateRecoveryManager { private static final Logger LOG = LoggerFactory.getLogger(StateRecoveryManager.class); @Inject - private HostVersionDAO hostVersionDAO; + private MpackHostStateDAO mpackHostStateDAO; + /** + * Used for looking up {@link Mpack} instances by IDs. + */ @Inject - private ServiceComponentDesiredStateDAO serviceComponentDAO; + private AmbariMetaInfo ambariMetaInfo; public void doWork() { - checkHostAndClusterVersions(); + updateManagementPackInstallationState(); } - void checkHostAndClusterVersions() { - List hostVersions = hostVersionDAO.findAll(); - for (HostVersionEntity hostVersion : hostVersions) { - if (hostVersion.getState().equals(RepositoryVersionState.INSTALLING)) { - hostVersion.setState(RepositoryVersionState.INSTALL_FAILED); + /** + * Resets any management pack installation states from + * {@link RepositoryVersionState#INSTALLING} to + * {@link RepositoryVersionState#INSTALL_FAILED}. + */ + void updateManagementPackInstallationState() { + List mpackHostStates = mpackHostStateDAO.findAll(); + for (MpackHostStateEntity mpackHostState : mpackHostStates) { + if (mpackHostState.getState() == RepositoryVersionState.INSTALLING) { + mpackHostState.setState(RepositoryVersionState.INSTALL_FAILED); + + Mpack mpack = ambariMetaInfo.getMpack(mpackHostState.getMpackId()); + String msg = String.format( - "Recovered state of host version %s on host %s from %s to %s", - hostVersion.getRepositoryVersion().getDisplayName(), - hostVersion.getHostName(), + "The installation state of management pack %s on host %s was set from %s to %s", + mpack.getName(), + mpackHostState.getHostName(), RepositoryVersionState.INSTALLING, RepositoryVersionState.INSTALL_FAILED); LOG.warn(msg); - hostVersionDAO.merge(hostVersion); - } - } - List components = serviceComponentDAO.findAll(); - for (ServiceComponentDesiredStateEntity component : components) { - if (RepositoryVersionState.INSTALLING == component.getRepositoryState()) { - component.setRepositoryState(RepositoryVersionState.INSTALL_FAILED); - serviceComponentDAO.merge(component); - String msg = String.format( - "Recovered state of cluster %s of component %s/%s for version %s from %s to %s", - component.getClusterId(), - component.getServiceId(), - component.getComponentName(), - component.getDesiredRepositoryVersion().getDisplayName(), - RepositoryVersionState.INSTALLING, - RepositoryVersionState.INSTALL_FAILED); - LOG.warn(msg); + mpackHostStateDAO.merge(mpackHostState); } } } - - } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java index 57f9c4128e8..ad383aee517 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java @@ -34,18 +34,22 @@ import org.apache.ambari.server.agent.ExecutionCommand; import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.configuration.Configuration; -import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.orm.dao.HostRoleCommandDAO; +import org.apache.ambari.server.orm.dao.MpackDAO; +import org.apache.ambari.server.orm.dao.ServiceGroupDAO; +import org.apache.ambari.server.orm.entities.MpackEntity; import org.apache.ambari.server.orm.entities.RepoOsEntity; -import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; +import org.apache.ambari.server.orm.entities.ServiceGroupEntity; +import org.apache.ambari.server.orm.entities.StackEntity; import org.apache.ambari.server.orm.entities.UpgradeEntity; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.ConfigHelper; import org.apache.ambari.server.state.DesiredConfig; import org.apache.ambari.server.state.Host; +import org.apache.ambari.server.state.ModuleComponent; +import org.apache.ambari.server.state.Mpack; import org.apache.ambari.server.state.Service; -import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.StackInfo; @@ -96,6 +100,19 @@ public class ExecutionCommandWrapper { @Inject private Configuration configuration; + /** + * Used to get service groups (and from them mpacks) so that we can set the + * right information on the command. + */ + @Inject + private ServiceGroupDAO serviceGroupDAO; + + /** + * Used for retrieving mpack entities by their ID. + */ + @Inject + private MpackDAO mpackDAO; + @AssistedInject public ExecutionCommandWrapper(@Assisted String jsonExecutionCommand) { this.jsonExecutionCommand = jsonExecutionCommand; @@ -232,28 +249,18 @@ public ExecutionCommand getExecutionCommand() { // setting repositoryFile final Host host = cluster.getHost(executionCommand.getHostname()); // can be null on internal commands - final String serviceName = executionCommand.getServiceName(); // can be null on executing special RU tasks - if (null == executionCommand.getRepositoryFile() && null != host && null != serviceName) { + if (null == executionCommand.getRepositoryFile() && null != host) { final CommandRepository commandRepository; - final Service service = cluster.getService(serviceName); - final String componentName = executionCommand.getComponentName(); - try { + ServiceGroupEntity serviceGroupEntity = serviceGroupDAO.find(clusterId, executionCommand.getServiceGroupName()); + long mpackId = serviceGroupEntity.getStack().getMpackId(); + Mpack mpack = ambariMetaInfo.getMpack(mpackId); + MpackEntity mpackEntity = mpackDAO.findById(mpackId); - if (null != componentName) { - ServiceComponent serviceComponent = service.getServiceComponent(componentName); - commandRepository = repoVersionHelper.getCommandRepository(null, serviceComponent, host); - } else { - RepositoryVersionEntity repoVersion = service.getDesiredRepositoryVersion(); - RepoOsEntity osEntity = repoVersionHelper.getOSEntityForHost(host, repoVersion); - commandRepository = repoVersionHelper.getCommandRepository(repoVersion, osEntity); - } - executionCommand.setRepositoryFile(commandRepository); - - } catch (SystemException e) { - throw new RuntimeException(e); - } + RepoOsEntity osEntity = repoVersionHelper.getOSEntityForHost(mpackEntity, host); + commandRepository = repoVersionHelper.getCommandRepository(mpack, osEntity); + executionCommand.setRepositoryFile(commandRepository); } } catch (ClusterNotFoundException cnfe) { @@ -264,7 +271,7 @@ public ExecutionCommand getExecutionCommand() { cnfe.getMessage()); return executionCommand; - } catch (AmbariException e) { + } catch (Exception e) { throw new RuntimeException(e); } @@ -272,44 +279,45 @@ public ExecutionCommand getExecutionCommand() { } public void setVersions(Cluster cluster) { - // set the repository version for the component this command is for - - // always use the current desired version + String serviceGroupName = executionCommand.getServiceGroupName(); String serviceName = executionCommand.getServiceName(); + String componentName = executionCommand.getComponentName(); + String serviceType = null; + try { - RepositoryVersionEntity repositoryVersion = null; - if (!StringUtils.isEmpty(serviceName)) { - Service service = cluster.getService(serviceName); - if (null != service) { - serviceType = service.getServiceType(); - repositoryVersion = service.getDesiredRepositoryVersion(); - - String componentName = executionCommand.getComponentName(); - if (!StringUtils.isEmpty(componentName)) { - ServiceComponent serviceComponent = service.getServiceComponent(componentName); - if (null != serviceComponent) { - repositoryVersion = serviceComponent.getDesiredRepositoryVersion(); - } - } - } + Mpack mpack = null; + StackEntity stackEntity = null; + + if (StringUtils.isNotBlank(serviceGroupName)) { + ServiceGroupEntity serviceGroupEntity = serviceGroupDAO.find(cluster.getClusterId(), serviceGroupName); + stackEntity = serviceGroupEntity.getStack(); + mpack = ambariMetaInfo.getMpack(stackEntity.getMpackId()); } - Map commandParams = executionCommand.getCommandParams(); + Service service = cluster.getService(serviceGroupName, serviceName); + if (null != service) { + serviceType = service.getServiceType(); + } - if (null != repositoryVersion) { + ModuleComponent moduleComponent = null; + Map commandParams = executionCommand.getCommandParams(); + if (null != mpack && StringUtils.isNotBlank(serviceName) && StringUtils.isNotBlank(componentName)) { // only set the version if it's not set and this is NOT an install // command - // Some stack scripts use version for path purposes. Sending unresolved version first (for - // blueprints) and then resolved one would result in various issues: duplicate directories - // (/hdp/apps/2.6.3.0 + /hdp/apps/2.6.3.0-235), parent directory not found, and file not - // found, etc. Hence requiring repositoryVersion to be resolved. + + moduleComponent = mpack.getModuleComponent(serviceName, componentName); + } + + if( null != moduleComponent ) { if (!commandParams.containsKey(VERSION) - && repositoryVersion.isResolved() - && executionCommand.getRoleCommand() != RoleCommand.INSTALL) { - commandParams.put(VERSION, repositoryVersion.getVersion()); - } + && executionCommand.getRoleCommand() != RoleCommand.INSTALL) { + commandParams.put(VERSION, moduleComponent.getVersion()); + } + } - StackId stackId = repositoryVersion.getStackId(); + if (null != stackEntity) { + StackId stackId = new StackId(stackEntity); StackInfo stackInfo = ambariMetaInfo.getStack(stackId.getStackName(), stackId.getStackVersion()); @@ -327,6 +335,7 @@ public void setVersions(Cluster cluster) { } } + // set the desired versions of versionable components. This is safe even during an upgrade because // we are "loading-late": components that have not yet upgraded in an EU will have the correct versions. executionCommand.setComponentVersions(cluster); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java index ecb5a214b8d..42b1e8ddcc1 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java @@ -40,14 +40,14 @@ public class CommandRepository { @SerializedName("repositories") private List m_repositories = new ArrayList<>(); - @SerializedName("repoVersion") - private String m_repoVersion; + @SerializedName("mpackId") + private long m_mpackId; - @SerializedName("repoVersionId") - private long m_repoVersionId; + @SerializedName("mpackName") + private String m_mpackName; - @SerializedName("stackName") - private String m_stackName; + @SerializedName("mpackVersion") + private String m_mpackVersion; @SerializedName("repoFileName") private String m_repoFileName; @@ -69,27 +69,30 @@ public CommandRepositoryFeature getFeature(){ * version after distribution. */ @SerializedName("resolved") - private boolean m_resolved; + private final boolean m_resolved = true; /** - * @param version the repo version + * @param id + * the mpack id */ - public void setRepositoryVersion(String version) { - m_repoVersion = version; + public void setMpackId(long id) { + m_mpackId = id; } /** - * @param id the repository id + * @param name + * the mpack name */ - public void setRepositoryVersionId(long id) { - m_repoVersionId = id; + public void setMpackName(String name) { + m_mpackName = name; } /** - * @param name the stack name + * @param version + * the mpack version */ - public void setStackName(String name) { - m_stackName = name; + public void setMpackVersion(String mpackVersion) { + m_mpackVersion = mpackVersion; } /** @@ -155,16 +158,6 @@ public boolean isResolved() { return m_resolved; } - /** - * Gets whether this repository has had its version resolved. - * - * @param resolved - * {@code true} to mark this repository as being resolved. - */ - public void setResolved(boolean resolved) { - m_resolved = resolved; - } - /** * Update repository id to be consistent with old format * @@ -187,7 +180,7 @@ public void setLegacyRepoId(String repoVersion){ @Deprecated @Experimental(feature= ExperimentalFeature.PATCH_UPGRADES) public void setLegacyRepoFileName(String stackName, String repoVersion) { - this.m_repoFileName = String.format("%s-%s", stackName, repoVersion); + m_repoFileName = String.format("%s-%s", stackName, repoVersion); } /** @@ -197,7 +190,7 @@ public void setLegacyRepoFileName(String stackName, String repoVersion) { * @param repoVersionId repository version id */ public void setRepoFileName(String stackName, Long repoVersionId) { - this.m_repoFileName = String.format("ambari-%s-%s", stackName.toLowerCase(), repoVersionId.toString()); + m_repoFileName = String.format("ambari-%s-%s", stackName.toLowerCase(), repoVersionId.toString()); } /** @@ -220,11 +213,11 @@ public static class CommandRepositoryFeature { private boolean m_isScoped = true; public void setIsScoped(boolean isScoped){ - this.m_isScoped = isScoped; + m_isScoped = isScoped; } public void setPreInstalled(String isPreInstalled) { - this.m_isPreInstalled = isPreInstalled.equalsIgnoreCase("true"); + m_isPreInstalled = isPreInstalled.equalsIgnoreCase("true"); } } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java index 8f0bd906dd5..ec23720f994 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java @@ -482,9 +482,6 @@ public interface KeyNames { String STACK_NAME = "stack_name"; String SERVICE_TYPE = "service_type"; String STACK_VERSION = "stack_version"; - @Deprecated - @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES) - String SERVICE_REPO_INFO = "service_repo_info"; String PACKAGE_LIST = "package_list"; String JDK_LOCATION = "jdk_location"; String JAVA_HOME = "java_home"; @@ -501,12 +498,6 @@ public interface KeyNames { String ORACLE_JDBC_URL = "oracle_jdbc_url"; String DB_DRIVER_FILENAME = "db_driver_filename"; String CLIENTS_TO_UPDATE_CONFIGS = "clientsToUpdateConfigs"; - /** - * Keep for backward compatibility. - */ - @Deprecated - @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES) - String REPO_INFO = "repo_info"; String DB_NAME = "db_name"; String GLOBAL = "global"; @@ -536,29 +527,11 @@ public interface KeyNames { String SERVICE_CHECK = "SERVICE_CHECK"; // TODO: is it standard command? maybe add it to RoleCommand enum? String CUSTOM_COMMAND = "custom_command"; - /** - * The key indicating that the package_version string is available - */ - @Deprecated - @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES) - String PACKAGE_VERSION = "package_version"; - /** * The key indicating that there is an un-finalized upgrade which is suspended. */ String UPGRADE_SUSPENDED = "upgrade_suspended"; - /** - * When installing packages, optionally provide the row id the version is - * for in order to precisely match response data. - *

- * The agent will return this value back in its response so the repository - * can be looked up and possibly have its version updated. - */ - @Deprecated - @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES) - String REPO_VERSION_ID = "repository_version_id"; - /** * The version of the component to send down with the command. Normally, * this is simply the repository version of the component. However, during @@ -570,11 +543,15 @@ public interface KeyNames { comment = "Change this to reflect the component version") String VERSION = "version"; - /** * When installing packages, includes what services will be included in the upgrade */ String CLUSTER_VERSION_SUMMARY = "cluster_version_summary"; + + /** + * The ID of the mpack associated with this command. + */ + String MPACK_ID = "mpack_id"; } /** diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java index 8cae46d6a92..cbd78e1448d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatProcessor.java @@ -500,10 +500,10 @@ protected void processCommandReports( } String newVersion = structuredOutput == null ? null : structuredOutput.version; - Long repoVersionId = structuredOutput == null ? null : structuredOutput.repositoryVersionId; + Long mpackId = structuredOutput == null ? null : structuredOutput.mpackId; HostComponentVersionAdvertisedEvent event = new HostComponentVersionAdvertisedEvent( - cl, scHost, newVersion, repoVersionId); + cl, scHost, newVersion); versionEventPublisher.publish(event); } @@ -764,8 +764,8 @@ private static class ComponentVersionStructuredOut { @SerializedName("direction") private Direction upgradeDirection = null; - @SerializedName(KeyNames.REPO_VERSION_ID) - private Long repositoryVersionId; + @SerializedName(KeyNames.MPACK_ID) + private Long mpackId; } } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/alerts/ComponentVersionAlertRunnable.java b/ambari-server/src/main/java/org/apache/ambari/server/alerts/ComponentVersionAlertRunnable.java index 977dc9e76d3..7c5423ce79a 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/alerts/ComponentVersionAlertRunnable.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/alerts/ComponentVersionAlertRunnable.java @@ -28,17 +28,16 @@ import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.orm.entities.AlertDefinitionEntity; -import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.orm.entities.UpgradeEntity; import org.apache.ambari.server.state.Alert; import org.apache.ambari.server.state.AlertState; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.ComponentInfo; import org.apache.ambari.server.state.Host; -import org.apache.ambari.server.state.Service; -import org.apache.ambari.server.state.ServiceComponent; +import org.apache.ambari.server.state.ModuleComponent; +import org.apache.ambari.server.state.Mpack; import org.apache.ambari.server.state.ServiceComponentHost; -import org.apache.ambari.server.state.StackId; +import org.apache.ambari.server.state.ServiceGroup; import org.apache.ambari.server.state.stack.upgrade.Direction; import org.apache.commons.lang.StringUtils; @@ -109,17 +108,15 @@ List execute(Cluster cluster, AlertDefinitionEntity myDefinition) throws for (Host host : hosts) { List hostComponents = cluster.getServiceComponentHosts(host.getHostName()); for (ServiceComponentHost hostComponent : hostComponents) { - Service service = cluster.getService(hostComponent.getServiceName()); - ServiceComponent serviceComponent = service.getServiceComponent(hostComponent.getServiceComponentName()); - - RepositoryVersionEntity desiredRepositoryVersion = service.getDesiredRepositoryVersion(); - StackId desiredStackId = serviceComponent.getDesiredStackId(); - String desiredVersion = desiredRepositoryVersion.getVersion(); + String serviceGroupName = hostComponent.getServiceGroupName(); + ServiceGroup serviceGroup = cluster.getServiceGroup(serviceGroupName); + Long mpackId = serviceGroup.getMpackId(); + Mpack mpack = m_metaInfo.getMpack(mpackId); final ComponentInfo componentInfo; try { - componentInfo = m_metaInfo.getComponent(desiredStackId.getStackName(), - desiredStackId.getStackVersion(), hostComponent.getServiceType(), + componentInfo = m_metaInfo.getComponent(mpack.getName(), + mpack.getVersion(), hostComponent.getServiceType(), hostComponent.getServiceComponentName()); } catch (AmbariException ambariException) { // throw an UNKNOWN response if we can't load component info @@ -135,8 +132,11 @@ List execute(Cluster cluster, AlertDefinitionEntity myDefinition) throws continue; } + ModuleComponent moduleComponent = mpack.getModuleComponent(hostComponent.getServiceName(), + hostComponent.getServiceComponentName()); + String version = hostComponent.getVersion(); - if (!StringUtils.equals(version, desiredVersion)) { + if (!StringUtils.equals(version, moduleComponent.getVersion())) { Set mismatchedComponents = versionMismatches.get(host); if (null == mismatchedComponents) { mismatchedComponents = new HashSet<>(); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java index 5334b7c8390..91189aff7dd 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java @@ -23,11 +23,14 @@ import java.util.List; import java.util.Map; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.actionmanager.TargetHostType; import org.apache.ambari.server.agent.ExecutionCommand; import org.apache.ambari.server.controller.internal.RequestOperationLevel; import org.apache.ambari.server.controller.internal.RequestResourceFilter; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; +import org.apache.ambari.server.state.Mpack; /** * The context required to create tasks and stages for a custom action @@ -46,6 +49,7 @@ public class ActionExecutionContext { private boolean hostsInMaintenanceModeExcluded = true; private boolean allowRetry = false; private RepositoryVersionEntity repositoryVersion; + private Mpack mpack = null; private List m_visitors = new ArrayList<>(); @@ -190,6 +194,8 @@ public void setAutoSkipFailures(boolean autoSkipFailures) { * * @return */ + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public RepositoryVersionEntity getRepositoryVersion() { return repositoryVersion; } @@ -202,10 +208,30 @@ public RepositoryVersionEntity getRepositoryVersion() { * @param stackId * the stackId to use for stack-based properties on the command. */ + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public void setRepositoryVersion(RepositoryVersionEntity repositoryVersion) { this.repositoryVersion = repositoryVersion; } + /** + * Sets the management pack for this command. This can be used to version and + * stack information. + * + * @param mpack + */ + public void setMpack(Mpack mpack) { + this.mpack = mpack; + } + + /** + * Gets the management pack associated with this command. This can be used for + * version and stack information. + */ + public Mpack getMpack() { + return mpack; + } + /** * Adds a command visitor that will be invoked after a command is created. Provides access * to the command. diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java index a46e2c4d4dd..56e6968b90f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java @@ -52,7 +52,6 @@ import org.apache.ambari.server.state.ServiceComponentHost; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.state.StackId; -import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; import org.apache.ambari.server.state.svccomphost.ServiceComponentHostOpInProgressEvent; import org.apache.ambari.server.utils.SecretReference; import org.apache.ambari.server.utils.StageUtils; @@ -92,10 +91,6 @@ public class AmbariActionExecutionHelper { @Inject private Configuration configs; - @Inject - private RepositoryVersionHelper repoVersionHelper; - - /** * Validates the request to execute an action. * @param actionRequest @@ -471,15 +466,6 @@ public boolean shouldHostBeRemoved(final String hostname) hostLevelParams.put(previousDBConnectorName.getKey(), previousDBConnectorName.getValue()); } - if (StringUtils.isNotBlank(serviceName)) { - Service service = cluster.getService(serviceName); - repoVersionHelper.addRepoInfoToHostLevelParams(cluster, actionContext, service.getDesiredRepositoryVersion(), - hostLevelParams, hostName); - } else { - repoVersionHelper.addRepoInfoToHostLevelParams(cluster, actionContext, null, hostLevelParams, hostName); - } - - Map roleParams = execCmd.getRoleParams(); if (roleParams == null) { roleParams = new TreeMap<>(); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java index 9625f101269..fdd20425395 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java @@ -33,7 +33,6 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.MYSQL_JDBC_URL; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.NOT_MANAGED_HDFS_PATH_LIST; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.ORACLE_JDBC_URL; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.REPO_INFO; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT_TYPE; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_NAME; @@ -71,7 +70,6 @@ import org.apache.ambari.server.controller.internal.RequestOperationLevel; import org.apache.ambari.server.controller.internal.RequestResourceFilter; import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.metadata.ActionMetadata; import org.apache.ambari.server.orm.dao.HostRoleCommandDAO; import org.apache.ambari.server.state.Cluster; @@ -415,12 +413,6 @@ public boolean shouldHostBeRemoved(final String hostname) hostLevelParams.put(CUSTOM_COMMAND, commandName); - // Set parameters required for re-installing clients on restart - try { - hostLevelParams.put(REPO_INFO, repoVersionHelper.getRepoInfo(cluster, component, host)); - } catch (SystemException e) { - throw new AmbariException("", e); - } hostLevelParams.put(STACK_NAME, stackId.getStackName()); hostLevelParams.put(STACK_VERSION, stackId.getStackVersion()); @@ -1442,7 +1434,6 @@ Map createDefaultHostParams(Cluster cluster, StackId stackId) th hostLevelParams.put(MYSQL_JDBC_URL, managementController.getMysqljdbcUrl()); hostLevelParams.put(ORACLE_JDBC_URL, managementController.getOjdbcUrl()); hostLevelParams.put(DB_DRIVER_FILENAME, configs.getMySQLJarName()); - hostLevelParams.putAll(managementController.getRcaParameters()); hostLevelParams.put(HOST_SYS_PREPPED, configs.areHostsSysPrepped()); hostLevelParams.put(AGENT_STACK_RETRY_ON_UNAVAILABILITY, configs.isAgentStackRetryOnInstallEnabled()); hostLevelParams.put(AGENT_STACK_RETRY_COUNT, configs.getAgentStackRetryOnInstallCount()); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java index 9a1bb921215..016648da395 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java @@ -725,14 +725,6 @@ RequestStageContainer addStages(RequestStageContainer requestStages, Cluster clu Map> findConfigurationTagsWithOverrides( Cluster cluster, String hostName) throws AmbariException; - /** - * Returns parameters for RCA database - * - * @return the map with parameters for RCA db - * - */ - Map getRcaParameters(); - /** * Get the Factory to create Request schedules * @return the request execution factory 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 9f5acbfdf94..0258792b670 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 @@ -18,10 +18,6 @@ package org.apache.ambari.server.controller; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_DRIVER; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_PASSWORD; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_URL; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_USERNAME; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_RETRY_ENABLED; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_TIMEOUT; @@ -31,11 +27,8 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.MAX_DURATION_OF_RETRIES; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.NOT_MANAGED_HDFS_PATH_LIST; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.PACKAGE_LIST; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.PACKAGE_VERSION; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.REPO_INFO; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SCRIPT_TYPE; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_REPO_INFO; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.UNLIMITED_KEY_JCE_REQUIRED; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_GROUPS; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_LIST; @@ -90,7 +83,6 @@ import org.apache.ambari.server.actionmanager.Stage; import org.apache.ambari.server.actionmanager.StageFactory; import org.apache.ambari.server.agent.ExecutionCommand; -import org.apache.ambari.server.agent.ExecutionCommand.KeyNames; import org.apache.ambari.server.agent.rest.AgentResource; import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.api.services.LoggingService; @@ -109,7 +101,6 @@ import org.apache.ambari.server.controller.metrics.timeline.cache.TimelineMetricCacheProvider; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException; -import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.customactions.ActionDefinition; import org.apache.ambari.server.events.publishers.AmbariEventPublisher; import org.apache.ambari.server.metadata.ActionMetadata; @@ -188,6 +179,7 @@ import org.apache.ambari.server.state.ServiceComponentHostEvent; import org.apache.ambari.server.state.ServiceComponentHostFactory; import org.apache.ambari.server.state.ServiceFactory; +import org.apache.ambari.server.state.ServiceGroup; import org.apache.ambari.server.state.ServiceGroupFactory; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.state.StackId; @@ -2394,7 +2386,6 @@ private void createHostAction(Cluster cluster, Map commandParamsInp, ServiceComponentHostEvent event, boolean skipFailure, - RepositoryVersionEntity repoVersion, boolean isUpgradeSuspended, DatabaseType databaseType, Map clusterDesiredConfigs @@ -2561,34 +2552,7 @@ private void createHostAction(Cluster cluster, } StageUtils.useAmbariJdkInCommandParams(commandParams, configs); - String repoInfo; - try { - repoInfo = repoVersionHelper.getRepoInfo(cluster, component, host); - } catch (SystemException e) { - throw new AmbariException("", e); - } - if (LOG.isDebugEnabled()) { - LOG.debug("Sending repo information to agent, hostname={}, clusterName={}, stackInfo={}, repoInfo={}", - scHost.getHostName(), clusterName, stackId.getStackId(), repoInfo); - } - Map hostParams = new TreeMap<>(); - hostParams.put(REPO_INFO, repoInfo); - hostParams.putAll(getRcaParameters()); - - if (null != repoVersion) { - try { - VersionDefinitionXml xml = repoVersion.getRepositoryXml(); - if (null != xml && !StringUtils.isBlank(xml.getPackageVersion(osFamily))) { - hostParams.put(PACKAGE_VERSION, xml.getPackageVersion(osFamily)); - } - } catch (Exception e) { - throw new AmbariException(String.format("Could not load version xml from repo version %s", - repoVersion.getVersion()), e); - } - - hostParams.put(KeyNames.REPO_VERSION_ID, repoVersion.getId().toString()); - } List packages = getPackagesForStackServiceHost(ambariMetaInfo.getStack(stackId), serviceInfo, hostParams, osFamily); @@ -2680,11 +2644,11 @@ private void createHostAction(Cluster cluster, /** * Computes os-dependent packages for osSpecificMap. Does not take into - * account package dependencies for ANY_OS. Instead of this method - * you should use getPackagesForStackServiceHost() - * because it takes into account both os-dependent and os-independent lists - * of packages for stack service. - * @param hostParams may be modified (appended SERVICE_REPO_INFO) + * account package dependencies for ANY_OS. Instead of this method you should + * use getPackagesForStackServiceHost() because it takes into account both + * os-dependent and os-independent lists of packages for stack service. + * + * @param hostParams * @return a list of os-dependent packages for host */ protected OsSpecific populatePackagesInfo(Map osSpecificMap, Map hostParams, @@ -2695,18 +2659,12 @@ protected OsSpecific populatePackagesInfo(Map osSpecificMap, for (OsSpecific osSpecific : foundOSSpecifics) { hostOs.addPackages(osSpecific.getPackages()); } - - //TODO this looks deprecated. Need to investigate if it's actually used - // Choose repo that is relevant for host - OsSpecific.Repo repos = hostOs.getRepo(); - if (repos != null) { - String serviceRepoInfo = gson.toJson(repos); - hostParams.put(SERVICE_REPO_INFO, serviceRepoInfo); - } } + return hostOs; } + @Override public List getPackagesForStackServiceHost(StackInfo stackInfo, ServiceInfo serviceInfo, Map hostParams, String osFamily) { List packages = new ArrayList<>(); //add all packages for ANY_OS @@ -2949,11 +2907,11 @@ protected RequestStageContainer doStageCreation(RequestStageContainer requestSta Service service = cluster.getService(scHost.getServiceName()); ServiceComponent serviceComponent = service.getServiceComponent(compName); + StackId stackId = cluster.getServiceGroup(scHost.getServiceGroupId()).getStackId(); if (StringUtils.isBlank(stage.getHostParamsStage())) { - RepositoryVersionEntity repositoryVersion = serviceComponent.getDesiredRepositoryVersion(); stage.setHostParamsStage(StageUtils.getGson().toJson( - customCommandExecutionHelper.createDefaultHostParams(cluster, repositoryVersion.getStackId()))); + customCommandExecutionHelper.createDefaultHostParams(cluster, stackId))); } @@ -3023,7 +2981,6 @@ protected RequestStageContainer doStageCreation(RequestStageContainer requestSta } break; case STARTED: - StackId stackId = serviceComponent.getDesiredStackId(); ComponentInfo compInfo = ambariMetaInfo.getComponent( stackId.getStackName(), stackId.getStackVersion(), scHost.getServiceType(), scHost.getServiceComponentName()); @@ -3170,10 +3127,8 @@ protected RequestStageContainer doStageCreation(RequestStageContainer requestSta } } else { // !!! can never be null - RepositoryVersionEntity repoVersion = serviceComponent.getDesiredRepositoryVersion(); - createHostAction(cluster, stage, scHost, configurations, configurationAttributes, configTags, - roleCommand, requestParameters, event, skipFailure, repoVersion, isUpgradeSuspended, + roleCommand, requestParameters, event, skipFailure, isUpgradeSuspended, databaseType, clusterDesiredConfigs); } @@ -3189,9 +3144,12 @@ protected RequestStageContainer doStageCreation(RequestStageContainer requestSta calculateServiceComponentHostForServiceCheck(cluster, service); if (StringUtils.isBlank(stage.getHostParamsStage())) { - RepositoryVersionEntity repositoryVersion = componentForServiceCheck.getServiceComponent().getDesiredRepositoryVersion(); + long serviceGroupId = componentForServiceCheck.getServiceGroupId(); + ServiceGroup serviceGroup = cluster.getServiceGroup(serviceGroupId); + StackId stackId = serviceGroup.getStackId(); + stage.setHostParamsStage(StageUtils.getGson().toJson( - customCommandExecutionHelper.createDefaultHostParams(cluster, repositoryVersion.getStackId()))); + customCommandExecutionHelper.createDefaultHostParams(cluster, stackId))); } customCommandExecutionHelper.addServiceCheckAction(stage, componentForServiceCheck.getHostName(), smokeTestRole, @@ -3318,19 +3276,11 @@ public ExecutionCommand getExecutionCommand(Cluster cluster, configurationAttributes = new TreeMap<>(); - RepositoryVersionEntity repoVersion = null; - if (null != scHost.getServiceComponent().getDesiredRepositoryVersion()) { - repoVersion = scHost.getServiceComponent().getDesiredRepositoryVersion(); - } else { - Service service = cluster.getService(scHost.getServiceName()); - repoVersion = service.getDesiredRepositoryVersion(); - } - boolean isUpgradeSuspended = cluster.isUpgradeSuspended(); DatabaseType databaseType = configs.getDatabaseType(); Map clusterDesiredConfigs = cluster.getDesiredConfigs(); createHostAction(cluster, stage, scHost, configurations, configurationAttributes, configTags, - roleCommand, null, null, false, repoVersion, isUpgradeSuspended, databaseType, + roleCommand, null, null, false, isUpgradeSuspended, databaseType, clusterDesiredConfigs); ExecutionCommand ec = stage.getExecutionCommands().get(scHost.getHostName()).get(0).getExecutionCommand(); @@ -5078,28 +5028,6 @@ public String getMysqljdbcUrl() { return mysqljdbcUrl; } - @Override - public Map getRcaParameters() { - - String hostName = StageUtils.getHostName(); - - String url = configs.getRcaDatabaseUrl(); - if (url.contains(Configuration.HOSTNAME_MACRO)) { - url = - url.replace(Configuration.HOSTNAME_MACRO, - hostsMap.getHostMap(hostName)); - } - - Map rcaParameters = new HashMap<>(); - - rcaParameters.put(AMBARI_DB_RCA_URL, url); - rcaParameters.put(AMBARI_DB_RCA_DRIVER, configs.getRcaDatabaseDriver()); - rcaParameters.put(AMBARI_DB_RCA_USERNAME, configs.getRcaDatabaseUser()); - rcaParameters.put(AMBARI_DB_RCA_PASSWORD, configs.getRcaDatabasePassword()); - - return rcaParameters; - } - @Override public boolean checkLdapConfigured() { return ldapDataPopulator.isLdapEnabled(); @@ -5804,7 +5732,7 @@ public Set createServiceConfigVersion(Set existingConfigTypeToConfig = new HashMap(); + Map existingConfigTypeToConfig = new HashMap<>(); for (Config config : configs) { Config existingConfig = cluster.getDesiredConfigByType(config.getType()); existingConfigTypeToConfig.put(config.getType(), existingConfig); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java index fbe80ed0226..f7f26833108 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java @@ -113,7 +113,6 @@ import org.apache.ambari.server.security.unsecured.rest.CertificateDownload; import org.apache.ambari.server.security.unsecured.rest.CertificateSign; import org.apache.ambari.server.security.unsecured.rest.ConnectionInfo; -import org.apache.ambari.server.stack.UpdateActiveRepoVersionOnStartup; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.topology.AmbariContext; import org.apache.ambari.server.topology.BlueprintFactory; @@ -1075,7 +1074,7 @@ private static void loadRequestlogHandler(AmbariHandlerList handlerList, Server HandlerCollection handlers = new HandlerCollection(); Handler[] handler = serverForAgent.getHandlers(); if(handler != null ) { - handlers.setHandlers((Handler[])handler); + handlers.setHandlers(handler); handlers.addHandler(requestLogHandler); serverForAgent.setHandler(handlers); } @@ -1106,7 +1105,6 @@ public static void main(String[] args) throws Exception { DatabaseConsistencyCheckHelper.checkDBVersionCompatible(); server = injector.getInstance(AmbariServer.class); - injector.getInstance(UpdateActiveRepoVersionOnStartup.class).process(); CertificateManager certMan = injector.getInstance(CertificateManager.class); certMan.initRootCert(); KerberosChecker.checkJaasConfiguration(); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceResponse.java index 73a2c93a9ca..65cd5734568 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceResponse.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceResponse.java @@ -18,6 +18,8 @@ package org.apache.ambari.server.controller; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.state.RepositoryVersionState; import org.apache.ambari.server.state.StackId; @@ -191,8 +193,12 @@ public RepositoryVersionState getRepositoryVersionState() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } ServiceResponse that = (ServiceResponse) o; @@ -302,12 +308,16 @@ public interface ServiceResponseSwagger extends ApiModel { /** * @param id */ + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public void setDesiredRepositoryVersionId(Long id) { desiredRepositoryVersionId = id; } /** */ + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public Long getDesiredRepositoryVersionId() { return desiredRepositoryVersionId; } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java index fdbb034d419..6de2bfa89c2 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java @@ -385,7 +385,6 @@ public Set invoke() throws AmbariException { hostLevelParams.put(MYSQL_JDBC_URL, managementController.getMysqljdbcUrl()); hostLevelParams.put(ORACLE_JDBC_URL, managementController.getOjdbcUrl()); hostLevelParams.put(HOST_SYS_PREPPED, configs.areHostsSysPrepped()); - hostLevelParams.putAll(managementController.getRcaParameters()); hostLevelParams.put(AGENT_STACK_RETRY_ON_UNAVAILABILITY, configs.isAgentStackRetryOnInstallEnabled()); hostLevelParams.put(AGENT_STACK_RETRY_COUNT, configs.getAgentStackRetryOnInstallCount()); hostLevelParams.put(GPL_LICENSE_ACCEPTED, configs.getGplLicenseAccepted().toString()); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java index 69c33ed3e35..ab11fc71dc8 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java @@ -102,6 +102,8 @@ * Resource provider for cluster stack versions resources. */ @StaticallyInject +@Deprecated +@Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public class ClusterStackVersionResourceProvider extends AbstractControllerResourceProvider { private static final Logger LOG = LoggerFactory.getLogger(ClusterStackVersionResourceProvider.class); @@ -698,7 +700,7 @@ ActionExecutionContext getHostVersionInstallCommand(RepositoryVersionEntity repo // Determine repositories for host String osFamily = host.getOsFamily(); - RepoOsEntity osEntity = repoVersionHelper.getOSEntityForHost(host, repoVersion); + RepoOsEntity osEntity = repoVersionHelper.getOSEntityForHost(repoVersion.getRepoOsEntities(), host); if (CollectionUtils.isEmpty(osEntity.getRepoDefinitionEntities())) { throw new SystemException(String.format("Repositories for os type %s are not defined for version %s of Stack %s.", diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java index 0934704825b..44a2ad63488 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java @@ -30,6 +30,8 @@ import java.util.Map.Entry; import java.util.Set; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.StaticallyInject; import org.apache.ambari.server.api.resources.OperatingSystemResourceDefinition; @@ -47,8 +49,10 @@ import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.controller.spi.UnsupportedPropertyException; import org.apache.ambari.server.controller.utilities.PropertyHelper; +import org.apache.ambari.server.orm.dao.MpackDAO; import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; import org.apache.ambari.server.orm.dao.StackDAO; +import org.apache.ambari.server.orm.entities.MpackEntity; import org.apache.ambari.server.orm.entities.RepoDefinitionEntity; import org.apache.ambari.server.orm.entities.RepoOsEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; @@ -87,6 +91,8 @@ * files. */ @StaticallyInject +@Deprecated +@Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourceProvider { private static final Logger LOG = LoggerFactory.getLogger(VersionDefinitionResourceProvider.class); @@ -138,6 +144,9 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc @Inject private static Configuration s_configuration; + @Inject + private static MpackDAO s_mpackDAO; + /** * Key property ids */ @@ -604,6 +613,7 @@ protected void toRepositoryVersionEntity(XmlHolder holder) throws AmbariExceptio StackId stackId = new StackId(holder.xml.release.stackId); StackEntity stackEntity = s_stackDAO.find(stackId.getStackName(), stackId.getStackVersion()); + MpackEntity mpackEntity = s_mpackDAO.findById(stackEntity.getMpackId()); entity.setStack(stackEntity); @@ -614,7 +624,8 @@ protected void toRepositoryVersionEntity(XmlHolder holder) throws AmbariExceptio s_metaInfo.get().getStack(stackId.getStackName(), stackId.getStackVersion()).getRepositoriesByOs(); repos.addAll(RepoUtil.getServiceRepos(repos, stackReposByOs)); - entity.addRepoOsEntities(s_repoVersionHelper.get().createRepoOsEntities(repos)); + + entity.addRepoOsEntities(mpackEntity.getRepositoryOperatingSystems()); entity.setVersion(holder.xml.release.getFullVersion()); entity.setDisplayName(stackId, holder.xml.release); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/HostComponentVersionAdvertisedEvent.java b/ambari-server/src/main/java/org/apache/ambari/server/events/HostComponentVersionAdvertisedEvent.java index 6155880b1cb..e8509b46779 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/events/HostComponentVersionAdvertisedEvent.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/events/HostComponentVersionAdvertisedEvent.java @@ -17,6 +17,8 @@ */ package org.apache.ambari.server.events; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.ServiceComponentHost; @@ -24,6 +26,8 @@ * The {@link HostComponentVersionAdvertisedEvent} * occurs when a Host Component advertises it's current version value. */ +@Deprecated +@Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public class HostComponentVersionAdvertisedEvent extends ClusterEvent { protected Cluster cluster; diff --git a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java index df038b4ecd2..34a19fe0026 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/StackVersionListener.java @@ -208,8 +208,6 @@ private void processComponentAdvertisedVersion(Cluster cluster, ServiceComponent setUpgradeStateAndRecalculateHostVersions(sch, UpgradeState.VERSION_MISMATCH); } } - - sc.updateRepositoryState(newVersion); } /** diff --git a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java index d77c5e1fa70..0fd4136b419 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java @@ -44,11 +44,15 @@ import org.apache.ambari.server.orm.dao.MpackDAO; import org.apache.ambari.server.orm.dao.StackDAO; import org.apache.ambari.server.orm.entities.MpackEntity; +import org.apache.ambari.server.orm.entities.RepoOsEntity; import org.apache.ambari.server.orm.entities.StackEntity; +import org.apache.ambari.server.stack.RepoUtil; import org.apache.ambari.server.state.Module; import org.apache.ambari.server.state.Mpack; import org.apache.ambari.server.state.OsSpecific; +import org.apache.ambari.server.state.stack.RepositoryXml; import org.apache.ambari.server.state.stack.StackMetainfoXml; +import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; @@ -79,20 +83,20 @@ public class MpackManager { private MpackDAO mpackDAO; private StackDAO stackDAO; private File stackRoot; + private RepositoryVersionHelper repoVersionHelper; + @AssistedInject - public MpackManager( - @Assisted("mpacksv2Staging") File mpacksStagingLocation, - @Assisted("stackRoot") File stackRootDir, - MpackDAO mpackDAOObj, - StackDAO stackDAOObj) { + public MpackManager(@Assisted("mpacksv2Staging") File mpacksStagingLocation, + @Assisted("stackRoot") File stackRootDir, MpackDAO mpackDAOObj, StackDAO stackDAOObj, + RepositoryVersionHelper repoVersionHelper) { mpacksStaging = mpacksStagingLocation; mpackDAO = mpackDAOObj; stackRoot = stackRootDir; stackDAO = stackDAOObj; + this.repoVersionHelper = repoVersionHelper; parseMpackDirectories(); - } /** @@ -199,6 +203,7 @@ public MpackResponse registerMpack(MpackRequest mpackRequest) mpackDirectory = mpacksStaging + File.separator + mpack.getName() + File.separator + mpack.getVersion(); } } + extractMpackTar(mpack, mpackTarPath, mpackDirectory); mpack.setMpackUri(mpackRequest.getMpackUri()); mpackResourceId = populateDB(mpack); @@ -310,6 +315,14 @@ private void extractMpackTar(Mpack mpack, Path mpackTarPath, String mpackDirecto generateMetainfo(metainfoFile, mpack); } + RepositoryXml repositoryXml = RepoUtil.getRepositoryXml(extractedMpackDirectory.toFile()); + if (null == repositoryXml) { + throw new IOException("The repository file " + RepoUtil.REPOSITORY_FILE_NAME + + " must exist in the management pack"); + } + + mpack.setRepositoryXml(repositoryXml); + createSymLinks(mpack); } @@ -514,6 +527,15 @@ protected Long populateDB(Mpack mpack) throws IOException { mpackEntity.setMpackVersion(mpackVersion); mpackEntity.setMpackUri(mpack.getMpackUri()); mpackEntity.setRegistryId(mpack.getRegistryId()); + + List repositoryOperatingSystems = repoVersionHelper.createRepoOsEntities( + mpack.getRepositoryXml().getRepositories()); + + repositoryOperatingSystems.stream().forEach( + operatingSystem -> operatingSystem.setMpackEntity(mpackEntity)); + + mpackEntity.setRepositoryOperatingSystems(repositoryOperatingSystems); + Long mpackId = mpackDAO.create(mpackEntity); return mpackId; } @@ -586,8 +608,9 @@ public boolean removeMpack(MpackEntity mpackEntity, StackEntity stackEntity) thr if (stackEntity != null) { Path stackPath = Paths.get(stackRoot + "/" + stackEntity.getStackName() + "/" + stackEntity.getStackVersion()); File stackDirectory = new File(stackRoot + "/" + stackEntity.getStackName()); - if (!Files.exists(stackPath)) + if (!Files.exists(stackPath)) { Files.delete(stackPath); + } if (stackDirectory.isDirectory()) { if (stackDirectory.list().length == 0) { Files.delete(stackDirectory.toPath()); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostVersionDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostVersionDAO.java index feb4172b160..a8ef7a8c87c 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostVersionDAO.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostVersionDAO.java @@ -24,6 +24,8 @@ import javax.persistence.EntityManager; import javax.persistence.TypedQuery; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.orm.RequiresSession; import org.apache.ambari.server.orm.entities.HostEntity; import org.apache.ambari.server.orm.entities.HostVersionEntity; @@ -43,6 +45,8 @@ * {@link org.apache.ambari.server.state.RepositoryVersionState#INSTALLING}. */ @Singleton +@Deprecated +@Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public class HostVersionDAO extends CrudDAO { @Inject Provider entityManagerProvider; @@ -157,9 +161,9 @@ public List findByClusterAndState(String clusterName, Reposit query.setParameter("clusterName", clusterName); query.setParameter("state", state); - return daoUtils.selectList(query); + return daoUtils.selectList(query); } - + /** * Retrieve all of the host versions for the given cluster name, host name, and state.
* @param clusterName Cluster name diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackHostStateDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackHostStateDAO.java new file mode 100644 index 00000000000..5be01370003 --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackHostStateDAO.java @@ -0,0 +1,109 @@ +/* + * 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.orm.dao; + +import java.util.Collection; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; + +import org.apache.ambari.server.orm.RequiresSession; +import org.apache.ambari.server.orm.entities.MpackHostStateEntity; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.Singleton; +import com.google.inject.persist.Transactional; + +/** + * The {@link MpackHostStateDAO} contains all of the CRUD operations relating to + * the installation state of a management pack on a host. + */ +@Singleton +public class MpackHostStateDAO extends CrudDAO { + @Inject + Provider entityManagerProvider; + + @Inject + DaoUtils daoUtils; + + /** + * Constructor. + */ + public MpackHostStateDAO() { + super(MpackHostStateEntity.class); + } + + /** + * @param entity entity to create + */ + @Override + @Transactional + public void create(MpackHostStateEntity entity) throws IllegalArgumentException { + super.create(entity); + } + + /** + * Retrieve all of the install states for any management packs installed on + * the specified host. + * + * @param hostName + * FQDN of host + * @return Return all of the mpack install states that match the criteria. + */ + @RequiresSession + public List findByHost(String hostName) { + final TypedQuery query = entityManagerProvider.get().createNamedQuery( + "mpackHostStateForHost", MpackHostStateEntity.class); + query.setParameter("hostName", hostName); + + return daoUtils.selectList(query); + } + + /** + * Retrieve all of the host versions for the given management pack. + * + * @param mpackId + * the ID of the mpack + * @return all of the hosts in the cluster which have entries for the + * specified mpack. + */ + @RequiresSession + public List findByMpack(Long mpackId) { + final TypedQuery query = entityManagerProvider.get().createNamedQuery( + "mpackHostStateForMpack", MpackHostStateEntity.class); + query.setParameter("mpackId", mpackId); + + return daoUtils.selectList(query); + } + + /** + * Removes all of the associated mpack host states for a given host. + * + * @param hostName + * the name of the host. + */ + @Transactional + public void removeByHostName(String hostName) { + Collection mpackHostStates = findByHost(hostName); + this.remove(mpackHostStates); + } + +} diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RepositoryVersionDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RepositoryVersionDAO.java index 732a4e9f557..dd51e557005 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RepositoryVersionDAO.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/RepositoryVersionDAO.java @@ -22,6 +22,8 @@ import javax.persistence.TypedQuery; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.orm.RequiresSession; import org.apache.ambari.server.orm.entities.RepoOsEntity; @@ -38,6 +40,8 @@ * */ @Singleton +@Deprecated +@Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public class RepositoryVersionDAO extends CrudDAO { /** * Constructor. @@ -153,7 +157,7 @@ public List findByStackAndType(StackId stackId, Reposit query.setParameter("type", type); return daoUtils.selectList(query); } - + /** * Validates and creates an object. * The version must be unique within this stack name (e.g., HDP, HDPWIN, BIGTOP). diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceComponentDesiredStateDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceComponentDesiredStateDAO.java index 61bc9aed6d6..90398f105b7 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceComponentDesiredStateDAO.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceComponentDesiredStateDAO.java @@ -26,7 +26,6 @@ import org.apache.ambari.server.orm.RequiresSession; import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity; -import org.apache.ambari.server.orm.entities.ServiceComponentVersionEntity; import com.google.inject.Inject; import com.google.inject.Provider; @@ -129,53 +128,4 @@ public void removeByName(long clusterId, long serviceGroupId, long serviceId, St entityManagerProvider.get().remove(entity); } } - - /** - * @param clusterId the cluster id - * @param serviceGroupId the service group id - * @param serviceId the service id - * @param componentName the component name - * @return the list of repository versions for a component - */ - @RequiresSession - public List findVersions(long clusterId, long serviceGroupId, long serviceId, - String componentName) { - EntityManager entityManager = entityManagerProvider.get(); - TypedQuery query = entityManager.createNamedQuery( - "ServiceComponentVersionEntity.findByComponent", ServiceComponentVersionEntity.class); - - query.setParameter("clusterId", clusterId); - query.setParameter("serviceGroupId", serviceGroupId); - query.setParameter("serviceId", serviceId); - query.setParameter("componentName", componentName); - - return daoUtils.selectList(query); - } - - /** - * Gets a specific version for a component - * @param clusterId the cluster id - * @param serviceGroupId the service group id - * @param serviceId the service id - * @param componentName the component name - * @param version the component version to find - * @return the version entity, or {@code null} if not found - */ - @RequiresSession - public ServiceComponentVersionEntity findVersion(long clusterId, long serviceGroupId, long serviceId, - String componentName, String version) { - - EntityManager entityManager = entityManagerProvider.get(); - TypedQuery query = entityManager.createNamedQuery( - "ServiceComponentVersionEntity.findByComponentAndVersion", ServiceComponentVersionEntity.class); - - query.setParameter("clusterId", clusterId); - query.setParameter("serviceGroupId", serviceGroupId); - query.setParameter("serviceId", serviceId); - query.setParameter("componentName", componentName); - query.setParameter("repoVersion", version); - - return daoUtils.selectSingle(query); - } - } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostVersionEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostVersionEntity.java index 2c61a3c2aa3..94bbb78a4a2 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostVersionEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostVersionEntity.java @@ -33,8 +33,12 @@ import javax.persistence.TableGenerator; import javax.persistence.UniqueConstraint; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.state.RepositoryVersionState; +@Deprecated +@Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) @Entity @Table( name = "host_version", diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java index 879d24a1238..1a2d5808843 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java @@ -17,8 +17,11 @@ */ package org.apache.ambari.server.orm.entities; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -26,6 +29,7 @@ import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.TableGenerator; @@ -64,6 +68,14 @@ public class MpackEntity { @Column(name = "mpack_uri", nullable = false) private String mpackUri; + /** + * The list of repositories for this management pack. Each repository is + * organized by operating system. A single operating system can have multiple + * repo URLs defined for it for a given management pack. + */ + @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "mpackEntity") + private List repositoryOperatingSystems = new ArrayList<>(); + public Long getId() { return id; } @@ -104,6 +116,26 @@ public void setMpackUri(String mpackUri) { this.mpackUri = mpackUri; } + /** + * Gets the list of repositories by OS that are associated with this + * management pack. + * + * @return the repositories for this mpack by operating system. + */ + public List getRepositoryOperatingSystems() { + return repositoryOperatingSystems; + } + + /** + * Sets the repositories associated with this management pack. + * + * @param repositoryOperatingSystems + * each operating system repo grouping. + */ + public void setRepositoryOperatingSystems(List repositoryOperatingSystems) { + this.repositoryOperatingSystems = repositoryOperatingSystems; + } + public MpackEntity() { } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackHostStateEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackHostStateEntity.java new file mode 100644 index 00000000000..2030ddd53d9 --- /dev/null +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackHostStateEntity.java @@ -0,0 +1,206 @@ +/** + * 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.orm.entities; + +import java.util.Objects; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.Table; +import javax.persistence.TableGenerator; +import javax.persistence.UniqueConstraint; + +import org.apache.ambari.server.state.RepositoryVersionState; + +/** + * The {@link MpackHostStateEntity} is used to track the installation state of a + * management pack for a given host. This allows Ambari to determine if a + * management pack needs re-installation on a host or if a host has the correct + * bits installed already. + */ +@Entity +@Table( + name = "mpack_host_state", + uniqueConstraints = @UniqueConstraint( + name = "UQ_mpack_host_state", + columnNames = { "host_id", "mpack_id" })) +@TableGenerator( + name = "mpack_host_state_id_generator", + table = "ambari_sequences", + pkColumnName = "sequence_name", + valueColumnName = "sequence_value", + pkColumnValue = "mpack_host_state_id_seq", + initialValue = 0) +@NamedQueries({ + @NamedQuery( + name = "mpackHostStateForHost", + query = "SELECT mpackHostState FROM MpackHostStateEntity mpackHostState JOIN mpackHostState.hostEntity host " + + "WHERE mpackHostState.hostEntity.hostName=:hostName"), + @NamedQuery( + name = "mpackHostStateForMpack", + query = "SELECT mpackHostState FROM MpackHostStateEntity mpackHostState WHERE mpackHostState.id = :mpackId") }) + +public class MpackHostStateEntity { + + /** + * The primary key ID of this entity. + */ + @Id + @Column(name = "id", nullable = false, insertable = true, updatable = false) + @GeneratedValue(strategy = GenerationType.TABLE, generator = "mpack_host_state_id_generator") + private Long id; + + /** + * The ID of the host associated with an mpack for a given installation state. + */ + @Column(name = "host_id", nullable = false, insertable = false, updatable = false) + private Long hostId; + + /** + * The host associated with an mpack for a given installation state. + */ + @ManyToOne + @JoinColumn(name = "host_id", referencedColumnName = "host_id", nullable = false) + private HostEntity hostEntity; + + /** + * The ID of the host associated with an mpack for a given installation state. + */ + @Column(name = "mpack_id", nullable = false, insertable = false, updatable = false) + private Long mpackId; + + /** + * The host associated with an mpack for a given installation state. + */ + @ManyToOne + @JoinColumn(name = "mpack_id", referencedColumnName = "id", nullable = false) + private MpackEntity mpackEntity; + + /** + * The state of the + */ + @Column(name = "state", nullable = false, insertable = true, updatable = true) + @Enumerated(value = EnumType.STRING) + private RepositoryVersionState state; + + /** + * Constructor. + */ + public MpackHostStateEntity() { + } + + /** + * Constructor. + * + * @param mpackEntity + * @param hostEntity + * @param state + */ + public MpackHostStateEntity(MpackEntity mpackEntity, HostEntity hostEntity, + RepositoryVersionState state) { + this.mpackEntity = mpackEntity; + this.hostEntity = hostEntity; + this.state = state; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getHostId() { + return hostId; + } + + public void setHostId(Long hostId) { + this.hostId = hostId; + } + + public Long getMpackId() { + return mpackId; + } + + public void setMpackId(Long mpackId) { + this.mpackId = mpackId; + } + + public String getHostName() { + return hostEntity != null ? hostEntity.getHostName() : null; + } + + public HostEntity getHostEntity() { + return hostEntity; + } + + public void setHostEntity(HostEntity hostEntity) { + this.hostEntity = hostEntity; + } + + public RepositoryVersionState getState() { + return state; + } + + public void setState(RepositoryVersionState state) { + this.state = state; + } + + public MpackEntity getMpack() { + return mpackEntity; + } + + public void setMpack(MpackEntity mpackEntity) { + this.mpackEntity = mpackEntity; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hash(id, mpackId, hostId, state); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + + MpackHostStateEntity other = (MpackHostStateEntity) obj; + return Objects.equals(id, other.id) && Objects.equals(mpackId, other.mpackId) + && Objects.equals(hostId, other.hostId) && Objects.equals(state, other.state); + } +} diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepoOsEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepoOsEntity.java index e1c4a566e95..d32155bca8f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepoOsEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepoOsEntity.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; +import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; @@ -33,6 +34,9 @@ import javax.persistence.Table; import javax.persistence.TableGenerator; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; + import com.google.common.base.Objects; /** @@ -52,6 +56,13 @@ public class RepoOsEntity { @GeneratedValue(strategy = GenerationType.TABLE, generator = "repo_os_id_generator") private Long id; + /** + * The ID of the mpack that this repository entry belongs to. + */ + @Basic + @Column(name = "mpack_id", updatable = false, insertable = false) + private long mpackId; + @Column(name = "family") private String family; @@ -67,10 +78,16 @@ public class RepoOsEntity { /** * many-to-one association to {@link RepositoryVersionEntity} */ + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "repo_version_id", nullable = false) + @JoinColumn(name = "repo_version_id", nullable = true) private RepositoryVersionEntity repositoryVersionEntity; + @ManyToOne + @JoinColumn(name = "mpack_id", referencedColumnName = "id", nullable = false) + private MpackEntity mpackEntity; + /** * @return repoDefinitionEntities */ @@ -95,14 +112,13 @@ public void addRepoDefinitionEntities(List repoDefinitionE * @param repoDefinition many-to-one entity */ public void addRepoDefinition(RepoDefinitionEntity repoDefinition) { - this.repoDefinitionEntities.add(repoDefinition); + repoDefinitionEntities.add(repoDefinition); repoDefinition.setRepoOs(this); } - public RepositoryVersionEntity getRepositoryVersionEntity() { - return repositoryVersionEntity; - } + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public void setRepositoryVersionEntity(RepositoryVersionEntity repositoryVersionEntity) { this.repositoryVersionEntity = repositoryVersionEntity; } @@ -115,6 +131,25 @@ public void setId(Long id) { this.id = id; } + /** + * Gets the management pack ID. + * + * @return the management pack ID. + */ + public long getMpackId() { + return mpackId; + } + + /** + * Sets the management pack ID. + * + * @param mpackId + * the ID of the management pack which owns this repository. + */ + public void setMpackId(long mpackId) { + this.mpackId = mpackId; + } + public String getFamily() { return family; } @@ -131,12 +166,31 @@ public void setAmbariManaged(boolean ambariManaged) { this.ambariManaged = (short) (ambariManaged ? 1 : 0); } + /** + * Gets the Mpack which is associated with this repository operating system. + * + * @return the Mpack + */ + public MpackEntity getMpackEntity() { + return mpackEntity; + } + + /** + * Sets the Mpack which is associated with this repository operating system. + * + * @param mpackEntity + * the Mpack + */ + public void setMpackEntity(MpackEntity mpackEntity) { + this.mpackEntity = mpackEntity; + } + /** * {@inheritDoc} */ @Override public int hashCode() { - return java.util.Objects.hash(family, ambariManaged, repoDefinitionEntities); + return java.util.Objects.hash(mpackId, family, ambariManaged, repoDefinitionEntities); } /** @@ -157,7 +211,8 @@ public boolean equals(Object object) { } RepoOsEntity that = (RepoOsEntity) object; - return Objects.equal(ambariManaged, that.ambariManaged) + return Objects.equal(mpackId, that.mpackId) + && Objects.equal(ambariManaged, that.ambariManaged) && Objects.equal(family, that.family) && Objects.equal(repoDefinitionEntities, that.repoDefinitionEntities); } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java index 18ac2c2c3d7..0ab0c60482f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RepositoryVersionEntity.java @@ -92,6 +92,8 @@ name = "findByServiceDesiredVersion", query = "SELECT repositoryVersion FROM RepositoryVersionEntity repositoryVersion WHERE repositoryVersion IN (SELECT DISTINCT sd1.desiredRepositoryVersion FROM ServiceDesiredStateEntity sd1 WHERE sd1.desiredRepositoryVersion IN ?1)") }) @StaticallyInject +@Deprecated +@Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public class RepositoryVersionEntity { @Inject private static Provider repositoryVersionHelperProvider; diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceComponentDesiredStateEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceComponentDesiredStateEntity.java index 8a8b3809758..f3b0184dffb 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceComponentDesiredStateEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceComponentDesiredStateEntity.java @@ -18,10 +18,8 @@ package org.apache.ambari.server.orm.entities; -import java.util.ArrayList; import java.util.Collection; -import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; @@ -40,6 +38,8 @@ import javax.persistence.TableGenerator; import javax.persistence.UniqueConstraint; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.state.RepositoryVersionState; import org.apache.ambari.server.state.State; @@ -91,6 +91,8 @@ public class ServiceComponentDesiredStateEntity { @Column(name = "recovery_enabled", nullable = false, insertable = true, updatable = true) private Integer recoveryEnabled = 0; + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) @Column(name = "repo_state", nullable = false, insertable = true, updatable = true) @Enumerated(EnumType.STRING) private RepositoryVersionState repoState = RepositoryVersionState.NOT_REQUIRED; @@ -98,6 +100,8 @@ public class ServiceComponentDesiredStateEntity { /** * Unidirectional one-to-one association to {@link RepositoryVersionEntity} */ + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) @OneToOne @JoinColumn( name = "desired_repo_version_id", @@ -122,11 +126,6 @@ public class ServiceComponentDesiredStateEntity { @OneToMany(mappedBy = "serviceComponentDesiredStateEntity") private Collection hostComponentDesiredStateEntities; - @OneToMany( - mappedBy = "m_serviceComponentDesiredStateEntity", - cascade = {CascadeType.ALL}) - private Collection serviceComponentVersions; - public Long getId() { return id; } @@ -163,42 +162,30 @@ public void setDesiredState(State desiredState) { this.desiredState = desiredState; } + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public RepositoryVersionEntity getDesiredRepositoryVersion() { return desiredRepositoryVersion; } + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public void setDesiredRepositoryVersion(RepositoryVersionEntity desiredRepositoryVersion) { this.desiredRepositoryVersion = desiredRepositoryVersion; } + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public StackEntity getDesiredStack() { return desiredRepositoryVersion.getStack(); } + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public String getDesiredVersion() { return desiredRepositoryVersion.getVersion(); } - /** - * @param versionEntity the version to add - */ - public void addVersion(ServiceComponentVersionEntity versionEntity) { - if (null == serviceComponentVersions) { - serviceComponentVersions = new ArrayList<>(); - } - - serviceComponentVersions.add(versionEntity); - versionEntity.setServiceComponentDesiredState(this); - } - - /** - * @return the collection of versions for the component - */ - public Collection getVersions() { - return serviceComponentVersions; - } - - public boolean isRecoveryEnabled() { return recoveryEnabled != 0; } @@ -287,6 +274,8 @@ public void setHostComponentDesiredStateEntities(Collection REPO_ENTITY_TO_NAME = new Function() { @Override @@ -73,6 +78,19 @@ public String apply(@Nullable RepoDefinitionEntity input) { } }; + /** + * Gets the repository XML as an unmarshalled object. + * + * @param directory + * the root stack directory. + * @return the repository XML or {@code null}. + */ + public static RepositoryXml getRepositoryXml(File directory) { + RepositoryFolderAndXml repositoryFolderAndXml = parseRepoFile(directory, + Arrays.asList(directory.list()), m_unmarshaller); + + return repositoryFolderAndXml.repoXml.orNull(); + } /** * Parses the repository file for a stack/service if exists. @@ -126,11 +144,12 @@ public static boolean addServiceReposToOperatingSystemEntities(List serviceReposForOs = stackReposByOs.get(os.getFamily()); ImmutableSet repoNames = ImmutableSet.copyOf(Lists.transform(os.getRepoDefinitionEntities(), REPO_ENTITY_TO_NAME)); - for (RepositoryInfo repoInfo : serviceReposForOs) + for (RepositoryInfo repoInfo : serviceReposForOs) { if (!repoNames.contains(repoInfo.getRepoName())) { os.addRepoDefinition(toRepositoryEntity(repoInfo)); addedRepos.add(String.format("%s (%s)", repoInfo.getRepoId(), os.getFamily())); } + } } LOG.info("Added {} service repos: {}", addedRepos.size(),Iterables.toString(addedRepos)); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java index baaf8f0f7db..496a845f0d5 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java @@ -132,11 +132,6 @@ public boolean accept(File dir, String s) { */ private final static String REPOSITORY_FOLDER_NAME = "repos"; - /** - * repository file name - */ - private final static String REPOSITORY_FILE_NAME = "repoinfo.xml"; - /** * metainfo file name */ diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartup.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartup.java deleted file mode 100644 index 334136f6a48..00000000000 --- a/ambari-server/src/main/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartup.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * 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.stack; - -import java.util.List; - -import org.apache.ambari.server.AmbariException; -import org.apache.ambari.server.api.services.AmbariMetaInfo; -import org.apache.ambari.server.orm.dao.ClusterDAO; -import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; -import org.apache.ambari.server.orm.entities.ClusterEntity; -import org.apache.ambari.server.orm.entities.ClusterServiceEntity; -import org.apache.ambari.server.orm.entities.RepoOsEntity; -import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; -import org.apache.ambari.server.state.RepositoryInfo; -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.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.collect.ListMultimap; -import com.google.inject.Inject; -import com.google.inject.persist.Transactional; - - -/** - * This class should be instantiated on server startup and its {@link #process()} method invoked. - * The class is part of management pack support. Management packs can contain services which define - * their own (yum/apt/ect) repositories. If a management pack is installed on an Ambari with an existing - * cluster, the cluster's repository version entity must be updated with the custom repos provided by the - * management pack. The class takes care of this. - */ -public class UpdateActiveRepoVersionOnStartup { - - private static final Logger LOG = LoggerFactory.getLogger(UpdateActiveRepoVersionOnStartup.class); - - ClusterDAO clusterDao; - RepositoryVersionDAO repositoryVersionDao; - RepositoryVersionHelper repositoryVersionHelper; - StackManager stackManager; - - @Inject - public UpdateActiveRepoVersionOnStartup(ClusterDAO clusterDao, - RepositoryVersionDAO repositoryVersionDao, - RepositoryVersionHelper repositoryVersionHelper, - AmbariMetaInfo metaInfo) { - this.clusterDao = clusterDao; - this.repositoryVersionDao = repositoryVersionDao; - this.repositoryVersionHelper = repositoryVersionHelper; - this.stackManager = metaInfo.getStackManager(); - } - - /** - * Updates the active {@link RepositoryVersionEntity} for clusters with add-on services defined in management packs. - * @throws AmbariException - */ - @Transactional - public void process() throws AmbariException { - LOG.info("Updating existing repo versions with service repos."); - - try { - - List clusters = clusterDao.findAll(); - for (ClusterEntity cluster: clusters) { - for (ClusterServiceEntity service : cluster.getClusterServiceEntities()) { - RepositoryVersionEntity repositoryVersion = service.getServiceDesiredStateEntity().getDesiredRepositoryVersion(); - - StackId stackId = repositoryVersion.getStackId(); - StackInfo stack = stackManager.getStack(stackId.getStackName(), stackId.getStackVersion()); - - if (updateRepoVersion(stack, repositoryVersion)) { - repositoryVersionDao.merge(repositoryVersion); - } - } - } - } - catch(Exception ex) { - throw new AmbariException( - "An error occured during updating current repository versions with stack repositories.", - ex); - } - } - - private boolean updateRepoVersion(StackInfo stackInfo, RepositoryVersionEntity repoVersion) throws Exception { - ListMultimap serviceReposByOs = stackInfo.getRepositoriesByOs(); - - List operatingSystems = repoVersion.getRepoOsEntities(); - boolean changed = RepoUtil.addServiceReposToOperatingSystemEntities(operatingSystems, serviceReposByOs); - if (changed) { - repoVersion.addRepoOsEntities(operatingSystems); - } - return changed; - } - -} diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Module.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Module.java index 800a9e01f4a..29366d9d842 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/Module.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Module.java @@ -20,6 +20,8 @@ import java.util.List; import java.util.Objects; +import org.apache.commons.lang3.StringUtils; + import com.google.gson.annotations.SerializedName; public class Module { @@ -127,11 +129,24 @@ public void setComponents(List components) { this.components = components; } + public ModuleComponent getModuleComponent(String moduleComponentName) { + for (ModuleComponent moduleComponent : components) { + if (StringUtils.equals(moduleComponentName, moduleComponent.getName())) { + return moduleComponent; + } + } + + return null; + } @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Module module = (Module) o; diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java index 76e43d4aab6..2dd86565435 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java @@ -20,6 +20,10 @@ import java.util.List; import java.util.Map; +import org.apache.ambari.server.stack.RepoUtil; +import org.apache.ambari.server.state.stack.RepositoryXml; +import org.apache.commons.lang.StringUtils; + import com.google.gson.annotations.SerializedName; /** @@ -61,6 +65,11 @@ public class Mpack { private String mpackUri; + /** + * The {@link RepoUtil#REPOSITORY_FILE_NAME} representation. + */ + private RepositoryXml repositoryXml; + public Long getResourceId() { return resourceId; } @@ -142,22 +151,100 @@ public void setDefinition(String definition) { this.definition = definition; } + /** + * Gets the repository XML representation. + * + * @return the {@link RepoUtil#REPOSITORY_FILE_NAME} unmarshalled. + */ + public RepositoryXml getRepositoryXml() { + return repositoryXml; + } + + /** + * Gets the repository XML representation. + * + * @param repositoryXml + * the {@link RepoUtil#REPOSITORY_FILE_NAME} unmarshalled. + */ + public void setRepositoryXml(RepositoryXml repositoryXml) { + this.repositoryXml = repositoryXml; + } + + /** + * Gets the module with the given name. Module names are service names. + * + * @param moduleName + * the name of the module. + * @return the module or {@code null}. + */ + public Module getModule(String moduleName) { + for (Module module : modules) { + if (StringUtils.equals(moduleName, module.getName())) { + return module; + } + } + + return null; + } + + /** + * Gets a component from a given module. + * + * @param moduleName + * the module (service) name. + * @param moduleComponentName + * the name of the component. + * @return the component or {@code null}. + */ + public ModuleComponent getModuleComponent(String moduleName, String moduleComponentName) { + for( Module module : modules ) { + ModuleComponent moduleComponent = module.getModuleComponent(moduleComponentName); + if( null != moduleComponent ) { + return moduleComponent; + } + } + + return null; + } + @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Mpack mpack = (Mpack) o; - if (!resourceId.equals(mpack.resourceId)) return false; - if (registryId != null ? !registryId.equals(mpack.registryId) : mpack.registryId != null) return false; - if (!mpackId.equals(mpack.mpackId)) return false; - if (!name.equals(mpack.name)) return false; - if (!version.equals(mpack.version)) return false; - if (!prerequisites.equals(mpack.prerequisites)) return false; - if (!modules.equals(mpack.modules)) return false; - if (!definition.equals(mpack.definition)) return false; - if (!description.equals(mpack.description)) return false; + if (!resourceId.equals(mpack.resourceId)) { + return false; + } + if (registryId != null ? !registryId.equals(mpack.registryId) : mpack.registryId != null) { + return false; + } + if (!mpackId.equals(mpack.mpackId)) { + return false; + } + if (!name.equals(mpack.name)) { + return false; + } + if (!version.equals(mpack.version)) { + return false; + } + if (!prerequisites.equals(mpack.prerequisites)) { + return false; + } + if (!modules.equals(mpack.modules)) { + return false; + } + if (!definition.equals(mpack.definition)) { + return false; + } + if (!description.equals(mpack.description)) { + return false; + } return mpackUri.equals(mpack.mpackUri); } @@ -193,32 +280,32 @@ public String toString() { } public void copyFrom(Mpack mpack) { - if (this.resourceId == null) { - this.resourceId = mpack.getResourceId(); + if (resourceId == null) { + resourceId = mpack.getResourceId(); } - if (this.name == null) { - this.name = mpack.getName(); + if (name == null) { + name = mpack.getName(); } - if (this.mpackId == null) { - this.mpackId = mpack.getMpackId(); + if (mpackId == null) { + mpackId = mpack.getMpackId(); } - if (this.version == null) { - this.version = mpack.getVersion(); + if (version == null) { + version = mpack.getVersion(); } - if (this.registryId == null) { - this.registryId = mpack.getRegistryId(); + if (registryId == null) { + registryId = mpack.getRegistryId(); } - if (this.description == null) { - this.description = mpack.getDescription(); + if (description == null) { + description = mpack.getDescription(); } - if (this.modules == null) { - this.modules = mpack.getModules(); + if (modules == null) { + modules = mpack.getModules(); } - if (this.prerequisites == null) { - this.prerequisites = mpack.getPrerequisites(); + if (prerequisites == null) { + prerequisites = mpack.getPrerequisites(); } - if (this.definition == null) { - this.definition = mpack.getDefinition(); + if (definition == null) { + definition = mpack.getDefinition(); } } } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java index 0ba80cc8046..b1f18e72e94 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java @@ -22,6 +22,8 @@ import java.util.Map; import java.util.Set; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.api.services.ServiceKey; import org.apache.ambari.server.controller.ServiceDependencyResponse; @@ -146,17 +148,23 @@ void deleteServiceComponent(String componentName) /** * @return */ + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) RepositoryVersionEntity getDesiredRepositoryVersion(); /** * @param desiredRepositoryVersion */ + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) void setDesiredRepositoryVersion(RepositoryVersionEntity desiredRepositoryVersion); /** * Gets the repository for the desired version of this service by consulting * the repository states of all known components. */ + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) RepositoryVersionState getRepositoryState(); enum Type { diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java index 3c44fdf971f..8a0eda35b24 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponent.java @@ -20,6 +20,8 @@ import java.util.Map; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.controller.ServiceComponentResponse; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; @@ -63,12 +65,20 @@ public interface ServiceComponent { * * @return */ + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) RepositoryVersionEntity getDesiredRepositoryVersion(); + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) StackId getDesiredStackId(); + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) String getDesiredVersion(); + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) void setDesiredRepositoryVersion(RepositoryVersionEntity repositoryVersionEntity); /** @@ -110,18 +120,10 @@ ServiceComponentHost addServiceComponentHost( void delete() throws AmbariException; - /** - * This method computes the state of the repository that's associated with the desired - * version. It is used, for example, when a host component reports its version and the - * state can be in flux. - * - * @param reportedVersion - * @throws AmbariException - */ - void updateRepositoryState(String reportedVersion) throws AmbariException; - /** * @return the repository state for the desired version */ + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) RepositoryVersionState getRepositoryState(); } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java index b4b4ea1c3fb..2cfbd45ef9f 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java @@ -19,7 +19,6 @@ package org.apache.ambari.server.state; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; @@ -27,6 +26,8 @@ import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.ObjectNotFoundException; import org.apache.ambari.server.ServiceComponentHostNotFoundException; @@ -35,7 +36,6 @@ import org.apache.ambari.server.controller.MaintenanceStateHelper; import org.apache.ambari.server.controller.ServiceComponentResponse; import org.apache.ambari.server.events.ServiceComponentRecoveryChangedEvent; -import org.apache.ambari.server.events.listeners.upgrade.StackVersionListener; import org.apache.ambari.server.events.publishers.AmbariEventPublisher; import org.apache.ambari.server.orm.dao.ClusterServiceDAO; import org.apache.ambari.server.orm.dao.HostComponentDesiredStateDAO; @@ -48,16 +48,11 @@ import org.apache.ambari.server.orm.entities.HostComponentStateEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity; -import org.apache.ambari.server.orm.entities.ServiceComponentVersionEntity; import org.apache.ambari.server.orm.entities.StackEntity; import org.apache.ambari.server.state.cluster.ClusterImpl; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Function; -import com.google.common.collect.Maps; import com.google.inject.Inject; import com.google.inject.ProvisionException; import com.google.inject.assistedinject.Assisted; @@ -393,6 +388,8 @@ public StackId getDesiredStackId() { * {@inheritDoc} */ @Override + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public void setDesiredRepositoryVersion(RepositoryVersionEntity repositoryVersionEntity) { ServiceComponentDesiredStateEntity desiredStateEntity = serviceComponentDesiredStateDAO.findById( desiredStateEntityId); @@ -410,6 +407,8 @@ public void setDesiredRepositoryVersion(RepositoryVersionEntity repositoryVersio * {@inheritDoc} */ @Override + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public RepositoryVersionEntity getDesiredRepositoryVersion() { ServiceComponentDesiredStateEntity desiredStateEntity = serviceComponentDesiredStateDAO.findById( desiredStateEntityId); @@ -418,6 +417,8 @@ public RepositoryVersionEntity getDesiredRepositoryVersion() { } @Override + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public String getDesiredVersion() { ServiceComponentDesiredStateEntity desiredStateEntity = serviceComponentDesiredStateDAO.findById( desiredStateEntityId); @@ -429,18 +430,23 @@ public String getDesiredVersion() { public ServiceComponentResponse convertToResponse() { Cluster cluster = service.getCluster(); ServiceGroup sg = null; - RepositoryVersionEntity repositoryVersionEntity = getDesiredRepositoryVersion(); - StackId desiredStackId = repositoryVersionEntity.getStackId(); try { sg = cluster.getServiceGroup(service.getServiceGroupId()); } catch (ServiceGroupNotFoundException e) { LOG.warn("Service Group " + service.getServiceGroupId() + " not found"); } + + String serviceName = service.getName(); + String componentName = getName(); + + Mpack mpack = ambariMetaInfo.getMpack(sg.getMpackId()); + ModuleComponent moduleComponent = mpack.getModuleComponent(serviceName, componentName); + ServiceComponentResponse r = new ServiceComponentResponse(getClusterId(), cluster.getClusterName(), sg.getServiceGroupId(), sg.getServiceGroupName(), service.getServiceId(), - service.getName(), service.getServiceType(), getName(), desiredStackId, getDesiredState().toString(), - getServiceComponentStateCount(), isRecoveryEnabled(), displayName, repositoryVersionEntity.getVersion(), + serviceName, service.getServiceType(), componentName, sg.getStackId(), getDesiredState().toString(), + getServiceComponentStateCount(), isRecoveryEnabled(), displayName, moduleComponent.getVersion(), getRepositoryState()); return r; @@ -590,139 +596,9 @@ public void delete() throws AmbariException { } } - - /** - * Follows this version logic: - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
DB hostcomponent1DB hostcomponentNDB desiredNew desiredRepo State
v1v1UNKNOWNv1CURRENT
v1v2UNKNOWNUNKNOWNOUT_OF_SYNC
v1v2v2v2 (no change)OUT_OF_SYNC
v2v2v1v1 (no change)OUT_OF_SYNC
v2v2v2v2 (no change)CURRENT
- */ - @Override - @Transactional - public void updateRepositoryState(String reportedVersion) throws AmbariException { - - ServiceComponentDesiredStateEntity component = serviceComponentDesiredStateDAO.findById( - desiredStateEntityId); - - List componentVersions = serviceComponentDesiredStateDAO.findVersions( - getClusterId(), getServiceGroupId(), getServiceId(), getName()); - - // per component, this list should be small, so iterating here isn't a big deal - Map map = new HashMap<>(Maps.uniqueIndex(componentVersions, - new Function() { - @Override - public String apply(ServiceComponentVersionEntity input) { - return input.getRepositoryVersion().getVersion(); - } - })); - - if (LOG.isDebugEnabled()) { - LOG.debug("Existing versions for {}/{}/{}: {}", - getClusterName(), getServiceName(), getName(), map.keySet()); - } - - ServiceComponentVersionEntity componentVersion = map.get(reportedVersion); - - if (null == componentVersion) { - RepositoryVersionEntity repoVersion = repoVersionDAO.findByStackAndVersion( - getDesiredStackId(), reportedVersion); - - if (null != repoVersion) { - componentVersion = new ServiceComponentVersionEntity(); - componentVersion.setRepositoryVersion(repoVersion); - componentVersion.setState(RepositoryVersionState.INSTALLED); - componentVersion.setUserName("auto-reported"); - - // since we've never seen this version before, mark the component as CURRENT - component.setRepositoryState(RepositoryVersionState.CURRENT); - component.addVersion(componentVersion); - - component = serviceComponentDesiredStateDAO.merge(component); - - map.put(reportedVersion, componentVersion); - - } else { - LOG.warn("There is no repository available for stack {}, version {}", - getDesiredStackId(), reportedVersion); - } - } - - if (MapUtils.isNotEmpty(map)) { - String desiredVersion = component.getDesiredVersion(); - RepositoryVersionEntity desiredRepositoryVersion = service.getDesiredRepositoryVersion(); - - // TODO : is this function call rally required. check ? - List hostComponents = hostComponentDAO.findByServiceAndComponentAndNotVersion( - getClusterId(), getServiceGroupId(), getServiceId(), component.getComponentName(), reportedVersion); - - LOG.debug("{}/{} reportedVersion={}, desiredVersion={}, non-matching desired count={}, repo_state={}", - component.getServiceId(), component.getComponentName(), reportedVersion, - desiredVersion, hostComponents.size(), component.getRepositoryState()); - - // !!! if we are unknown, that means it's never been set. Try to determine it. - if (StackVersionListener.UNKNOWN_VERSION.equals(desiredVersion)) { - if (CollectionUtils.isEmpty(hostComponents)) { - // all host components are the same version as reported - component.setDesiredRepositoryVersion(desiredRepositoryVersion); - component.setRepositoryState(RepositoryVersionState.CURRENT); - } else { - // desired is UNKNOWN and there's a mix of versions in the host components - component.setRepositoryState(RepositoryVersionState.OUT_OF_SYNC); - } - } else { - if (!reportedVersion.equals(desiredVersion)) { - component.setRepositoryState(RepositoryVersionState.OUT_OF_SYNC); - } else if (CollectionUtils.isEmpty(hostComponents)) { - component.setRepositoryState(RepositoryVersionState.CURRENT); - } - } - - component = serviceComponentDesiredStateDAO.merge(component); - } - } - @Override + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public RepositoryVersionState getRepositoryState() { ServiceComponentDesiredStateEntity component = serviceComponentDesiredStateDAO.findById( desiredStateEntityId); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceGroup.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceGroup.java index dce2337c68d..9ea95a130a9 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceGroup.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceGroup.java @@ -72,4 +72,11 @@ public interface ServiceGroup { * @return updated service group entity */ ServiceGroupEntity deleteServiceGroupDependency(Long dependencyServiceGroupId) throws AmbariException; + + /** + * Gets the management pack associated with this service group. + * + * @return the management pack. + */ + Long getMpackId(); } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceGroupImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceGroupImpl.java index 5ada744eaed..504644134bc 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceGroupImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceGroupImpl.java @@ -95,7 +95,7 @@ public ServiceGroupImpl(@Assisted Cluster cluster, this.serviceGroupDependencies = serviceGroupDependencies; } - this.serviceGroupEntityPK = getServiceGroupEntityPK(serviceGroupEntity); + serviceGroupEntityPK = getServiceGroupEntityPK(serviceGroupEntity); persist(serviceGroupEntity); } @@ -115,13 +115,13 @@ public ServiceGroupImpl(@Assisted Cluster cluster, this.serviceGroupDAO = serviceGroupDAO; this.eventPublisher = eventPublisher; - this.serviceGroupId = serviceGroupEntity.getServiceGroupId(); - this.serviceGroupName = serviceGroupEntity.getServiceGroupName(); + serviceGroupId = serviceGroupEntity.getServiceGroupId(); + serviceGroupName = serviceGroupEntity.getServiceGroupName(); StackEntity stack = serviceGroupEntity.getStack(); - this.stackId = new StackId(stack.getStackName(), stack.getStackVersion()); - this.serviceGroupDependencies = getServiceGroupDependencies(serviceGroupEntity.getServiceGroupDependencies()); + stackId = new StackId(stack.getStackName(), stack.getStackVersion()); + serviceGroupDependencies = getServiceGroupDependencies(serviceGroupEntity.getServiceGroupDependencies()); - this.serviceGroupEntityPK = getServiceGroupEntityPK(serviceGroupEntity); + serviceGroupEntityPK = getServiceGroupEntityPK(serviceGroupEntity); } @Override @@ -162,6 +162,15 @@ public void setServiceGroupDependencies(Set serviceGroupDepende this.serviceGroupDependencies = serviceGroupDependencies; } + /** + * {@inheritDoc} + */ + @Override + public Long getMpackId() { + ServiceGroupEntity serviceGroupEntity = getServiceGroupEntity(); + return serviceGroupEntity.getStack().getMpackId(); + } + @Override public ServiceGroupResponse convertToResponse() { ServiceGroupResponse r = new ServiceGroupResponse(cluster.getClusterId(), diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java index 7f1daa7ebe5..4ed65a769af 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java @@ -30,6 +30,8 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.ObjectNotFoundException; import org.apache.ambari.server.ServiceComponentNotFoundException; @@ -210,11 +212,11 @@ public class ServiceImpl implements Service { this.serviceDesiredStateDAO = serviceDesiredStateDAO; this.serviceComponentFactory = serviceComponentFactory; this.eventPublisher = eventPublisher; - this.serviceId = serviceEntity.getServiceId(); - this.serviceName = serviceEntity.getServiceName(); - this.serviceType = serviceEntity.getServiceType(); + serviceId = serviceEntity.getServiceId(); + serviceName = serviceEntity.getServiceName(); + serviceType = serviceEntity.getServiceType(); this.ambariMetaInfo = ambariMetaInfo; - this.serviceDependencies = getServiceDependencies(serviceEntity.getServiceDependencies()); + serviceDependencies = getServiceDependencies(serviceEntity.getServiceDependencies()); ServiceDesiredStateEntity serviceDesiredStateEntity = serviceEntity.getServiceDesiredStateEntity(); serviceDesiredStateEntityPK = getServiceDesiredStateEntityPK(serviceDesiredStateEntity); @@ -447,6 +449,8 @@ public StackId getDesiredStackId() { * {@inheritDoc} */ @Override + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public RepositoryVersionEntity getDesiredRepositoryVersion() { ServiceDesiredStateEntity serviceDesiredStateEntity = getServiceDesiredStateEntity(); return serviceDesiredStateEntity.getDesiredRepositoryVersion(); @@ -457,6 +461,8 @@ public RepositoryVersionEntity getDesiredRepositoryVersion() { */ @Override @Transactional + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public void setDesiredRepositoryVersion(RepositoryVersionEntity repositoryVersionEntity) { ServiceDesiredStateEntity serviceDesiredStateEntity = getServiceDesiredStateEntity(); serviceDesiredStateEntity.setDesiredRepositoryVersion(repositoryVersionEntity); @@ -472,6 +478,8 @@ public void setDesiredRepositoryVersion(RepositoryVersionEntity repositoryVersio * {@inheritDoc} */ @Override + @Deprecated + @Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public RepositoryVersionState getRepositoryState() { if (components.isEmpty()) { return RepositoryVersionState.NOT_REQUIRED; @@ -488,11 +496,12 @@ public RepositoryVersionState getRepositoryState() { @Override public ServiceResponse convertToResponse() { RepositoryVersionEntity desiredRespositoryVersion = getDesiredRepositoryVersion(); - StackId desiredStackId = desiredRespositoryVersion.getStackId(); + Mpack mpack = ambariMetaInfo.getMpack(serviceGroup.getMpackId()); + Module module = mpack.getModule(getName()); ServiceResponse r = new ServiceResponse(cluster.getClusterId(), cluster.getClusterName(), serviceGroup.getServiceGroupId(), serviceGroup.getServiceGroupName(), - getServiceId(), getName(), getServiceType(), desiredStackId, desiredRespositoryVersion.getVersion(), + getServiceId(), getName(), getServiceType(), serviceGroup.getStackId(), module.getVersion(), getRepositoryState(), getDesiredState().toString(), isCredentialStoreSupported(), isCredentialStoreEnabled()); r.setDesiredRepositoryVersionId(desiredRespositoryVersion.getId()); diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java index 6cad9be253e..bec6d5d9e32 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/repository/VersionDefinitionXml.java @@ -48,6 +48,8 @@ import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; +import org.apache.ambari.annotations.Experimental; +import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.ComponentInfo; @@ -78,6 +80,8 @@ */ @XmlRootElement(name="repository-version") @XmlAccessorType(XmlAccessType.FIELD) +@Deprecated +@Experimental(feature = ExperimentalFeature.REPO_VERSION_REMOVAL) public class VersionDefinitionXml { public static String SCHEMA_LOCATION = "version_definition.xsd"; 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 fcbf846cbb3..356a24f76df 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 @@ -39,22 +39,22 @@ import org.apache.ambari.server.controller.internal.RepositoryResourceProvider; import org.apache.ambari.server.controller.internal.RepositoryVersionResourceProvider; import org.apache.ambari.server.controller.spi.SystemException; +import org.apache.ambari.server.orm.dao.MpackDAO; +import org.apache.ambari.server.orm.entities.MpackEntity; import org.apache.ambari.server.orm.entities.RepoDefinitionEntity; import org.apache.ambari.server.orm.entities.RepoOsEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Host; +import org.apache.ambari.server.state.Mpack; import org.apache.ambari.server.state.OsSpecific; import org.apache.ambari.server.state.RepositoryInfo; -import org.apache.ambari.server.state.RepositoryType; -import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; +import org.apache.ambari.server.state.ServiceGroup; 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.repository.ClusterVersionSummary; -import org.apache.ambari.server.state.repository.VersionDefinitionXml; import org.apache.ambari.server.state.stack.OsFamily; import org.apache.ambari.server.state.stack.RepoTag; import org.apache.ambari.server.state.stack.UpgradePack; @@ -96,45 +96,17 @@ public class RepositoryVersionHelper { @Inject Provider clusters; - /** - * Checks repo URLs against the current version for the cluster and make - * adjustments to the Base URL when the current is different. - * - * @param cluster {@link Cluster} object - * @param component resolve {@link RepositoryVersionEntity} for the component, could be {@code null} - * - * @return {@link RepositoryVersionEntity} retrieved for component if set or cluster if not + * Used to retrieve management packs. */ - @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES) - private RepositoryVersionEntity getRepositoryVersionEntity(Cluster cluster, ServiceComponent component) throws SystemException { - - RepositoryVersionEntity repositoryEntity = null; - - // !!! try to find the component repo first - if (null != component) { - repositoryEntity = component.getDesiredRepositoryVersion(); - } else { - LOG.info("Service component not passed in, attempt to resolve the repository for cluster {}", - cluster.getClusterName()); - } - - if (null == repositoryEntity && null != component) { - try { - Service service = cluster.getService(component.getServiceName()); - repositoryEntity = service.getDesiredRepositoryVersion(); - } catch (AmbariException e) { - throw new SystemException("Unhandled exception", e); - } - } - - if (null == repositoryEntity) { - LOG.info("Cluster {} has no specific Repository Versions. Using stack-defined values", cluster.getClusterName()); - return null; - } + @Inject + private Provider ambariMetainfoProvider; - return repositoryEntity; - } + /** + * Used for retrieving mpacks by their ID. + */ + @Inject + private MpackDAO mpackDAO; /** * Parses operating systems json to a list of entities. Expects json like: @@ -338,17 +310,23 @@ public Map buildRoleParams(AmbariManagementController amc, Repos /** - * Return repositories available for target os version on host based on {@code repoVersion} repository definition - * @param host target {@link Host} for providing repositories list - * @param repoVersion {@link RepositoryVersionEntity} version definition with all available repositories + * Return repositories available for target os version on host based on the + * mpack and host family. + * + * @param mpackEntity + * the management pack to get the repo for. + * @param host + * target {@link Host} for providing repositories list * * @return {@link RepoOsEntity} with available repositories for host - * @throws SystemException if no repository available for target {@link Host} + * @throws SystemException + * if no repository available for target {@link Host} */ - public RepoOsEntity getOSEntityForHost(Host host, RepositoryVersionEntity repoVersion) throws SystemException { + public RepoOsEntity getOSEntityForHost(MpackEntity mpackEntity, Host host) + throws SystemException { String osFamily = host.getOsFamily(); RepoOsEntity osEntity = null; - for (RepoOsEntity operatingSystem : repoVersion.getRepoOsEntities()) { + for (RepoOsEntity operatingSystem : mpackEntity.getRepositoryOperatingSystems()) { if (osFamily.equals(operatingSystem.getFamily())) { osEntity = operatingSystem; break; @@ -356,8 +334,42 @@ public RepoOsEntity getOSEntityForHost(Host host, RepositoryVersionEntity repoVe } if (null == osEntity) { - throw new SystemException(String.format("Operating System matching %s could not be found", - osFamily)); + throw new SystemException( + String.format("Operating System matching %s could not be found for mpack with ID %s", + osFamily, mpackEntity.getId())); + } + + return osEntity; + } + + /** + * Return repositories available for target os version on host based on the + * host family. + * + * @param operatingSystems + * the list of repository operating systems to use when finding a + * match for the host's OS family. + * @param host + * target {@link Host} for providing repositories list + * + * @return {@link RepoOsEntity} with available repositories for host + * @throws SystemException + * if no repository available for target {@link Host} + */ + public RepoOsEntity getOSEntityForHost(List operatingSystems, Host host) + throws SystemException { + String osFamily = host.getOsFamily(); + RepoOsEntity osEntity = null; + for (RepoOsEntity operatingSystem : operatingSystems) { + if (osFamily.equals(operatingSystem.getFamily())) { + osEntity = operatingSystem; + break; + } + } + + if (null == osEntity) { + throw new SystemException( + String.format("Operating System matching %s could not be found", osFamily)); } return osEntity; @@ -367,35 +379,24 @@ public RepoOsEntity getOSEntityForHost(Host host, RepositoryVersionEntity repoVe * Adds a command repository to the action context * @param osEntity the OS family */ - public CommandRepository getCommandRepository(final RepositoryVersionEntity repoVersion, - final RepoOsEntity osEntity) throws SystemException { + public CommandRepository getCommandRepository(Mpack mpack, RepoOsEntity osEntity) + throws AmbariException { final CommandRepository commandRepo = new CommandRepository(); final boolean sysPreppedHost = configuration.get().areHostsSysPrepped().equalsIgnoreCase("true"); - if (null == repoVersion) { - throw new SystemException("Repository version entity is not provided"); - } - commandRepo.setRepositories(osEntity.getFamily(), osEntity.getRepoDefinitionEntities()); - commandRepo.setRepositoryVersion(repoVersion.getVersion()); - commandRepo.setRepositoryVersionId(repoVersion.getId()); - commandRepo.setResolved(repoVersion.isResolved()); - commandRepo.setStackName(repoVersion.getStackId().getStackName()); + commandRepo.setMpackId(mpack.getResourceId()); + commandRepo.setMpackName(mpack.getName()); + commandRepo.setMpackVersion(mpack.getVersion()); commandRepo.getFeature().setPreInstalled(configuration.get().areHostsSysPrepped()); commandRepo.getFeature().setIsScoped(!sysPreppedHost); if (!osEntity.isAmbariManaged()) { commandRepo.setNonManaged(); } else { - if (repoVersion.isLegacy()){ - commandRepo.setLegacyRepoFileName(repoVersion.getStackName(), repoVersion.getVersion()); - commandRepo.setLegacyRepoId(repoVersion.getVersion()); - commandRepo.getFeature().setIsScoped(false); - } else { - commandRepo.setRepoFileName(repoVersion.getStackName(), repoVersion.getId()); - commandRepo.setUniqueSuffix(String.format("-repo-%s", repoVersion.getId())); - } + commandRepo.setRepoFileName(mpack.getName(), mpack.getResourceId()); + commandRepo.setUniqueSuffix(String.format("-repo-%s", mpack.getMpackId())); } if (configuration.get().arePackagesLegacyOverridden()) { @@ -418,210 +419,48 @@ public CommandRepository getCommandRepository(final RepositoryVersionEntity repo */ @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES) public CommandRepository getCommandRepository(final Cluster cluster, ServiceComponent component, final Host host) - throws SystemException { - - RepositoryVersionEntity repoVersion = getRepositoryVersionEntity(cluster, component); - RepoOsEntity osEntity = getOSEntityForHost(host, repoVersion); - - return getCommandRepository(repoVersion, osEntity); - } - - /** - * This method builds and adds repo infoto hostLevelParams of action - * - * @param cluster cluster to which host level params belongs - * @param actionContext context of the action. Must be not {@code null} - * @param repositoryVersion repository version entity to use - * @param hostLevelParams hasgmap with host level params. Must be not {@code null} - * @param hostName host name to which add repo onfo - * @throws AmbariException - */ - @Deprecated - public void addRepoInfoToHostLevelParams(final Cluster cluster, final ActionExecutionContext actionContext, - final RepositoryVersionEntity repositoryVersion, final Map hostLevelParams, - final String hostName) throws AmbariException { - - // if the repo is null, see if any values from the context should go on the - // host params and then return - if (null == repositoryVersion) { - // see if the action context has a repository set to use for the command - if (null != actionContext.getRepositoryVersion()) { - StackId stackId = actionContext.getRepositoryVersion().getStackId(); - hostLevelParams.put(KeyNames.STACK_NAME, stackId.getStackName()); - hostLevelParams.put(KeyNames.STACK_VERSION, stackId.getStackVersion()); - } - - return; - } else { - StackId stackId = repositoryVersion.getStackId(); - hostLevelParams.put(KeyNames.STACK_NAME, stackId.getStackName()); - hostLevelParams.put(KeyNames.STACK_VERSION, stackId.getStackVersion()); - } - - JsonObject rootJsonObject = new JsonObject(); - JsonArray repositories = new JsonArray(); + throws AmbariException, SystemException { - String hostOsFamily = cluster.getHost(hostName).getOsFamily(); - for (RepoOsEntity operatingSystemEntity : repositoryVersion.getRepoOsEntities()) { - if (operatingSystemEntity.getFamily().equals(hostOsFamily)) { - for (RepoDefinitionEntity repositoryEntity : operatingSystemEntity.getRepoDefinitionEntities()) { - JsonObject repositoryInfo = new JsonObject(); - repositoryInfo.addProperty("base_url", repositoryEntity.getBaseUrl()); - repositoryInfo.addProperty("repo_name", repositoryEntity.getRepoName()); - repositoryInfo.addProperty("repo_id", repositoryEntity.getRepoID()); + AmbariMetaInfo ambariMetaInfo = ambariMetainfoProvider.get(); - repositories.add(repositoryInfo); - } - rootJsonObject.add("repositories", repositories); - } - } - hostLevelParams.put(KeyNames.REPO_INFO, rootJsonObject.toString()); - } - - - /** - * Get repository info given a cluster and host. - * - * @param cluster the cluster - * @param host the host - * - * @return the repo info - * - * @deprecated use {@link #getCommandRepository(Cluster, ServiceComponent, Host)} instead. - * @throws SystemException if the repository information can not be obtained - */ - @Deprecated - public String getRepoInfo(Cluster cluster, ServiceComponent component, Host host) throws SystemException { - final JsonArray jsonList = getBaseUrls(cluster, component, host); - final RepositoryVersionEntity rve = getRepositoryVersionEntity(cluster, component); - - if (null == rve || null == jsonList) { - return ""; - } - - final JsonArray result = new JsonArray(); - - for (JsonElement e : jsonList) { - JsonObject obj = e.getAsJsonObject(); + long serviceGroupId = component.getServiceGroupId(); + ServiceGroup serviceGroup = cluster.getServiceGroup(serviceGroupId); + long mpackId = serviceGroup.getMpackId(); + MpackEntity mpackEntity = mpackDAO.findById(mpackId); + Mpack mpack = ambariMetaInfo.getMpack(mpackId); - String repoId = obj.has("repoId") ? obj.get("repoId").getAsString() : null; - String repoName = obj.has("repoName") ? obj.get("repoName").getAsString() : null; - String baseUrl = obj.has("baseUrl") ? obj.get("baseUrl").getAsString() : null; - String osType = obj.has("osType") ? obj.get("osType").getAsString() : null; - - if (null == repoId || null == baseUrl || null == osType || null == repoName) { - continue; - } - - for (RepoOsEntity ose : rve.getRepoOsEntities()) { - if (ose.getFamily().equals(osType) && ose.isAmbariManaged()) { - for (RepoDefinitionEntity re : ose.getRepoDefinitionEntities()) { - if (re.getRepoName().equals(repoName) && - !re.getBaseUrl().equals(baseUrl)) { - obj.addProperty("baseUrl", re.getBaseUrl()); - } - } - result.add(e); - } - } - } - return result.toString(); + RepoOsEntity osEntity = getOSEntityForHost(mpackEntity, host); + return getCommandRepository(mpack, osEntity); } - - /** - * Executed by two different representations of repos. When we are comfortable with the new - * implementation, this may be removed and called inline in {@link #getCommandRepository(Cluster, ServiceComponent, Host)} - * - * @param cluster the cluster to isolate the stack - * @param component the component - * @param host used to resolve the family for the repositories - * @return JsonArray the type as defined by the supplied {@code function}. - * @throws SystemException - */ - @Deprecated - private JsonArray getBaseUrls(Cluster cluster, ServiceComponent component, Host host) throws SystemException { - - String hostOsType = host.getOsType(); - String hostOsFamily = host.getOsFamily(); - String hostName = host.getHostName(); - - StackId stackId = component.getDesiredStackId(); - Map> repos; - - try { - repos = ami.get().getRepository(stackId.getStackName(), stackId.getStackVersion()); - }catch (AmbariException e) { - throw new SystemException("Unhandled exception", e); - } - - String family = os_family.get().find(hostOsType); - if (null == family) { - family = hostOsFamily; - } - - final List repoInfoList; - - // !!! check for the most specific first - if (repos.containsKey(hostOsType)) { - repoInfoList = repos.get(hostOsType); - } else if (null != family && repos.containsKey(family)) { - repoInfoList = repos.get(family); - } else { - repoInfoList = null; - LOG.warn("Could not retrieve repo information for host" - + ", hostname=" + hostName - + ", clusterName=" + cluster.getClusterName() - + ", stackInfo=" + stackId.getStackId()); - } - - return (null == repoInfoList) ? null : (JsonArray) gson.toJsonTree(repoInfoList); - } - - /** * Adds a command repository to the action context * @param context the context * @param osEntity the OS family */ public void addCommandRepositoryToContext(ActionExecutionContext context, - RepoOsEntity osEntity) throws SystemException { - - final RepositoryVersionEntity repoVersion = context.getRepositoryVersion(); - final CommandRepository commandRepo = getCommandRepository(repoVersion, osEntity); + RepoOsEntity osEntity) throws SystemException { - ClusterVersionSummary summary = null; + AmbariMetaInfo ambariMetaInfo = ambariMetainfoProvider.get(); - if (RepositoryType.STANDARD != repoVersion.getType()) { - try { + try { + Mpack mpack = context.getMpack(); + if (null == mpack) { final Cluster cluster = clusters.get().getCluster(context.getClusterName()); - - VersionDefinitionXml xml = repoVersion.getRepositoryXml(); - summary = xml.getClusterSummary(cluster); - } catch (Exception e) { - LOG.warn("Could not determine repository from %s/%s. Will not pass cluster version."); + ServiceGroup serviceGroup = cluster.getServiceGroup(context.getExpectedServiceGroupName()); + long mpackId = serviceGroup.getMpackId(); + mpack = ambariMetaInfo.getMpack(mpackId); } - } - - final ClusterVersionSummary clusterSummary = summary; + final CommandRepository commandRepo = getCommandRepository(mpack, osEntity); - context.addVisitor(command -> { - if (null == command.getRepositoryFile()) { - command.setRepositoryFile(commandRepo); - } - - if (null != clusterSummary) { - Map params = command.getRoleParameters(); - if (null == params) { - params = new HashMap<>(); - command.setRoleParameters(params); + context.addVisitor(command -> { + if (null == command.getRepositoryFile()) { + command.setRepositoryFile(commandRepo); } - params.put(KeyNames.CLUSTER_VERSION_SUMMARY, clusterSummary); - } - - }); + }); + } catch (AmbariException ambariException) { + throw new SystemException(ambariException.getMessage(), ambariException); + } } - - } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java index 519bcc60de5..7caef7f672b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java @@ -18,7 +18,6 @@ package org.apache.ambari.server.state.svccomphost; -import java.text.MessageFormat; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -71,7 +70,6 @@ import org.apache.ambari.server.state.ServiceComponentHostEventType; import org.apache.ambari.server.state.ServiceGroup; import org.apache.ambari.server.state.StackId; -import org.apache.ambari.server.state.StackInfo; import org.apache.ambari.server.state.State; import org.apache.ambari.server.state.UpgradeState; import org.apache.ambari.server.state.alert.AlertDefinitionHash; @@ -1465,28 +1463,6 @@ public void setRestartRequired(boolean restartRequired) { } } - @Transactional - RepositoryVersionEntity createRepositoryVersion(String version, final StackId stackId, final StackInfo stackInfo) throws AmbariException { - // During an Ambari Upgrade from 1.7.0 -> 2.0.0, the Repo Version will not exist, so bootstrap it. - LOG.info("Creating new repository version " + stackId.getStackName() + "-" + version); - - StackEntity stackEntity = stackDAO.find(stackId.getStackName(), - stackId.getStackVersion()); - - // Ensure that the version provided is part of the Stack. - // E.g., version 2.3.0.0 is part of HDP 2.3, so is 2.3.0.0-1234 - if (null == version) { - throw new AmbariException(MessageFormat.format("Cannot create Repository Version for Stack {0}-{1} if the version is empty", - stackId.getStackName(), stackId.getStackVersion())); - } - - return repositoryVersionDAO.create( - stackEntity, - version, - stackId.getStackName() + "-" + version, - repositoryVersionHelper.createRepoOsEntities(stackInfo.getRepositories())); - } - /** * {@inheritDoc} */ diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql index b3c50070f03..d211f4932b0 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql @@ -18,22 +18,22 @@ ------create tables and grant privileges to db user--------- CREATE TABLE registries ( - id BIGINT NOT NULL, - registry_name VARCHAR(255) NOT NULL, - registry_type VARCHAR(255) NOT NULL, - registry_uri VARCHAR(255) NOT NULL, - CONSTRAINT PK_registries PRIMARY KEY (id), - CONSTRAINT UQ_registry_name UNIQUE (registry_name)); + id BIGINT NOT NULL, + registry_name VARCHAR(255) NOT NULL, + registry_type VARCHAR(255) NOT NULL, + registry_uri VARCHAR(255) NOT NULL, + CONSTRAINT PK_registries PRIMARY KEY (id), + CONSTRAINT UQ_registry_name UNIQUE (registry_name)); CREATE TABLE mpacks ( - id BIGINT NOT NULL, - mpack_name VARCHAR(255) NOT NULL, - mpack_version VARCHAR(255) NOT NULL, - mpack_uri VARCHAR(255), - registry_id BIGINT, - CONSTRAINT PK_mpacks PRIMARY KEY (id), - CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id), - CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version)); + id BIGINT NOT NULL, + mpack_name VARCHAR(255) NOT NULL, + mpack_version VARCHAR(255) NOT NULL, + mpack_uri VARCHAR(255), + registry_id BIGINT, + CONSTRAINT PK_mpacks PRIMARY KEY (id), + CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id), + CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version)); CREATE TABLE stack ( stack_id BIGINT NOT NULL, @@ -113,6 +113,16 @@ CREATE TABLE hosts ( CONSTRAINT PK_hosts PRIMARY KEY (host_id), CONSTRAINT UQ_hosts_host_name UNIQUE (host_name)); +CREATE TABLE mpack_host_state ( + id BIGINT NOT NULL, + host_id BIGINT NOT NULL, + mpack_id BIGINT NOT NULL, + state VARCHAR(32) NOT NULL, + CONSTRAINT PK_mpack_host_state PRIMARY KEY (id), + CONSTRAINT FK_mhs_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id), + CONSTRAINT FK_mhs_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_mpack_host_state UNIQUE(host_id, mpack_id)); + CREATE TABLE clustersettings ( id BIGINT NOT NULL, setting_name VARCHAR(255) NOT NULL, @@ -128,7 +138,8 @@ CREATE TABLE servicegroups ( stack_id BIGINT NOT NULL, CONSTRAINT PK_servicegroups PRIMARY KEY (id, cluster_id), CONSTRAINT FK_servicegroups_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id), - CONSTRAINT FK_servicegroups_stack_id FOREIGN KEY (stack_id) REFERENCES stack (stack_id)); + CONSTRAINT FK_servicegroups_stack_id FOREIGN KEY (stack_id) REFERENCES stack (stack_id), + CONSTRAINT UQ_WTF UNIQUE(id)); CREATE TABLE servicegroupdependencies ( id BIGINT NOT NULL, @@ -244,11 +255,13 @@ CREATE TABLE repo_version ( CREATE TABLE repo_os ( id BIGINT NOT NULL, - repo_version_id BIGINT NOT NULL, + repo_version_id BIGINT, + mpack_id BIGINT NOT NULL, family VARCHAR(255) NOT NULL DEFAULT '', ambari_managed SMALLINT DEFAULT 1, CONSTRAINT PK_repo_os_id PRIMARY KEY (id), - CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id)); + CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id), + CONSTRAINT FK_repo_os_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id)); CREATE TABLE repo_definition ( id BIGINT NOT NULL, @@ -1017,22 +1030,18 @@ CREATE TABLE upgrade_history( component_name VARCHAR(255) NOT NULL, from_repo_version_id BIGINT NOT NULL, target_repo_version_id BIGINT NOT NULL, + service_group_id BIGINT NOT NULL, + source_mpack_id BIGINT NOT NULL, + target_mpack_id BIGINT NOT NULL, CONSTRAINT PK_upgrade_hist PRIMARY KEY (id), CONSTRAINT FK_upgrade_hist_upgrade_id FOREIGN KEY (upgrade_id) REFERENCES upgrade (upgrade_id), CONSTRAINT FK_upgrade_hist_from_repo FOREIGN KEY (from_repo_version_id) REFERENCES repo_version (repo_version_id), CONSTRAINT FK_upgrade_hist_target_repo FOREIGN KEY (target_repo_version_id) REFERENCES repo_version (repo_version_id), - CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name) -); - -CREATE TABLE servicecomponent_version( - id BIGINT NOT NULL, - component_id BIGINT NOT NULL, - repo_version_id BIGINT NOT NULL, - state VARCHAR(32) NOT NULL, - user_name VARCHAR(255) NOT NULL, - CONSTRAINT PK_sc_version PRIMARY KEY (id), - CONSTRAINT FK_scv_component_id FOREIGN KEY (component_id) REFERENCES servicecomponentdesiredstate (id), - CONSTRAINT FK_scv_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id) + CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name), + CONSTRAINT FK_upgrade_hist_svc_grp_id FOREIGN KEY (service_group_id) REFERENCES servicegroups (id), + CONSTRAINT FK_upgrade_hist_src_mpack_id FOREIGN KEY (source_mpack_id) REFERENCES mpacks (id), + CONSTRAINT FK_upgrade_hist_tgt_mpack_id FOREIGN KEY (target_mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_upgrade_hist_srvc_grp UNIQUE (upgrade_id, service_group_id) ); CREATE TABLE ambari_operation_history( @@ -1260,6 +1269,7 @@ INSERT INTO ambari_sequences (sequence_name, sequence_value) VALUES ('config_id_seq', 1), ('repo_version_id_seq', 0), ('host_version_id_seq', 0), + ('mpack_host_state_id_seq', 0), ('service_config_id_seq', 1), ('upgrade_id_seq', 0), ('upgrade_group_id_seq', 0), @@ -1286,7 +1296,6 @@ INSERT INTO ambari_sequences (sequence_name, sequence_value) VALUES ('ambari_operation_history_id_seq', 0), ('remote_cluster_id_seq', 0), ('remote_cluster_service_id_seq', 0), - ('servicecomponent_version_id_seq', 0), ('blueprint_service_id_seq', 0), ('blueprint_mpack_instance_id_seq', 0), ('hostgroup_component_id_seq', 0), diff --git a/ambari-server/src/main/resources/META-INF/persistence.xml b/ambari-server/src/main/resources/META-INF/persistence.xml index dbe3713899e..79f051e2f7c 100644 --- a/ambari-server/src/main/resources/META-INF/persistence.xml +++ b/ambari-server/src/main/resources/META-INF/persistence.xml @@ -59,6 +59,7 @@ org.apache.ambari.server.orm.entities.KeyValueEntity org.apache.ambari.server.orm.entities.MemberEntity org.apache.ambari.server.orm.entities.MetainfoEntity + org.apache.ambari.server.orm.entities.MpackHostStateEntity org.apache.ambari.server.orm.entities.PermissionEntity org.apache.ambari.server.orm.entities.RoleAuthorizationEntity org.apache.ambari.server.orm.entities.PrincipalEntity @@ -76,7 +77,6 @@ org.apache.ambari.server.orm.entities.ResourceTypeEntity org.apache.ambari.server.orm.entities.RoleSuccessCriteriaEntity org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity - org.apache.ambari.server.orm.entities.ServiceComponentVersionEntity org.apache.ambari.server.orm.entities.ServiceConfigEntity org.apache.ambari.server.orm.entities.ServiceDesiredStateEntity org.apache.ambari.server.orm.entities.StackEntity diff --git a/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py b/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py index cd172afb1d0..ba18d8d3757 100644 --- a/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py +++ b/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py @@ -114,7 +114,7 @@ def actionexecute(self, env): # Build structured output with initial values self.structured_output = { 'package_installation_result': 'FAIL', - 'repository_version_id': command_repository.version_id + 'mpack_id': command_repository.mpack_id } self.put_structured_out(self.structured_output) diff --git a/ambari-server/src/test/java/org/apache/ambari/server/StateRecoveryManagerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/StateRecoveryManagerTest.java index 8b94338396c..4b928850f7a 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/StateRecoveryManagerTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/StateRecoveryManagerTest.java @@ -111,7 +111,7 @@ public void testCheckHostAndClusterVersions() throws Exception { replay(hostVersionDAOMock, serviceComponentDesiredStateDAOMock); - stateRecoveryManager.checkHostAndClusterVersions(); + stateRecoveryManager.doWork(); // Checking that only invalid host version states have been changed assertFalse(installFailedHostVersionCapture.hasCaptured()); diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java index 8fb34c00296..7a208edcf3b 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java @@ -56,7 +56,6 @@ import org.apache.ambari.server.orm.entities.RepoOsEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity; -import org.apache.ambari.server.orm.entities.ServiceComponentVersionEntity; import org.apache.ambari.server.orm.entities.StackEntity; import org.apache.ambari.server.security.TestAuthenticationFactory; import org.apache.ambari.server.security.authorization.AuthorizationException; @@ -747,12 +746,7 @@ public void testCommandRepository() throws Exception { ServiceComponentDesiredStateEntity componentEntity = componentDAO.findByName(cluster.getClusterId(), serviceYARN.getServiceGroupId(), serviceYARN.getServiceId(), componentRM.getName()); - ServiceComponentVersionEntity componentVersionEntity = new ServiceComponentVersionEntity(); - componentVersionEntity.setRepositoryVersion(repositoryVersion); - componentVersionEntity.setUserName("admin"); - componentEntity.setDesiredRepositoryVersion(repositoryVersion); - componentEntity.addVersion(componentVersionEntity); componentDAO.merge(componentEntity); // !!! make sure the override is set diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java index 4b996e573b2..3d33d36352f 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java @@ -24,7 +24,6 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.NOT_MANAGED_HDFS_PATH_LIST; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_NAME; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_VERSION; - import static org.easymock.EasyMock.anyBoolean; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.capture; @@ -59,7 +58,6 @@ import javax.persistence.RollbackException; - import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.ClusterNotFoundException; import org.apache.ambari.server.HostNotFoundException; @@ -67,7 +65,6 @@ import org.apache.ambari.server.ServiceComponentHostNotFoundException; import org.apache.ambari.server.ServiceComponentNotFoundException; import org.apache.ambari.server.ServiceNotFoundException; - import org.apache.ambari.server.actionmanager.ActionDBAccessorImpl; import org.apache.ambari.server.actionmanager.ActionManager; import org.apache.ambari.server.agent.HeartBeatHandler; @@ -107,7 +104,6 @@ import org.apache.ambari.server.state.StackInfo; import org.apache.ambari.server.state.State; import org.apache.ambari.server.state.stack.OsFamily; - import org.easymock.Capture; import org.easymock.EasyMock; import org.junit.Before; @@ -1934,8 +1930,6 @@ public void testCreateDefaultHostParams() throws Exception { .addMockedMethod("getRcaParameters") .withConstructor(manager, clusters, injector).createNiceMock(); - expect(ambariManagementControllerImpl. - getRcaParameters()).andReturn(new HashMap<>()); replay(ambariManagementControllerImpl); // Inject configuration manually @@ -2054,7 +2048,7 @@ private class NestedTestClass extends AmbariManagementControllerImpl { public NestedTestClass(ActionManager actionManager, Clusters clusters, Injector injector, OsFamily osFamilyMock) throws Exception { super(actionManager, clusters, injector); - this.osFamily = osFamilyMock; + osFamily = osFamilyMock; } // public ServiceOsSpecific testPopulateServicePackagesInfo(ServiceInfo serviceInfo, Map hostParams, diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java index a17e94fa26a..9f9a101ec92 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java @@ -323,9 +323,6 @@ public void testGetResources() throws Exception { expect(service.getServiceComponent(componentName)).andReturn(serviceComponent).atLeastOnce(); expect(serviceComponent.getDesiredStackId()).andReturn(stackId).atLeastOnce(); - HashMap rcaParams = new HashMap<>(); - rcaParams.put("key","value"); - expect(managementController.getRcaParameters()).andReturn(rcaParams).anyTimes(); expect(stackInfo.getOsSpecifics()).andReturn(new HashMap<>()).anyTimes(); Set userSet = new HashSet<>(); userSet.add("hdfs"); @@ -583,7 +580,6 @@ public void testGetResourcesFromCommonServices() throws Exception { HashMap rcaParams = new HashMap<>(); rcaParams.put("key","value"); - expect(managementController.getRcaParameters()).andReturn(rcaParams).anyTimes(); expect(serviceInfo.getOsSpecifics()).andReturn(new HashMap<>()).anyTimes(); expect(stackInfo.getOsSpecifics()).andReturn(new HashMap<>()).anyTimes(); Set userSet = new HashSet<>(); diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/HostVersionDAOTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/HostVersionDAOTest.java deleted file mode 100644 index c961fb06795..00000000000 --- a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/HostVersionDAOTest.java +++ /dev/null @@ -1,356 +0,0 @@ -/* - * 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.orm.dao; - -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.apache.ambari.server.AmbariException; -import org.apache.ambari.server.H2DatabaseCleaner; -import org.apache.ambari.server.api.services.AmbariMetaInfo; -import org.apache.ambari.server.orm.GuiceJpaInitializer; -import org.apache.ambari.server.orm.InMemoryDefaultTestModule; -import org.apache.ambari.server.orm.OrmTestHelper; -import org.apache.ambari.server.orm.entities.ClusterEntity; -import org.apache.ambari.server.orm.entities.HostEntity; -import org.apache.ambari.server.orm.entities.HostVersionEntity; -import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; -import org.apache.ambari.server.orm.entities.ResourceEntity; -import org.apache.ambari.server.orm.entities.ResourceTypeEntity; -import org.apache.ambari.server.orm.entities.StackEntity; -import org.apache.ambari.server.security.authorization.ResourceType; -import org.apache.ambari.server.state.RepositoryVersionState; -import org.apache.ambari.server.state.StackId; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.google.inject.Guice; -import com.google.inject.Injector; - - -/** - * {@link org.apache.ambari.server.orm.dao.HostVersionDAO} unit tests. - */ -public class HostVersionDAOTest { - - private static Injector injector; - private ResourceTypeDAO resourceTypeDAO; - private ClusterDAO clusterDAO; - private StackDAO stackDAO; - private HostDAO hostDAO; - private HostVersionDAO hostVersionDAO; - private OrmTestHelper helper; - - private final static StackId HDP_22_STACK = new StackId("HDP", "2.2.0"); - private final static StackId BAD_STACK = new StackId("BADSTACK", "1.0"); - - private final static String repoVersion_2200 = "2.2.0.0-1"; - private final static String repoVersion_2201 = "2.2.0.1-2"; - private final static String repoVersion_2202 = "2.2.0.2-3"; - - @Before - public void before() { - injector = Guice.createInjector(new InMemoryDefaultTestModule()); - H2DatabaseCleaner.resetSequences(injector); - injector.getInstance(GuiceJpaInitializer.class); - - resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class); - clusterDAO = injector.getInstance(ClusterDAO.class); - stackDAO = injector.getInstance(StackDAO.class); - hostDAO = injector.getInstance(HostDAO.class); - hostVersionDAO = injector.getInstance(HostVersionDAO.class); - helper = injector.getInstance(OrmTestHelper.class); - - // required to populate the database with stacks - injector.getInstance(AmbariMetaInfo.class); - - createDefaultData(); - } - - /** - * Helper function to bootstrap some basic data about clusters, cluster version, host, and host versions. - */ - private void createDefaultData() { - StackEntity stackEntity = stackDAO.find(HDP_22_STACK.getStackName(), HDP_22_STACK.getStackVersion()); - Assert.assertNotNull(stackEntity); - - // Create the cluster - ResourceTypeEntity resourceTypeEntity = new ResourceTypeEntity(); - resourceTypeEntity.setId(ResourceType.CLUSTER.getId()); - resourceTypeEntity.setName(ResourceType.CLUSTER.name()); - resourceTypeEntity = resourceTypeDAO.merge(resourceTypeEntity); - - ResourceEntity resourceEntity = new ResourceEntity(); - resourceEntity.setResourceType(resourceTypeEntity); - - ClusterEntity clusterEntity = new ClusterEntity(); - clusterEntity.setClusterName("test_cluster1"); - clusterEntity.setClusterInfo("test_cluster_info1"); - clusterEntity.setResource(resourceEntity); - clusterEntity.setDesiredStack(stackEntity); - - clusterDAO.create(clusterEntity); - - RepositoryVersionEntity repoVersionEntity = helper.getOrCreateRepositoryVersion(HDP_22_STACK, repoVersion_2200); - - // Create the hosts - HostEntity host1 = new HostEntity(); - HostEntity host2 = new HostEntity(); - HostEntity host3 = new HostEntity(); - - host1.setHostName("test_host1"); - host2.setHostName("test_host2"); - host3.setHostName("test_host3"); - host1.setIpv4("192.168.0.1"); - host2.setIpv4("192.168.0.2"); - host3.setIpv4("192.168.0.3"); - - List hostEntities = new ArrayList<>(); - hostEntities.add(host1); - hostEntities.add(host2); - hostEntities.add(host3); - - // Both sides of relation should be set when modifying in runtime - host1.setClusterEntities(Arrays.asList(clusterEntity)); - host2.setClusterEntities(Arrays.asList(clusterEntity)); - host3.setClusterEntities(Arrays.asList(clusterEntity)); - - hostDAO.create(host1); - hostDAO.create(host2); - hostDAO.create(host3); - - clusterEntity.setHostEntities(hostEntities); - clusterDAO.merge(clusterEntity); - - // Create the Host Versions - HostVersionEntity hostVersionEntity1 = new HostVersionEntity(host1, repoVersionEntity, RepositoryVersionState.CURRENT); - HostVersionEntity hostVersionEntity2 = new HostVersionEntity(host2, repoVersionEntity, RepositoryVersionState.INSTALLED); - HostVersionEntity hostVersionEntity3 = new HostVersionEntity(host3, repoVersionEntity, RepositoryVersionState.INSTALLED); - - hostVersionDAO.create(hostVersionEntity1); - hostVersionDAO.create(hostVersionEntity2); - hostVersionDAO.create(hostVersionEntity3); - } - - /** - * Helper function to bootstrap additional data on top of the default data. - */ - private void addMoreVersions() { - ClusterEntity clusterEntity = clusterDAO.findByName("test_cluster1"); - - RepositoryVersionEntity repositoryVersionEnt_2_2_0_1 = helper.getOrCreateRepositoryVersion(HDP_22_STACK, repoVersion_2201); - - - HostEntity[] hostEntities = clusterEntity.getHostEntities().toArray(new HostEntity[clusterEntity.getHostEntities().size()]); - // Must sort by host name in ascending order to ensure that state is accurately set later on. - Arrays.sort(hostEntities); - - // For each of the hosts, add a host version - for (HostEntity host : hostEntities) { - HostVersionEntity hostVersionEntity = new HostVersionEntity(host, repositoryVersionEnt_2_2_0_1, RepositoryVersionState.INSTALLED); - hostVersionDAO.create(hostVersionEntity); - } - - // For each of the hosts, add one more host version - RepositoryVersionEntity repositoryVersionEnt_2_2_0_2 = helper.getOrCreateRepositoryVersion(HDP_22_STACK, repoVersion_2202); - for (int i = 0; i < hostEntities.length; i++) { - RepositoryVersionState desiredState = null; - if (i % 3 == 0) { - desiredState = RepositoryVersionState.INSTALLED; - } - if (i % 3 == 1) { - desiredState = RepositoryVersionState.INSTALLING; - } - if (i % 3 == 2) { - desiredState = RepositoryVersionState.INSTALL_FAILED; - } - - - HostVersionEntity hostVersionEntity = new HostVersionEntity(hostEntities[i], repositoryVersionEnt_2_2_0_2, desiredState); - hostVersionDAO.create(hostVersionEntity); - } - } - - /** - * Test the {@link HostVersionDAO#findAll()} method. - */ - @Test - public void testFindAll() { - Assert.assertEquals(3, hostVersionDAO.findAll().size()); - } - - /** - * Test the {@link HostVersionDAO#findByHost(String)} method. - */ - @Test - public void testFindByHost() { - Assert.assertEquals(1, hostVersionDAO.findByHost("test_host1").size()); - Assert.assertEquals(1, hostVersionDAO.findByHost("test_host2").size()); - Assert.assertEquals(1, hostVersionDAO.findByHost("test_host3").size()); - - addMoreVersions(); - - Assert.assertEquals(3, hostVersionDAO.findByHost("test_host1").size()); - Assert.assertEquals(3, hostVersionDAO.findByHost("test_host2").size()); - Assert.assertEquals(3, hostVersionDAO.findByHost("test_host3").size()); - } - - /** - * Test the {@link HostVersionDAO#findByClusterStackAndVersion(String, org.apache.ambari.server.state.StackId, String)} method. - */ - @Test - public void testFindByClusterStackAndVersion() { - Assert.assertEquals(3, hostVersionDAO.findByClusterStackAndVersion("test_cluster1", HDP_22_STACK, repoVersion_2200).size()); - Assert.assertEquals(3, hostVersionDAO.findAll().size()); - - addMoreVersions(); - - Assert.assertEquals(3, hostVersionDAO.findByClusterStackAndVersion("test_cluster1", HDP_22_STACK, repoVersion_2201).size()); - Assert.assertEquals(3, hostVersionDAO.findByClusterStackAndVersion("test_cluster1", HDP_22_STACK, repoVersion_2202).size()); - Assert.assertEquals(9, hostVersionDAO.findAll().size()); - } - - /** - * Test the {@link HostVersionDAO#findByClusterAndHost(String, String)} method. - */ - @Test - public void testFindByClusterAndHost() { - Assert.assertEquals(1, hostVersionDAO.findByClusterAndHost("test_cluster1", "test_host1").size()); - Assert.assertEquals(1, hostVersionDAO.findByClusterAndHost("test_cluster1", "test_host2").size()); - Assert.assertEquals(1, hostVersionDAO.findByClusterAndHost("test_cluster1", "test_host3").size()); - - addMoreVersions(); - - Assert.assertEquals(3, hostVersionDAO.findByClusterAndHost("test_cluster1", "test_host1").size()); - Assert.assertEquals(3, hostVersionDAO.findByClusterAndHost("test_cluster1", "test_host2").size()); - Assert.assertEquals(3, hostVersionDAO.findByClusterAndHost("test_cluster1", "test_host3").size()); - } - - /** - * Test the {@link HostVersionDAO#findByCluster(String)} method. - */ - @Test - public void testFindByCluster() { - Assert.assertEquals(3, hostVersionDAO.findByCluster("test_cluster1").size()); - - addMoreVersions(); - - Assert.assertEquals(9, hostVersionDAO.findByCluster("test_cluster1").size()); - } - - /** - * Test the {@link HostVersionDAO#findByClusterHostAndState(String, String, org.apache.ambari.server.state.RepositoryVersionState)} method. - */ - @Test - public void testFindByClusterHostAndState() { - Assert.assertEquals(1, hostVersionDAO.findByClusterHostAndState("test_cluster1", "test_host1", RepositoryVersionState.CURRENT).size()); - Assert.assertEquals(0, hostVersionDAO.findByClusterHostAndState("test_cluster1", "test_host1", RepositoryVersionState.INSTALLED).size()); - Assert.assertEquals(0, hostVersionDAO.findByClusterHostAndState("test_cluster1", "test_host2", RepositoryVersionState.INSTALLING).size()); - Assert.assertEquals(0, hostVersionDAO.findByClusterHostAndState("test_cluster1", "test_host3", RepositoryVersionState.INSTALL_FAILED).size()); - - addMoreVersions(); - - Assert.assertEquals(2, hostVersionDAO.findByClusterHostAndState("test_cluster1", "test_host1", RepositoryVersionState.INSTALLED).size()); - Assert.assertEquals(2, hostVersionDAO.findByClusterHostAndState("test_cluster1", "test_host2", RepositoryVersionState.INSTALLED).size()); - Assert.assertEquals(2, hostVersionDAO.findByClusterHostAndState("test_cluster1", "test_host3", RepositoryVersionState.INSTALLED).size()); - - Assert.assertEquals(1, hostVersionDAO.findByClusterHostAndState("test_cluster1", "test_host1", RepositoryVersionState.CURRENT).size()); - Assert.assertEquals(1, hostVersionDAO.findByClusterHostAndState("test_cluster1", "test_host2", RepositoryVersionState.INSTALLING).size()); - Assert.assertEquals(1, hostVersionDAO.findByClusterHostAndState("test_cluster1", "test_host3", RepositoryVersionState.INSTALL_FAILED).size()); - } - - /** - * Test the {@link HostVersionDAO#findByClusterStackVersionAndHost(String, StackId, String, String)} method. - */ - @Test - public void testFindByClusterStackVersionAndHost() { - HostEntity host1 = hostDAO.findByName("test_host1"); - HostEntity host2 = hostDAO.findByName("test_host2"); - HostEntity host3 = hostDAO.findByName("test_host3"); - - HostVersionEntity hostVersionEntity1 = new HostVersionEntity(host1, - helper.getOrCreateRepositoryVersion(HDP_22_STACK, repoVersion_2200), RepositoryVersionState.CURRENT); - hostVersionEntity1.setId(1L); - HostVersionEntity hostVersionEntity2 = new HostVersionEntity(host2, - helper.getOrCreateRepositoryVersion(HDP_22_STACK, repoVersion_2200), RepositoryVersionState.INSTALLED); - hostVersionEntity2.setId(2L); - HostVersionEntity hostVersionEntity3 = new HostVersionEntity(host3, - helper.getOrCreateRepositoryVersion(HDP_22_STACK, repoVersion_2200), RepositoryVersionState.INSTALLED); - hostVersionEntity3.setId(3L); - - hostVersionEntity1.equals(hostVersionDAO.findByClusterStackVersionAndHost("test_cluster1", HDP_22_STACK, repoVersion_2200, "test_host1")); - Assert.assertEquals(hostVersionEntity1, hostVersionDAO.findByClusterStackVersionAndHost("test_cluster1", HDP_22_STACK, repoVersion_2200, "test_host1")); - Assert.assertEquals(hostVersionEntity2, hostVersionDAO.findByClusterStackVersionAndHost("test_cluster1", HDP_22_STACK, repoVersion_2200, "test_host2")); - Assert.assertEquals(hostVersionEntity3, hostVersionDAO.findByClusterStackVersionAndHost("test_cluster1", HDP_22_STACK, repoVersion_2200, "test_host3")); - - // Test non-existent objects - Assert.assertEquals(null, hostVersionDAO.findByClusterStackVersionAndHost("non_existent_cluster", HDP_22_STACK, repoVersion_2200, "test_host3")); - Assert.assertEquals(null, hostVersionDAO.findByClusterStackVersionAndHost("test_cluster1", BAD_STACK, repoVersion_2200, "test_host3")); - Assert.assertEquals(null, hostVersionDAO.findByClusterStackVersionAndHost("test_cluster1", HDP_22_STACK, "non_existent_version", "test_host3")); - Assert.assertEquals(null, hostVersionDAO.findByClusterStackVersionAndHost("test_cluster1", HDP_22_STACK, "non_existent_version", "non_existent_host")); - - addMoreVersions(); - - // Expected - HostVersionEntity hostVersionEntity1LastExpected = new HostVersionEntity(host1, - helper.getOrCreateRepositoryVersion(HDP_22_STACK, repoVersion_2202), RepositoryVersionState.INSTALLED); - HostVersionEntity hostVersionEntity2LastExpected = new HostVersionEntity(host2, - helper.getOrCreateRepositoryVersion(HDP_22_STACK, repoVersion_2202), RepositoryVersionState.INSTALLING); - HostVersionEntity hostVersionEntity3LastExpected = new HostVersionEntity(host3, - helper.getOrCreateRepositoryVersion(HDP_22_STACK, repoVersion_2202), RepositoryVersionState.INSTALL_FAILED); - - // Actual - HostVersionEntity hostVersionEntity1LastActual = hostVersionDAO.findByClusterStackVersionAndHost("test_cluster1", HDP_22_STACK, repoVersion_2202, "test_host1"); - HostVersionEntity hostVersionEntity2LastActual = hostVersionDAO.findByClusterStackVersionAndHost("test_cluster1", HDP_22_STACK, repoVersion_2202, "test_host2"); - HostVersionEntity hostVersionEntity3LastActual = hostVersionDAO.findByClusterStackVersionAndHost("test_cluster1", HDP_22_STACK, repoVersion_2202, "test_host3"); - - // Trying to Mock the actual objects to override the getId() method will not work because the class that mockito creates - // is still a Mockito wrapper. Instead, take advantage of an overloaded constructor that ignores the Id. - Assert.assertEquals(hostVersionEntity1LastExpected, new HostVersionEntity(hostVersionEntity1LastActual)); - Assert.assertEquals(hostVersionEntity2LastExpected, new HostVersionEntity(hostVersionEntity2LastActual)); - Assert.assertEquals(hostVersionEntity3LastExpected, new HostVersionEntity(hostVersionEntity3LastActual)); - } - - @Test - public void testDuplicates() throws Exception { - HostEntity host1 = hostDAO.findByName("test_host1"); - - RepositoryVersionEntity repoVersion = helper.getOrCreateRepositoryVersion(HDP_22_STACK, repoVersion_2200); - - HostVersionEntity hostVersionEntity1 = new HostVersionEntity(host1, repoVersion, RepositoryVersionState.CURRENT); - - try { - hostVersionDAO.create(hostVersionEntity1); - Assert.fail("Each host can have a relationship to a repo version, but cannot have more than one for the same repo"); - } catch (Exception e) { - // expected - } - - } - - @After - public void after() throws AmbariException, SQLException { - H2DatabaseCleaner.clearDatabaseAndStopPersistenceService(injector); - injector = null; - } -} diff --git a/ambari-server/src/test/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartupTest.java b/ambari-server/src/test/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartupTest.java deleted file mode 100644 index ad63eb783db..00000000000 --- a/ambari-server/src/test/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartupTest.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * 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.stack; - - -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.apache.ambari.server.api.services.AmbariMetaInfo; -import org.apache.ambari.server.orm.InMemoryDefaultTestModule; -import org.apache.ambari.server.orm.dao.ClusterDAO; -import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; -import org.apache.ambari.server.orm.entities.ClusterEntity; -import org.apache.ambari.server.orm.entities.ClusterServiceEntity; -import org.apache.ambari.server.orm.entities.RepoDefinitionEntity; -import org.apache.ambari.server.orm.entities.RepoOsEntity; -import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; -import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntity; -import org.apache.ambari.server.orm.entities.StackEntity; -import org.apache.ambari.server.state.RepositoryInfo; -import org.apache.ambari.server.state.StackInfo; -import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; -import org.junit.Test; -import org.mockito.Mockito; - -import com.google.common.base.Charsets; -import com.google.common.collect.ImmutableList; -import com.google.common.io.Resources; -import com.google.gson.Gson; -import com.google.inject.Guice; -import com.google.inject.Provider; - -/** - * Unit test for {@link UpdateActiveRepoVersionOnStartup} - */ -public class UpdateActiveRepoVersionOnStartupTest { - - private static String CLUSTER_NAME = "c1"; - private static String ADD_ON_REPO_ID = "MSFT_R-8.0"; - - private RepositoryVersionDAO repositoryVersionDao; - private UpdateActiveRepoVersionOnStartup activeRepoUpdater; - - @Test - public void addAServiceRepoToExistingRepoVersion() throws Exception { - init(true); - activeRepoUpdater.process(); - verifyRepoIsAdded(); - } - - @Test - public void missingClusterVersionShouldNotCauseException() throws Exception { - init(false); - activeRepoUpdater.process(); - } - - /** - * Verifies if the add-on service repo is added to the repo version entity, both json and xml representations. - * - * @throws Exception - */ - private void verifyRepoIsAdded() throws Exception { - verify(repositoryVersionDao, atLeast(1)).merge(Mockito.any(RepositoryVersionEntity.class)); - } - - public void init(boolean addClusterVersion) throws Exception { - ClusterDAO clusterDao = mock(ClusterDAO.class); - - repositoryVersionDao = mock(RepositoryVersionDAO.class); - - final RepositoryVersionHelper repositoryVersionHelper = new RepositoryVersionHelper(); - Field field = RepositoryVersionHelper.class.getDeclaredField("gson"); - field.setAccessible(true); - field.set(repositoryVersionHelper, new Gson()); - - final AmbariMetaInfo metaInfo = mock(AmbariMetaInfo.class); - - StackManager stackManager = mock(StackManager.class); - when(metaInfo.getStackManager()).thenReturn(stackManager); - - ClusterEntity cluster = new ClusterEntity(); - cluster.setClusterName(CLUSTER_NAME); - when(clusterDao.findAll()).thenReturn(ImmutableList.of(cluster)); - - StackEntity stackEntity = new StackEntity(); - stackEntity.setStackName("HDP"); - stackEntity.setStackVersion("2.3"); - cluster.setDesiredStack(stackEntity); - - RepositoryVersionEntity desiredRepositoryVersion = new RepositoryVersionEntity(); - desiredRepositoryVersion.setStack(stackEntity); - - List operatingSystems = new ArrayList<>(); - RepoDefinitionEntity repoDefinitionEntity1 = new RepoDefinitionEntity(); - repoDefinitionEntity1.setRepoID("HDP-UTILS-1.1.0.20"); - repoDefinitionEntity1.setBaseUrl("http://192.168.99.100/repos/HDP-UTILS-1.1.0.20/"); - repoDefinitionEntity1.setRepoName("HDP-UTILS"); - RepoDefinitionEntity repoDefinitionEntity2 = new RepoDefinitionEntity(); - repoDefinitionEntity2.setRepoID("HDP-2.4"); - repoDefinitionEntity2.setBaseUrl("http://192.168.99.100/repos/HDP-2.4.0.0/"); - repoDefinitionEntity2.setRepoName("HDP"); - RepoOsEntity repoOsEntity1 = new RepoOsEntity(); - repoOsEntity1.setFamily("redhat6"); - repoOsEntity1.setAmbariManaged(true); - repoOsEntity1.addRepoDefinition(repoDefinitionEntity1); - repoOsEntity1.addRepoDefinition(repoDefinitionEntity2); - operatingSystems.add(repoOsEntity1); - RepoDefinitionEntity repoDefinitionEntity3 = new RepoDefinitionEntity(); - repoDefinitionEntity3.setRepoID("HDP-UTILS-1.1.0.20"); - repoDefinitionEntity3.setBaseUrl("http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos7"); - repoDefinitionEntity3.setRepoName("HDP-UTILS"); - RepoDefinitionEntity repoDefinitionEntity4 = new RepoDefinitionEntity(); - repoDefinitionEntity4.setRepoID("HDP-2.4"); - repoDefinitionEntity4.setBaseUrl("http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos7/2.x/BUILDS/2.4.3.0-207"); - repoDefinitionEntity4.setRepoName("HDP"); - RepoOsEntity repoOsEntity2 = new RepoOsEntity(); - repoOsEntity2.setFamily("redhat7"); - repoOsEntity2.setAmbariManaged(true); - repoOsEntity2.addRepoDefinition(repoDefinitionEntity3); - repoOsEntity2.addRepoDefinition(repoDefinitionEntity4); - operatingSystems.add(repoOsEntity2); - - desiredRepositoryVersion.addRepoOsEntities(operatingSystems); - - ServiceDesiredStateEntity serviceDesiredStateEntity = new ServiceDesiredStateEntity(); - serviceDesiredStateEntity.setDesiredRepositoryVersion(desiredRepositoryVersion); - - ClusterServiceEntity clusterServiceEntity = new ClusterServiceEntity(); - clusterServiceEntity.setServiceDesiredStateEntity(serviceDesiredStateEntity); - cluster.setClusterServiceEntities(Collections.singletonList(clusterServiceEntity)); - - StackInfo stackInfo = new StackInfo(); - stackInfo.setName("HDP"); - stackInfo.setVersion("2.3"); - - RepositoryInfo repositoryInfo = new RepositoryInfo(); - repositoryInfo.setBaseUrl("http://msft.r"); - repositoryInfo.setRepoId(ADD_ON_REPO_ID); - repositoryInfo.setRepoName("MSFT_R"); - repositoryInfo.setOsType("redhat6"); - stackInfo.getRepositories().add(repositoryInfo); - - when(stackManager.getStack("HDP", "2.3")).thenReturn(stackInfo); - - final Provider repositoryVersionHelperProvider = mock(Provider.class); - when(repositoryVersionHelperProvider.get()).thenReturn(repositoryVersionHelper); - - - InMemoryDefaultTestModule testModule = new InMemoryDefaultTestModule() { - @Override - protected void configure() { - bind(RepositoryVersionHelper.class).toProvider(repositoryVersionHelperProvider); - bind(AmbariMetaInfo.class).toProvider(new Provider() { - @Override - public AmbariMetaInfo get() { - return metaInfo; - } - }); - - requestStaticInjection(RepositoryVersionEntity.class); - } - }; - - Guice.createInjector(testModule); - if (addClusterVersion) { - - RepositoryInfo info = new RepositoryInfo(); - info.setBaseUrl("http://msft.r"); - info.setRepoId(ADD_ON_REPO_ID); - info.setRepoName("MSFT_R1"); - info.setOsType("redhat6"); - stackInfo.getRepositories().add(info); - } - - activeRepoUpdater = new UpdateActiveRepoVersionOnStartup(clusterDao, - repositoryVersionDao, repositoryVersionHelper, metaInfo); - } - - private static String resourceAsString(String resourceName) throws IOException { - return Resources.toString(Resources.getResource(resourceName), Charsets.UTF_8); - } - -} diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java index 4a4541d6cf7..90a156e0228 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java @@ -18,15 +18,12 @@ package org.apache.ambari.server.state; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import java.sql.SQLException; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import org.apache.ambari.server.AmbariException; @@ -38,16 +35,12 @@ import org.apache.ambari.server.orm.dao.HostComponentDesiredStateDAO; import org.apache.ambari.server.orm.dao.HostComponentStateDAO; import org.apache.ambari.server.orm.dao.HostDAO; -import org.apache.ambari.server.orm.dao.RepositoryVersionDAO; import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO; -import org.apache.ambari.server.orm.dao.StackDAO; import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity; import org.apache.ambari.server.orm.entities.HostComponentStateEntity; import org.apache.ambari.server.orm.entities.HostEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity; -import org.apache.ambari.server.orm.entities.ServiceComponentVersionEntity; -import org.apache.ambari.server.orm.entities.StackEntity; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -424,212 +417,4 @@ public void testServiceComponentRemove() throws AmbariException { Assert.assertNull(serviceComponentDesiredStateEntity); } - - @Test - public void testVersionCreation() throws Exception { - ServiceComponentDesiredStateDAO serviceComponentDesiredStateDAO = injector.getInstance( - ServiceComponentDesiredStateDAO.class); - - String componentName = "NAMENODE"; - ServiceComponent component = serviceComponentFactory.createNew(service, componentName); - service.addServiceComponent(component); - - ServiceComponent sc = service.getServiceComponent(componentName); - Assert.assertNotNull(sc); - - sc.setDesiredState(State.INSTALLED); - Assert.assertEquals(State.INSTALLED, sc.getDesiredState()); - - long serviceGroupId = 1; - long serviceId = 1; - - ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity = serviceComponentDesiredStateDAO.findByName( - cluster.getClusterId(), serviceGroupId, serviceId, componentName); - - StackDAO stackDAO = injector.getInstance(StackDAO.class); - StackEntity stackEntity = stackDAO.find("HDP", "2.2.0"); - - RepositoryVersionEntity rve = new RepositoryVersionEntity(stackEntity, "HDP-2.2.0", - "2.2.0.1-1111", new ArrayList<>()); - - RepositoryVersionDAO repositoryDAO = injector.getInstance(RepositoryVersionDAO.class); - repositoryDAO.create(rve); - - sc.setDesiredRepositoryVersion(rve); - - Assert.assertEquals(rve, sc.getDesiredRepositoryVersion()); - - Assert.assertEquals(new StackId("HDP", "2.2.0"), sc.getDesiredStackId()); - - Assert.assertEquals("HDP-2.2.0", sc.getDesiredStackId().getStackId()); - - Assert.assertNotNull(serviceComponentDesiredStateEntity); - - ServiceComponentVersionEntity version = new ServiceComponentVersionEntity(); - version.setState(RepositoryVersionState.CURRENT); - version.setRepositoryVersion(rve); - version.setUserName("user"); - serviceComponentDesiredStateEntity.addVersion(version); - - serviceComponentDesiredStateEntity = serviceComponentDesiredStateDAO.merge( - serviceComponentDesiredStateEntity); - - serviceComponentDesiredStateEntity = serviceComponentDesiredStateDAO.findByName( - cluster.getClusterId(), serviceGroupId, serviceId, componentName); - - assertEquals(1, serviceComponentDesiredStateEntity.getVersions().size()); - ServiceComponentVersionEntity persistedVersion = serviceComponentDesiredStateEntity.getVersions().iterator().next(); - - assertEquals(RepositoryVersionState.CURRENT, persistedVersion.getState()); - } - - @Test - public void testVersionRemoval() throws Exception { - ServiceComponentDesiredStateDAO serviceComponentDesiredStateDAO = injector.getInstance( - ServiceComponentDesiredStateDAO.class); - - String componentName = "NAMENODE"; - ServiceComponent component = serviceComponentFactory.createNew(service, componentName); - service.addServiceComponent(component); - - ServiceComponent sc = service.getServiceComponent(componentName); - Assert.assertNotNull(sc); - - sc.setDesiredState(State.INSTALLED); - Assert.assertEquals(State.INSTALLED, sc.getDesiredState()); - - long serviceGroupId = 1; - long serviceId = 1; - - ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity = serviceComponentDesiredStateDAO.findByName( - cluster.getClusterId(), serviceGroupId, serviceId, componentName); - - StackDAO stackDAO = injector.getInstance(StackDAO.class); - StackEntity stackEntity = stackDAO.find("HDP", "2.2.0"); - - RepositoryVersionEntity rve = new RepositoryVersionEntity(stackEntity, "HDP-2.2.0", - "2.2.0.1-1111", new ArrayList<>()); - - RepositoryVersionDAO repositoryDAO = injector.getInstance(RepositoryVersionDAO.class); - repositoryDAO.create(rve); - - sc.setDesiredRepositoryVersion(rve); - - StackId stackId = sc.getDesiredStackId(); - Assert.assertEquals(new StackId("HDP", "2.2.0"), stackId); - - Assert.assertEquals("HDP-2.2.0", sc.getDesiredStackId().getStackId()); - - Assert.assertNotNull(serviceComponentDesiredStateEntity); - - ServiceComponentVersionEntity version = new ServiceComponentVersionEntity(); - version.setState(RepositoryVersionState.CURRENT); - version.setRepositoryVersion(rve); - version.setUserName("user"); - serviceComponentDesiredStateEntity.addVersion(version); - - serviceComponentDesiredStateEntity = serviceComponentDesiredStateDAO.merge( - serviceComponentDesiredStateEntity); - - serviceComponentDesiredStateEntity = serviceComponentDesiredStateDAO.findByName( - cluster.getClusterId(), serviceGroupId, serviceId, componentName); - - assertEquals(1, serviceComponentDesiredStateEntity.getVersions().size()); - ServiceComponentVersionEntity persistedVersion = serviceComponentDesiredStateEntity.getVersions().iterator().next(); - - assertEquals(RepositoryVersionState.CURRENT, persistedVersion.getState()); - - sc.delete(); - - serviceComponentDesiredStateEntity = serviceComponentDesiredStateDAO.findByName( - cluster.getClusterId(), serviceGroupId, serviceId, componentName); - Assert.assertNull(serviceComponentDesiredStateEntity); - - - // verify versions are gone, too - List list = serviceComponentDesiredStateDAO.findVersions(cluster.getClusterId(), serviceGroupId, serviceId, componentName); - assertEquals(0, list.size()); - } - - - @Test - public void testUpdateStates() throws Exception { - ServiceComponentDesiredStateDAO serviceComponentDesiredStateDAO = injector.getInstance( - ServiceComponentDesiredStateDAO.class); - - String componentName = "NAMENODE"; - - ServiceComponent component = serviceComponentFactory.createNew(service, componentName); - - StackId newStackId = new StackId("HDP-2.2.0"); - RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(newStackId, - newStackId.getStackVersion()); - - component.setDesiredRepositoryVersion(repositoryVersion); - - service.addServiceComponent(component); - - ServiceComponent sc = service.getServiceComponent(componentName); - Assert.assertNotNull(sc); - - long serviceGroupId = 1; - long serviceId = 1; - - ServiceComponentDesiredStateEntity entity = serviceComponentDesiredStateDAO.findByName(cluster.getClusterId(), serviceGroupId, serviceId, componentName); - - RepositoryVersionEntity repoVersion2201 = helper.getOrCreateRepositoryVersion( - component.getDesiredStackId(), "2.2.0.1"); - - RepositoryVersionEntity repoVersion2202 = helper.getOrCreateRepositoryVersion( - component.getDesiredStackId(), "2.2.0.2"); - - addHostToCluster("h1", clusterName); - addHostToCluster("h2", clusterName); - - sc.setDesiredState(State.INSTALLED); - Assert.assertEquals(State.INSTALLED, sc.getDesiredState()); - - ServiceComponentHost sch1 = sc.addServiceComponentHost("h1"); - ServiceComponentHost sch2 = sc.addServiceComponentHost("h2"); - - // !!! case 1: component desired is UNKNOWN, mix of h-c versions - sc.setDesiredRepositoryVersion(repositoryVersion); - sch1.setVersion("2.2.0.1"); - sch2.setVersion("2.2.0.2"); - sc.updateRepositoryState("2.2.0.2"); - entity = serviceComponentDesiredStateDAO.findByName(cluster.getClusterId(), serviceGroupId, serviceId, componentName); - assertEquals(RepositoryVersionState.OUT_OF_SYNC, entity.getRepositoryState()); - - // !!! case 2: component desired is UNKNOWN, all h-c same version - sc.setDesiredRepositoryVersion(repositoryVersion); - sch1.setVersion("2.2.0.1"); - sch2.setVersion("2.2.0.1"); - sc.updateRepositoryState("2.2.0.1"); - entity = serviceComponentDesiredStateDAO.findByName(cluster.getClusterId(), serviceGroupId, serviceId, componentName); - assertEquals(RepositoryVersionState.OUT_OF_SYNC, entity.getRepositoryState()); - - // !!! case 3: component desired is known, any component reports different version - sc.setDesiredRepositoryVersion(repoVersion2201); - sch1.setVersion("2.2.0.1"); - sch2.setVersion("2.2.0.2"); - sc.updateRepositoryState("2.2.0.2"); - entity = serviceComponentDesiredStateDAO.findByName(cluster.getClusterId(), serviceGroupId, serviceId, componentName); - assertEquals(RepositoryVersionState.OUT_OF_SYNC, entity.getRepositoryState()); - - // !!! case 4: component desired is known, component reports same as desired, mix of h-c versions - sc.setDesiredRepositoryVersion(repoVersion2201); - sch1.setVersion("2.2.0.1"); - sch2.setVersion("2.2.0.2"); - sc.updateRepositoryState("2.2.0.1"); - entity = serviceComponentDesiredStateDAO.findByName(cluster.getClusterId(), serviceGroupId, serviceId, componentName); - assertEquals(RepositoryVersionState.OUT_OF_SYNC, entity.getRepositoryState()); - - // !!! case 5: component desired is known, component reports same as desired, all h-c the same - sc.setDesiredRepositoryVersion(repoVersion2201); - sch1.setVersion("2.2.0.1"); - sch2.setVersion("2.2.0.1"); - sc.updateRepositoryState("2.2.0.1"); - entity = serviceComponentDesiredStateDAO.findByName(cluster.getClusterId(), serviceGroupId, serviceId, componentName); - assertEquals(RepositoryVersionState.CURRENT, entity.getRepositoryState()); - } } diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/repository/VersionDefinitionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/repository/VersionDefinitionTest.java deleted file mode 100644 index a293d3a518f..00000000000 --- a/ambari-server/src/test/java/org/apache/ambari/server/state/repository/VersionDefinitionTest.java +++ /dev/null @@ -1,611 +0,0 @@ -/* - * 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.repository; - -import static org.easymock.EasyMock.createNiceMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.lang.reflect.Field; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; -import org.apache.ambari.server.state.Cluster; -import org.apache.ambari.server.state.ComponentInfo; -import org.apache.ambari.server.state.RepositoryType; -import org.apache.ambari.server.state.Service; -import org.apache.ambari.server.state.ServiceInfo; -import org.apache.ambari.server.state.StackInfo; -import org.apache.ambari.server.state.stack.RepoTag; -import org.apache.ambari.server.state.stack.RepositoryXml; -import org.apache.ambari.server.state.stack.RepositoryXml.Os; -import org.apache.ambari.server.state.stack.RepositoryXml.Repo; -import org.apache.commons.io.FileUtils; -import org.junit.Test; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - -/** - * Tests for repository definitions. - */ -public class VersionDefinitionTest { - - private static File file = new File("src/test/resources/version_definition_test.xml"); - - @Test - public void testLoadingString() throws Exception { - String xmlString = FileUtils.readFileToString(file); - VersionDefinitionXml xml = VersionDefinitionXml.load(xmlString); - - validateXml(xml); - } - - @Test - public void testLoadingUrl() throws Exception { - VersionDefinitionXml xml = VersionDefinitionXml.load(file.toURI().toURL()); - - validateXml(xml); - } - - private void validateXml(VersionDefinitionXml xml) throws Exception { - assertNotNull(xml.release); - assertEquals(RepositoryType.PATCH, xml.release.repositoryType); - assertEquals("HDP-2.3", xml.release.stackId); - assertEquals("2.3.4.1", xml.release.version); - assertEquals("2.3.4.[1-9]", xml.release.compatibleWith); - assertEquals("http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.3.4/", xml.release.releaseNotes); - - assertEquals(4, xml.manifestServices.size()); - assertEquals("HDFS-271", xml.manifestServices.get(0).serviceId); - assertEquals("HDFS", xml.manifestServices.get(0).serviceName); - assertEquals("2.7.1", xml.manifestServices.get(0).version); - assertEquals("10", xml.manifestServices.get(0).versionId); - - assertEquals(3, xml.availableServices.size()); - assertEquals("HDFS-271", xml.availableServices.get(0).serviceIdReference); - assertEquals(0, xml.availableServices.get(0).components.size()); - - assertEquals("HIVE-110", xml.availableServices.get(2).serviceIdReference); - assertEquals(1, xml.availableServices.get(2).components.size()); - - assertNotNull(xml.repositoryInfo); - assertEquals(2, xml.repositoryInfo.getOses().size()); - - assertEquals("redhat6", xml.repositoryInfo.getOses().get(0).getFamily()); - assertEquals(2, xml.repositoryInfo.getOses().get(0).getRepos().size()); - assertEquals("http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.3.0.0", - xml.repositoryInfo.getOses().get(0).getRepos().get(0).getBaseUrl()); - assertEquals("HDP-2.3", xml.repositoryInfo.getOses().get(0).getRepos().get(0).getRepoId()); - assertEquals("HDP", xml.repositoryInfo.getOses().get(0).getRepos().get(0).getRepoName()); - assertNull(xml.repositoryInfo.getOses().get(0).getPackageVersion()); - } - - @Test - public void testAllServices() throws Exception { - - File f = new File("src/test/resources/version_definition_test_all_services.xml"); - - VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); - - StackInfo stack = new StackInfo() { - @Override - public ServiceInfo getService(String name) { - return null; - } - }; - - // the file does not define available services - assertEquals(4, xml.manifestServices.size()); - assertEquals(3, xml.getAvailableServices(stack).size()); - } - - @Test - public void testStackManifest() throws Exception { - - File f = new File("src/test/resources/version_definition_test_all_services.xml"); - - VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); - - StackInfo stack = new StackInfo() { - private Map m_services = new HashMap() {{ - put("HDFS", makeService("HDFS")); - put("HBASE", makeService("HBASE")); - put("HIVE", makeService("HIVE")); - put("YARN", makeService("YARN")); - }}; - - @Override - public ServiceInfo getService(String name) { - return m_services.get(name); - } - - @Override - public synchronized Collection getServices() { - return m_services.values(); - } - - }; - - List stackServices = xml.getStackServices(stack); - - // the file does not define available services - assertEquals(4, xml.manifestServices.size()); - assertEquals(3, xml.getAvailableServices(stack).size()); - assertEquals(4, stackServices.size()); - - boolean foundHdfs = false; - boolean foundYarn = false; - boolean foundHive = false; - - for (ManifestServiceInfo msi : stackServices) { - if ("HDFS".equals(msi.m_name)) { - foundHdfs = true; - assertEquals("HDFS Display", msi.m_display); - assertEquals("HDFS Comment", msi.m_comment); - assertEquals(1, msi.m_versions.size()); - assertEquals("2.7.1", msi.m_versions.iterator().next()); - } else if ("YARN".equals(msi.m_name)) { - foundYarn = true; - assertEquals(1, msi.m_versions.size()); - assertEquals("1.1.1", msi.m_versions.iterator().next()); - } else if ("HIVE".equals(msi.m_name)) { - foundHive = true; - assertEquals(2, msi.m_versions.size()); - assertTrue(msi.m_versions.contains("1.1.0")); - assertTrue(msi.m_versions.contains("2.0.0")); - } - } - - assertTrue(foundHdfs); - assertTrue(foundYarn); - assertTrue(foundHive); - } - - @Test - public void testSerialization() throws Exception { - - File f = new File("src/test/resources/version_definition_test_all_services.xml"); - VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); - String xmlString = xml.toXml(); - xml = VersionDefinitionXml.load(xmlString); - - assertNotNull(xml.release.build); - assertEquals("1234", xml.release.build); - - f = new File("src/test/resources/version_definition_with_tags.xml"); - xml = VersionDefinitionXml.load(f.toURI().toURL()); - xmlString = xml.toXml(); - - xml = VersionDefinitionXml.load(xmlString); - - assertEquals(2, xml.repositoryInfo.getOses().size()); - List repos = null; - for (Os os : xml.repositoryInfo.getOses()) { - if (os.getFamily().equals("redhat6")) { - repos = os.getRepos(); - } - } - assertNotNull(repos); - assertEquals(3, repos.size()); - - Repo found = null; - for (Repo repo : repos) { - if (repo.getRepoName().equals("HDP-GPL")) { - found = repo; - break; - } - } - - assertNotNull(found); - assertNotNull(found.getTags()); - assertEquals(1, found.getTags().size()); - assertEquals(RepoTag.GPL, found.getTags().iterator().next()); - } - - - @Test - public void testMerger() throws Exception { - File f = new File("src/test/resources/version_definition_test_all_services.xml"); - - VersionDefinitionXml xml1 = VersionDefinitionXml.load(f.toURI().toURL()); - VersionDefinitionXml xml2 = VersionDefinitionXml.load(f.toURI().toURL()); - - assertEquals(2, xml1.repositoryInfo.getOses().size()); - assertEquals(2, xml2.repositoryInfo.getOses().size()); - - // make xml1 have only redhat6 (remove redhat7) without a package version - RepositoryXml.Os target = null; - for (RepositoryXml.Os os : xml1.repositoryInfo.getOses()) { - if (os.getFamily().equals("redhat7")) { - target = os; - } - } - assertNotNull(target); - xml1.repositoryInfo.getOses().remove(target); - - // make xml2 have only redhat7 (remove redhat6) with a package version - target = null; - for (RepositoryXml.Os os : xml2.repositoryInfo.getOses()) { - if (os.getFamily().equals("redhat6")) { - target = os; - } else { - Field field = RepositoryXml.Os.class.getDeclaredField("packageVersion"); - field.setAccessible(true); - field.set(os, "2_3_4_2"); - } - } - assertNotNull(target); - xml2.repositoryInfo.getOses().remove(target); - xml2.release.version = "2.3.4.2"; - xml2.release.build = "2468"; - - assertEquals(1, xml1.repositoryInfo.getOses().size()); - assertEquals(1, xml2.repositoryInfo.getOses().size()); - - VersionDefinitionXml.Merger builder = new VersionDefinitionXml.Merger(); - VersionDefinitionXml xml3 = builder.merge(); - - assertNull(xml3); - - builder.add(xml1.release.version, xml1); - builder.add("", xml2); - xml3 = builder.merge(); - - assertNotNull(xml3); - assertNull("Merged definition cannot have a build", xml3.release.build); - assertEquals(xml3.release.version, "2.3.4.1"); - - RepositoryXml.Os redhat6 = null; - RepositoryXml.Os redhat7 = null; - assertEquals(2, xml3.repositoryInfo.getOses().size()); - for (RepositoryXml.Os os : xml3.repositoryInfo.getOses()) { - if (os.getFamily().equals("redhat6")) { - redhat6 = os; - } else if (os.getFamily().equals("redhat7")) { - redhat7 = os; - } - } - assertNotNull(redhat6); - assertNotNull(redhat7); - assertNull(redhat6.getPackageVersion()); - assertEquals("2_3_4_2", redhat7.getPackageVersion()); - - // !!! extra test to make sure it serializes - xml3.toXml(); - } - - @Test - public void testLoadingBadNewLine() throws Exception { - List lines = FileUtils.readLines(file); - - // crude - StringBuilder builder = new StringBuilder(); - for (Object line : lines) { - String lineString = line.toString().trim(); - if (lineString.startsWith("")) { - lineString = lineString.replace("", ""); - lineString = lineString.replace("", ""); - - builder.append("\n"); - builder.append(lineString).append('\n'); - builder.append("\n"); - } else if (lineString.startsWith("")) { - lineString = lineString.replace("", ""); - lineString = lineString.replace("", ""); - - builder.append("\n"); - builder.append(lineString).append('\n'); - builder.append("\n"); - } else { - builder.append(line.toString().trim()).append('\n'); - } - } - - VersionDefinitionXml xml = VersionDefinitionXml.load(builder.toString()); - - validateXml(xml); - } - - @Test - public void testPackageVersion() throws Exception { - File f = new File("src/test/resources/hbase_version_test.xml"); - - VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); - - String xmlString = xml.toXml(); - - xml = VersionDefinitionXml.load(xmlString); - - assertNotNull(xml.release.build); - assertEquals("3396", xml.release.build); - assertEquals("redhat6", xml.repositoryInfo.getOses().get(0).getFamily()); - assertEquals("2_3_4_0_3396", xml.repositoryInfo.getOses().get(0).getPackageVersion()); - assertNotNull(xml.getPackageVersion("redhat6")); - assertEquals("2_3_4_0_3396", xml.getPackageVersion("redhat6")); - assertNull(xml.getPackageVersion("suse11")); - } - - @Test - public void testMaintVersion() throws Exception { - File f = new File("src/test/resources/version_definition_test_maint.xml"); - - VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); - - String xmlString = xml.toXml(); - - xml = VersionDefinitionXml.load(xmlString); - - assertEquals(RepositoryType.MAINT, xml.release.repositoryType); - assertEquals("2.3.4.1", xml.release.version); - assertEquals("1234", xml.release.build); - assertEquals("redhat6", xml.repositoryInfo.getOses().get(0).getFamily()); - - - - List availableServices = xml.availableServices; - assertEquals(3, availableServices.size()); - - List manifestServices = xml.manifestServices; - assertEquals(4, manifestServices.size()); - - ManifestService hdfs = null; - ManifestService hive = null; - for (ManifestService as : manifestServices) { - if (as.serviceId.equals("HDFS-271")) { - hdfs = as; - } else if (as.serviceId.equals("HIVE-200")) { - hive = as; - } - } - - assertNotNull(hdfs); - assertNotNull(hive); - - assertEquals("2.3.4.0", hdfs.releaseVersion); - assertNull(hive.releaseVersion); - - StackInfo stack = new StackInfo() { - @Override - public ServiceInfo getService(String name) { - return makeService("HIVE", "HIVE_METASTORE"); - } - }; - - Collection availables = xml.getAvailableServices(stack); - - assertEquals(2, availables.size()); - - boolean found = false; - for (AvailableService available : availables) { - if (available.getName().equals("HIVE")) { - found = true; - assertEquals(2, available.getVersions().size()); - for (AvailableVersion version : available.getVersions()) { - if (version.getVersion().equals("1.1.0")) { - assertEquals("1.0.9", version.getReleaseVersion()); - } else { - assertNull(version.getReleaseVersion()); - } - } - } - } - - assertTrue("Found available version for HIVE", found); - } - - @Test - public void testAvailableFull() throws Exception { - - Cluster cluster = createNiceMock(Cluster.class); - RepositoryVersionEntity repositoryVersion = createNiceMock(RepositoryVersionEntity.class); - expect(repositoryVersion.getVersion()).andReturn("2.3.4.0").atLeastOnce(); - - Service serviceHdfs = createNiceMock(Service.class); - expect(serviceHdfs.getName()).andReturn("HDFS").atLeastOnce(); - expect(serviceHdfs.getDisplayName()).andReturn("HDFS").atLeastOnce(); - expect(serviceHdfs.getDesiredRepositoryVersion()).andReturn(repositoryVersion).atLeastOnce(); - - Service serviceHBase = createNiceMock(Service.class); - expect(serviceHBase.getName()).andReturn("HBASE").atLeastOnce(); - expect(serviceHBase.getDisplayName()).andReturn("HBase").atLeastOnce(); - expect(serviceHBase.getDesiredRepositoryVersion()).andReturn(repositoryVersion).atLeastOnce(); - - // !!! should never be accessed as it's not in any VDF - Service serviceAMS = createNiceMock(Service.class); - - expect(cluster.getServices()).andReturn(ImmutableMap.builder() - .put("HDFS", serviceHdfs) - .put("HBASE", serviceHBase) - .put("AMBARI_METRICS", serviceAMS).build()).atLeastOnce(); - - - replay(cluster, repositoryVersion, serviceHdfs, serviceHBase); - - File f = new File("src/test/resources/version_definition_test_all_services.xml"); - VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); - ClusterVersionSummary summary = xml.getClusterSummary(cluster); - assertEquals(2, summary.getAvailableServiceNames().size()); - - f = new File("src/test/resources/version_definition_test_maint.xml"); - xml = VersionDefinitionXml.load(f.toURI().toURL()); - summary = xml.getClusterSummary(cluster); - assertEquals(0, summary.getAvailableServiceNames().size()); - - f = new File("src/test/resources/version_definition_test_maint.xml"); - xml = VersionDefinitionXml.load(f.toURI().toURL()); - xml.release.repositoryType = RepositoryType.STANDARD; - xml.availableServices = Collections.emptyList(); - summary = xml.getClusterSummary(cluster); - assertEquals(2, summary.getAvailableServiceNames().size()); - - f = new File("src/test/resources/version_definition_test_maint_partial.xml"); - xml = VersionDefinitionXml.load(f.toURI().toURL()); - summary = xml.getClusterSummary(cluster); - assertEquals(1, summary.getAvailableServiceNames().size()); - } - - @Test - public void testAvailableBuildVersion() throws Exception { - - Cluster cluster = createNiceMock(Cluster.class); - RepositoryVersionEntity repositoryVersion = createNiceMock(RepositoryVersionEntity.class); - expect(repositoryVersion.getVersion()).andReturn("2.3.4.1-1").atLeastOnce(); - - Service serviceHdfs = createNiceMock(Service.class); - expect(serviceHdfs.getName()).andReturn("HDFS").atLeastOnce(); - expect(serviceHdfs.getDisplayName()).andReturn("HDFS").atLeastOnce(); - expect(serviceHdfs.getDesiredRepositoryVersion()).andReturn(repositoryVersion).atLeastOnce(); - - Service serviceHBase = createNiceMock(Service.class); - expect(serviceHBase.getName()).andReturn("HBASE").atLeastOnce(); - expect(serviceHBase.getDisplayName()).andReturn("HBase").atLeastOnce(); - expect(serviceHBase.getDesiredRepositoryVersion()).andReturn(repositoryVersion).atLeastOnce(); - - // !!! should never be accessed as it's not in any VDF - Service serviceAMS = createNiceMock(Service.class); - - expect(cluster.getServices()).andReturn(ImmutableMap.builder() - .put("HDFS", serviceHdfs) - .put("HBASE", serviceHBase) - .put("AMBARI_METRICS", serviceAMS).build()).atLeastOnce(); - - replay(cluster, repositoryVersion, serviceHdfs, serviceHBase); - - File f = new File("src/test/resources/version_definition_test_maint_partial.xml"); - VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); - xml.release.version = "2.3.4.1"; - xml.release.build = "2"; - ClusterVersionSummary summary = xml.getClusterSummary(cluster); - assertEquals(1, summary.getAvailableServiceNames().size()); - } - - /** - * Tests that patch upgrade dependencies can be calculated recursively. - * - * @throws Exception - */ - @Test - public void testRecursiveDependencyDetection() throws Exception { - File f = new File("src/test/resources/version_definition_test_all_services.xml"); - VersionDefinitionXml xml = VersionDefinitionXml.load(f.toURI().toURL()); - - Map> dependencies = new HashMap<>(); - dependencies.put("A", Lists.newArrayList("B", "X")); - dependencies.put("B", Lists.newArrayList("C", "D", "E")); - dependencies.put("E", Lists.newArrayList("A", "F")); - dependencies.put("F", Lists.newArrayList("B", "E")); - - // services not installed - dependencies.put("X", Lists.newArrayList("Y", "Z", "A")); - dependencies.put("Z", Lists.newArrayList("B")); - - Set installedServices = Sets.newHashSet("A", "B", "C", "D", "E", "F", "G", "H"); - - Set servicesInUpgrade = Sets.newHashSet("A"); - - Set results = xml.getRecursiveDependencies(Sets.newHashSet("B"), dependencies, - servicesInUpgrade, installedServices); - - assertEquals(5, results.size()); - assertTrue(results.contains("B")); - assertTrue(results.contains("C")); - assertTrue(results.contains("D")); - assertTrue(results.contains("E")); - assertTrue(results.contains("F")); - - servicesInUpgrade = Sets.newHashSet("A", "B", "C", "E", "F"); - results = xml.getRecursiveDependencies(Sets.newHashSet("D"), dependencies, servicesInUpgrade, - installedServices); - - assertEquals(1, results.size()); - assertTrue(results.contains("D")); - - servicesInUpgrade = Sets.newHashSet("A", "F"); - results = xml.getRecursiveDependencies(Sets.newHashSet("B", "E"), dependencies, - servicesInUpgrade, - installedServices); - - assertEquals(4, results.size()); - assertTrue(results.contains("B")); - assertTrue(results.contains("C")); - assertTrue(results.contains("D")); - assertTrue(results.contains("E")); - } - - private static ServiceInfo makeService(final String name) { - return new ServiceInfo() { - @Override - public String getName() { - return name; - } - @Override - public String getDisplayName() { - return name + " Display"; - } - @Override - public String getVersion() { - return "1.1.1"; - } - @Override - public String getComment() { - return name + " Comment"; - } - - }; - } - - private static ServiceInfo makeService(final String name, final String component) { - return new ServiceInfo() { - @Override - public String getName() { - return name; - } - @Override - public String getDisplayName() { - return name + " Display"; - } - @Override - public String getVersion() { - return "1.1.1"; - } - @Override - public String getComment() { - return name + " Comment"; - } - - @Override - public ComponentInfo getComponentByName(String name) { - return null; - } - - }; - } - -} From b6d1e6bebfee6b188bc93716eec6064c06003e54 Mon Sep 17 00:00:00 2001 From: Jonathan Hurley Date: Thu, 1 Mar 2018 11:36:28 -0500 Subject: [PATCH 2/3] AMBARI-23107 - Decided to add changes to the other SQL files as well --- .../resources/Ambari-DDL-Derby-CREATE.sql | 71 +++++++++-------- .../resources/Ambari-DDL-MySQL-CREATE.sql | 69 +++++++++-------- .../resources/Ambari-DDL-Oracle-CREATE.sql | 69 +++++++++-------- .../resources/Ambari-DDL-Postgres-CREATE.sql | 2 +- .../Ambari-DDL-SQLAnywhere-CREATE.sql | 77 +++++++++++-------- .../resources/Ambari-DDL-SQLServer-CREATE.sql | 69 +++++++++-------- 6 files changed, 201 insertions(+), 156 deletions(-) diff --git a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql index c2f83e6755a..3b0b5eeea58 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql @@ -18,22 +18,22 @@ ------create tables and grant privileges to db user--------- CREATE TABLE registries ( - id BIGINT NOT NULL, - registry_name VARCHAR(255) NOT NULL, - registry_type VARCHAR(255) NOT NULL, - registry_uri VARCHAR(255) NOT NULL, - CONSTRAINT PK_registries PRIMARY KEY (id), - CONSTRAINT UQ_registry_name UNIQUE (registry_name)); + id BIGINT NOT NULL, + registry_name VARCHAR(255) NOT NULL, + registry_type VARCHAR(255) NOT NULL, + registry_uri VARCHAR(255) NOT NULL, + CONSTRAINT PK_registries PRIMARY KEY (id), + CONSTRAINT UQ_registry_name UNIQUE (registry_name)); CREATE TABLE mpacks ( - id BIGINT NOT NULL, - mpack_name VARCHAR(255) NOT NULL, - mpack_version VARCHAR(255) NOT NULL, - mpack_uri VARCHAR(255), - registry_id BIGINT, - CONSTRAINT PK_mpacks PRIMARY KEY (id), - CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id), - CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version)); + id BIGINT NOT NULL, + mpack_name VARCHAR(255) NOT NULL, + mpack_version VARCHAR(255) NOT NULL, + mpack_uri VARCHAR(255), + registry_id BIGINT, + CONSTRAINT PK_mpacks PRIMARY KEY (id), + CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id), + CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version)); CREATE TABLE stack ( stack_id BIGINT NOT NULL, @@ -44,6 +44,16 @@ CREATE TABLE stack ( CONSTRAINT FK_mpacks FOREIGN KEY (mpack_id) REFERENCES mpacks(id), CONSTRAINT UQ_stack UNIQUE (stack_name, stack_version)); +CREATE TABLE mpack_host_state ( + id BIGINT NOT NULL, + host_id BIGINT NOT NULL, + mpack_id BIGINT NOT NULL, + state VARCHAR(32) NOT NULL, + CONSTRAINT PK_mpack_host_state PRIMARY KEY (id), + CONSTRAINT FK_mhs_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id), + CONSTRAINT FK_mhs_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_mpack_host_state UNIQUE(host_id, mpack_id)); + CREATE TABLE extension( extension_id BIGINT NOT NULL, extension_name VARCHAR(255) NOT NULL, @@ -126,7 +136,8 @@ CREATE TABLE servicegroups ( stack_id BIGINT NOT NULL, CONSTRAINT PK_servicegroups PRIMARY KEY (id, cluster_id), CONSTRAINT FK_servicegroups_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id), - CONSTRAINT FK_servicegroups_stack_id FOREIGN KEY (stack_id) REFERENCES stack (stack_id)); + CONSTRAINT FK_servicegroups_stack_id FOREIGN KEY (stack_id) REFERENCES stack (stack_id), + CONSTRAINT UQ_TEMP_UNTIL_REAL_PK UNIQUE(id)); CREATE TABLE servicegroupdependencies ( id BIGINT NOT NULL, @@ -243,11 +254,13 @@ CREATE TABLE repo_version ( CREATE TABLE repo_os ( id BIGINT NOT NULL, - repo_version_id BIGINT NOT NULL, + repo_version_id BIGINT, + mpack_id BIGINT NOT NULL, family VARCHAR(255) NOT NULL DEFAULT '', ambari_managed SMALLINT DEFAULT 1, CONSTRAINT PK_repo_os_id PRIMARY KEY (id), - CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id)); + CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id), + CONSTRAINT FK_repo_os_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id)); CREATE TABLE repo_definition ( id BIGINT NOT NULL, @@ -1017,22 +1030,18 @@ CREATE TABLE upgrade_history( component_name VARCHAR(255) NOT NULL, from_repo_version_id BIGINT NOT NULL, target_repo_version_id BIGINT NOT NULL, + service_group_id BIGINT NOT NULL, + source_mpack_id BIGINT NOT NULL, + target_mpack_id BIGINT NOT NULL, CONSTRAINT PK_upgrade_hist PRIMARY KEY (id), CONSTRAINT FK_upgrade_hist_upgrade_id FOREIGN KEY (upgrade_id) REFERENCES upgrade (upgrade_id), CONSTRAINT FK_upgrade_hist_from_repo FOREIGN KEY (from_repo_version_id) REFERENCES repo_version (repo_version_id), CONSTRAINT FK_upgrade_hist_target_repo FOREIGN KEY (target_repo_version_id) REFERENCES repo_version (repo_version_id), - CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name) -); - -CREATE TABLE servicecomponent_version( - id BIGINT NOT NULL, - component_id BIGINT NOT NULL, - repo_version_id BIGINT NOT NULL, - state VARCHAR(32) NOT NULL, - user_name VARCHAR(255) NOT NULL, - CONSTRAINT PK_sc_version PRIMARY KEY (id), - CONSTRAINT FK_scv_component_id FOREIGN KEY (component_id) REFERENCES servicecomponentdesiredstate (id), - CONSTRAINT FK_scv_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id) + CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name), + CONSTRAINT FK_upgrade_hist_svc_grp_id FOREIGN KEY (service_group_id) REFERENCES servicegroups (id), + CONSTRAINT FK_upgrade_hist_src_mpack_id FOREIGN KEY (source_mpack_id) REFERENCES mpacks (id), + CONSTRAINT FK_upgrade_hist_tgt_mpack_id FOREIGN KEY (target_mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_upgrade_hist_srvc_grp UNIQUE (upgrade_id, service_group_id) ); CREATE TABLE ambari_operation_history( @@ -1300,6 +1309,8 @@ INSERT INTO ambari_sequences (sequence_name, sequence_value) union all select 'host_version_id_seq', 0 FROM SYSIBM.SYSDUMMY1 union all + select 'mpack_host_state_id_seq', 0 FROM SYSIBM.SYSDUMMY1 + union all select 'service_config_id_seq', 1 FROM SYSIBM.SYSDUMMY1 union all select 'upgrade_id_seq', 0 FROM SYSIBM.SYSDUMMY1 @@ -1352,8 +1363,6 @@ INSERT INTO ambari_sequences (sequence_name, sequence_value) union all select 'remote_cluster_service_id_seq', 0 FROM SYSIBM.SYSDUMMY1 union all - select 'servicecomponent_version_id_seq', 0 FROM SYSIBM.SYSDUMMY1 - union all select 'hostcomponentdesiredstate_id_seq', 0 FROM SYSIBM.SYSDUMMY1 union all select 'blueprint_service_id_seq', 0 FROM SYSIBM.SYSDUMMY1 diff --git a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql index c420286d3c5..1ca41884288 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql @@ -37,22 +37,22 @@ execute statement; DEALLOCATE PREPARE statement; CREATE TABLE registries ( - id BIGINT NOT NULL, - registry_name VARCHAR(255) NOT NULL, - registry_type VARCHAR(255) NOT NULL, - registry_uri VARCHAR(255) NOT NULL, - CONSTRAINT PK_registries PRIMARY KEY (id), - CONSTRAINT UQ_registry_name UNIQUE (registry_name)); + id BIGINT NOT NULL, + registry_name VARCHAR(255) NOT NULL, + registry_type VARCHAR(255) NOT NULL, + registry_uri VARCHAR(255) NOT NULL, + CONSTRAINT PK_registries PRIMARY KEY (id), + CONSTRAINT UQ_registry_name UNIQUE (registry_name)); CREATE TABLE mpacks ( - id BIGINT NOT NULL, - mpack_name VARCHAR(255) NOT NULL, - mpack_version VARCHAR(255) NOT NULL, - mpack_uri VARCHAR(255), - registry_id BIGINT, - CONSTRAINT PK_mpacks PRIMARY KEY (id), - CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version), - CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id)); + id BIGINT NOT NULL, + mpack_name VARCHAR(255) NOT NULL, + mpack_version VARCHAR(255) NOT NULL, + mpack_uri VARCHAR(255), + registry_id BIGINT, + CONSTRAINT PK_mpacks PRIMARY KEY (id), + CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version), + CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id)); CREATE TABLE stack ( stack_id BIGINT NOT NULL, @@ -63,6 +63,16 @@ CREATE TABLE stack ( CONSTRAINT FK_mpacks FOREIGN KEY (mpack_id) REFERENCES mpacks(id), CONSTRAINT UQ_stack UNIQUE (stack_name, stack_version)); +CREATE TABLE mpack_host_state ( + id BIGINT NOT NULL, + host_id BIGINT NOT NULL, + mpack_id BIGINT NOT NULL, + state VARCHAR(32) NOT NULL, + CONSTRAINT PK_mpack_host_state PRIMARY KEY (id), + CONSTRAINT FK_mhs_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id), + CONSTRAINT FK_mhs_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_mpack_host_state UNIQUE(host_id, mpack_id)); + CREATE TABLE extension( extension_id BIGINT NOT NULL, extension_name VARCHAR(100) NOT NULL, @@ -145,7 +155,8 @@ CREATE TABLE servicegroups ( stack_id BIGINT NOT NULL, CONSTRAINT PK_servicegroups PRIMARY KEY (id, cluster_id), CONSTRAINT FK_servicegroups_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id), - CONSTRAINT FK_servicegroups_stack_id FOREIGN KEY (stack_id) REFERENCES stack (stack_id)); + CONSTRAINT FK_servicegroups_stack_id FOREIGN KEY (stack_id) REFERENCES stack (stack_id), + CONSTRAINT UQ_TEMP_UNTIL_REAL_PK UNIQUE(id)); CREATE TABLE servicegroupdependencies ( id BIGINT NOT NULL, @@ -262,11 +273,13 @@ CREATE TABLE repo_version ( CREATE TABLE repo_os ( id BIGINT NOT NULL, - repo_version_id BIGINT NOT NULL, + repo_version_id BIGINT, + mpack_id BIGINT NOT NULL, family VARCHAR(255) NOT NULL DEFAULT '', ambari_managed TINYINT(1) DEFAULT 1, CONSTRAINT PK_repo_os_id PRIMARY KEY (id), - CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id)); + CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id), + CONSTRAINT FK_repo_os_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id)); CREATE TABLE repo_definition ( id BIGINT NOT NULL, @@ -1034,22 +1047,18 @@ CREATE TABLE upgrade_history( component_name VARCHAR(255) NOT NULL, from_repo_version_id BIGINT NOT NULL, target_repo_version_id BIGINT NOT NULL, + service_group_id BIGINT NOT NULL, + source_mpack_id BIGINT NOT NULL, + target_mpack_id BIGINT NOT NULL, CONSTRAINT PK_upgrade_hist PRIMARY KEY (id), CONSTRAINT FK_upgrade_hist_upgrade_id FOREIGN KEY (upgrade_id) REFERENCES upgrade (upgrade_id), CONSTRAINT FK_upgrade_hist_from_repo FOREIGN KEY (from_repo_version_id) REFERENCES repo_version (repo_version_id), CONSTRAINT FK_upgrade_hist_target_repo FOREIGN KEY (target_repo_version_id) REFERENCES repo_version (repo_version_id), - CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name) -); - -CREATE TABLE servicecomponent_version( - id BIGINT NOT NULL, - component_id BIGINT NOT NULL, - repo_version_id BIGINT NOT NULL, - state VARCHAR(32) NOT NULL, - user_name VARCHAR(255) NOT NULL, - CONSTRAINT PK_sc_version PRIMARY KEY (id), - CONSTRAINT FK_scv_component_id FOREIGN KEY (component_id) REFERENCES servicecomponentdesiredstate (id), - CONSTRAINT FK_scv_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id) + CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name), + CONSTRAINT FK_upgrade_hist_svc_grp_id FOREIGN KEY (service_group_id) REFERENCES servicegroups (id), + CONSTRAINT FK_upgrade_hist_src_mpack_id FOREIGN KEY (source_mpack_id) REFERENCES mpacks (id), + CONSTRAINT FK_upgrade_hist_tgt_mpack_id FOREIGN KEY (target_mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_upgrade_hist_srvc_grp UNIQUE (upgrade_id, service_group_id) ); CREATE TABLE ambari_operation_history( @@ -1271,6 +1280,7 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) VALUES ('privilege_id_seq', 1), ('config_id_seq', 1), ('host_version_id_seq', 0), + ('mpack_host_state_id_seq', 0), ('service_config_id_seq', 1), ('alert_definition_id_seq', 0), ('alert_group_id_seq', 0), @@ -1306,7 +1316,6 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) VALUES ('ambari_operation_history_id_seq', 0), ('remote_cluster_id_seq', 0), ('remote_cluster_service_id_seq', 0), - ('servicecomponent_version_id_seq', 0), ('hostcomponentdesiredstate_id_seq', 0), ('blueprint_service_id_seq', 0), ('blueprint_mpack_instance_id_seq', 0), diff --git a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql index 3bcba3f3717..975d0202d46 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql @@ -18,22 +18,22 @@ ------create tables--------- CREATE TABLE registries ( - id NUMBER(19) NOT NULL, - registry_name VARCHAR(255) NOT NULL, - registry_type VARCHAR(255) NOT NULL, - registry_uri VARCHAR(255) NOT NULL, - CONSTRAINT PK_registries PRIMARY KEY (id), - CONSTRAINT UQ_registry_name UNIQUE (registry_name)); + id NUMBER(19) NOT NULL, + registry_name VARCHAR(255) NOT NULL, + registry_type VARCHAR(255) NOT NULL, + registry_uri VARCHAR(255) NOT NULL, + CONSTRAINT PK_registries PRIMARY KEY (id), + CONSTRAINT UQ_registry_name UNIQUE (registry_name)); CREATE TABLE mpacks ( - id NUMBER(19) NOT NULL, - mpack_name VARCHAR(255) NOT NULL, - mpack_version VARCHAR(255) NOT NULL, - mpack_uri VARCHAR(255), - registry_id NUMBER(19), - CONSTRAINT PK_mpacks PRIMARY KEY (id), - CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version), - CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id)); + id NUMBER(19) NOT NULL, + mpack_name VARCHAR(255) NOT NULL, + mpack_version VARCHAR(255) NOT NULL, + mpack_uri VARCHAR(255), + registry_id NUMBER(19), + CONSTRAINT PK_mpacks PRIMARY KEY (id), + CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version), + CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id)); CREATE TABLE stack ( stack_id NUMBER(19) NOT NULL, @@ -44,6 +44,16 @@ CREATE TABLE stack ( CONSTRAINT FK_mpacks FOREIGN KEY (mpack_id) REFERENCES mpacks(id), CONSTRAINT UQ_stack UNIQUE (stack_name, stack_version)); +CREATE TABLE mpack_host_state ( + id NUMBER(19) NOT NULL, + host_id NUMBER(19) NOT NULL, + mpack_id NUMBER(19) NOT NULL, + state VARCHAR2(32) NOT NULL, + CONSTRAINT PK_mpack_host_state PRIMARY KEY (id), + CONSTRAINT FK_mhs_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id), + CONSTRAINT FK_mhs_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_mpack_host_state UNIQUE(host_id, mpack_id)); + CREATE TABLE extension( extension_id NUMERIC(19) NOT NULL, extension_name VARCHAR2(255) NOT NULL, @@ -198,7 +208,8 @@ CREATE TABLE serviceconfig ( CONSTRAINT PK_serviceconfig PRIMARY KEY (service_config_id), CONSTRAINT FK_serviceconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id), CONSTRAINT FK_serviceconfig_clstr_svc FOREIGN KEY (service_id, service_group_id, cluster_id) REFERENCES clusterservices (id, service_group_id, cluster_id), - CONSTRAINT UQ_scv_service_version UNIQUE (cluster_id, service_id, version)); + CONSTRAINT UQ_scv_service_version UNIQUE (cluster_id, service_id, version), + CONSTRAINT UQ_TEMP_UNTIL_REAL_PK UNIQUE(id)); CREATE TABLE serviceconfighosts ( service_config_id NUMBER(19) NOT NULL, @@ -242,11 +253,13 @@ CREATE TABLE repo_version ( CREATE TABLE repo_os ( id NUMBER(19) NOT NULL, - repo_version_id NUMBER(19) NOT NULL, + repo_version_id NUMBER(19), + mpack_id NUMBER(19) NOT NULL, family VARCHAR(255) DEFAULT '' NOT NULL, ambari_managed NUMBER(1) DEFAULT 1, CONSTRAINT PK_repo_os_id PRIMARY KEY (id), - CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id)); + CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id), + CONSTRAINT FK_repo_os_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id)); CREATE TABLE repo_definition ( id NUMBER(19) NOT NULL, @@ -1012,22 +1025,18 @@ CREATE TABLE upgrade_history( component_name VARCHAR2(255) NOT NULL, from_repo_version_id NUMBER(19) NOT NULL, target_repo_version_id NUMBER(19) NOT NULL, + service_group_id NUMBER(19) NOT NULL, + source_mpack_id NUMBER(19) NOT NULL, + target_mpack_id NUMBER(19) NOT NULL, CONSTRAINT PK_upgrade_hist PRIMARY KEY (id), CONSTRAINT FK_upgrade_hist_upgrade_id FOREIGN KEY (upgrade_id) REFERENCES upgrade (upgrade_id), CONSTRAINT FK_upgrade_hist_from_repo FOREIGN KEY (from_repo_version_id) REFERENCES repo_version (repo_version_id), CONSTRAINT FK_upgrade_hist_target_repo FOREIGN KEY (target_repo_version_id) REFERENCES repo_version (repo_version_id), - CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name) -); - -CREATE TABLE servicecomponent_version( - id NUMBER(19) NOT NULL, - component_id NUMBER(19) NOT NULL, - repo_version_id NUMBER(19) NOT NULL, - state VARCHAR2(32) NOT NULL, - user_name VARCHAR2(255) NOT NULL, - CONSTRAINT PK_sc_version PRIMARY KEY (id), - CONSTRAINT FK_scv_component_id FOREIGN KEY (component_id) REFERENCES servicecomponentdesiredstate (id), - CONSTRAINT FK_scv_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id) + CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name), + CONSTRAINT FK_upgrade_hist_svc_grp_id FOREIGN KEY (service_group_id) REFERENCES servicegroups (id), + CONSTRAINT FK_upgrade_hist_src_mpack_id FOREIGN KEY (source_mpack_id) REFERENCES mpacks (id), + CONSTRAINT FK_upgrade_hist_tgt_mpack_id FOREIGN KEY (target_mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_upgrade_hist_srvc_grp UNIQUE (upgrade_id, service_group_id) ); CREATE TABLE ambari_operation_history( @@ -1249,6 +1258,7 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('permission_ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('privilege_id_seq', 1); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('config_id_seq', 1); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('host_version_id_seq', 0); +INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('mpack_host_state_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('service_config_id_seq', 1); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('alert_definition_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('alert_group_id_seq', 0); @@ -1284,7 +1294,6 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('blueprint_s INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('ambari_operation_history_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_cluster_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_cluster_service_id_seq', 0); -INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('servicecomponent_version_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostcomponentdesiredstate_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('blueprint_service_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('blueprint_mpack_instance_id_seq', 0); diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql index d211f4932b0..2fcfaa72090 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql @@ -139,7 +139,7 @@ CREATE TABLE servicegroups ( CONSTRAINT PK_servicegroups PRIMARY KEY (id, cluster_id), CONSTRAINT FK_servicegroups_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id), CONSTRAINT FK_servicegroups_stack_id FOREIGN KEY (stack_id) REFERENCES stack (stack_id), - CONSTRAINT UQ_WTF UNIQUE(id)); + CONSTRAINT UQ_TEMP_UNTIL_REAL_PK UNIQUE(id)); CREATE TABLE servicegroupdependencies ( id BIGINT NOT NULL, diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql index e9897b109b8..7f0373adef5 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql @@ -17,22 +17,22 @@ -- CREATE TABLE registries ( - id NUMERIC(19) NOT NULL, - registry_name VARCHAR(255) NOT NULL, - registry_type VARCHAR(255) NOT NULL, - registry_uri VARCHAR(255) NOT NULL, - CONSTRAINT PK_registries PRIMARY KEY (id), - CONSTRAINT UQ_registry_name UNIQUE (registry_name)); + id NUMERIC(19) NOT NULL, + registry_name VARCHAR(255) NOT NULL, + registry_type VARCHAR(255) NOT NULL, + registry_uri VARCHAR(255) NOT NULL, + CONSTRAINT PK_registries PRIMARY KEY (id), + CONSTRAINT UQ_registry_name UNIQUE (registry_name)); CREATE TABLE mpacks ( - id NUMERIC(19) NOT NULL, - mpack_name VARCHAR(255) NOT NULL, - mpack_version VARCHAR(255) NOT NULL, - mpack_uri VARCHAR(255), - registry_id BIGINT, - CONSTRAINT PK_mpacks PRIMARY KEY (id), - CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version), - CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id)); + id NUMERIC(19) NOT NULL, + mpack_name VARCHAR(255) NOT NULL, + mpack_version VARCHAR(255) NOT NULL, + mpack_uri VARCHAR(255), + registry_id BIGINT, + CONSTRAINT PK_mpacks PRIMARY KEY (id), + CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version), + CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id)); CREATE TABLE stack ( stack_id NUMERIC(19) NOT NULL, @@ -43,6 +43,16 @@ CREATE TABLE stack ( CONSTRAINT FK_mpacks FOREIGN KEY (mpack_id) REFERENCES mpacks(id), CONSTRAINT UQ_stack UNIQUE (stack_name, stack_version)); +CREATE TABLE mpack_host_state ( + id NUMERIC(19) NOT NULL, + host_id NUMERIC(19) NOT NULL, + mpack_id NUMERIC(19) NOT NULL, + state VARCHAR(32) NOT NULL, + CONSTRAINT PK_mpack_host_state PRIMARY KEY (id), + CONSTRAINT FK_mhs_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id), + CONSTRAINT FK_mhs_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_mpack_host_state UNIQUE(host_id, mpack_id)); + CREATE TABLE extension( extension_id NUMERIC(19) NOT NULL, extension_name VARCHAR(255) NOT NULL, @@ -125,7 +135,8 @@ CREATE TABLE servicegroups ( stack_id NUMERIC(19) NOT NULL, CONSTRAINT PK_servicegroups PRIMARY KEY (id, cluster_id), CONSTRAINT FK_servicegroups_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id), - CONSTRAINT FK_servicegroups_stack_id FOREIGN KEY (stack_id) REFERENCES stack (stack_id)); + CONSTRAINT FK_servicegroups_stack_id FOREIGN KEY (stack_id) REFERENCES stack (stack_id), + CONSTRAINT UQ_TEMP_UNTIL_REAL_PK UNIQUE(id)); CREATE TABLE servicegroupdependencies ( id NUMBER(19) NOT NULL, @@ -241,11 +252,13 @@ CREATE TABLE repo_version ( CREATE TABLE repo_os ( id NUMERIC(19) NOT NULL, - repo_version_id NUMERIC(19) NOT NULL, + repo_version_id NUMERIC(19), + mpack_id NUMERIC(19) NOT NULL, family VARCHAR(255) NOT NULL DEFAULT '', ambari_managed SMALLINT DEFAULT 1, CONSTRAINT PK_repo_os_id PRIMARY KEY (id), - CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id)); + CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id), + CONSTRAINT FK_repo_os_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id)); CREATE TABLE repo_definition ( id NUMERIC(19) NOT NULL, @@ -1006,28 +1019,24 @@ CREATE TABLE upgrade_item ( ); CREATE TABLE upgrade_history( - id BIGINT NOT NULL, - upgrade_id BIGINT NOT NULL, + id NUMERIC(19) NOT NULL, + upgrade_id NUMERIC(19) NOT NULL, service_name VARCHAR(255) NOT NULL, component_name VARCHAR(255) NOT NULL, - from_repo_version_id BIGINT NOT NULL, - target_repo_version_id BIGINT NOT NULL, + from_repo_version_id NUMERIC(19) NOT NULL, + target_repo_version_id NUMERIC(19) NOT NULL, + service_group_id NUMERIC(19) NOT NULL, + source_mpack_id NUMERIC(19) NOT NULL, + target_mpack_id NUMERIC(19) NOT NULL, CONSTRAINT PK_upgrade_hist PRIMARY KEY (id), CONSTRAINT FK_upgrade_hist_upgrade_id FOREIGN KEY (upgrade_id) REFERENCES upgrade (upgrade_id), CONSTRAINT FK_upgrade_hist_from_repo FOREIGN KEY (from_repo_version_id) REFERENCES repo_version (repo_version_id), CONSTRAINT FK_upgrade_hist_target_repo FOREIGN KEY (target_repo_version_id) REFERENCES repo_version (repo_version_id), - CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name) -); - -CREATE TABLE servicecomponent_version( - id NUMERIC(19) NOT NULL, - component_id NUMERIC(19) NOT NULL, - repo_version_id NUMERIC(19) NOT NULL, - state VARCHAR(32) NOT NULL, - user_name VARCHAR(255) NOT NULL, - CONSTRAINT PK_sc_version PRIMARY KEY (id), - CONSTRAINT FK_scv_component_id FOREIGN KEY (component_id) REFERENCES servicecomponentdesiredstate (id), - CONSTRAINT FK_scv_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id) + CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name), + CONSTRAINT FK_upgrade_hist_svc_grp_id FOREIGN KEY (service_group_id) REFERENCES servicegroups (id), + CONSTRAINT FK_upgrade_hist_src_mpack_id FOREIGN KEY (source_mpack_id) REFERENCES mpacks (id), + CONSTRAINT FK_upgrade_hist_tgt_mpack_id FOREIGN KEY (target_mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_upgrade_hist_srvc_grp UNIQUE (upgrade_id, service_group_id) ); CREATE TABLE ambari_operation_history( @@ -1249,6 +1258,7 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('permission_ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('privilege_id_seq', 1); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('config_id_seq', 1); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('host_version_id_seq', 0); +INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('mpack_host_state_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('service_config_id_seq', 1); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('alert_definition_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('alert_group_id_seq', 0); @@ -1284,7 +1294,6 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('blueprint_s INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('ambari_operation_history_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_cluster_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_cluster_service_id_seq', 0); -INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('servicecomponent_version_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostcomponentdesiredstate_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('blueprint_service_id_seq', 0); INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('blueprint_mpack_instance_id_seq', 0); diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql index 94f00f0da10..fdf6e470504 100644 --- a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql +++ b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql @@ -30,22 +30,22 @@ sqlcmd -S localhost\SQLEXPRESS -i C:\app\ambari-server-1.3.0-SNAPSHOT\resources\ ------create tables and grant privileges to db user--------- CREATE TABLE registries ( - id BIGINT NOT NULL, - registry_name VARCHAR(255) NOT NULL, - registry_type VARCHAR(255) NOT NULL, - registry_uri VARCHAR(255) NOT NULL, - CONSTRAINT PK_registries PRIMARY KEY (id), - CONSTRAINT UQ_registry_name UNIQUE (registry_name)); + id BIGINT NOT NULL, + registry_name VARCHAR(255) NOT NULL, + registry_type VARCHAR(255) NOT NULL, + registry_uri VARCHAR(255) NOT NULL, + CONSTRAINT PK_registries PRIMARY KEY (id), + CONSTRAINT UQ_registry_name UNIQUE (registry_name)); CREATE TABLE mpacks ( - id BIGINT NOT NULL, - mpack_name VARCHAR(255) NOT NULL, - mpack_version VARCHAR(255) NOT NULL, - mpack_uri VARCHAR(255), - registry_id BIGINT, - CONSTRAINT PK_mpacks PRIMARY KEY (id), - CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version), - CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id)); + id BIGINT NOT NULL, + mpack_name VARCHAR(255) NOT NULL, + mpack_version VARCHAR(255) NOT NULL, + mpack_uri VARCHAR(255), + registry_id BIGINT, + CONSTRAINT PK_mpacks PRIMARY KEY (id), + CONSTRAINT UQ_mpack_name_version UNIQUE(mpack_name, mpack_version), + CONSTRAINT FK_registries FOREIGN KEY (registry_id) REFERENCES registries(id)); CREATE TABLE stack ( stack_id BIGINT NOT NULL, @@ -56,6 +56,16 @@ CREATE TABLE stack ( CONSTRAINT FK_mpacks FOREIGN KEY (mpack_id) REFERENCES mpacks(id), CONSTRAINT UQ_stack UNIQUE (stack_name, stack_version)); +CREATE TABLE mpack_host_state ( + id BIGINT NOT NULL, + host_id BIGINT NOT NULL, + mpack_id BIGINT NOT NULL, + state VARCHAR(32) NOT NULL, + CONSTRAINT PK_mpack_host_state PRIMARY KEY (id), + CONSTRAINT FK_mhs_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id), + CONSTRAINT FK_mhs_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_mpack_host_state UNIQUE(host_id, mpack_id)); + CREATE TABLE extension( extension_id BIGINT NOT NULL, extension_name VARCHAR(255) NOT NULL, @@ -139,7 +149,8 @@ CREATE TABLE servicegroups ( cluster_id BIGINT NOT NULL, CONSTRAINT PK_servicegroups PRIMARY KEY (id, cluster_id), CONSTRAINT FK_servicegroups_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id), - CONSTRAINT FK_servicegroups_stack_id FOREIGN KEY (stack_id) REFERENCES stack (stack_id)); + CONSTRAINT FK_servicegroups_stack_id FOREIGN KEY (stack_id) REFERENCES stack (stack_id), + CONSTRAINT UQ_TEMP_UNTIL_REAL_PK UNIQUE(id)); CREATE TABLE servicegroupdependencies ( id BIGINT NOT NULL, @@ -255,11 +266,13 @@ CREATE TABLE repo_version ( CREATE TABLE repo_os ( id BIGINT NOT NULL, - repo_version_id BIGINT NOT NULL, + repo_version_id BIGINT, + mpack_id BIGINT NOT NULL, family VARCHAR(255) NOT NULL DEFAULT '', ambari_managed BIT DEFAULT 1, CONSTRAINT PK_repo_os_id PRIMARY KEY (id), - CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id)); + CONSTRAINT FK_repo_os_id_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id), + CONSTRAINT FK_repo_os_mpack_id FOREIGN KEY (mpack_id) REFERENCES mpacks (id)); CREATE TABLE repo_definition ( id BIGINT NOT NULL, @@ -1034,22 +1047,18 @@ CREATE TABLE upgrade_history( component_name VARCHAR(255) NOT NULL, from_repo_version_id BIGINT NOT NULL, target_repo_version_id BIGINT NOT NULL, + service_group_id BIGINT NOT NULL, + source_mpack_id BIGINT NOT NULL, + target_mpack_id BIGINT NOT NULL, CONSTRAINT PK_upgrade_hist PRIMARY KEY (id), CONSTRAINT FK_upgrade_hist_upgrade_id FOREIGN KEY (upgrade_id) REFERENCES upgrade (upgrade_id), CONSTRAINT FK_upgrade_hist_from_repo FOREIGN KEY (from_repo_version_id) REFERENCES repo_version (repo_version_id), CONSTRAINT FK_upgrade_hist_target_repo FOREIGN KEY (target_repo_version_id) REFERENCES repo_version (repo_version_id), - CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name) -); - -CREATE TABLE servicecomponent_version( - id BIGINT NOT NULL, - component_id BIGINT NOT NULL, - repo_version_id BIGINT NOT NULL, - state VARCHAR(32) NOT NULL, - user_name VARCHAR(255) NOT NULL, - CONSTRAINT PK_sc_version PRIMARY KEY (id), - CONSTRAINT FK_scv_component_id FOREIGN KEY (component_id) REFERENCES servicecomponentdesiredstate (id), - CONSTRAINT FK_scv_repo_version_id FOREIGN KEY (repo_version_id) REFERENCES repo_version (repo_version_id) + CONSTRAINT UQ_upgrade_hist UNIQUE (upgrade_id, component_name, service_name), + CONSTRAINT FK_upgrade_hist_svc_grp_id FOREIGN KEY (service_group_id) REFERENCES servicegroups (id), + CONSTRAINT FK_upgrade_hist_src_mpack_id FOREIGN KEY (source_mpack_id) REFERENCES mpacks (id), + CONSTRAINT FK_upgrade_hist_tgt_mpack_id FOREIGN KEY (target_mpack_id) REFERENCES mpacks (id), + CONSTRAINT UQ_upgrade_hist_srvc_grp UNIQUE (upgrade_id, service_group_id) ); CREATE TABLE ambari_operation_history( @@ -1285,6 +1294,7 @@ BEGIN TRANSACTION ('repo_os_id_seq', 0), ('repo_definition_id_seq', 0), ('host_version_id_seq', 0), + ('mpack_host_state_id_seq', 0), ('service_config_id_seq', 1), ('upgrade_id_seq', 0), ('upgrade_group_id_seq', 0), @@ -1311,7 +1321,6 @@ BEGIN TRANSACTION ('ambari_operation_history_id_seq', 0), ('remote_cluster_id_seq', 0), ('remote_cluster_service_id_seq', 0), - ('servicecomponent_version_id_seq', 0), ('hostcomponentdesiredstate_id_seq', 0), ('blueprint_service_id_seq', 0), ('blueprint_mpack_instance_id_seq', 0), From cdb91754a7c8e7b3458c49b596d3948d8462206c Mon Sep 17 00:00:00 2001 From: Jonathan Hurley Date: Thu, 1 Mar 2018 11:45:05 -0500 Subject: [PATCH 3/3] AMBARI-23107 - Addressed Nate's comments on formatting and equals()/hashCode() --- .../ExecutionCommandWrapper.java | 8 +-- .../org/apache/ambari/server/state/Mpack.java | 70 +++++++------------ 2 files changed, 31 insertions(+), 47 deletions(-) diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java index ad383aee517..5370bb08b55 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java @@ -141,7 +141,7 @@ public ExecutionCommand getExecutionCommand() { return executionCommand; } - if( null == jsonExecutionCommand ){ + if (null == jsonExecutionCommand) { throw new RuntimeException( "Invalid ExecutionCommandWrapper, both object and string representations are null"); } @@ -309,11 +309,11 @@ public void setVersions(Cluster cluster) { moduleComponent = mpack.getModuleComponent(serviceName, componentName); } - if( null != moduleComponent ) { + if (null != moduleComponent) { if (!commandParams.containsKey(VERSION) && executionCommand.getRoleCommand() != RoleCommand.INSTALL) { - commandParams.put(VERSION, moduleComponent.getVersion()); - } + commandParams.put(VERSION, moduleComponent.getVersion()); + } } if (null != stackEntity) { diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java index 2dd86565435..93b9a2d6949 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java @@ -19,10 +19,12 @@ import java.util.List; import java.util.Map; +import java.util.Objects; import org.apache.ambari.server.stack.RepoUtil; import org.apache.ambari.server.state.stack.RepositoryXml; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.builder.EqualsBuilder; import com.google.gson.annotations.SerializedName; @@ -197,9 +199,9 @@ public Module getModule(String moduleName) { * @return the component or {@code null}. */ public ModuleComponent getModuleComponent(String moduleName, String moduleComponentName) { - for( Module module : modules ) { + for (Module module : modules) { ModuleComponent moduleComponent = module.getModuleComponent(moduleComponentName); - if( null != moduleComponent ) { + if (null != moduleComponent) { return moduleComponent; } } @@ -207,60 +209,42 @@ public ModuleComponent getModuleComponent(String moduleName, String moduleCompon return null; } + /** + * {@inheritDoc} + */ @Override public boolean equals(Object o) { if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } - Mpack mpack = (Mpack) o; - - if (!resourceId.equals(mpack.resourceId)) { - return false; - } - if (registryId != null ? !registryId.equals(mpack.registryId) : mpack.registryId != null) { - return false; - } - if (!mpackId.equals(mpack.mpackId)) { - return false; - } - if (!name.equals(mpack.name)) { - return false; - } - if (!version.equals(mpack.version)) { - return false; - } - if (!prerequisites.equals(mpack.prerequisites)) { - return false; - } - if (!modules.equals(mpack.modules)) { - return false; - } - if (!definition.equals(mpack.definition)) { - return false; - } - if (!description.equals(mpack.description)) { - return false; - } - return mpackUri.equals(mpack.mpackUri); + Mpack that = (Mpack) o; + EqualsBuilder equalsBuilder = new EqualsBuilder(); + equalsBuilder.append(resourceId, that.resourceId); + equalsBuilder.append(registryId, that.registryId); + equalsBuilder.append(mpackId, that.mpackId); + equalsBuilder.append(name, that.name); + equalsBuilder.append(version, that.version); + equalsBuilder.append(prerequisites, that.prerequisites); + equalsBuilder.append(modules, that.modules); + equalsBuilder.append(definition, that.definition); + equalsBuilder.append(description, that.description); + equalsBuilder.append(mpackUri, that.mpackUri); + + return equalsBuilder.isEquals(); } + /** + * {@inheritDoc} + */ @Override public int hashCode() { - int result = resourceId.hashCode(); - result = 31 * result + (registryId != null ? registryId.hashCode() : 0); - result = 31 * result + mpackId.hashCode(); - result = 31 * result + name.hashCode(); - result = 31 * result + version.hashCode(); - result = 31 * result + prerequisites.hashCode(); - result = 31 * result + modules.hashCode(); - result = 31 * result + definition.hashCode(); - result = 31 * result + description.hashCode(); - result = 31 * result + mpackUri.hashCode(); - return result; + return Objects.hash(resourceId, registryId, mpackId, name, version, prerequisites, modules, + definition, description, mpackUri); } @Override