AMBARI-22318 repositoryFile entity populating for wrong repository for RU (dgrinenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/18c4af48 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/18c4af48 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/18c4af48 Branch: refs/heads/trunk Commit: 18c4af48c8f409fa083172df6b04e94d010d8410 Parents: 365c91e Author: Dmytro Grinenko <[email protected]> Authored: Fri Nov 17 10:23:55 2017 +0200 Committer: Dmytro Grinenko <[email protected]> Committed: Fri Nov 17 10:23:55 2017 +0200 ---------------------------------------------------------------------- .../actionmanager/ExecutionCommandWrapper.java | 35 +++ .../ambari/server/agent/CommandRepository.java | 2 +- .../controller/ActionExecutionContext.java | 6 +- .../controller/AmbariActionExecutionHelper.java | 71 +---- .../AmbariCustomCommandExecutionHelper.java | 257 +-------------- .../AmbariManagementControllerImpl.java | 14 +- .../ClusterStackVersionResourceProvider.java | 16 +- .../HostStackVersionResourceProvider.java | 3 +- .../stack/upgrade/RepositoryVersionHelper.java | 314 +++++++++++++++++-- .../AmbariCustomCommandExecutionHelperTest.java | 13 +- .../AmbariManagementControllerTest.java | 176 +++++------ ...ClusterStackVersionResourceProviderTest.java | 51 ++- .../internal/UpgradeResourceProviderTest.java | 12 +- .../apache/ambari/server/orm/OrmTestHelper.java | 4 +- 14 files changed, 530 insertions(+), 444 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/18c4af48/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java ---------------------------------------------------------------------- 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 ff13d0b..a0c5f26 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 @@ -31,15 +31,19 @@ import org.apache.ambari.server.ClusterNotFoundException; import org.apache.ambari.server.RoleCommand; import org.apache.ambari.server.ServiceNotFoundException; import org.apache.ambari.server.agent.AgentCommand.AgentCommandType; +import org.apache.ambari.server.agent.CommandRepository; import org.apache.ambari.server.agent.ExecutionCommand; import org.apache.ambari.server.api.services.AmbariMetaInfo; +import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.orm.dao.HostRoleCommandDAO; +import org.apache.ambari.server.orm.entities.OperatingSystemEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; 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.Service; import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceInfo; @@ -48,6 +52,7 @@ import org.apache.ambari.server.state.StackInfo; import org.apache.ambari.server.state.UpgradeContext; import org.apache.ambari.server.state.UpgradeContext.UpgradeSummary; import org.apache.ambari.server.state.UpgradeContextFactory; +import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; @@ -79,6 +84,9 @@ public class ExecutionCommandWrapper { @Inject private UpgradeContextFactory upgradeContextFactory; + @Inject + private RepositoryVersionHelper repoVersionHelper; + /** * Used for injecting hooks and common-services into the command. */ @@ -215,9 +223,36 @@ public class ExecutionCommandWrapper { if (null != upgrade) { UpgradeContext upgradeContext = upgradeContextFactory.create(cluster, upgrade); UpgradeSummary upgradeSummary = upgradeContext.getUpgradeSummary(); + executionCommand.setUpgradeSummary(upgradeSummary); } + // 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) { + final CommandRepository commandRepository; + final Service service = cluster.getService(serviceName); + final String componentName = executionCommand.getComponentName(); + + try { + + if (null != componentName) { + ServiceComponent serviceComponent = service.getServiceComponent(componentName); + commandRepository = repoVersionHelper.getCommandRepository(null, serviceComponent, host); + } else { + RepositoryVersionEntity repoVersion = service.getDesiredRepositoryVersion(); + OperatingSystemEntity osEntity = repoVersionHelper.getOSEntityForHost(host, repoVersion); + commandRepository = repoVersionHelper.getCommandRepository(repoVersion, osEntity); + } + executionCommand.setRepositoryFile(commandRepository); + + } catch (SystemException e) { + throw new RuntimeException(e); + } + } + } catch (ClusterNotFoundException cnfe) { // it's possible that there are commands without clusters; in such cases, // just return the de-serialized command and don't try to read configs http://git-wip-us.apache.org/repos/asf/ambari/blob/18c4af48/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java ---------------------------------------------------------------------- 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 a70326e..449d2d5 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 @@ -51,7 +51,7 @@ public class CommandRepository { private String m_repoFileName; @SerializedName("feature") - private CommandRepositoryFeature feature = new CommandRepositoryFeature(); + private final CommandRepositoryFeature feature = new CommandRepositoryFeature(); /** * Provides {@link CommandRepository} feature http://git-wip-us.apache.org/repos/asf/ambari/blob/18c4af48/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java ---------------------------------------------------------------------- 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 5d71869..e94defc 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 @@ -262,12 +262,12 @@ public class ActionExecutionContext { } /** + * * Interface that allows a final attempt to setting values on an {@link ExecutionCommand} - * @author ncole * */ - public static interface ExecutionCommandVisitor { - public void visit(ExecutionCommand command); + public interface ExecutionCommandVisitor { + void visit(ExecutionCommand command); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/18c4af48/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java ---------------------------------------------------------------------- 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 0a43732..23c2297 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 @@ -22,11 +22,8 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AGENT_STA import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AGENT_STACK_RETRY_ON_UNAVAILABILITY; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMMAND_TIMEOUT; import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.COMPONENT_CATEGORY; -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; -import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_VERSION; import java.util.HashSet; import java.util.List; @@ -46,9 +43,9 @@ import org.apache.ambari.server.agent.ExecutionCommand.KeyNames; import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.controller.internal.RequestResourceFilter; +import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.customactions.ActionDefinition; import org.apache.ambari.server.orm.entities.OperatingSystemEntity; -import org.apache.ambari.server.orm.entities.RepositoryEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; @@ -58,6 +55,7 @@ import org.apache.ambari.server.state.ServiceComponent; 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; @@ -65,8 +63,6 @@ import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -78,6 +74,7 @@ public class AmbariActionExecutionHelper { private final static Logger LOG = LoggerFactory.getLogger(AmbariActionExecutionHelper.class); private static final String TYPE_PYTHON = "PYTHON"; + private static final String ACTION_FILE_EXTENSION = "py"; private static final String ACTION_UPDATE_REPO = "update_repo"; private static final String SUCCESS_FACTOR_PARAMETER = "success_factor"; @@ -85,15 +82,23 @@ public class AmbariActionExecutionHelper { @Inject private Clusters clusters; + @Inject private AmbariManagementController managementController; + @Inject private AmbariMetaInfo ambariMetaInfo; + @Inject private MaintenanceStateHelper maintenanceStateHelper; + @Inject private Configuration configs; + @Inject + private RepositoryVersionHelper repoVersionHelper; + + /** * Validates the request to execute an action. * @param actionRequest @@ -417,7 +422,7 @@ public class AmbariActionExecutionHelper { commandParams.put(KeyNames.LOG_OUTPUT, requestParams.get(KeyNames.LOG_OUTPUT)); } - commandParams.put(SCRIPT, actionName + ".py"); + commandParams.put(SCRIPT, actionName + "." + ACTION_FILE_EXTENSION); commandParams.put(SCRIPT_TYPE, TYPE_PYTHON); StageUtils.useAmbariJdkInCommandParams(commandParams, configs); @@ -465,10 +470,10 @@ public class AmbariActionExecutionHelper { if (StringUtils.isNotBlank(serviceName)) { Service service = cluster.getService(serviceName); - addRepoInfoToHostLevelParams(actionContext, service.getDesiredRepositoryVersion(), + repoVersionHelper.addRepoInfoToHostLevelParams(cluster, actionContext, service.getDesiredRepositoryVersion(), hostLevelParams, hostName); } else { - addRepoInfoToHostLevelParams(actionContext, null, hostLevelParams, hostName); + repoVersionHelper.addRepoInfoToHostLevelParams(cluster, actionContext, null, hostLevelParams, hostName); } @@ -526,52 +531,4 @@ public class AmbariActionExecutionHelper { } } - /* - * This method builds and adds repo info - * to hostLevelParams of action - * - * */ - - private void addRepoInfoToHostLevelParams(ActionExecutionContext actionContext, - RepositoryVersionEntity repositoryVersion, Map<String, String> hostLevelParams, - 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(STACK_NAME, stackId.getStackName()); - hostLevelParams.put(STACK_VERSION, stackId.getStackVersion()); - } - - return; - } else { - StackId stackId = repositoryVersion.getStackId(); - hostLevelParams.put(STACK_NAME, stackId.getStackName()); - hostLevelParams.put(STACK_VERSION, stackId.getStackVersion()); - } - - JsonObject rootJsonObject = new JsonObject(); - JsonArray repositories = new JsonArray(); - - String hostOsFamily = clusters.getHost(hostName).getOsFamily(); - for (OperatingSystemEntity operatingSystemEntity : repositoryVersion.getOperatingSystems()) { - // ostype in OperatingSystemEntity it's os family. That should be fixed - // in OperatingSystemEntity. - if (operatingSystemEntity.getOsType().equals(hostOsFamily)) { - for (RepositoryEntity repositoryEntity : operatingSystemEntity.getRepositories()) { - JsonObject repositoryInfo = new JsonObject(); - repositoryInfo.addProperty("base_url", repositoryEntity.getBaseUrl()); - repositoryInfo.addProperty("repo_name", repositoryEntity.getName()); - repositoryInfo.addProperty("repo_id", repositoryEntity.getRepositoryId()); - - repositories.add(repositoryInfo); - } - rootJsonObject.add("repositories", repositories); - } - } - hostLevelParams.put(REPO_INFO, rootJsonObject.toString()); - } } http://git-wip-us.apache.org/repos/asf/ambari/blob/18c4af48/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java ---------------------------------------------------------------------- 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 dc6bbb7..9f95f7a 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 @@ -53,8 +53,6 @@ import java.util.Random; import java.util.Set; import java.util.TreeMap; -import org.apache.ambari.annotations.Experimental; -import org.apache.ambari.annotations.ExperimentalFeature; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.Role; import org.apache.ambari.server.RoleCommand; @@ -62,7 +60,6 @@ import org.apache.ambari.server.actionmanager.HostRoleCommand; import org.apache.ambari.server.actionmanager.HostRoleStatus; import org.apache.ambari.server.actionmanager.Stage; import org.apache.ambari.server.agent.AgentCommand.AgentCommandType; -import org.apache.ambari.server.agent.CommandRepository; import org.apache.ambari.server.agent.ExecutionCommand; import org.apache.ambari.server.agent.ExecutionCommand.KeyNames; import org.apache.ambari.server.api.services.AmbariMetaInfo; @@ -70,11 +67,9 @@ import org.apache.ambari.server.configuration.Configuration; 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.orm.entities.OperatingSystemEntity; -import org.apache.ambari.server.orm.entities.RepositoryEntity; -import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.CommandScriptDefinition; @@ -90,7 +85,6 @@ import org.apache.ambari.server.state.MaintenanceState; import org.apache.ambari.server.state.PropertyInfo; import org.apache.ambari.server.state.PropertyInfo.PropertyType; import org.apache.ambari.server.state.RefreshCommandConfiguration; -import org.apache.ambari.server.state.RepositoryInfo; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.ServiceComponent; import org.apache.ambari.server.state.ServiceComponentHost; @@ -99,6 +93,7 @@ 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.stack.OsFamily; +import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; import org.apache.ambari.server.state.svccomphost.ServiceComponentHostOpInProgressEvent; import org.apache.ambari.server.utils.StageUtils; import org.apache.commons.lang.StringUtils; @@ -106,11 +101,7 @@ import org.apache.commons.lang.math.NumberUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Function; import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -175,6 +166,9 @@ public class AmbariCustomCommandExecutionHelper { @Inject private HostRoleCommandDAO hostRoleCommandDAO; + @Inject + private RepositoryVersionHelper repoVersionHelper; + private Map<String, Map<String, Map<String, String>>> configCredentialsForService = new HashMap<>(); protected static final String SERVICE_CHECK_COMMAND_NAME = "SERVICE_CHECK"; @@ -413,7 +407,11 @@ public class AmbariCustomCommandExecutionHelper { hostLevelParams.put(CUSTOM_COMMAND, commandName); // Set parameters required for re-installing clients on restart - hostLevelParams.put(REPO_INFO, getRepoInfo(cluster, component, host)); + 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()); @@ -521,8 +519,6 @@ public class AmbariCustomCommandExecutionHelper { execCmd.setCommandParams(commandParams); execCmd.setRoleParams(roleParams); - execCmd.setRepositoryFile(getCommandRepository(cluster, component, host)); - // perform any server side command related logic - eg - set desired states on restart applyCustomCommandBackendLogic(cluster, serviceName, componentName, commandName, hostName); } @@ -848,7 +844,8 @@ public class AmbariCustomCommandExecutionHelper { * calls into the implementation of a custom command */ private void addDecommissionAction(final ActionExecutionContext actionExecutionContext, - final RequestResourceFilter resourceFilter, Stage stage, ExecuteCommandJson executeCommandJson) throws AmbariException { + final RequestResourceFilter resourceFilter, Stage stage, ExecuteCommandJson executeCommandJson) + throws AmbariException { String clusterName = actionExecutionContext.getClusterName(); final Cluster cluster = clusters.getCluster(clusterName); @@ -1145,7 +1142,8 @@ public class AmbariCustomCommandExecutionHelper { * @throws AmbariException if the commands can not be added */ public void addExecutionCommandsToStage(ActionExecutionContext actionExecutionContext, - Stage stage, Map<String, String> requestParams, ExecuteCommandJson executeCommandJson) throws AmbariException { + Stage stage, Map<String, String> requestParams, ExecuteCommandJson executeCommandJson) + throws AmbariException { List<RequestResourceFilter> resourceFilters = actionExecutionContext.getResourceFilters(); @@ -1209,216 +1207,6 @@ public class AmbariCustomCommandExecutionHelper { } } - /** - * 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 AmbariException if the repository information can not be obtained - */ - @Deprecated - public String getRepoInfo(Cluster cluster, ServiceComponent component, Host host) throws AmbariException { - - Function<List<RepositoryInfo>, JsonArray> function = new Function<List<RepositoryInfo>, JsonArray>() { - @Override - public JsonArray apply(List<RepositoryInfo> input) { - return null == input ? null : (JsonArray) gson.toJsonTree(input); - } - }; - - final JsonArray gsonList = getBaseUrls(cluster, component, host, function); - - if (null == gsonList) { - return ""; - } - - BaseUrlUpdater<JsonArray> updater = new BaseUrlUpdater<JsonArray>(gsonList) { - @Override - public JsonArray apply(final RepositoryVersionEntity rve) { - - JsonArray result = new JsonArray(); - - for (JsonElement e : gsonList) { - JsonObject obj = e.getAsJsonObject(); - - 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 (OperatingSystemEntity ose : rve.getOperatingSystems()) { - if (ose.getOsType().equals(osType) && ose.isAmbariManagedRepos()) { - for (RepositoryEntity re : ose.getRepositories()) { - if (re.getName().equals(repoName) && - !re.getBaseUrl().equals(baseUrl)) { - obj.addProperty("baseUrl", re.getBaseUrl()); - } - } - result.add(e); - } - } - } - - return result; - } - }; - - return updateBaseUrls(cluster, component, updater).toString(); - } - - /** - * Builds repository information for inclusion in a command. This replaces escaping json on - * a command. - * - * @param cluster the cluster - * @param host the host - * @return the command repository - * @throws AmbariException - */ - @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES) - public CommandRepository getCommandRepository(final Cluster cluster, ServiceComponent component, final Host host) throws AmbariException { - - final CommandRepository command = new CommandRepository(); - boolean sysPreppedHost = configs.areHostsSysPrepped().equalsIgnoreCase("true"); - StackId stackId = component.getDesiredStackId(); - command.setRepositories(Collections.<RepositoryInfo>emptyList()); - command.setStackName(stackId.getStackName()); - command.getFeature().setPreInstalled(configs.areHostsSysPrepped()); - command.getFeature().setIsScoped(!sysPreppedHost); - - final BaseUrlUpdater<Void> updater = new BaseUrlUpdater<Void>(null) { - @Override - public Void apply(RepositoryVersionEntity rve) { - command.setRepositoryVersionId(rve.getId()); - command.setRepositoryVersion(rve.getVersion()); - command.setResolved(rve.isResolved()); - command.setStackName(rve.getStackName()); - - // !!! a repository version entity has all the repos worked out. We shouldn't use - // the stack at all. - for (OperatingSystemEntity osEntity : rve.getOperatingSystems()) { - String osEntityFamily = os_family.find(osEntity.getOsType()); - if (osEntityFamily.equals(host.getOsFamily())) { - command.setRepositories(osEntity.getOsType(), osEntity.getRepositories()); - - if (!osEntity.isAmbariManagedRepos()) { - command.setNonManaged(); - } else { - if (rve.isLegacy()){ - command.setLegacyRepoId(rve.getVersion()); - command.setLegacyRepoFileName(rve.getStackName(), rve.getVersion()); - command.getFeature().setIsScoped(false); - } else { - command.setRepoFileName(rve.getStackName(), rve.getId()); - command.setUniqueSuffix(String.format("-repo-%s", rve.getId())); - } - } - } - } - - return null; - } - }; - - updateBaseUrls(cluster, component, updater); - - if (configs.arePackagesLegacyOverridden()) { - LOG.warn("Legacy override option is turned on, disabling CommandRepositoryFeature.scoped feature"); - command.getFeature().setIsScoped(false); - } - - return command; - } - - /** - * 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 - * @param function function that will transform the supplied repositories for specific use. - * @return <T> the type as defined by the supplied {@code function}. - * @throws AmbariException - */ - @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES) - private <T> T getBaseUrls(Cluster cluster, ServiceComponent component, Host host, - Function<List<RepositoryInfo>, T> function) throws AmbariException { - - String hostOsType = host.getOsType(); - String hostOsFamily = host.getOsFamily(); - String hostName = host.getHostName(); - - StackId stackId = component.getDesiredStackId(); - - Map<String, List<RepositoryInfo>> repos = ambariMetaInfo.getRepository( - stackId.getStackName(), stackId.getStackVersion()); - - String family = os_family.find(hostOsType); - if (null == family) { - family = hostOsFamily; - } - - final List<RepositoryInfo> repoInfos; - - // !!! check for the most specific first - if (repos.containsKey(hostOsType)) { - repoInfos = repos.get(hostOsType); - } else if (null != family && repos.containsKey(family)) { - repoInfos = repos.get(family); - } else { - repoInfos = null; - LOG.warn("Could not retrieve repo information for host" - + ", hostname=" + hostName - + ", clusterName=" + cluster.getClusterName() - + ", stackInfo=" + stackId.getStackId()); - } - - // leave it to function implementation to handle null. - return function.apply(repoInfos); - } - - /** - * Checks repo URLs against the current version for the cluster and makes - * adjustments to the Base URL when the current is different. - * - * @param <T> the result after appling the repository version, if found. - */ - @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES) - private <T> T updateBaseUrls(Cluster cluster, ServiceComponent component, BaseUrlUpdater<T> function) throws AmbariException { - - 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) { - Service service = cluster.getService(component.getServiceName()); - - repositoryEntity = service.getDesiredRepositoryVersion(); - } - - if (null == repositoryEntity) { - LOG.info("Cluster {} has no specific Repository Versions. Using stack-defined values", cluster.getClusterName()); - return function.getDefault(); - } - - return function.apply(repositoryEntity); - } - /** * Helper method to fill execution command information. @@ -1652,21 +1440,4 @@ public class AmbariCustomCommandExecutionHelper { return removedHosts; } - /** - * Class that is used to update base urls. There are two implementations of this - when we no - * longer are sure the deprecated repo info can be removed, so too can this class. - */ - @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES) - abstract static class BaseUrlUpdater<T> implements Function<RepositoryVersionEntity, T> { - private T m_default; - - private BaseUrlUpdater(T defaultValue) { - m_default = defaultValue; - } - - private T getDefault() { - return m_default; - } - - } } http://git-wip-us.apache.org/repos/asf/ambari/blob/18c4af48/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java ---------------------------------------------------------------------- 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 4c00f1f..fd91e9d 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 @@ -89,6 +89,7 @@ import org.apache.ambari.server.actionmanager.HostRoleCommand; import org.apache.ambari.server.actionmanager.RequestFactory; import org.apache.ambari.server.actionmanager.Stage; import org.apache.ambari.server.actionmanager.StageFactory; +import org.apache.ambari.server.agent.CommandRepository; import org.apache.ambari.server.agent.ExecutionCommand; import org.apache.ambari.server.agent.ExecutionCommand.KeyNames; import org.apache.ambari.server.api.services.AmbariMetaInfo; @@ -107,6 +108,7 @@ import org.apache.ambari.server.controller.metrics.MetricPropertyProviderFactory import org.apache.ambari.server.controller.metrics.MetricsCollectorHAManager; 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.SystemException; import org.apache.ambari.server.customactions.ActionDefinition; import org.apache.ambari.server.events.publishers.AmbariEventPublisher; import org.apache.ambari.server.metadata.ActionMetadata; @@ -193,6 +195,7 @@ import org.apache.ambari.server.state.stack.OsFamily; import org.apache.ambari.server.state.stack.RepositoryXml; import org.apache.ambari.server.state.stack.WidgetLayout; import org.apache.ambari.server.state.stack.WidgetLayoutInfo; +import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper; import org.apache.ambari.server.state.svccomphost.ServiceComponentHostInstallEvent; import org.apache.ambari.server.state.svccomphost.ServiceComponentHostOpInProgressEvent; import org.apache.ambari.server.state.svccomphost.ServiceComponentHostOpSucceededEvent; @@ -321,6 +324,9 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle @Inject protected OsFamily osFamily; + @Inject + private RepositoryVersionHelper repoVersionHelper; + /** * The KerberosHelper to help setup for enabling for disabling Kerberos */ @@ -2463,7 +2469,12 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle } StageUtils.useAmbariJdkInCommandParams(commandParams, configs); - String repoInfo = customCommandExecutionHelper.getRepoInfo(cluster, component, host); + 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); @@ -2561,7 +2572,6 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle execCmd.setRoleParams(roleParams); execCmd.setCommandParams(commandParams); - execCmd.setRepositoryFile(customCommandExecutionHelper.getCommandRepository(cluster, component, host)); execCmdWrapper.setVersions(cluster); if (execCmd.getConfigurationTags().containsKey("cluster-env")) { http://git-wip-us.apache.org/repos/asf/ambari/blob/18c4af48/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java ---------------------------------------------------------------------- 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 24e4d70..1c36c96 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 @@ -705,18 +705,10 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou // Determine repositories for host String osFamily = host.getOsFamily(); + OperatingSystemEntity osEntity = repoVersionHelper.getOSEntityForHost(host, repoVersion); - OperatingSystemEntity osEntity = null; - for (OperatingSystemEntity os : repoVersion.getOperatingSystems()) { - if (os.getOsType().equals(osFamily)) { - osEntity = os; - break; - } - } - - if (null == osEntity || CollectionUtils.isEmpty(osEntity.getRepositories())) { - throw new SystemException(String.format("Repositories for os type %s are " + - "not defined for version %s of Stack %s.", + if (CollectionUtils.isEmpty(osEntity.getRepositories())) { + throw new SystemException(String.format("Repositories for os type %s are not defined for version %s of Stack %s.", osFamily, repoVersion.getVersion(), stackId)); } @@ -747,7 +739,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou actionContext.setRepositoryVersion(repoVersion); actionContext.setTimeout(Short.valueOf(configuration.getDefaultAgentTaskTimeout(true))); - repoVersionHelper.addCommandRepository(actionContext, cluster, repoVersion, osEntity); + repoVersionHelper.addCommandRepositoryToContext(actionContext, osEntity); return actionContext; } http://git-wip-us.apache.org/repos/asf/ambari/blob/18c4af48/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java index 62fb530..48e9f59 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java @@ -446,8 +446,9 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource Collections.singletonList(filter), roleParams); actionContext.setTimeout(Short.valueOf(configuration.getDefaultAgentTaskTimeout(true))); + actionContext.setRepositoryVersion(repoVersionEnt); - repoVersionHelper.addCommandRepository(actionContext, cluster, repoVersionEnt, osEntity); + repoVersionHelper.addCommandRepositoryToContext(actionContext, osEntity); String caption = String.format(INSTALL_PACKAGES_FULL_NAME + " on host %s", hostName); RequestStageContainer req = createRequest(caption); http://git-wip-us.apache.org/repos/asf/ambari/blob/18c4af48/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java index 87943d1..8276f4a 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 @@ -25,14 +25,14 @@ import java.util.Map; 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.agent.CommandRepository; -import org.apache.ambari.server.agent.ExecutionCommand; import org.apache.ambari.server.agent.ExecutionCommand.KeyNames; import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.configuration.Configuration; import org.apache.ambari.server.controller.ActionExecutionContext; -import org.apache.ambari.server.controller.ActionExecutionContext.ExecutionCommandVisitor; import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.controller.internal.OperatingSystemResourceProvider; import org.apache.ambari.server.controller.internal.RepositoryResourceProvider; @@ -42,13 +42,18 @@ import org.apache.ambari.server.orm.entities.OperatingSystemEntity; import org.apache.ambari.server.orm.entities.RepositoryEntity; import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.state.Cluster; +import org.apache.ambari.server.state.Clusters; +import org.apache.ambari.server.state.Host; 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.ServiceInfo; import org.apache.ambari.server.state.ServiceOsSpecific; import org.apache.ambari.server.state.StackId; 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.UpgradePack; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; @@ -65,6 +70,7 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; + /** * Provides helper methods to manage repository versions. */ @@ -82,6 +88,51 @@ public class RepositoryVersionHelper { @Inject private Provider<Configuration> configuration; + @Inject + private Provider<OsFamily> os_family; + + @Inject Provider<Clusters> 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 + */ + @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; + } + + return repositoryEntity; + } + /** * Parses operating systems json to a list of entities. Expects json like: * <pre> @@ -310,17 +361,46 @@ public class RepositoryVersionHelper { return roleParams; } + + /** + * 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 {@link OperatingSystemEntity} with available repositories for host + * @throws SystemException if no repository available for target {@link Host} + */ + public OperatingSystemEntity getOSEntityForHost(Host host, RepositoryVersionEntity repoVersion) throws SystemException { + String osFamily = host.getOsFamily(); + OperatingSystemEntity osEntity = null; + for (OperatingSystemEntity operatingSystem : repoVersion.getOperatingSystems()) { + if (osFamily.equals(operatingSystem.getOsType())) { + osEntity = operatingSystem; + break; + } + } + + if (null == osEntity) { + throw new SystemException(String.format("Operating System matching %s could not be found", + osFamily)); + } + + return osEntity; + } + /** * Adds a command repository to the action context - * @param context the context * @param osEntity the OS family - * @param repoVersion the repository version entity */ - public void addCommandRepository(ActionExecutionContext context, Cluster cluster, - RepositoryVersionEntity repoVersion, OperatingSystemEntity osEntity) { + public CommandRepository getCommandRepository(final RepositoryVersionEntity repoVersion, + final OperatingSystemEntity osEntity) throws SystemException { final CommandRepository commandRepo = new CommandRepository(); - boolean sysPreppedHost = configuration.get().areHostsSysPrepped().equalsIgnoreCase("true"); + final boolean sysPreppedHost = configuration.get().areHostsSysPrepped().equalsIgnoreCase("true"); + + if (null == repoVersion) { + throw new SystemException("Repository version entity is not provided"); + } commandRepo.setRepositories(osEntity.getOsType(), osEntity.getRepositories()); commandRepo.setRepositoryVersion(repoVersion.getVersion()); @@ -347,10 +427,202 @@ public class RepositoryVersionHelper { LOG.warn("Legacy override option is turned on, disabling CommandRepositoryFeature.scoped feature"); commandRepo.getFeature().setIsScoped(false); } + return commandRepo; + } + + + /** + * Builds repository information for inclusion in a command. This replaces escaping json on + * a command. + * + * @param cluster the cluster + * @param host the host + * @param component {@link ServiceComponent} object, could be null to return service-related repository + * @return the command repository + * @throws SystemException + */ + @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES) + public CommandRepository getCommandRepository(final Cluster cluster, ServiceComponent component, final Host host) + throws SystemException { + + RepositoryVersionEntity repoVersion = getRepositoryVersionEntity(cluster, component); + OperatingSystemEntity 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<String, String> 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(); + + String hostOsFamily = cluster.getHost(hostName).getOsFamily(); + for (OperatingSystemEntity operatingSystemEntity : repositoryVersion.getOperatingSystems()) { + // ostype in OperatingSystemEntity it's os family. That should be fixed + // in OperatingSystemEntity. + if (operatingSystemEntity.getOsType().equals(hostOsFamily)) { + for (RepositoryEntity repositoryEntity : operatingSystemEntity.getRepositories()) { + JsonObject repositoryInfo = new JsonObject(); + repositoryInfo.addProperty("base_url", repositoryEntity.getBaseUrl()); + repositoryInfo.addProperty("repo_name", repositoryEntity.getName()); + repositoryInfo.addProperty("repo_id", repositoryEntity.getRepositoryId()); + + 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(); + + 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 (OperatingSystemEntity ose : rve.getOperatingSystems()) { + if (ose.getOsType().equals(osType) && ose.isAmbariManagedRepos()) { + for (RepositoryEntity re : ose.getRepositories()) { + if (re.getName().equals(repoName) && + !re.getBaseUrl().equals(baseUrl)) { + obj.addProperty("baseUrl", re.getBaseUrl()); + } + } + result.add(e); + } + } + } + return result.toString(); + } + + + /** + * 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<String, List<RepositoryInfo>> 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<RepositoryInfo> 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, + OperatingSystemEntity osEntity) throws SystemException { + + final RepositoryVersionEntity repoVersion = context.getRepositoryVersion(); + final CommandRepository commandRepo = getCommandRepository(repoVersion, osEntity); ClusterVersionSummary summary = null; + if (RepositoryType.STANDARD != repoVersion.getType()) { try { + final Cluster cluster = clusters.get().getCluster(context.getClusterName()); + VersionDefinitionXml xml = repoVersion.getRepositoryXml(); summary = xml.getClusterSummary(cluster); } catch (Exception e) { @@ -360,25 +632,23 @@ public class RepositoryVersionHelper { final ClusterVersionSummary clusterSummary = summary; - context.addVisitor(new ExecutionCommandVisitor() { - @Override - public void visit(ExecutionCommand command) { - if (null == command.getRepositoryFile()) { - command.setRepositoryFile(commandRepo); - } - if (null != clusterSummary) { - Map<String, Object> params = command.getRoleParameters(); - if (null == params) { - params = new HashMap<>(); - command.setRoleParameters(params); - } - params.put(KeyNames.CLUSTER_VERSION_SUMMARY, clusterSummary); - } + context.addVisitor(command -> { + if (null == command.getRepositoryFile()) { + command.setRepositoryFile(commandRepo); + } + if (null != clusterSummary) { + Map<String, Object> params = command.getRoleParameters(); + if (null == params) { + params = new HashMap<>(); + command.setRoleParameters(params); + } + params.put(KeyNames.CLUSTER_VERSION_SUMMARY, clusterSummary); } + }); } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/18c4af48/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelperTest.java ---------------------------------------------------------------------- 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 883e891..26c79e6 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 @@ -574,14 +574,15 @@ public class AmbariCustomCommandExecutionHelperTest { Host host = clusters.getHost("c1-c6401"); AmbariCustomCommandExecutionHelper helper = injector.getInstance(AmbariCustomCommandExecutionHelper.class); + RepositoryVersionHelper repoHelper = injector.getInstance(RepositoryVersionHelper.class); StackDAO stackDAO = injector.getInstance(StackDAO.class); RepositoryVersionDAO repoVersionDAO = injector.getInstance(RepositoryVersionDAO.class); ServiceComponentDesiredStateDAO componentDAO = injector.getInstance(ServiceComponentDesiredStateDAO.class); RepositoryVersionHelper repoVersionHelper = injector.getInstance(RepositoryVersionHelper.class); - CommandRepository commandRepo = helper.getCommandRepository(cluster, componentRM, host); + CommandRepository commandRepo = repoHelper.getCommandRepository(cluster, componentRM, host); + Assert.assertEquals(2, commandRepo.getRepositories().size()); - Assert.assertEquals(0, commandRepo.getRepositories().size()); RepositoryInfo ri = new RepositoryInfo(); ri.setBaseUrl("http://foo"); @@ -607,18 +608,18 @@ public class AmbariCustomCommandExecutionHelperTest { componentEntity.setDesiredRepositoryVersion(repositoryVersion); componentEntity.addVersion(componentVersionEntity); - componentEntity = componentDAO.merge(componentEntity); + componentDAO.merge(componentEntity); // !!! make sure the override is set - commandRepo = helper.getCommandRepository(cluster, componentRM, host); + commandRepo = repoHelper.getCommandRepository(cluster, componentRM, host); Assert.assertEquals(1, commandRepo.getRepositories().size()); CommandRepository.Repository repo = commandRepo.getRepositories().iterator().next(); Assert.assertEquals("http://foo", repo.getBaseUrl()); // verify that ZK has no repositories, since we haven't defined a repo version for ZKC - commandRepo = helper.getCommandRepository(cluster, componentZKC, host); - Assert.assertEquals(0, commandRepo.getRepositories().size()); + commandRepo = repoHelper.getCommandRepository(cluster, componentZKC, host); + Assert.assertEquals(2, commandRepo.getRepositories().size()); } private void createClusterFixture(String clusterName, StackId stackId,
