This is an automated email from the ASF dual-hosted git repository.

amagyar pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git

commit cb013822f6f93548bab0734a7660a361e5a4f725
Author: Attila Magyar <amag...@hortonworks.com>
AuthorDate: Wed Mar 7 20:09:16 2018 +0100

    AMBARI-22755. Show OneFS JMX metrics on the UI (amagyar)
---
 .../internal/AbstractProviderModule.java           |  10 +-
 .../internal/ConfigBasedJmxHostProvider.java       |  95 +++++++++++++++++++
 .../internal/StackDefinedPropertyProvider.java     |   9 +-
 .../server/controller/jmx/JMXHostProvider.java     |  32 +------
 .../ambari/server/state/alert/AmsSource.java       |   4 +-
 .../ambari/server/state/alert/MetricSource.java    |   4 +-
 .../state/alert/{AlertUri.java => MetricsUri.java} |   6 +-
 .../ambari/server/state/alert/ServerSource.java    |   4 +-
 .../ambari/server/state/alert/WebSource.java       |   4 +-
 .../server/state/stack/MetricDefinition.java       |   9 ++
 .../internal/ConfigBasedJmxHostProviderTest.java   |  93 ++++++++++++++++++
 .../controller/internal/JMXHostProviderTest.java   | 104 +++++++-------------
 .../metrics/JMXPropertyProviderTest.java           |  11 +--
 .../{AlertUriTest.java => MetricsUriTest.java}     |   8 +-
 .../app/controllers/global/update_controller.js    |   3 +-
 ambari-web/app/mappers/service_metrics_mapper.js   |  49 ++++++++++
 ambari-web/app/models.js                           |   1 +
 ambari-web/app/models/service.js                   |   1 +
 ambari-web/app/models/service/onefs.js             |  43 +++++++++
 ambari-web/app/views/main/service/info/summary.js  |   1 +
 .../addon-services/ONEFS/1.0.0/metrics.json        | 105 +++++++++++++++++++++
 21 files changed, 461 insertions(+), 135 deletions(-)

diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
index caa21bc..4486410 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java
@@ -486,8 +486,7 @@ public abstract class AbstractProviderModule implements 
ProviderModule,
     return hosts;
   }
 
