AMBARI-7252. Decouple Slider View from ambari-server dependency (srimanth)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/11146fb6 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/11146fb6 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/11146fb6 Branch: refs/heads/branch-alerts-dev Commit: 11146fb67456a40aeab9fc3f3e6973fd3cf9facd Parents: 475d458 Author: Srimanth Gunturi <sgunt...@hortonworks.com> Authored: Wed Sep 10 12:25:28 2014 -0700 Committer: Srimanth Gunturi <sgunt...@hortonworks.com> Committed: Wed Sep 10 13:02:19 2014 -0700 ---------------------------------------------------------------------- contrib/views/slider/pom.xml | 8 - .../view/slider/SliderAppsViewController.java | 5 + .../slider/SliderAppsViewControllerImpl.java | 262 +++++------------ .../apache/ambari/view/slider/ViewStatus.java | 33 +-- .../view/slider/clients/AmbariClient.java | 3 - .../slider/clients/AmbariInternalClient.java | 292 ------------------- .../slider/rest/client/JMXMetricHolder.java | 50 ++++ .../slider/rest/client/SliderAppJmxHelper.java | 1 - .../app/controllers/slider_apps_controller.js | 8 +- .../src/main/resources/ui/app/initialize.js | 19 +- .../views/slider/src/main/resources/view.xml | 23 +- 11 files changed, 174 insertions(+), 530 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/11146fb6/contrib/views/slider/pom.xml ---------------------------------------------------------------------- diff --git a/contrib/views/slider/pom.xml b/contrib/views/slider/pom.xml index 31a7c7e..ec4089f 100644 --- a/contrib/views/slider/pom.xml +++ b/contrib/views/slider/pom.xml @@ -105,12 +105,6 @@ <artifactId>gson</artifactId> <version>2.2.2</version> </dependency> - <dependency> - <groupId>org.apache.ambari</groupId> - <artifactId>ambari-server</artifactId> - <version>${ambari.version}</version> - <scope>provided</scope> - </dependency> <!-- ==================================================================== --> <!-- Slider Dependencies (to be removed when Slider has Maven repository) --> @@ -398,8 +392,6 @@ <nodejs.directory>${basedir}/target/nodejs</nodejs.directory> <npm.version>1.4.3</npm.version> <ui.directory>${basedir}/src/main/resources/ui</ui.directory> - <!-- deprecated, moved to top component --> - <!-- <ambari.version>1.3.0-SNAPSHOT</ambari.version> --> <hadoop.version>2.6.0-SNAPSHOT</hadoop.version> <avro.version>1.7.4</avro.version> <bigtop.version>0.7.0</bigtop.version> http://git-wip-us.apache.org/repos/asf/ambari/blob/11146fb6/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 823fea6..70e333f 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 @@ -30,6 +30,11 @@ import com.google.inject.ImplementedBy; @ImplementedBy(SliderAppsViewControllerImpl.class) public interface SliderAppsViewController { + public static final String PROPERTY_HDFS_ADDRESS = "hdfs.address"; + public static final String PROPERTY_YARN_RM_ADDRESS = "yarn.resourcemanager.address"; + public static final String PROPERTY_YARN_RM_SCHEDULER_ADDRESS = "yarn.resourcemanager.scheduler.address"; + public static final String PROPERTY_ZK_QUOROM = "zookeeper.quorum"; + public ViewStatus getViewStatus(); /** http://git-wip-us.apache.org/repos/asf/ambari/blob/11146fb6/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 6b3b3f5..f17b66d 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 @@ -35,12 +35,6 @@ import java.util.Set; import java.util.zip.ZipException; import org.apache.ambari.view.ViewContext; -import org.apache.ambari.view.slider.clients.AmbariClient; -import org.apache.ambari.view.slider.clients.AmbariCluster; -import org.apache.ambari.view.slider.clients.AmbariClusterInfo; -import org.apache.ambari.view.slider.clients.AmbariHostComponent; -import org.apache.ambari.view.slider.clients.AmbariService; -import org.apache.ambari.view.slider.clients.AmbariServiceInfo; import org.apache.ambari.view.slider.rest.client.Metric; import org.apache.ambari.view.slider.rest.client.SliderAppMasterClient; import org.apache.ambari.view.slider.rest.client.SliderAppMasterClient.SliderAppMasterData; @@ -90,15 +84,11 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { .getLogger(SliderAppsViewControllerImpl.class); @Inject private ViewContext viewContext; - @Inject - private AmbariClient ambariClient; private List<SliderAppType> appTypes; private Integer createAppCounter = -1; private String getAppsFolderPath() { - return viewContext - .getAmbariProperty(org.apache.ambari.server.configuration.Configuration.RESOURCES_DIR_KEY) - + "/apps"; + return viewContext.getAmbariProperty("resources.dir") + "/apps"; } private String getAppsCreateFolderPath() { @@ -108,91 +98,13 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { @Override public ViewStatus getViewStatus() { ViewStatus status = new ViewStatus(); - List<String> viewErrors = new ArrayList<String>(); - - AmbariClusterInfo clusterInfo = ambariClient.getClusterInfo(); - if (clusterInfo != null) { - AmbariCluster cluster = ambariClient.getCluster(clusterInfo); - List<AmbariServiceInfo> services = cluster.getServices(); - if (services != null && !services.isEmpty()) { - AmbariServiceInfo hdfsService = null, yarnService = null, zkService = null; - for (AmbariServiceInfo service : services) { - if ("HDFS".equals(service.getId())) { - hdfsService = service; - } else if ("YARN".equals(service.getId())) { - yarnService = service; - } else if ("ZOOKEEPER".equals(service.getId())) { - zkService = service; - } - } - if (hdfsService == null) { - viewErrors.add("Slider applications view requires HDFS service"); - } else { - if (!hdfsService.isStarted()) { - viewErrors - .add("Slider applications view requires HDFS service to be started"); - } - } - if (yarnService == null) { - viewErrors.add("Slider applications view requires YARN service"); - } else { - if (!yarnService.isStarted()) { - viewErrors - .add("Slider applications view requires YARN service to be started"); - } - } - if (zkService == null) { - viewErrors.add("Slider applications view requires ZooKeeper service"); - } else { - if (!zkService.isStarted()) { - viewErrors - .add("Slider applications view requires ZooKeeper service to be started"); - } - } - } else { - viewErrors - .add("Slider applications view is unable to locate any services"); - } - // Check security - if (cluster.getDesiredConfigs() != null - && cluster.getDesiredConfigs().containsKey("hadoop-env")) { - Map<String, String> globalConfig = ambariClient.getConfiguration( - clusterInfo, "hadoop-env", cluster.getDesiredConfigs().get("hadoop-env")); - if (globalConfig != null - && globalConfig.containsKey("security_enabled")) { - String securityValue = globalConfig.get("security_enabled"); - if (Boolean.valueOf(securityValue)) { - viewErrors - .add("Slider applications view cannot be rendered in secure mode"); - } - } else { - viewErrors - .add("Slider applications view is unable to determine the security status of the cluster"); - } - } else { - viewErrors - .add("Slider applications view is unable to determine the security status of the cluster"); - } - } else { - viewErrors.add("Slider applications view requires a cluster"); - } status.setVersion(SliderAppsConfiguration.INSTANCE.getVersion()); - status.setViewEnabled(viewErrors.size() < 1); - status.setViewErrors(viewErrors); return status; } - private AmbariCluster getAmbariCluster() { - AmbariClusterInfo clusterInfo = ambariClient.getClusterInfo(); - if (clusterInfo != null) { - return ambariClient.getCluster(clusterInfo); - } - return null; - } - private String getApplicationIdString(ApplicationId appId) { return Long.toString(appId.getClusterTimestamp()) + "_" - + Integer.toString(appId.getId()); + + Integer.toString(appId.getId()); } private ApplicationId getApplicationId(String appIdString) { @@ -228,7 +140,7 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { } private SliderApp createSliderAppObject(ApplicationReport yarnApp, - Set<String> properties, SliderClient sliderClient) { + Set<String> properties, SliderClient sliderClient) { if (yarnApp == null) { return null; } @@ -311,13 +223,17 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { List<SliderAppType> appTypes = getSliderAppTypes(null); if (appTypes != null && appTypes.size() > 0) { for (SliderAppType appType : appTypes) { - logger.info("TYPE: " + appType.getTypeName() + " " + app.getType()); - logger.info("VERSION: " + appType.getTypeVersion() + " " + app.getAppVersion()); - if ((appType.getTypeName() != null && appType.getTypeName().equalsIgnoreCase(app.getType())) && - (appType.getTypeVersion() != null - && appType.getTypeVersion().equalsIgnoreCase(app.getAppVersion()))) { + logger.info("TYPE: " + appType.getTypeName() + " " + + app.getType()); + logger.info("VERSION: " + appType.getTypeVersion() + " " + + app.getAppVersion()); + if ((appType.getTypeName() != null && appType.getTypeName() + .equalsIgnoreCase(app.getType())) + && (appType.getTypeVersion() != null && appType + .getTypeVersion().equalsIgnoreCase( + app.getAppVersion()))) { app.setJmx(sliderAppClient.getJmx(jmxUrl, viewContext, - appType)); + appType)); break; } } @@ -336,10 +252,8 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { Map<String, SliderAppComponent> componentTypeMap = new HashMap<String, SliderAppComponent>(); for (Entry<String, Object> e : description.status.entrySet()) { @SuppressWarnings("unchecked") - Map<String, Map<String, Map<String, Object>>> - componentsObj = - (Map<String, Map<String, Map<String, Object>>>) e - .getValue(); + Map<String, Map<String, Map<String, Object>>> componentsObj = (Map<String, Map<String, Map<String, Object>>>) e + .getValue(); boolean isLive = "live".equals(e.getKey()); for (Entry<String, Map<String, Map<String, Object>>> componentEntry : componentsObj .entrySet()) { @@ -353,7 +267,7 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { appComponent .setCompletedContainers(new HashMap<String, Map<String, String>>()); componentTypeMap.put(componentEntry.getKey(), - appComponent); + appComponent); } for (Entry<String, Map<String, Object>> containerEntry : componentEntry .getValue().entrySet()) { @@ -366,19 +280,19 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { Object containerPropertyValue = containerValues .get(containerProperty); containerDataMap.put(containerProperty, - containerPropertyValue.toString()); + containerPropertyValue.toString()); } if (isLive) { appComponent.getActiveContainers().put(containerId, - containerDataMap); + containerDataMap); } else { appComponent.getCompletedContainers().put( containerId, containerDataMap); } } appComponent.setInstanceCount(appComponent - .getActiveContainers().size() - + appComponent.getCompletedContainers().size()); + .getActiveContainers().size() + + appComponent.getCompletedContainers().size()); } } app.setComponents(componentTypeMap); @@ -386,16 +300,16 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { } catch (UnknownApplicationInstanceException e) { logger.warn( "Unable to determine app components for " - + yarnApp.getName(), e); + + yarnApp.getName(), e); } catch (YarnException e) { logger.warn( "Unable to determine app components for " - + yarnApp.getName(), e); + + yarnApp.getName(), e); throw new RuntimeException(e.getMessage(), e); } catch (IOException e) { logger.warn( "Unable to determine app components for " - + yarnApp.getName(), e); + + yarnApp.getName(), e); throw new RuntimeException(e.getMessage(), e); } } @@ -407,9 +321,10 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { } /** - * Creates a new {@link SliderClient} initialized with appropriate configuration. If configuration was not determined, - * <code>null</code> is returned. - * + * Creates a new {@link SliderClient} initialized with appropriate + * configuration. If configuration was not determined, <code>null</code> is + * returned. + * * @return */ protected SliderClient getSliderClient() { @@ -426,7 +341,7 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { super.serviceInit(conf); // Override the default FS client to set the super user. FileSystem fs = FileSystem.get(FileSystem.getDefaultUri(getConfig()), - getConfig(), "yarn"); + getConfig(), "yarn"); SliderFileSystem fileSystem = new SliderFileSystem(fs, getConfig()); Field fsField = SliderClient.class .getDeclaredField("sliderFileSystem"); @@ -436,7 +351,7 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { }; try { sliderClientConfiguration = client.bindArgs(sliderClientConfiguration, - new String[]{"usage"}); + new String[] { "usage" }); } catch (Exception e) { logger.warn("Unable to set SliderClient configs", e); throw new RuntimeException(e.getMessage(), e); @@ -449,60 +364,28 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { } /** - * Dynamically determines Slider client configuration. If unable to determine, <code>null</code> is returned. - * + * Dynamically determines Slider client configuration. If unable to determine, + * <code>null</code> is returned. + * * @return */ private Configuration getSliderClientConfiguration() { - AmbariCluster ambariCluster = getAmbariCluster(); - if (ambariCluster != null) { - AmbariService zkService = ambariClient.getService(ambariCluster, - "ZOOKEEPER"); - if (zkService != null && ambariCluster.getDesiredConfigs() != null - && ambariCluster.getDesiredConfigs().containsKey("zookeeper-env") - && ambariCluster.getDesiredConfigs().containsKey("yarn-site") - && ambariCluster.getDesiredConfigs().containsKey("core-site")) { - Map<String, String> zkConfigs = ambariClient.getConfiguration( - ambariCluster, "zookeeper-env", - ambariCluster.getDesiredConfigs().get("zookeeper-env")); - Map<String, String> yarnSiteConfigs = ambariClient.getConfiguration( - ambariCluster, "yarn-site", - ambariCluster.getDesiredConfigs().get("yarn-site")); - Map<String, String> coreSiteConfigs = ambariClient.getConfiguration( - ambariCluster, "core-site", - ambariCluster.getDesiredConfigs().get("core-site")); - String zkPort = zkConfigs.get("clientPort"); - String hdfsPath = coreSiteConfigs.get("fs.defaultFS"); - String rmAddress = yarnSiteConfigs.get("yarn.resourcemanager.address"); - String rmSchedulerAddress = yarnSiteConfigs - .get("yarn.resourcemanager.scheduler.address"); - StringBuilder zkQuorum = new StringBuilder(); - List<AmbariHostComponent> zkHosts = zkService - .getComponentsToHostComponentsMap().get("ZOOKEEPER_SERVER"); - for (AmbariHostComponent zkHost : zkHosts) { - if (zkQuorum.length() > 0) { - zkQuorum.append(','); - } - zkQuorum.append(zkHost.getHostName() + ":" + zkPort); - } - HdfsConfiguration hdfsConfig = new HdfsConfiguration(); - YarnConfiguration yarnConfig = new YarnConfiguration(hdfsConfig); - - yarnConfig.set("slider.yarn.queue", "default"); - yarnConfig.set("yarn.log-aggregation-enable", "true"); - yarnConfig.set("yarn.resourcemanager.address", rmAddress); - yarnConfig.set("yarn.resourcemanager.scheduler.address", - rmSchedulerAddress); - yarnConfig.set("fs.defaultFS", hdfsPath); - yarnConfig.set("slider.zookeeper.quorum", zkQuorum.toString()); - yarnConfig - .set( - "yarn.application.classpath", - "/etc/hadoop/conf,/usr/lib/hadoop/*,/usr/lib/hadoop/lib/*,/usr/lib/hadoop-hdfs/*,/usr/lib/hadoop-hdfs/lib/*,/usr/lib/hadoop-yarn/*,/usr/lib/hadoop-yarn/lib/*,/usr/lib/hadoop-mapreduce/*,/usr/lib/hadoop-mapreduce/lib/*"); - return yarnConfig; - } - } - return null; + String hdfsPath = viewContext.getProperties().get(PROPERTY_HDFS_ADDRESS); + String rmAddress = viewContext.getProperties().get(PROPERTY_YARN_RM_ADDRESS); + String rmSchedulerAddress = viewContext.getProperties().get(PROPERTY_YARN_RM_SCHEDULER_ADDRESS); + String zkQuorum = viewContext.getProperties().get(PROPERTY_ZK_QUOROM); + HdfsConfiguration hdfsConfig = new HdfsConfiguration(); + YarnConfiguration yarnConfig = new YarnConfiguration(hdfsConfig); + + yarnConfig.set("slider.yarn.queue", "default"); + yarnConfig.set("yarn.log-aggregation-enable", "true"); + yarnConfig.set("yarn.resourcemanager.address", rmAddress); + yarnConfig.set("yarn.resourcemanager.scheduler.address", rmSchedulerAddress); + yarnConfig.set("fs.defaultFS", hdfsPath); + yarnConfig.set("slider.zookeeper.quorum", zkQuorum.toString()); + yarnConfig.set("yarn.application.classpath", + "/etc/hadoop/conf,/usr/lib/hadoop/*,/usr/lib/hadoop/lib/*,/usr/lib/hadoop-hdfs/*,/usr/lib/hadoop-hdfs/lib/*,/usr/lib/hadoop-yarn/*,/usr/lib/hadoop-yarn/lib/*,/usr/lib/hadoop-mapreduce/*,/usr/lib/hadoop-mapreduce/lib/*"); + return yarnConfig; } @Override @@ -518,7 +401,7 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { List<ApplicationReport> yarnApps = sliderClient.listSliderInstances(null); for (ApplicationReport yarnApp : yarnApps) { SliderApp sliderAppObject = createSliderAppObject(yarnApp, properties, - sliderClient); + sliderClient); if (sliderAppObject != null) { if (sliderAppsMap.containsKey(sliderAppObject.getName())) { if (sliderAppsMap.get(sliderAppObject.getName()).getId() @@ -594,7 +477,7 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { try { ZipFile zipFile = new ZipFile(appZip); Metainfo metainfo = new MetainfoParser().parse(zipFile - .getInputStream(zipFile.getEntry("metainfo.xml"))); + .getInputStream(zipFile.getEntry("metainfo.xml"))); // Create app type object if (metainfo.getApplication() != null) { Application application = metainfo.getApplication(); @@ -637,11 +520,11 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { // appTypeComponent.setPriority(component.); if (component.getMinInstanceCount() != null) { appTypeComponent.setInstanceCount(Integer.parseInt(component - .getMinInstanceCount())); + .getMinInstanceCount())); } if (component.getMaxInstanceCount() != null) { appTypeComponent.setMaxInstanceCount(Integer - .parseInt(component.getMaxInstanceCount())); + .parseInt(component.getMaxInstanceCount())); } if (resourcesJson != null) { JsonElement componentJson = resourcesJson.getAsJsonObject() @@ -649,10 +532,10 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { .get(component.getName()); if (componentJson != null && componentJson.getAsJsonObject().has( - "yarn.role.priority")) { + "yarn.role.priority")) { appTypeComponent.setPriority(Integer.parseInt(componentJson - .getAsJsonObject().get("yarn.role.priority") - .getAsString())); + .getAsJsonObject().get("yarn.role.priority") + .getAsString())); } } appTypeComponent.setCategory(component.getCategory()); @@ -661,7 +544,7 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { appType.setJmxMetrics(readMetrics(zipFile, "jmx_metrics.json")); appType.setGangliaMetrics(readMetrics(zipFile, - "ganglia_metrics.json")); + "ganglia_metrics.json")); appType.setTypeComponents(appTypeComponentList); appTypes.add(appType); @@ -678,16 +561,16 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { } Map<String, Map<String, Map<String, Metric>>> readMetrics(ZipFile zipFile, - String fileName) { + String fileName) { Map<String, Map<String, Map<String, Metric>>> metrics = null; try { InputStream inputStream = zipFile.getInputStream(zipFile - .getEntry("jmx_metrics.json")); + .getEntry("jmx_metrics.json")); ObjectMapper mapper = new ObjectMapper(); metrics = mapper.readValue(inputStream, - new TypeReference<Map<String, Map<String, Map<String, Metric>>>>() { - }); + new TypeReference<Map<String, Map<String, Map<String, Metric>>>>() { + }); } catch (IOException e) { logger.info("Error reading metrics. " + e.getMessage()); } @@ -727,31 +610,26 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { appCount = ++createAppCounter; } File appCreateFolder = new File(appsCreateFolder, - Integer.toString(appCount)); + Integer.toString(appCount)); appCreateFolder.mkdirs(); File appConfigJsonFile = new File(appCreateFolder, "appConfig.json"); File resourcesJsonFile = new File(appCreateFolder, "resources.json"); saveAppConfigs(configs, componentsArray, appConfigJsonFile); saveAppResources(componentsArray, resourcesJsonFile); - AmbariClusterInfo clusterInfo = ambariClient.getClusterInfo(); - AmbariCluster cluster = ambariClient.getCluster(clusterInfo); - Map<String, String> coreSiteConfigs = ambariClient.getConfiguration( - clusterInfo, "core-site", cluster.getDesiredConfigs() - .get("core-site")); - String hdfsLocation = coreSiteConfigs.get("fs.defaultFS"); + String hdfsLocation = viewContext.getProperties().get(PROPERTY_HDFS_ADDRESS); final ActionCreateArgs createArgs = new ActionCreateArgs(); createArgs.template = appConfigJsonFile; createArgs.resources = resourcesJsonFile; createArgs.image = new Path(hdfsLocation - + "/user/yarn/agent/slider-agent.tar.gz"); + + "/user/yarn/agent/slider-agent.tar.gz"); ClassLoader currentClassLoader = Thread.currentThread() .getContextClassLoader(); Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); try { ApplicationId applicationId = UserGroupInformation.getBestUGI(null, - "yarn").doAs(new PrivilegedExceptionAction<ApplicationId>() { + "yarn").doAs(new PrivilegedExceptionAction<ApplicationId>() { public ApplicationId run() throws IOException, YarnException { SliderClient sliderClient = getSliderClient(); sliderClient.actionCreate(appName, createArgs); @@ -769,10 +647,10 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { } private void saveAppResources(JsonArray componentsArray, - File resourcesJsonFile) throws IOException { + File resourcesJsonFile) throws IOException { JsonObject resourcesObj = new JsonObject(); resourcesObj.addProperty("schema", - "http://example.org/specification/v2.0.0"); + "http://example.org/specification/v2.0.0"); resourcesObj.add("metadata", new JsonObject()); resourcesObj.add("global", new JsonObject()); JsonObject componentsObj = new JsonObject(); @@ -782,11 +660,11 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { if (inputComponent.has("id")) { JsonObject componentValue = new JsonObject(); componentValue.addProperty("yarn.role.priority", - inputComponent.get("priority").getAsString()); + inputComponent.get("priority").getAsString()); componentValue.addProperty("yarn.component.instances", inputComponent .get("instanceCount").getAsString()); componentsObj.add(inputComponent.get("id").getAsString(), - componentValue); + componentValue); } } } @@ -804,7 +682,7 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { } private void saveAppConfigs(JsonObject configs, JsonArray componentsArray, - File appConfigJsonFile) throws IOException { + File appConfigJsonFile) throws IOException { JsonObject appConfigs = new JsonObject(); appConfigs.addProperty("schema", "http://example.org/specification/v2.0.0"); appConfigs.add("metadata", new JsonObject()); @@ -815,7 +693,7 @@ public class SliderAppsViewControllerImpl implements SliderAppsViewController { JsonObject inputComponent = componentsArray.get(i).getAsJsonObject(); if (inputComponent.has("id")) { componentsObj.add(inputComponent.get("id").getAsString(), - new JsonObject()); + new JsonObject()); } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/11146fb6/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/ViewStatus.java ---------------------------------------------------------------------- diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/ViewStatus.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/ViewStatus.java index 134f400..b9dbbbd 100644 --- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/ViewStatus.java +++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/ViewStatus.java @@ -18,34 +18,15 @@ package org.apache.ambari.view.slider; -import java.util.List; public class ViewStatus { - private String version; - private boolean viewEnabled; - private List<String> viewErrors; + private String version; - public String getVersion() { - return version; - } + public String getVersion() { + return version; + } - public void setVersion(String version) { - this.version = version; - } - - public boolean isViewEnabled() { - return viewEnabled; - } - - public void setViewEnabled(boolean viewEnabled) { - this.viewEnabled = viewEnabled; - } - - public List<String> getViewErrors() { - return viewErrors; - } - - public void setViewErrors(List<String> viewErrors) { - this.viewErrors = viewErrors; - } + public void setVersion(String version) { + this.version = version; + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/11146fb6/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/clients/AmbariClient.java ---------------------------------------------------------------------- diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/clients/AmbariClient.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/clients/AmbariClient.java index a53afe4..b77e340 100644 --- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/clients/AmbariClient.java +++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/clients/AmbariClient.java @@ -20,9 +20,6 @@ package org.apache.ambari.view.slider.clients; import java.util.Map; -import com.google.inject.ImplementedBy; - -@ImplementedBy(AmbariInternalClient.class) public interface AmbariClient { /** * Provides the first cluster defined on this Ambari server. http://git-wip-us.apache.org/repos/asf/ambari/blob/11146fb6/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/clients/AmbariInternalClient.java ---------------------------------------------------------------------- diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/clients/AmbariInternalClient.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/clients/AmbariInternalClient.java deleted file mode 100644 index 529af9d..0000000 --- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/clients/AmbariInternalClient.java +++ /dev/null @@ -1,292 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ambari.view.slider.clients; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.ambari.server.controller.predicate.AndPredicate; -import org.apache.ambari.server.controller.predicate.EqualsPredicate; -import org.apache.ambari.server.controller.spi.ClusterController; -import org.apache.ambari.server.controller.spi.NoSuchParentResourceException; -import org.apache.ambari.server.controller.spi.NoSuchResourceException; -import org.apache.ambari.server.controller.spi.Resource; -import org.apache.ambari.server.controller.spi.SystemException; -import org.apache.ambari.server.controller.spi.UnsupportedPropertyException; -import org.apache.ambari.server.controller.utilities.ClusterControllerHelper; -import org.apache.ambari.server.controller.utilities.PropertyHelper; -import org.apache.ambari.server.state.DesiredConfig; -import org.apache.ambari.server.state.State; -import org.apache.log4j.Logger; - -import com.google.inject.Singleton; - -@Singleton -public class AmbariInternalClient implements AmbariClient { - - private static final Logger logger = Logger - .getLogger(AmbariInternalClient.class); - - @Override - public AmbariCluster getCluster(AmbariClusterInfo clusterInfo) { - ClusterController clusterController = ClusterControllerHelper - .getClusterController(); - try { - EqualsPredicate<String> clusterPredicate = new EqualsPredicate<String>( - "Clusters/cluster_name", clusterInfo.getName()); - Set<Resource> clusterResources = clusterController.getResources( - Resource.Type.Cluster, PropertyHelper.getReadRequest(), - clusterPredicate); - if (!clusterResources.isEmpty()) { - Resource clusterResource = clusterResources.iterator().next(); - AmbariCluster cluster = new AmbariCluster(); - cluster.setName(clusterResource.getPropertyValue( - "Clusters/cluster_name").toString()); - cluster.setVersion(clusterResource.getPropertyValue("Clusters/version") - .toString()); - Map<String, String> desiredConfigsMap = new HashMap<String, String>(); - Map<String, Object> desiredConfigsMapResource = clusterResource - .getPropertiesMap().get("Clusters/desired_configs"); - for (Map.Entry<String, Object> siteEntry : desiredConfigsMapResource - .entrySet()) { - desiredConfigsMap.put(siteEntry.getKey(), - ((DesiredConfig) siteEntry.getValue()).getTag()); - } - cluster.setDesiredConfigs(desiredConfigsMap); - - EqualsPredicate<String> serviceClusterPredicate = new EqualsPredicate<String>( - "ServiceInfo/cluster_name", cluster.getName()); - EqualsPredicate<String> hostClusterPredicate = new EqualsPredicate<String>( - "Hosts/cluster_name", cluster.getName()); - Set<Resource> serviceResources = clusterController.getResources( - Resource.Type.Service, PropertyHelper.getReadRequest(), - serviceClusterPredicate); - Set<Resource> hostResources = clusterController.getResources( - Resource.Type.Host, PropertyHelper.getReadRequest(), - hostClusterPredicate); - List<AmbariServiceInfo> servicesList = new ArrayList<AmbariServiceInfo>(); - List<AmbariHostInfo> hostsList = new ArrayList<AmbariHostInfo>(); - for (Resource serviceResource : serviceResources) { - AmbariServiceInfo service = new AmbariServiceInfo(); - service.setId(serviceResource.getPropertyValue( - "ServiceInfo/service_name").toString()); - service.setStarted(State.STARTED.toString().equals( - serviceResource.getPropertyValue("ServiceInfo/state"))); - service.setMaintenanceMode("ON".equals(serviceResource - .getPropertyValue("ServiceInfo/maintenance_state"))); - servicesList.add(service); - } - for (Resource hostResource : hostResources) { - AmbariHostInfo host = new AmbariHostInfo(); - host.setHostName(hostResource.getPropertyValue("Hosts/host_name") - .toString()); - hostsList.add(host); - } - cluster.setServices(servicesList); - cluster.setHosts(hostsList); - return cluster; - } - } catch (UnsupportedPropertyException e) { - logger.warn( - "Unable to determine Ambari cluster details - " - + clusterInfo.getName(), e); - throw new RuntimeException(e.getMessage(), e); - } catch (NoSuchResourceException e) { - logger.warn( - "Unable to determine Ambari cluster details - " - + clusterInfo.getName(), e); - throw new RuntimeException(e.getMessage(), e); - } catch (NoSuchParentResourceException e) { - logger.warn( - "Unable to determine Ambari cluster details - " - + clusterInfo.getName(), e); - throw new RuntimeException(e.getMessage(), e); - } catch (SystemException e) { - logger.warn( - "Unable to determine Ambari cluster details - " - + clusterInfo.getName(), e); - throw new RuntimeException(e.getMessage(), e); - } - return null; - } - - @Override - public AmbariClusterInfo getClusterInfo() { - ClusterController clusterController = ClusterControllerHelper - .getClusterController(); - try { - Set<Resource> resources = clusterController.getResources( - Resource.Type.Cluster, PropertyHelper.getReadRequest(), null); - if (resources.size() > 0) { - Resource clusterResource = resources.iterator().next(); - AmbariClusterInfo clusterInfo = new AmbariClusterInfo(); - clusterInfo.setName(clusterResource.getPropertyValue( - "Clusters/cluster_name").toString()); - clusterInfo.setVersion(clusterResource.getPropertyValue( - "Clusters/version").toString()); - return clusterInfo; - } - } catch (UnsupportedPropertyException e) { - logger.warn("Unable to determine Ambari cluster", e); - throw new RuntimeException(e.getMessage(), e); - } catch (NoSuchResourceException e) { - logger.warn("Unable to determine Ambari cluster", e); - throw new RuntimeException(e.getMessage(), e); - } catch (NoSuchParentResourceException e) { - logger.warn("Unable to determine Ambari cluster", e); - throw new RuntimeException(e.getMessage(), e); - } catch (SystemException e) { - logger.warn("Unable to determine Ambari cluster", e); - throw new RuntimeException(e.getMessage(), e); - } - return null; - } - - @Override - public Map<String, String> getConfiguration(AmbariClusterInfo cluster, - String configType, String configTag) { - ClusterController clusterController = ClusterControllerHelper - .getClusterController(); - try { - EqualsPredicate<String> clusterPredicate = new EqualsPredicate<String>( - "Config/cluster_name", cluster.getName()); - EqualsPredicate<String> typePredicate = new EqualsPredicate<String>( - "type", configType); - EqualsPredicate<String> tagPredicate = new EqualsPredicate<String>("tag", - configTag); - AndPredicate typeTagPredicate = new AndPredicate(typePredicate, - tagPredicate); - AndPredicate configsPredicate = new AndPredicate(clusterPredicate, - typeTagPredicate); - - Set<Resource> configResources = clusterController.getResources( - Resource.Type.Configuration, PropertyHelper.getReadRequest(), - configsPredicate); - if (!configResources.isEmpty()) { - Resource configResource = configResources.iterator().next(); - Map<String, String> configs = new HashMap<String, String>(); - Object props = configResource.getPropertiesMap().get("properties"); - if (props instanceof Map) { - @SuppressWarnings("unchecked") - Map<String, String> propsMap = (Map<String, String>) props; - configs.putAll(propsMap); - } - return configs; - } - } catch (UnsupportedPropertyException e) { - logger.warn("Unable to determine Ambari cluster configuration", e); - throw new RuntimeException(e.getMessage(), e); - } catch (NoSuchResourceException e) { - logger.warn("Unable to determine Ambari cluster configuration", e); - throw new RuntimeException(e.getMessage(), e); - } catch (NoSuchParentResourceException e) { - logger.warn("Unable to determine Ambari cluster configuration", e); - throw new RuntimeException(e.getMessage(), e); - } catch (SystemException e) { - logger.warn("Unable to determine Ambari cluster configuration", e); - throw new RuntimeException(e.getMessage(), e); - } - return null; - } - - @Override - public AmbariService getService(AmbariClusterInfo clusterInfo, - String serviceId) { - ClusterController clusterController = ClusterControllerHelper - .getClusterController(); - try { - EqualsPredicate<String> clusterPredicate = new EqualsPredicate<String>( - "ServiceInfo/cluster_name", clusterInfo.getName()); - EqualsPredicate<String> servicePredicate = new EqualsPredicate<String>( - "ServiceInfo/service_name", serviceId); - AndPredicate andPredicate = new AndPredicate(clusterPredicate, - servicePredicate); - Set<Resource> serviceResources = clusterController.getResources( - Resource.Type.Service, PropertyHelper.getReadRequest(), andPredicate); - if (!serviceResources.isEmpty()) { - Resource serviceResource = serviceResources.iterator().next(); - AmbariService service = new AmbariService(); - service.setId(serviceResource.getPropertyValue( - "ServiceInfo/service_name").toString()); - service.setStarted(State.STARTED.toString().equals( - serviceResource.getPropertyValue("ServiceInfo/state"))); - service.setMaintenanceMode("ON".equals(serviceResource - .getPropertyValue("ServiceInfo/maintenance_state"))); - // Components - Map<String, List<AmbariHostComponent>> componentsMap = new HashMap<String, List<AmbariHostComponent>>(); - service.setComponentsToHostComponentsMap(componentsMap); - clusterPredicate = new EqualsPredicate<String>( - "ServiceComponentInfo/cluster_name", clusterInfo.getName()); - servicePredicate = new EqualsPredicate<String>( - "ServiceComponentInfo/service_name", serviceId); - andPredicate = new AndPredicate(clusterPredicate, servicePredicate); - Set<Resource> componentResources = clusterController.getResources( - Resource.Type.Component, PropertyHelper.getReadRequest(), - andPredicate); - if (!componentResources.isEmpty()) { - for (Resource componentResouce : componentResources) { - List<AmbariHostComponent> hostComponents = new ArrayList<AmbariHostComponent>(); - String componentName = componentResouce.getPropertyValue( - "ServiceComponentInfo/component_name").toString(); - componentsMap.put(componentName, hostComponents); - clusterPredicate = new EqualsPredicate<String>( - "HostRoles/cluster_name", clusterInfo.getName()); - EqualsPredicate<String> componentPredicate = new EqualsPredicate<String>( - "HostRoles/component_name", componentName); - andPredicate = new AndPredicate(clusterPredicate, - componentPredicate); - Set<Resource> hostComponentResources = clusterController - .getResources(Resource.Type.HostComponent, - PropertyHelper.getReadRequest(), andPredicate); - if (!hostComponentResources.isEmpty()) { - for (Resource hostComponentResource : hostComponentResources) { - AmbariHostComponent hc = new AmbariHostComponent(); - hc.setHostName(hostComponentResource.getPropertyValue( - "HostRoles/host_name").toString()); - hc.setName(hostComponentResource.getPropertyValue( - "HostRoles/component_name").toString()); - hc.setStarted(State.STARTED.toString().equals( - hostComponentResource.getPropertyValue("HostRoles/state") - .toString())); - hostComponents.add(hc); - } - } - } - } - return service; - } - } catch (UnsupportedPropertyException e) { - logger.warn("Unable to determine service details - " + serviceId, e); - throw new RuntimeException(e.getMessage(), e); - } catch (NoSuchResourceException e) { - logger.warn("Unable to determine service details - " + serviceId, e); - throw new RuntimeException(e.getMessage(), e); - } catch (NoSuchParentResourceException e) { - logger.warn("Unable to determine service details - " + serviceId, e); - throw new RuntimeException(e.getMessage(), e); - } catch (SystemException e) { - logger.warn("Unable to determine service details - " + serviceId, e); - throw new RuntimeException(e.getMessage(), e); - } - return null; - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/11146fb6/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/JMXMetricHolder.java ---------------------------------------------------------------------- diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/JMXMetricHolder.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/JMXMetricHolder.java new file mode 100644 index 0000000..04b824a --- /dev/null +++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/JMXMetricHolder.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ambari.view.slider.rest.client; + +import java.util.List; +import java.util.Map; + +/** + * + */ +public final class JMXMetricHolder { + + private List<Map<String, Object>> beans; + + public List<Map<String, Object>> getBeans() { + return beans; + } + + public void setBeans(List<Map<String, Object>> beans) { + this.beans = beans; + } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + + for (Map<String, Object> map : beans) { + for (Map.Entry<String, Object> entry : map.entrySet()) { + stringBuilder.append(" ").append(entry.toString()).append("\n"); + } + } + return stringBuilder.toString(); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/11146fb6/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/SliderAppJmxHelper.java ---------------------------------------------------------------------- diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/SliderAppJmxHelper.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/SliderAppJmxHelper.java index e0a8072..d3ca1e4 100644 --- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/SliderAppJmxHelper.java +++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/SliderAppJmxHelper.java @@ -18,7 +18,6 @@ package org.apache.ambari.view.slider.rest.client; -import org.apache.ambari.server.controller.jmx.JMXMetricHolder; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.codehaus.jackson.map.DeserializationConfig; http://git-wip-us.apache.org/repos/asf/ambari/blob/11146fb6/contrib/views/slider/src/main/resources/ui/app/controllers/slider_apps_controller.js ---------------------------------------------------------------------- diff --git a/contrib/views/slider/src/main/resources/ui/app/controllers/slider_apps_controller.js b/contrib/views/slider/src/main/resources/ui/app/controllers/slider_apps_controller.js index 7199777..2f422f1 100644 --- a/contrib/views/slider/src/main/resources/ui/app/controllers/slider_apps_controller.js +++ b/contrib/views/slider/src/main/resources/ui/app/controllers/slider_apps_controller.js @@ -146,13 +146,19 @@ App.SliderAppsController = Ember.ArrayController.extend({ * @method sendInitialValues */ sendInitialValues: function () { + var initialValues = this.get('initialValuesToLoad'); return App.ajax.send({ name: 'saveInitialValues', sender: this, data: { data: { ViewInstanceInfo: { - properties: this.get('initialValuesToLoad') + properties: { + 'hdfs.address': initialValues.get('hdfsAddress'), + 'yarn.resourcemanager.address': initialValues.get('yarnRMAddress'), + 'yarn.resourcemanager.scheduler.address': initialValues.get('yarnRMSchedulerAddress'), + 'zookeeper.quorum': initialValues.get('zookeeperQuorum') + } } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/11146fb6/contrib/views/slider/src/main/resources/ui/app/initialize.js ---------------------------------------------------------------------- diff --git a/contrib/views/slider/src/main/resources/ui/app/initialize.js b/contrib/views/slider/src/main/resources/ui/app/initialize.js index a9df6ad..4fc797a 100755 --- a/contrib/views/slider/src/main/resources/ui/app/initialize.js +++ b/contrib/views/slider/src/main/resources/ui/app/initialize.js @@ -29,7 +29,18 @@ App.initializer({ name: "preload", initialize: function(container, application) { - + var viewId = 'SLIDER'; + var viewVersion = '1.0.0'; + var instanceName = 'SLIDER_1'; + if (location.pathname != null) { + var splits = location.pathname.split('/'); + if (splits != null && splits.length > 4) { + viewId = splits[2]; + viewVersion = splits[3]; + instanceName = splits[4]; + } + } + application.reopen({ /** * Test mode is automatically enabled if running on brunch server @@ -40,13 +51,13 @@ App.initializer({ /** * @type {string} */ - name: 'SLIDER', + name: viewId, /** * Slider version * @type {string} */ - version: '1.0.0', + version: viewVersion, /** * Version of SLIDER_1 resource @@ -57,7 +68,7 @@ App.initializer({ /** * @type {string} */ - instance: 'SLIDER_1', + instance: instanceName, /** * API url for Slider http://git-wip-us.apache.org/repos/asf/ambari/blob/11146fb6/contrib/views/slider/src/main/resources/view.xml ---------------------------------------------------------------------- diff --git a/contrib/views/slider/src/main/resources/view.xml b/contrib/views/slider/src/main/resources/view.xml index 57499ce..87dfbe7 100644 --- a/contrib/views/slider/src/main/resources/view.xml +++ b/contrib/views/slider/src/main/resources/view.xml @@ -18,9 +18,26 @@ limitations under the License. Kerberos, LDAP, Custom. Binary/Htt <name>SLIDER</name> <label>Slider Apps View</label> <version>1.0.0</version> - <instance> - <name>SLIDER_1</name> - </instance> + <parameter> + <name>hdfs.address</name> + <description>The URL to access HDFS service via its protocol. Typically this is the fs.defaultFS property in the core-site.xml configuration. For example: hdfs://hdfs.namenode.host:8020.</description> + <required>false</required> + </parameter> + <parameter> + <name>yarn.resourcemanager.address</name> + <description>The URL to the YARN ResourceManager, used to provide YARN Application data. For example: http://yarn.resourcemanager.host:8050</description> + <required>false</required> + </parameter> + <parameter> + <name>yarn.resourcemanager.scheduler.address</name> + <description>The URL to the YARN ResourceManager Scheduler, which schedules YARN Applications. For example: http://yarn.resourcemanager.host:8030</description> + <required>false</required> + </parameter> + <parameter> + <name>zookeeper.quorum</name> + <description>ZooKeeper quorum location. Typically this is a comma separated list of ZooKeeper hostnames and port numbers. The port number can be got from the clientPort property in the zookeeper-env configuration. For example: zookeeper.host1:2181,zookeeper.host2:2181.</description> + <required>false</required> + </parameter> <resource> <name>status</name> <service-class>org.apache.ambari.view.slider.rest.ViewStatusResource</service-class>