You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by rl...@apache.org on 2017/11/27 20:24:12 UTC
[02/49] ambari git commit: AMBARI-22318 repositoryFile entity
populating for wrong repository for RU (dgrinenko)
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/branch-feature-AMBARI-20859
Commit: 18c4af48c8f409fa083172df6b04e94d010d8410
Parents: 365c91e
Author: Dmytro Grinenko <ha...@apache.org>
Authored: Fri Nov 17 10:23:55 2017 +0200
Committer: Dmytro Grinenko <ha...@apache.org>
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,