-  @Override
-  public Host getHost(String clusterName, String hostName) {
+  private Host getHost(String clusterName, String hostName) {
     Host host = null;
     try {
       Cluster cluster = 
managementController.getClusters().getCluster(clusterName);
@@ -518,12 +517,7 @@ public abstract class AbstractProviderModule implements 
ProviderModule,
   // ----- JMXHostProvider ---------------------------------------------------
 
   @Override
-  public String getPort(String clusterName, String componentName, String 
hostName) throws SystemException {
-    return getPort(clusterName, componentName, hostName, false);
-  }
-
-  @Override
-  public String getPort(String clusterName, String componentName, String 
hostName, boolean httpsEnabled) throws SystemException {
+  public String getPort(String clusterName, String componentName, String 
hostName, boolean httpsEnabled) {
     ConcurrentMap<String, ConcurrentMap<String, String>> clusterJmxPorts;
     // Still need double check to ensure single init
     if (!jmxPortMap.containsKey(clusterName)) {
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigBasedJmxHostProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigBasedJmxHostProvider.java
new file mode 100644
index 0000000..62b292f
--- /dev/null
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigBasedJmxHostProvider.java
@@ -0,0 +1,95 @@
+/*
+ *
+ *  * 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.server.controller.internal;
+
+import static edu.emory.mathcs.backport.java.util.Collections.singleton;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.controller.jmx.JMXHostProvider;
+import org.apache.ambari.server.state.ConfigHelper;
+import org.apache.ambari.server.state.alert.MetricsUri;
+
+/**
+ * I'm a special {@link JMXHostProvider} that resolves JMX URIs based on 
cluster configuration.
+ */
+public class ConfigBasedJmxHostProvider implements JMXHostProvider {
+  private final Map<String, MetricsUri> overriddenJmxUris;
+  private final JMXHostProvider defaultProvider;
+  private final ConfigHelper configHelper;
+
+  public ConfigBasedJmxHostProvider(Map<String, MetricsUri> overriddenJmxUris, 
JMXHostProvider defaultProvider, ConfigHelper configHelper) {
+    this.overriddenJmxUris = overriddenJmxUris;
+    this.defaultProvider = defaultProvider;
+    this.configHelper = configHelper;
+  }
+
+  @Override
+  public String getPublicHostName(String clusterName, String hostName) {
+    return defaultProvider.getPublicHostName(clusterName, hostName);
+  }
+
+  @Override
+  public Set<String> getHostNames(String clusterName, String componentName) {
+    return overridenJmxUri(componentName)
+      .map(uri -> singleton(resolve(uri, clusterName).getHost()))
+      .orElseGet(() -> defaultProvider.getHostNames(clusterName, 
componentName));
+  }
+
+  private URI resolve(MetricsUri uri, String clusterName) {
+    try {
+      return uri.resolve(config(clusterName));
+    } catch (AmbariException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  @Override
+  public String getPort(String clusterName, String componentName, String 
hostName, boolean httpsEnabled) {
+    return overridenJmxUri(componentName)
+      .map(uri -> String.valueOf(resolve(uri, clusterName).getPort()))
+      .orElseGet(() -> defaultProvider.getPort(clusterName, componentName, 
hostName, httpsEnabled));
+  }
+
+  @Override
+  public String getJMXProtocol(String clusterName, String componentName) {
+    return overridenJmxUri(componentName)
+      .map(uri -> resolve(uri, clusterName).getScheme())
+      .orElseGet(() -> defaultProvider.getJMXProtocol(clusterName, 
componentName));
+  }
+
+  @Override
+  public String getJMXRpcMetricTag(String clusterName, String componentName, 
String port) {
+    return defaultProvider.getJMXRpcMetricTag(clusterName, componentName, 
port);
+  }
+
+  private Optional<MetricsUri> overridenJmxUri(String component) {
+    return Optional.ofNullable(overriddenJmxUris.get(component));
+  }
+
+  private Map<String, Map<String, String>> config(String clusterName) throws 
AmbariException {
+    return configHelper.getEffectiveConfigProperties(clusterName, null);
+  }
+}
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProvider.java
index 861007b..34936a9 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDefinedPropertyProvider.java
@@ -50,6 +50,7 @@ import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.alert.MetricsUri;
 import org.apache.ambari.server.state.stack.Metric;
 import org.apache.ambari.server.state.stack.MetricDefinition;
 import org.slf4j.Logger;
@@ -157,6 +158,7 @@ public class StackDefinedPropertyProvider implements 
PropertyProvider {
 
     List<PropertyProvider> additional = new ArrayList<>();
     Map<String, String> overriddenHosts = new HashMap<>();
+    Map<String, MetricsUri> overriddenJmxUris = new HashMap<>();
 
     try {
       for (Resource r : resources) {
@@ -188,6 +190,7 @@ public class StackDefinedPropertyProvider implements 
PropertyProvider {
             m.getOverriddenHosts().ifPresent(host -> 
overriddenHosts.put(componentName, host));
           } else if (m.getType().equals("jmx")) {
             jmxMap.put(componentName, getPropertyInfo(m));
+            m.getJmxSourceUri().ifPresent(uri -> 
overriddenJmxUris.put(componentName, uri));
           } else {
             PropertyProvider pp = getDelegate(m,
                 streamProvider, metricHostProvider,
@@ -222,7 +225,7 @@ public class StackDefinedPropertyProvider implements 
PropertyProvider {
       if (jmxMap.size() > 0) {
         JMXPropertyProvider jpp = 
metricPropertyProviderFactory.createJMXPropertyProvider(jmxMap,
             streamProvider,
-            jmxHostProvider, metricHostProvider,
+            jmxHostProvider(overriddenJmxUris, jmxHostProvider, 
injector.getInstance(ConfigHelper.class)), metricHostProvider,
             clusterNamePropertyId, hostNamePropertyId,
             componentNamePropertyId, resourceStatePropertyId);
 
@@ -247,6 +250,10 @@ public class StackDefinedPropertyProvider implements 
PropertyProvider {
     return resources;
   }
 
+  private JMXHostProvider jmxHostProvider(Map<String, MetricsUri> 
overriddenJmxUris, JMXHostProvider defaultProvider, ConfigHelper configHelper) {
+    return overriddenJmxUris.isEmpty() ? defaultProvider : new 
ConfigBasedJmxHostProvider(overriddenJmxUris, defaultProvider, configHelper);
+  }
+
   private MetricHostProvider metricHostProvider(Map<String, String> 
overriddenHosts) {
     return new OverriddenMetricsHostProvider(overriddenHosts, 
metricHostProvider, injector.getInstance(ConfigHelper.class));
   }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXHostProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXHostProvider.java
index 4e48b53..ea79fe7 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXHostProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXHostProvider.java
@@ -19,9 +19,6 @@ package org.apache.ambari.server.controller.jmx;
 
 import java.util.Set;
 
-import org.apache.ambari.server.controller.spi.SystemException;
-import org.apache.ambari.server.state.Host;
-
 /**
  * Provider of JMX host information.
  */
@@ -41,28 +38,6 @@ public interface JMXHostProvider {
   Set<String> getHostNames(String clusterName, String componentName);
 
   /**
-   * Get cluster host info given the host name
-   * @param clusterName
-   * @param hostName the host name
-   * @return the host info {@link Host}
-   */
-  Host getHost(String clusterName, String hostName);
-
-  /**
-   * Get the port for the specified cluster name and component.
-   *
-   * @param clusterName    the cluster name
-   * @param componentName  the component name
-   * @param hostName       the component hostName
-   *
-   * @return the port for the specified cluster name and component
-   *
-   * @throws SystemException if unable to get the JMX port
-   */
-  String getPort(String clusterName, String componentName, String hostName)
-      throws SystemException;
-
-  /**
    * Get the port for the specified cluster name and component.
    *
    * @param clusterName    the cluster name
@@ -71,12 +46,9 @@ public interface JMXHostProvider {
    * @param httpsEnabled   https enabled
    *
    * @return the port for the specified cluster name and component
-   *
-   * @throws SystemException if unable to get the JMX port
    */
-  String getPort(String clusterName, String componentName, String hostName, 
boolean httpsEnabled)
-      throws SystemException;
-  
+  String getPort(String clusterName, String componentName, String hostName, 
boolean httpsEnabled);
+
   /**
    * Get the protocol for the specified cluster name and component.
    *
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AmsSource.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AmsSource.java
index f894be1..3a3ec2f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AmsSource.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AmsSource.java
@@ -34,7 +34,7 @@ import com.google.gson.annotations.SerializedName;
 public class AmsSource extends Source {
 
   @SerializedName("uri")
-  private AlertUri uri = null;
+  private MetricsUri uri = null;
 
   @SerializedName("ams")
   private AmsInfo amsInfo = null;
@@ -51,7 +51,7 @@ public class AmsSource extends Source {
    * @return the uri info, which may include port information
    */
   @JsonProperty("uri")
-  public AlertUri getUri() {
+  public MetricsUri getUri() {
     return uri;
   }
 
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/MetricSource.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/MetricSource.java
index f44e17f..8107383 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/MetricSource.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/MetricSource.java
@@ -43,7 +43,7 @@ import com.google.gson.annotations.SerializedName;
 public class MetricSource extends Source {
 
   @SerializedName("uri")
-  private AlertUri uri = null;
+  private MetricsUri uri = null;
 
   @SerializedName("jmx")
   private JmxInfo jmxInfo = null;
@@ -71,7 +71,7 @@ public class MetricSource extends Source {
    * @return the uri info, which may include port information
    */
   @JsonProperty("uri")
-  public AlertUri getUri() {
+  public MetricsUri getUri() {
     return uri;
   }
 
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertUri.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/MetricsUri.java
similarity index 98%
rename from 
ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertUri.java
rename to 
ambari-server/src/main/java/org/apache/ambari/server/state/alert/MetricsUri.java
index 82fc97b..0e52fd6 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertUri.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/MetricsUri.java
@@ -29,7 +29,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.gson.annotations.SerializedName;
 
 /**
- * The {@link AlertUri} class is used to represent a complex URI structure 
where
+ * The {@link MetricsUri} class is used to represent a complex URI structure 
where
  * there can be both a plaintext and SSL URI. This is used in cases where the
  * alert definition needs a way to expose which URL (http or https) should be
  * used to gather data. Currently, only {@link MetricSource} uses this, but it
@@ -37,7 +37,7 @@ import com.google.gson.annotations.SerializedName;
  * URI.
  */
 @JsonInclude(JsonInclude.Include.NON_EMPTY)
-public class AlertUri {
+public class MetricsUri {
   /**
    * The HTTP URI to use.
    */
@@ -374,7 +374,7 @@ public class AlertUri {
       return false;
     }
 
-    AlertUri other = (AlertUri) obj;
+    MetricsUri other = (MetricsUri) obj;
     if (m_httpUri == null) {
       if (other.m_httpUri != null) {
         return false;
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/ServerSource.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/ServerSource.java
index a385073..19e7ae6 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/ServerSource.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/ServerSource.java
@@ -34,7 +34,7 @@ public class ServerSource extends ParameterizedSource {
   private String m_class;
 
   @SerializedName("uri")
-  private AlertUri uri = null;
+  private MetricsUri uri = null;
 
   @SerializedName("jmx")
   private MetricSource.JmxInfo jmxInfo = null;
@@ -52,7 +52,7 @@ public class ServerSource extends ParameterizedSource {
     return jmxInfo;
   }
 
-  public AlertUri getUri() {
+  public MetricsUri getUri() {
     return uri;
   }
 
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/WebSource.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/WebSource.java
index 63b5647..9accae3 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/alert/WebSource.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/alert/WebSource.java
@@ -33,13 +33,13 @@ import com.google.gson.annotations.SerializedName;
 public class WebSource extends Source {
 
   @SerializedName("uri")
-  private AlertUri uri = null;
+  private MetricsUri uri = null;
 
   /**
    * @return the uri info, which may include port information
    */
   @JsonProperty("uri")
-  public AlertUri getUri() {
+  public MetricsUri getUri() {
     return uri;
   }
 
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/MetricDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/MetricDefinition.java
index 033b18b..08902d8 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/MetricDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/MetricDefinition.java
@@ -24,9 +24,12 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 
+import org.apache.ambari.server.state.alert.MetricsUri;
 import org.codehaus.jackson.annotate.JsonIgnore;
 import org.codehaus.jackson.annotate.JsonProperty;
 
+import com.google.gson.annotations.SerializedName;
+
 /**
  * Used to represent metrics for a stack component.
  */
@@ -35,6 +38,8 @@ public class MetricDefinition {
   private String type = null;
   private Map<String, String> properties = null;
   private Map<String, Map<String, Metric>> metrics = null;
+  @SerializedName("jmx_source_uri")
+  private MetricsUri jmxSourceUri;
 
   public MetricDefinition(String type, Map<String, String> properties, 
Map<String, Map<String, Metric>> metrics) {
     this.type = type;
@@ -82,4 +87,8 @@ public class MetricDefinition {
       ? Optional.empty()
       : Optional.ofNullable(properties.get(OVERRIDDEN_HOST_PROP));
   }
+
+  public Optional<MetricsUri> getJmxSourceUri() {
+    return !"jmx".equalsIgnoreCase(type) ? Optional.empty() : 
Optional.ofNullable(jmxSourceUri);
+  }
 }
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigBasedJmxHostProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigBasedJmxHostProviderTest.java
new file mode 100644
index 0000000..ca4b4e4
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigBasedJmxHostProviderTest.java
@@ -0,0 +1,93 @@
+/*
+ *
+ *  * 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.server.controller.internal;
+
+import static org.easymock.EasyMock.expect;
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.ambari.server.controller.jmx.JMXHostProvider;
+import org.apache.ambari.server.state.ConfigHelper;
+import org.apache.ambari.server.state.alert.MetricsUri;
+import org.easymock.EasyMockRule;
+import org.easymock.EasyMockSupport;
+import org.easymock.Mock;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class ConfigBasedJmxHostProviderTest extends EasyMockSupport {
+  private static final String COMPONENT_WITH_OVERRIDDEN_HOST = "component1";
+  private static final String CLUSTER_1 = "cluster1";
+  private static final String COMPONENT_WITHOUT_OVERRIDDEN_HOST = 
"componentWithoutOverriddenHost";
+  private static final String RESOLVED_HOST = "resolved.fqdn";
+  private static final Set<String> resolvedUris = new 
HashSet<>(Arrays.asList(RESOLVED_HOST));
+  @Rule
+  public EasyMockRule mocks = new EasyMockRule(this);
+  @Mock
+  private JMXHostProvider defaultHostProvider;
+  @Mock
+  private ConfigHelper configHelper;
+  private JMXHostProvider hostProvider;
+
+  @Before
+  public void setUp() throws Exception {
+    hostProvider = new ConfigBasedJmxHostProvider(overrideHosts(), 
defaultHostProvider, configHelper);
+  }
+
+  @Test
+  public void testDelegatesWhenHostIsNotOverridden() throws Exception {
+    expect(defaultHostProvider.getHostNames(CLUSTER_1, 
COMPONENT_WITHOUT_OVERRIDDEN_HOST)).andReturn(resolvedUris).anyTimes();
+    replayAll();
+    assertThat(hostProvider.getHostNames(CLUSTER_1, 
COMPONENT_WITHOUT_OVERRIDDEN_HOST), is(resolvedUris));
+    verifyAll();
+  }
+
+  @Test
+  public void testGetsUriFromConfigWhenHostIsOverridden() throws Exception {
+    expect(configHelper.getEffectiveConfigProperties(CLUSTER_1, 
null)).andReturn(config()).anyTimes();
+    replayAll();
+    assertThat(hostProvider.getHostNames(CLUSTER_1, 
COMPONENT_WITH_OVERRIDDEN_HOST), is(resolvedUris));
+    verifyAll();
+  }
+
+  private Map<String, MetricsUri> overrideHosts() {
+    MetricsUri uri = new MetricsUri();
+    uri.setHttpUri("${hdfs-site/dfs.namenode.http-address}");
+    return new HashMap<String, MetricsUri>() {{
+      put(COMPONENT_WITH_OVERRIDDEN_HOST, uri);
+    }};
+  }
+
+  private Map<String, Map<String, String>> config() {
+    return new HashMap<String, Map<String, String>>() {{
+      put("hdfs-site", new HashMap<String, String>() {{
+        put("dfs.namenode.http-address", RESOLVED_HOST);
+      }});
+    }};
+  }
+}
\ No newline at end of file
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
index 644fe1d..cc178da 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
@@ -37,13 +37,8 @@ import 
org.apache.ambari.server.controller.MaintenanceStateHelper;
 import org.apache.ambari.server.controller.ServiceComponentHostRequest;
 import org.apache.ambari.server.controller.ServiceComponentRequest;
 import org.apache.ambari.server.controller.ServiceRequest;
-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.ResourceAlreadyExistsException;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
-import org.apache.ambari.server.controller.spi.SystemException;
-import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.apache.ambari.server.orm.OrmTestHelper;
@@ -448,10 +443,7 @@ public class JMXHostProviderTest {
 
 
   @Test
-  public void testJMXPortMapInitAtServiceLevelVersion1() throws
-      NoSuchParentResourceException,
-      ResourceAlreadyExistsException, UnsupportedPropertyException,
-      SystemException, AmbariException, NoSuchResourceException, 
NoSuchFieldException, IllegalAccessException {
+  public void testJMXPortMapInitAtServiceLevelVersion1() throws Exception {
 
     createHDFSServiceConfigs(true);
 
@@ -459,19 +451,16 @@ public class JMXHostProviderTest {
     providerModule.registerResourceProvider(Resource.Type.Service);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     // Non default port addresses
-    Assert.assertEquals("70070", providerModule.getPort("c1", "NAMENODE", 
"localhost"));
-    Assert.assertEquals("70075", providerModule.getPort("c1", "DATANODE", 
"localhost"));
+    Assert.assertEquals("70070", providerModule.getPort("c1", "NAMENODE", 
"localhost", false));
+    Assert.assertEquals("70075", providerModule.getPort("c1", "DATANODE", 
"localhost", false));
     // Default port addresses
-    Assert.assertEquals(null, providerModule.getPort("c1", "JOBTRACKER", 
"localhost"));
-    Assert.assertEquals(null, providerModule.getPort("c1", "TASKTRACKER", 
"localhost"));
-    Assert.assertEquals(null, providerModule.getPort("c1", "HBASE_MASTER", 
"localhost"));
+    Assert.assertEquals(null, providerModule.getPort("c1", "JOBTRACKER", 
"localhost", false));
+    Assert.assertEquals(null, providerModule.getPort("c1", "TASKTRACKER", 
"localhost", false));
+    Assert.assertEquals(null, providerModule.getPort("c1", "HBASE_MASTER", 
"localhost", false));
   }
 
   @Test
-  public void testJMXPortMapInitAtServiceLevelVersion2() throws
-      NoSuchParentResourceException,
-      ResourceAlreadyExistsException, UnsupportedPropertyException,
-      SystemException, AmbariException, NoSuchResourceException, 
NoSuchFieldException, IllegalAccessException {
+  public void testJMXPortMapInitAtServiceLevelVersion2() throws Exception {
 
     createHDFSServiceConfigs(false);
 
@@ -479,20 +468,16 @@ public class JMXHostProviderTest {
     providerModule.registerResourceProvider(Resource.Type.Service);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     // Non default port addresses
-    Assert.assertEquals("70071", providerModule.getPort("c1", "NAMENODE", 
"localhost"));
-    Assert.assertEquals("70075", providerModule.getPort("c1", "DATANODE", 
"localhost"));
+    Assert.assertEquals("70071", providerModule.getPort("c1", "NAMENODE", 
"localhost", false));
+    Assert.assertEquals("70075", providerModule.getPort("c1", "DATANODE", 
"localhost", false));
     // Default port addresses
-    Assert.assertEquals(null, providerModule.getPort("c1", "JOBTRACKER", 
"localhost"));
-    Assert.assertEquals(null, providerModule.getPort("c1", "TASKTRACKER", 
"localhost"));
-    Assert.assertEquals(null, providerModule.getPort("c1", "HBASE_MASTER", 
"localhost"));
+    Assert.assertEquals(null, providerModule.getPort("c1", "JOBTRACKER", 
"localhost", false));
+    Assert.assertEquals(null, providerModule.getPort("c1", "TASKTRACKER", 
"localhost", false));
+    Assert.assertEquals(null, providerModule.getPort("c1", "HBASE_MASTER", 
"localhost", false));
   }
 
   @Test
-  public void testJMXPortMapNameNodeHa() throws
-      NoSuchParentResourceException,
-      ResourceAlreadyExistsException, UnsupportedPropertyException,
-      SystemException, AmbariException, NoSuchResourceException, 
NoSuchFieldException, IllegalAccessException {
-
+  public void testJMXPortMapNameNodeHa() throws Exception {
     createConfigsNameNodeHa();
 
     JMXHostProviderModule providerModule = new 
JMXHostProviderModule(controller);
@@ -500,28 +485,24 @@ public class JMXHostProviderTest {
     providerModule.registerResourceProvider(Resource.Type.Configuration);
 
 
-    Assert.assertEquals("50071", providerModule.getPort("nnha", "NAMENODE", 
"h1"));
-    Assert.assertEquals("50072", providerModule.getPort("nnha", "NAMENODE", 
"h2"));
+    Assert.assertEquals("50071", providerModule.getPort("nnha", "NAMENODE", 
"h1", false));
+    Assert.assertEquals("50072", providerModule.getPort("nnha", "NAMENODE", 
"h2", false));
   }
 
   @Test
-  public void testJMXPortMapInitAtClusterLevel() throws
-      NoSuchParentResourceException,
-      ResourceAlreadyExistsException, UnsupportedPropertyException,
-      SystemException, AmbariException, NoSuchResourceException, 
NoSuchFieldException, IllegalAccessException {
-
+  public void testJMXPortMapInitAtClusterLevel() throws Exception {
     createConfigs();
 
     JMXHostProviderModule providerModule = new 
JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     // Non default port addresses
-    Assert.assertEquals("70070", providerModule.getPort("c1", "NAMENODE", 
"localhost"));
-    Assert.assertEquals("70075", providerModule.getPort("c1", "DATANODE", 
"localhost"));
+    Assert.assertEquals("70070", providerModule.getPort("c1", "NAMENODE", 
"localhost", false));
+    Assert.assertEquals("70075", providerModule.getPort("c1", "DATANODE", 
"localhost", false));
     // Default port addresses
-    Assert.assertEquals(null, providerModule.getPort("c1", "JOBTRACKER", 
"localhost"));
-    Assert.assertEquals(null, providerModule.getPort("c1", "TASKTRACKER", 
"localhost"));
-    Assert.assertEquals(null, providerModule.getPort("c1", "HBASE_MASTER", 
"localhost"));
+    Assert.assertEquals(null, providerModule.getPort("c1", "JOBTRACKER", 
"localhost", false));
+    Assert.assertEquals(null, providerModule.getPort("c1", "TASKTRACKER", 
"localhost", false));
+    Assert.assertEquals(null, providerModule.getPort("c1", "HBASE_MASTER", 
"localhost", false));
   }
 
   @Test
@@ -552,10 +533,7 @@ public class JMXHostProviderTest {
   }
 
   @Test
-  public void testJMXHttpsPort() throws
-      NoSuchParentResourceException,
-      ResourceAlreadyExistsException, UnsupportedPropertyException,
-      SystemException, AmbariException, NoSuchResourceException, 
NoSuchFieldException, IllegalAccessException {
+  public void testJMXHttpsPort() throws Exception {
     createConfigs();
     JMXHostProviderModule providerModule = new 
JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
@@ -567,10 +545,7 @@ public class JMXHostProviderTest {
   }
 
   @Test
-  public void testJMXHistoryServerHttpsPort() throws
-      NoSuchParentResourceException,
-      ResourceAlreadyExistsException, UnsupportedPropertyException,
-      SystemException, AmbariException, NoSuchResourceException, 
NoSuchFieldException, IllegalAccessException {
+  public void testJMXHistoryServerHttpsPort() throws Exception {
     createConfigs();
     JMXHostProviderModule providerModule = new 
JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
@@ -581,10 +556,7 @@ public class JMXHostProviderTest {
   }
 
   @Test
-  public void testJMXJournalNodeHttpsPort() throws
-      NoSuchParentResourceException,
-      ResourceAlreadyExistsException, UnsupportedPropertyException,
-      SystemException, AmbariException, NoSuchResourceException, 
NoSuchFieldException, IllegalAccessException {
+  public void testJMXJournalNodeHttpsPort() throws Exception {
     createConfigs();
     JMXHostProviderModule providerModule = new 
JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
@@ -594,10 +566,7 @@ public class JMXHostProviderTest {
   }
 
   @Test
-  public void testJMXDataNodeHttpsPort() throws
-      NoSuchParentResourceException,
-      ResourceAlreadyExistsException, UnsupportedPropertyException,
-      SystemException, AmbariException, NoSuchResourceException, 
NoSuchFieldException, IllegalAccessException {
+  public void testJMXDataNodeHttpsPort() throws Exception {
     createConfigs();
     JMXHostProviderModule providerModule = new 
JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
@@ -607,10 +576,7 @@ public class JMXHostProviderTest {
   }
 
   @Test
-  public void testJMXHbaseMasterHttps() throws
-      NoSuchParentResourceException,
-      ResourceAlreadyExistsException, UnsupportedPropertyException,
-      SystemException, AmbariException, NoSuchResourceException, 
NoSuchFieldException, IllegalAccessException {
+  public void testJMXHbaseMasterHttps() throws Exception {
     createConfigs();
     JMXHostProviderModule providerModule = new 
JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
@@ -620,18 +586,14 @@ public class JMXHostProviderTest {
   }
 
   @Test
-  public void testJMXPortMapUpdate() throws
-      NoSuchParentResourceException,
-      ResourceAlreadyExistsException, UnsupportedPropertyException,
-      SystemException, AmbariException, NoSuchResourceException, 
NoSuchFieldException, IllegalAccessException {
-
+  public void testJMXPortMapUpdate() throws Exception {
     createConfigs();
 
     JMXHostProviderModule providerModule = new 
JMXHostProviderModule(controller);
     providerModule.registerResourceProvider(Resource.Type.Cluster);
     providerModule.registerResourceProvider(Resource.Type.Configuration);
     // Non default port addresses
-    Assert.assertEquals("8088", providerModule.getPort("c1", 
"RESOURCEMANAGER", "localhost"));
+    Assert.assertEquals("8088", providerModule.getPort("c1", 
"RESOURCEMANAGER", "localhost", false));
 
     Map<String, String> yarnConfigs = new HashMap<>();
     yarnConfigs.put(RESOURCEMANAGER_PORT, "localhost:50030");
@@ -642,15 +604,15 @@ public class JMXHostProviderTest {
     ClusterRequest crReq = new ClusterRequest(1L, "c1", null, null);
     crReq.setDesiredConfig(Collections.singletonList(cr2));
     controller.updateClusters(Collections.singleton(crReq), null);
-    Assert.assertEquals("50030", providerModule.getPort("c1", 
"RESOURCEMANAGER", "localhost"));
-    Assert.assertEquals("11111", providerModule.getPort("c1", "NODEMANAGER", 
"localhost"));
+    Assert.assertEquals("50030", providerModule.getPort("c1", 
"RESOURCEMANAGER", "localhost", false));
+    Assert.assertEquals("11111", providerModule.getPort("c1", "NODEMANAGER", 
"localhost", false));
 
     //Unrelated ports
-    Assert.assertEquals("70070", providerModule.getPort("c1", "NAMENODE", 
"localhost"));
-    Assert.assertEquals(null, providerModule.getPort("c1", "JOBTRACKER", 
"localhost"));
+    Assert.assertEquals("70070", providerModule.getPort("c1", "NAMENODE", 
"localhost", false));
+    Assert.assertEquals(null, providerModule.getPort("c1", "JOBTRACKER", 
"localhost", false));
 
     //test another host and component without property
-    Assert.assertNull(providerModule.getPort("c1", "HBASE_REGIONSERVER", 
"remotehost1"));
+    Assert.assertNull(providerModule.getPort("c1", "HBASE_REGIONSERVER", 
"remotehost1", false));
   }
 
   private static class JMXHostProviderModule extends AbstractProviderModule {
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/JMXPropertyProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/JMXPropertyProviderTest.java
index 37f8a1c..809dc89 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/JMXPropertyProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/metrics/JMXPropertyProviderTest.java
@@ -55,7 +55,6 @@ import 
org.apache.ambari.server.security.authorization.AuthorizationException;
 import 
org.apache.ambari.server.security.authorization.AuthorizationHelperInitializer;
 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.services.MetricsRetrievalService;
 import org.apache.ambari.server.utils.SynchronousThreadPoolExecutor;
 import org.junit.After;
@@ -628,18 +627,12 @@ public class JMXPropertyProviderTest {
       return null;
     }
 
-    @Override public Host getHost(final String clusterName, final String 
hostName) {
-      return null;
-    }
-
     @Override
-    public String getPort(String clusterName, String componentName, String 
hostName, boolean httpsEnabled) throws SystemException {
+    public String getPort(String clusterName, String componentName, String 
hostName, boolean httpsEnabled) {
       return getPort(clusterName, componentName, hostName);
     }
 
-    @Override
-    public String getPort(String clusterName, String componentName, String 
hostName) throws
-      SystemException {
+    public String getPort(String clusterName, String componentName, String 
hostName) {
 
       if (unknownPort) {
         return null;
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/alert/AlertUriTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/state/alert/MetricsUriTest.java
similarity index 91%
rename from 
ambari-server/src/test/java/org/apache/ambari/server/state/alert/AlertUriTest.java
rename to 
ambari-server/src/test/java/org/apache/ambari/server/state/alert/MetricsUriTest.java
index 295e364..282103f 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/state/alert/AlertUriTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/state/alert/MetricsUriTest.java
@@ -26,17 +26,17 @@ import java.util.Map;
 import org.apache.ambari.server.AmbariException;
 import org.junit.Test;
 
-public class AlertUriTest {
+public class MetricsUriTest {
   @Test
   public void testChoosesHttpByDefault() throws Exception {
-    AlertUri uri = new AlertUri();
+    MetricsUri uri = new MetricsUri();
     uri.setHttpUri("${config1/http-host}/path");
     assertThat(resolved(uri), is("http://http-host/path";));
   }
 
   @Test
   public void testChoosesHttpsBasedOnProperties() throws Exception {
-    AlertUri uri = new AlertUri();
+    MetricsUri uri = new MetricsUri();
     uri.setHttpUri("${config1/http-host}/path");
     uri.setHttpsUri("${config1/https-host}/path");
     uri.setHttpsProperty("${config1/use-http}");
@@ -54,7 +54,7 @@ public class AlertUriTest {
       }};
   }
 
-  private String resolved(AlertUri uri) throws AmbariException {
+  private String resolved(MetricsUri uri) throws AmbariException {
     return uri.resolve(config()).toString();
   }
 }
\ No newline at end of file
diff --git a/ambari-web/app/controllers/global/update_controller.js 
b/ambari-web/app/controllers/global/update_controller.js
index fb568ed..6a2458c 100644
--- a/ambari-web/app/controllers/global/update_controller.js
+++ b/ambari-web/app/controllers/global/update_controller.js
@@ -478,7 +478,7 @@ App.UpdateController = Em.Controller.extend({
       atsHandlerParam = isATSInstalled ? 
'ServiceComponentInfo/component_name=APP_TIMELINE_SERVER|' : '',
       haComponents = App.get('isHaEnabled') ? 
'ServiceComponentInfo/component_name=JOURNALNODE|ServiceComponentInfo/component_name=ZKFC|'
 : '',
       realUrl = '/components/?' + flumeHandlerParam + atsHandlerParam + 
haComponents +
-        'ServiceComponentInfo/category=MASTER&fields=' +
+        'ServiceComponentInfo/category.in(MASTER,CLIENT)&fields=' +
         'ServiceComponentInfo/service_name,' +
         'host_components/HostRoles/display_name,' +
         'host_components/HostRoles/host_name,' +
@@ -523,6 +523,7 @@ App.UpdateController = Em.Controller.extend({
     } else if (/^2.2/.test(App.get('currentStackVersionNumber'))) {
       serviceSpecificParams.STORM = 
'metrics/api/v1/cluster/summary,metrics/api/v1/topology/summary';
     }
+    serviceSpecificParams.ONEFS = 'metrics/dfs/*,';
 
     App.cache.services.forEach(function (service) {
       var urlParams = serviceSpecificParams[service.ServiceInfo.service_name];
diff --git a/ambari-web/app/mappers/service_metrics_mapper.js 
b/ambari-web/app/mappers/service_metrics_mapper.js
index 4d319fc..cf19581 100644
--- a/ambari-web/app/mappers/service_metrics_mapper.js
+++ b/ambari-web/app/mappers/service_metrics_mapper.js
@@ -76,6 +76,23 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     nfs_gateways_installed: 'nfs_gateways_installed',
     nfs_gateways_total: 'nfs_gateways_total'
   },
+  onefsConfig: {
+    metrics_not_available: 'metrics_not_available',
+    name_node_start_time: 'metrics.runtime.StartTime',
+    capacity_used: 'metrics.dfs.FSNamesystem.CapacityUsed',
+    capacity_total: 'metrics.dfs.FSNamesystem.CapacityTotal',
+    capacity_remaining: 'metrics.dfs.FSNamesystem.CapacityRemaining',
+    dfs_corrupt_blocks: 'metrics.dfs.FSNamesystem.CorruptBlocks',
+    dfs_under_replicated_blocks: 
'metrics.dfs.FSNamesystem.UnderReplicatedBlocks',
+    dfs_missing_blocks: 'metrics.dfs.FSNamesystem.MissingBlocks',
+    live_data_nodes: 'live_data_nodes',
+    dead_data_nodes: 'dead_data_nodes',
+    decommission_data_nodes: 'decommission_data_nodes',
+    dfs_total_files: 'metrics.dfs.namenode.TotalFiles',
+    jvm_memory_heap_used: 'metrics.jvm.memHeapUsedM',
+    jvm_memory_heap_max: 'metrics.jvm.memHeapCommittedM',
+    upgrade_status: 'metrics.dfs.namenode.UpgradeFinalized'
+  },
   yarnConfig: {
     resource_manager_start_time: 
'resourceManagerComponent.host_components[0].metrics.runtime.StartTime',
     jvm_memory_heap_used: 
'resourceManagerComponent.host_components[0].metrics.jvm.HeapMemoryUsed',
@@ -295,6 +312,10 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
       finalJson = this.hdfsMapper(item);
       finalJson.rand = Math.random();
       App.store.safeLoad(App.HDFSService, finalJson);
+    } else if (item && item.ServiceInfo && item.ServiceInfo.service_name == 
"ONEFS") {
+      finalJson = this.onefsMapper(item);
+      finalJson.rand = Math.random();
+      App.store.safeLoad(App.ONEFSService, finalJson);
     } else if (item && item.ServiceInfo && item.ServiceInfo.service_name == 
"HBASE") {
       finalJson = this.hbaseMapper(item);
       finalJson.rand = Math.random();
@@ -418,6 +439,34 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
       finalJson.quick_links = quickLinks[item.ServiceInfo.service_name];
   },
 
+  onefsMapper: function (item) {
+    var finalConfig = jQuery.extend({}, this.config);
+    item.components.forEach(function (component) {
+      if (this.isHostComponentPresent(component, 'ONEFS_CLIENT')) {
+        item.metrics = component.metrics;
+        item.decommission_data_nodes = [];
+        item.dead_data_nodes = [];
+        item.live_data_nodes = [];
+        if (component.metrics && component.metrics.dfs && 
component.metrics.dfs.namenode) {
+          item.metrics_not_available = false;
+          for (var host in 
App.parseJSON(component.metrics.dfs.namenode.DecomNodes)) {
+            item.decommission_data_nodes.push('DATANODE' + '_' + host);
+          }
+          for (var host in 
App.parseJSON(component.metrics.dfs.namenode.DeadNodes)) {
+            item.dead_data_nodes.push('DATANODE' + '_' + host);
+          }
+          for (var host in 
App.parseJSON(component.metrics.dfs.namenode.LiveNodes)) {
+            item.live_data_nodes.push('DATANODE' + '_' + host);
+          }
+        } else {
+          item.metrics_not_available = true;
+        }
+        finalConfig = jQuery.extend(finalConfig, this.onefsConfig);
+      }
+    }, this);
+    return this.parseIt(item, finalConfig);
+  },
+
   hdfsMapper: function (item) {
     let finalConfig = jQuery.extend({}, this.config);
     // Change the JSON so that it is easy to map
diff --git a/ambari-web/app/models.js b/ambari-web/app/models.js
index 3b86782..7ebf9af 100644
--- a/ambari-web/app/models.js
+++ b/ambari-web/app/models.js
@@ -40,6 +40,7 @@ require('models/quicklinks/quick_links_config');
 require('models/service');
 require('models/service_audit');
 require('models/service/hdfs');
+require('models/service/onefs');
 require('models/service/yarn');
 require('models/service/mapreduce2');
 require('models/service/hbase');
diff --git a/ambari-web/app/models/service.js b/ambari-web/app/models/service.js
index f9bedb1..fa7d30c 100644
--- a/ambari-web/app/models/service.js
+++ b/ambari-web/app/models/service.js
@@ -254,6 +254,7 @@ App.Service.Health = {
  */
 App.Service.extendedModel = {
   'HDFS': 'HDFSService',
+  'ONEFS' : 'ONEFSService',
   'HBASE': 'HBaseService',
   'YARN': 'YARNService',
   'MAPREDUCE2': 'MapReduce2Service',
diff --git a/ambari-web/app/models/service/onefs.js 
b/ambari-web/app/models/service/onefs.js
new file mode 100644
index 0000000..a9d20ee
--- /dev/null
+++ b/ambari-web/app/models/service/onefs.js
@@ -0,0 +1,43 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.ONEFSService = App.Service.extend({
+  nameNodeStartTime: DS.attr('number'),
+  jvmMemoryHeapUsed: DS.attr('number'),
+  jvmMemoryHeapMax: DS.attr('number'),
+  capacityUsed: DS.attr('number'),
+  capacityTotal: DS.attr('number'),
+  capacityRemaining: DS.attr('number'),
+  capacityNonDfsUsed: DS.attr('number'),
+  dfsTotalBlocks: DS.attr('number'),
+  dfsCorruptBlocks: DS.attr('number'),
+  dfsMissingBlocks: DS.attr('number'),
+  dfsUnderReplicatedBlocks: DS.attr('number'),
+  dfsTotalFiles: DS.attr('number'),
+  metricsNotAvailable: DS.attr('boolean'),
+  decommissionDataNodes: DS.hasMany('App.HostComponent'),
+  liveDataNodes: DS.hasMany('App.HostComponent'),
+  deadDataNodes: DS.hasMany('App.HostComponent'),
+  upgradeStatus: DS.attr('string'),
+  nfsGatewaysStarted: DS.attr('number', {defaultValue: 0}),
+  nfsGatewaysInstalled: DS.attr('number', {defaultValue: 0}),
+  nfsGatewaysTotal: DS.attr('number', {defaultValue: 0})
+});
+
+App.ONEFSService.FIXTURES = [];
diff --git a/ambari-web/app/views/main/service/info/summary.js 
b/ambari-web/app/views/main/service/info/summary.js
index 193f96d..40f4721 100644
--- a/ambari-web/app/views/main/service/info/summary.js
+++ b/ambari-web/app/views/main/service/info/summary.js
@@ -78,6 +78,7 @@ App.MainServiceInfoSummaryView = Em.View.extend({
     return {
       HBASE: App.MainDashboardServiceHbaseView,
       HDFS: App.MainDashboardServiceHdfsView,
+      ONEFS: App.MainDashboardServiceHdfsView,
       STORM: App.MainDashboardServiceStormView,
       YARN: App.MainDashboardServiceYARNView,
       RANGER: App.MainDashboardServiceRangerView,
diff --git 
a/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/metrics.json
 
b/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/metrics.json
index daba529..c0647f3 100644
--- 
a/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/metrics.json
+++ 
b/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/metrics.json
@@ -2,6 +2,111 @@
   "ONEFS_CLIENT" : {
     "Component" : [
       {
+        "type" : "jmx",
+        "jmx_source_uri": {
+          "http": "${hdfs-site/dfs.namenode.http-address}",
+          "https": "${hdfs-site/dfs.namenode.https-address}",
+          "https_property": "${hdfs-site/dfs.http.policy}",
+          "https_property_value": "HTTPS_ONLY",
+          "connection_timeout": 5.0
+        },
+        "metrics": {
+          "default": {
+            "metrics/runtime/StartTime": {
+              "metric": "java.lang:type=Runtime.StartTime",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/namenode/TotalFiles": {
+              "metric": "Hadoop:service=NameNode,name=NameNodeInfo.TotalFiles",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/namenode/UpgradeFinalized": {
+              "metric": 
"Hadoop:service=NameNode,name=NameNodeInfo.UpgradeFinalized",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/namenode/DecomNodes": {
+              "metric": "Hadoop:service=NameNode,name=NameNodeInfo.DecomNodes",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/namenode/LiveNodes": {
+              "metric": "Hadoop:service=NameNode,name=NameNodeInfo.LiveNodes",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/namenode/DeadNodes": {
+              "metric": "Hadoop:service=NameNode,name=NameNodeInfo.DeadNodes",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/jvm/gcCount": {
+              "metric": "Hadoop:service=NameNode,name=JvmMetrics.GcCount",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/jvm/memHeapUsedM": {
+              "metric": "Hadoop:service=NameNode,name=JvmMetrics.MemHeapUsedM",
+              "unit": "MB",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/jvm/memHeapCommittedM": {
+              "metric": 
"Hadoop:service=NameNode,name=JvmMetrics.MemHeapCommittedM",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/jvm/GcTimeMillisConcurrentMarkSweep": {
+              "metric": 
"Hadoop:service=NameNode,name=JvmMetrics.GcTimeMillisConcurrentMarkSweep",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/jvm/GcCountConcurrentMarkSweep": {
+              "metric": 
"Hadoop:service=NameNode,name=JvmMetrics.GcCountConcurrentMarkSweep",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/FSNamesystem/CapacityNonDFSUsed": {
+              "metric": 
"Hadoop:service=NameNode,name=FSNamesystem.CapacityNonDFSUsed",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/FSNamesystem/MissingBlocks": {
+              "metric": 
"Hadoop:service=NameNode,name=FSNamesystem.MissingBlocks",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/FSNamesystem/CorruptBlocks": {
+              "metric": 
"Hadoop:service=NameNode,name=FSNamesystem.CorruptBlocks",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/FSNamesystem/UnderReplicatedBlocks": {
+              "metric": 
"Hadoop:service=NameNode,name=FSNamesystem.UnderReplicatedBlocks",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/FSNamesystem/CapacityTotal": {
+              "metric": 
"Hadoop:service=NameNode,name=FSNamesystem.CapacityTotal",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/FSNamesystem/CapacityUsed": {
+              "metric": 
"Hadoop:service=NameNode,name=FSNamesystem.CapacityUsed",
+              "pointInTime": true,
+              "temporal": false
+            },
+            "metrics/dfs/FSNamesystem/CapacityRemaining": {
+              "metric": 
"Hadoop:service=NameNode,name=FSNamesystem.CapacityRemaining",
+              "pointInTime": true,
+              "temporal": false
+            }
+          }
+        }
+      },
+      {
         "type" : "ganglia",
         "properties" : {
           "overridden_host" : "${core-site/fs.defaultFS}"

-- 
To stop receiving notification emails like this one, please contact
amag...@apache.org.

Reply via email to