You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sr...@apache.org on 2014/05/23 18:31:10 UTC
git commit: AMBARI-5864. Slider App endpoint should have DELETE
method. (srimanth)
Repository: ambari
Updated Branches:
refs/heads/trunk 24ee41cc9 -> 546878b82
AMBARI-5864. Slider App endpoint should have DELETE method. (srimanth)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/546878b8
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/546878b8
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/546878b8
Branch: refs/heads/trunk
Commit: 546878b820f73fec3c92823a6e8dbd4beb183dac
Parents: 24ee41c
Author: Srimanth Gunturi <sg...@hortonworks.com>
Authored: Fri May 23 01:36:35 2014 -0700
Committer: Srimanth Gunturi <sg...@hortonworks.com>
Committed: Fri May 23 09:30:52 2014 -0700
----------------------------------------------------------------------
.../view/slider/SliderAppsResourceProvider.java | 19 +++--
.../view/slider/SliderAppsViewController.java | 11 +++
.../slider/SliderAppsViewControllerImpl.java | 74 ++++++++++++++++++--
.../view/slider/rest/SliderAppsResource.java | 14 ++++
4 files changed, 108 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/546878b8/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsResourceProvider.java
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsResourceProvider.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsResourceProvider.java
index 138a1ab..8d47769 100644
--- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsResourceProvider.java
+++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsResourceProvider.java
@@ -20,7 +20,6 @@ package org.apache.ambari.view.slider;
import java.io.IOException;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -53,8 +52,16 @@ public class SliderAppsResourceProvider implements ResourceProvider<SliderApp> {
@Override
public boolean deleteResource(String resourceId) throws SystemException,
NoSuchResourceException, UnsupportedPropertyException {
- // TODO Auto-generated method stub
- return false;
+ try {
+ sliderController.deleteSliderApp(resourceId);
+ return true;
+ } catch (YarnException e) {
+ logger.warn("Unable to delete Slider app with id " + resourceId, e);
+ throw new SystemException(e.getMessage(), e);
+ } catch (IOException e) {
+ logger.warn("Unable to delete Slider app with id " + resourceId, e);
+ throw new SystemException(e.getMessage(), e);
+ }
}
@Override
@@ -62,7 +69,8 @@ public class SliderAppsResourceProvider implements ResourceProvider<SliderApp> {
throws SystemException, NoSuchResourceException,
UnsupportedPropertyException {
try {
- SliderApp sliderApp = sliderController.getSliderApp(resourceId, properties);
+ SliderApp sliderApp = sliderController.getSliderApp(resourceId,
+ properties);
if (sliderApp == null)
throw new NoSuchResourceException(resourceId);
return sliderApp;
@@ -81,7 +89,8 @@ public class SliderAppsResourceProvider implements ResourceProvider<SliderApp> {
UnsupportedPropertyException {
Set<SliderApp> appSet = new HashSet<SliderApp>();
try {
- List<SliderApp> sliderApps = sliderController.getSliderApps(request.getPropertyIds());
+ List<SliderApp> sliderApps = sliderController.getSliderApps(request
+ .getPropertyIds());
for (SliderApp app : sliderApps)
appSet.add(app);
} catch (YarnException e) {
http://git-wip-us.apache.org/repos/asf/ambari/blob/546878b8/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewController.java
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewController.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewController.java
index 90ff76c..0b368be 100644
--- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewController.java
+++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewController.java
@@ -57,4 +57,15 @@ public interface SliderAppsViewController {
*/
public List<SliderApp> getSliderApps(Set<String> properties)
throws YarnException, IOException;
+
+ /**
+ * Attempts to delete a Slider app. An unsuccessful attempt will result in
+ * exception.
+ *
+ * @param applicationId
+ * @throws YarnException
+ * @throws IOException
+ */
+ public void deleteSliderApp(String applicationId) throws YarnException,
+ IOException;
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/546878b8/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewControllerImpl.java
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewControllerImpl.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewControllerImpl.java
index 6a884ce..8c3741f 100644
--- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewControllerImpl.java
+++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/SliderAppsViewControllerImpl.java
@@ -19,8 +19,10 @@
package org.apache.ambari.view.slider;
import java.io.IOException;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -36,16 +38,21 @@ import org.apache.ambari.view.slider.clients.AmbariServiceInfo;
import org.apache.ambari.view.slider.rest.client.SliderAppMasterClient;
import org.apache.ambari.view.slider.rest.client.SliderAppMasterClient.SliderAppMasterData;
import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ApplicationReport;
+import org.apache.hadoop.yarn.api.records.YarnApplicationState;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
+import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException;
import org.apache.hadoop.yarn.exceptions.YarnException;
import org.apache.log4j.Logger;
import org.apache.slider.api.ClusterDescription;
import org.apache.slider.client.SliderClient;
import org.apache.slider.common.SliderKeys;
+import org.apache.slider.common.tools.SliderFileSystem;
import org.apache.slider.core.exceptions.UnknownApplicationInstanceException;
+import org.apache.slider.core.main.LauncherExitCodes;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -160,7 +167,7 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController {
try {
SliderClient sliderClient = getSliderClient();
ApplicationReport yarnApp = sliderClient.getApplicationReport(appId);
- return populateSliderApp(yarnApp, properties, sliderClient);
+ return createSliderAppObject(yarnApp, properties, sliderClient);
} finally {
Thread.currentThread().setContextClassLoader(currentClassLoader);
}
@@ -169,16 +176,37 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController {
return null;
}
- private SliderApp populateSliderApp(ApplicationReport yarnApp,
+ private SliderApp createSliderAppObject(ApplicationReport yarnApp,
Set<String> properties, SliderClient sliderClient) {
if (yarnApp == null)
return null;
+
SliderApp app = new SliderApp();
+ app.setState(yarnApp.getYarnApplicationState().name());
+
+ // Valid Slider App?
+ // We want all Slider apps except the ones which properly finished.
+ if (YarnApplicationState.FINISHED.equals(yarnApp.getYarnApplicationState())) {
+ try {
+ if (sliderClient.actionExists(yarnApp.getName(), false) == LauncherExitCodes.EXIT_SUCCESS)
+ app.setState("FROZEN");
+ } catch (UnknownApplicationInstanceException e) {
+ return null; // Application not in HDFS - means it is not frozen
+ } catch (YarnException e) {
+ logger.warn(
+ "Unable to determine frozen state for " + yarnApp.getName(), e);
+ return null;
+ } catch (IOException e) {
+ logger.warn(
+ "Unable to determine frozen state for " + yarnApp.getName(), e);
+ return null;
+ }
+ }
+
app.setId(Long.toString(yarnApp.getApplicationId().getClusterTimestamp())
+ "_" + Integer.toString(yarnApp.getApplicationId().getId()));
app.setName(yarnApp.getName());
app.setUser(yarnApp.getUser());
- app.setState(yarnApp.getYarnApplicationState().name());
app.setDiagnostics(yarnApp.getDiagnostics());
app.setYarnId(yarnApp.getApplicationId().toString());
app.setType(yarnApp.getApplicationType());
@@ -306,6 +334,18 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController {
public String getUsername() throws IOException {
return null;
}
+
+ @Override
+ protected void serviceInit(Configuration conf) throws Exception {
+ super.serviceInit(conf);
+ // Override the default FS client to set the super user.
+ FileSystem fs = FileSystem.get(FileSystem.getDefaultUri(getConfig()),
+ getConfig(), "hdfs");
+ SliderFileSystem fileSystem = new SliderFileSystem(fs, getConfig());
+ Field fsField = SliderClient.class.getDeclaredField("sliderFileSystem");
+ fsField.setAccessible(true);
+ fsField.set(this, fileSystem);
+ }
};
try {
sliderClientConfiguration = client.bindArgs(sliderClientConfiguration,
@@ -383,13 +423,37 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController {
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
try {
SliderClient sliderClient = getSliderClient();
- List<ApplicationReport> yarnApps = sliderClient.getApplications();
+ List<ApplicationReport> yarnApps = sliderClient.listSliderInstances(null);
for (ApplicationReport yarnApp : yarnApps) {
- sliderApps.add(populateSliderApp(yarnApp, properties, sliderClient));
+ SliderApp sliderAppObject = createSliderAppObject(yarnApp, properties,
+ sliderClient);
+ if (sliderAppObject != null)
+ sliderApps.add(sliderAppObject);
}
} finally {
Thread.currentThread().setContextClassLoader(currentClassLoader);
}
return sliderApps;
}
+
+ @Override
+ public void deleteSliderApp(String applicationId) throws YarnException,
+ IOException {
+ ClassLoader currentClassLoader = Thread.currentThread()
+ .getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+ try {
+ Set<String> properties = new HashSet<String>();
+ properties.add("id");
+ properties.add("name");
+ SliderApp sliderApp = getSliderApp(applicationId, properties);
+ if (sliderApp == null)
+ throw new ApplicationNotFoundException(applicationId);
+
+ SliderClient sliderClient = getSliderClient();
+ sliderClient.actionDestroy(sliderApp.getName());
+ } finally {
+ Thread.currentThread().setContextClassLoader(currentClassLoader);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/546878b8/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/SliderAppsResource.java
----------------------------------------------------------------------
diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/SliderAppsResource.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/SliderAppsResource.java
index 2769f57..a221610 100644
--- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/SliderAppsResource.java
+++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/SliderAppsResource.java
@@ -18,6 +18,9 @@
package org.apache.ambari.view.slider.rest;
+import java.io.IOException;
+
+import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@@ -29,6 +32,8 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.ambari.view.ViewResourceHandler;
+import org.apache.ambari.view.slider.SliderAppsViewController;
+import org.apache.hadoop.yarn.exceptions.YarnException;
import com.google.inject.Inject;
@@ -36,6 +41,8 @@ public class SliderAppsResource {
@Inject
ViewResourceHandler resourceHandler;
+ @Inject
+ SliderAppsViewController sliderAppsViewController;
@GET
@Produces({ MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON })
@@ -51,4 +58,11 @@ public class SliderAppsResource {
return resourceHandler.handleRequest(headers, uri, appId);
}
+ @DELETE
+ @Path("{appId}")
+ public void deleteApp(@Context HttpHeaders headers, @Context UriInfo uri,
+ @PathParam("appId") String appId) throws YarnException, IOException {
+ sliderAppsViewController.deleteSliderApp(appId);
+ }
+
}