You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by dm...@apache.org on 2015/04/10 13:49:13 UTC
ambari git commit: AMBARI-10432. RU Improvements. Part 1
(dlysnichenko)
Repository: ambari
Updated Branches:
refs/heads/trunk c8c9be80b -> 7a8a7f71f
AMBARI-10432. RU Improvements. Part 1 (dlysnichenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7a8a7f71
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7a8a7f71
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7a8a7f71
Branch: refs/heads/trunk
Commit: 7a8a7f71f633e52e9f87a6d1ca87fc155fe105cb
Parents: c8c9be8
Author: Lisnichenko Dmitro <dl...@hortonworks.com>
Authored: Fri Apr 10 14:48:23 2015 +0300
Committer: Lisnichenko Dmitro <dl...@hortonworks.com>
Committed: Fri Apr 10 14:49:01 2015 +0300
----------------------------------------------------------------------
.../internal/HostComponentResourceProvider.java | 16 ++++++
.../upgrades/FinalizeUpgradeAction.java | 56 ++++++++++++++++++++
.../src/main/resources/properties.json | 1 +
.../HostComponentResourceProviderTest.java | 38 +++++++------
4 files changed, 96 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/7a8a7f71/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
index ab5c31c..4c37d5b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
@@ -21,6 +21,9 @@ import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
+import org.apache.ambari.server.orm.dao.HostVersionDAO;
+import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
+import org.apache.ambari.server.orm.entities.HostVersionEntity;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
import org.apache.ambari.server.controller.AmbariManagementController;
@@ -45,6 +48,7 @@ import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
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.MaintenanceState;
import org.apache.ambari.server.state.ServiceComponent;
import org.apache.ambari.server.state.ServiceComponentHost;
@@ -99,6 +103,8 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro
= PropertyHelper.getPropertyId("HostRoles", "desired_admin_state");
protected static final String HOST_COMPONENT_MAINTENANCE_STATE_PROPERTY_ID
= "HostRoles/maintenance_state";
+ protected static final String HOST_COMPONENT_HDP_VERSION
+ = PropertyHelper.getPropertyId("HostRoles", "hdp_version");
//Component name mappings
private final Map<String, PropertyProvider> HOST_COMPONENT_PROPERTIES_PROVIDER = new HashMap<String, PropertyProvider>();
@@ -121,6 +127,9 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro
@Inject
private MaintenanceStateHelper maintenanceStateHelper;
+ @Inject
+ private HostVersionDAO hostVersionDAO;
+
// ----- Constructors ----------------------------------------------------
/**
@@ -242,6 +251,13 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro
setResourceProperty(resource, HOST_COMPONENT_STALE_CONFIGS_PROPERTY_ID,
response.isStaleConfig(), requestedIds);
+ HostVersionEntity versionEntity = hostVersionDAO.
+ findByHostAndStateCurrent(response.getClusterName(), response.getHostname());
+ if (versionEntity != null) {
+ setResourceProperty(resource, HOST_COMPONENT_HDP_VERSION,
+ versionEntity.getRepositoryVersion().getDisplayName(), requestedIds);
+ }
+
if (response.getAdminState() != null) {
setResourceProperty(resource, HOST_COMPONENT_DESIRED_ADMIN_STATE_PROPERTY_ID,
response.getAdminState(), requestedIds);
http://git-wip-us.apache.org/repos/asf/ambari/blob/7a8a7f71/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
index 01bd9c7..fc9774b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
@@ -20,6 +20,7 @@ package org.apache.ambari.server.serveraction.upgrades;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.MessageFormat;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
@@ -41,13 +42,18 @@ import org.apache.ambari.server.orm.entities.HostVersionEntity;
import org.apache.ambari.server.serveraction.AbstractServerAction;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.ComponentInfo;
import org.apache.ambari.server.state.RepositoryVersionState;
+import org.apache.ambari.server.state.Service;
+import org.apache.ambari.server.state.ServiceComponent;
+import org.apache.ambari.server.state.ServiceComponentHost;
import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.state.UpgradeState;
import org.apache.ambari.server.state.svccomphost.ServiceComponentHostSummary;
import org.apache.commons.lang.StringUtils;
import com.google.inject.Inject;
+import org.apache.commons.lang.text.StrBuilder;
/**
* Action that represents finalizing the Upgrade by completing any database changes.
@@ -173,6 +179,8 @@ public class FinalizeUpgradeAction extends AbstractServerAction {
throw new AmbariException(message);
}
+ checkHostComponentVesions(cluster, version, stack);
+
// May need to first transition to UPGRADED
if (atLeastOneHostInInstalledState) {
cluster.transitionClusterVersion(stackId, version, RepositoryVersionState.UPGRADED);
@@ -303,4 +311,52 @@ public class FinalizeUpgradeAction extends AbstractServerAction {
}
}
+
+ /**
+ * Confirms that all host components that are able to provide hdp version,
+ * have been upgraded to the target version.
+ * @param cluster the cluster the upgrade is for
+ * @param desiredVersion the target version of the upgrade
+ * @throws AmbariException if any host component has not been updated yet
+ */
+ private void checkHostComponentVesions(Cluster cluster, String desiredVersion, StackId stackId)
+ throws AmbariException {
+ class InfoTuple {
+ public InfoTuple(String serviceName, String componentName, String hostName) {
+ this.serviceName = serviceName;
+ this.componentName = componentName;
+ this.hostName = hostName;
+ }
+
+ public final String serviceName;
+ public final String componentName;
+ public final String hostName;
+ }
+ ArrayList<InfoTuple> errors = new ArrayList<InfoTuple>();
+ for (Service service : cluster.getServices().values()) {
+ for (ServiceComponent serviceComponent : service.getServiceComponents().values()) {
+ for (ServiceComponentHost serviceComponentHost : serviceComponent.getServiceComponentHosts().values()) {
+ ComponentInfo componentInfo = ambariMetaInfo.getComponent(stackId.getStackName(),
+ stackId.getStackVersion(), service.getName(), serviceComponent.getName());
+ if (componentInfo.isVersionAdvertised() && ! serviceComponentHost.getVersion().equals(desiredVersion)) {
+ errors.add(new InfoTuple(
+ service.getName(), serviceComponent.getName(), serviceComponentHost.getHostName()));
+ }
+ }
+ }
+ }
+
+ if (! errors.isEmpty()) {
+ StrBuilder messageBuff = new StrBuilder(String.format("The following %d host component(s) " +
+ "have not been upgraded to version %s. Please install and upgrade " +
+ "the Stack Version on those hosts and try again.\nHost components:\n",
+ errors.size(), desiredVersion));
+ for (InfoTuple error : errors) {
+ messageBuff.append(String.format("%s on host %s\n", error.componentName, error.hostName));
+ }
+ throw new AmbariException(messageBuff.toString());
+ }
+
+ }
+
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/7a8a7f71/ambari-server/src/main/resources/properties.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/properties.json b/ambari-server/src/main/resources/properties.json
index 540d58b..40274ac 100644
--- a/ambari-server/src/main/resources/properties.json
+++ b/ambari-server/src/main/resources/properties.json
@@ -77,6 +77,7 @@
"HostRoles/stale_configs",
"HostRoles/desired_admin_state",
"HostRoles/maintenance_state",
+ "HostRoles/hdp_version",
"HostRoles/service_name",
"_"
],
http://git-wip-us.apache.org/repos/asf/ambari/blob/7a8a7f71/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java
index 9bc7570..5581383 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java
@@ -32,6 +32,7 @@ import org.apache.ambari.server.controller.spi.Resource;
import org.apache.ambari.server.controller.spi.ResourceProvider;
import org.apache.ambari.server.controller.utilities.PredicateBuilder;
import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.ambari.server.orm.dao.HostVersionDAO;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.Service;
@@ -250,6 +251,7 @@ public class HostComponentResourceProviderTest {
Resource.Type type = Resource.Type.HostComponent;
AmbariManagementController managementController = createMock(AmbariManagementController.class);
+ HostVersionDAO hostVersionDAO = createMock(HostVersionDAO.class);
RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class);
Injector injector = createNiceMock(Injector.class);
@@ -298,10 +300,12 @@ public class HostComponentResourceProviderTest {
stageContainer.persist();
expect(stageContainer.getRequestStatusResponse()).andReturn(response).once();
- HostComponentResourceProvider provider =
+ TestHostComponentResourceProvider provider =
new TestHostComponentResourceProvider(PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
- managementController, injector, maintenanceStateHelper);
+ managementController, injector);
+ provider.setFieldValue("maintenanceStateHelper", maintenanceStateHelper);
+ provider.setFieldValue("hostVersionDAO", hostVersionDAO);
expect(resourceProviderFactory.getHostComponentResourceProvider(anyObject(Set.class),
anyObject(Map.class),
@@ -352,6 +356,7 @@ public class HostComponentResourceProviderTest {
ServiceComponentHost clientComponentHost = createNiceMock(ServiceComponentHost.class);
RequestStageContainer stageContainer = createNiceMock(RequestStageContainer.class);
MaintenanceStateHelper maintenanceStateHelper = createNiceMock(MaintenanceStateHelper.class);
+ HostVersionDAO hostVersionDAO = createMock(HostVersionDAO.class);
Collection<String> hosts = new HashSet<String>();
hosts.add("Host100");
@@ -392,6 +397,7 @@ public class HostComponentResourceProviderTest {
expect(clientComponentHost.getHostName()).andReturn("Host100").anyTimes();
expect(clientComponentHost.getServiceComponentName()).andReturn("some-client").anyTimes();
expect(response.getMessage()).andReturn("response msg").anyTimes();
+ expect(hostVersionDAO.findByHostAndStateCurrent(anyObject(String.class), anyObject(String.class))).andReturn(null).anyTimes();
//Cluster is default type. Maintenance mode is not being tested here so the default is returned.
expect(maintenanceStateHelper.isOperationAllowed(Resource.Type.Cluster, componentHost)).andReturn(true).anyTimes();
@@ -424,20 +430,22 @@ public class HostComponentResourceProviderTest {
expect(stageContainer.getProjectedState("Host100", "Component100")).andReturn(State.INSTALLED).once();
expect(stageContainer.getRequestStatusResponse()).andReturn(response).once();
- HostComponentResourceProvider provider =
+ TestHostComponentResourceProvider provider =
new TestHostComponentResourceProvider(PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
- managementController, injector, maintenanceStateHelper);
+ managementController, injector);
+ provider.setFieldValue("maintenanceStateHelper", maintenanceStateHelper);
+ provider.setFieldValue("hostVersionDAO", hostVersionDAO);
expect(resourceProviderFactory.getHostComponentResourceProvider(anyObject(Set.class),
- anyObject(Map.class),
- eq(managementController))).
+ anyObject(Map.class),
+ eq(managementController))).
andReturn(provider).anyTimes();
// replay
replay(managementController, response, resourceProviderFactory, clusters, cluster, service,
component, componentHost, stageContainer, maintenanceStateHelper, clientComponent,
- clientComponentHost);
+ clientComponentHost, hostVersionDAO);
Map<String, Object> properties = new LinkedHashMap<String, Object>();
properties.put(HostComponentResourceProvider.HOST_COMPONENT_STATE_PROPERTY_ID, "STARTED");
@@ -549,8 +557,8 @@ public class HostComponentResourceProviderTest {
HostComponentResourceProvider provider =
new TestHostComponentResourceProvider(PropertyHelper.getPropertyIds(type),
PropertyHelper.getKeyPropertyIds(type),
- controller, injector, injector.getInstance(MaintenanceStateHelper.class)
- );
+ controller, injector);
+
RequestStageContainer requestStages = provider.updateHostComponents(null, requests, requestProperties, runSmokeTest);
requestStages.persist();
return requestStages.getRequestStatusResponse();
@@ -566,16 +574,16 @@ public class HostComponentResourceProviderTest {
* @param managementController the management controller
*/
public TestHostComponentResourceProvider(Set<String> propertyIds, Map<Resource.Type, String> keyPropertyIds,
- AmbariManagementController managementController, Injector injector,
- MaintenanceStateHelper maintenanceStateHelper) throws Exception {
-
+ AmbariManagementController managementController, Injector injector) throws Exception {
super(propertyIds, keyPropertyIds, managementController, injector);
+ }
+ public void setFieldValue(String fieldName, Object fieldValue) throws Exception {
Class<?> c = getClass().getSuperclass();
-
- Field f = c.getDeclaredField("maintenanceStateHelper");
+ Field f = c.getDeclaredField(fieldName);
f.setAccessible(true);
- f.set(this, maintenanceStateHelper);
+ f.set(this, fieldValue);
}
+
}
}