You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by am...@apache.org on 2018/05/18 15:32:26 UTC

[ambari] branch trunk updated: AMBARI-23892. OneFS Mpack to support HDP-3.0 (amagyar) (#1313)

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


The following commit(s) were added to refs/heads/trunk by this push:
     new 0d9fb4d  AMBARI-23892. OneFS Mpack to support HDP-3.0 (amagyar) (#1313)
0d9fb4d is described below

commit 0d9fb4dad7c3ced0129fd08579e2a57818cc04bc
Author: Attila Magyar <m....@gmail.com>
AuthorDate: Fri May 18 17:32:21 2018 +0200

    AMBARI-23892. OneFS Mpack to support HDP-3.0 (amagyar) (#1313)
---
 .../app/controllers/global/update_controller.js    |   2 +-
 .../app/mixins/common/widgets/widget_section.js    |   4 +-
 .../app/templates/main/service/services/onefs.hbs  | 187 ++++++++++++++++++++
 ambari-web/app/views.js                            |   1 +
 ambari-web/app/views/main/service/info/summary.js  |   2 +-
 .../app/views/main/service/services/onefs.js       | 189 +++++++++++++++++++++
 .../management-packs/isilon-onefs-mpack/pom.xml    |   2 +-
 .../ONEFS/1.0.0/package/scripts/params_linux.py    |   4 -
 .../addon-services/ONEFS/1.0.0/service_advisor.py  |   5 +-
 .../src/main/resources/mpack.json                  |   5 +-
 10 files changed, 386 insertions(+), 15 deletions(-)

diff --git a/ambari-web/app/controllers/global/update_controller.js b/ambari-web/app/controllers/global/update_controller.js
index 9068117..ec2e3c3 100644
--- a/ambari-web/app/controllers/global/update_controller.js
+++ b/ambari-web/app/controllers/global/update_controller.js
@@ -590,7 +590,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/*,';
+    serviceSpecificParams.ONEFS = 'metrics/*,';
 
     App.cache.services.forEach(function (service) {
       var urlParams = serviceSpecificParams[service.ServiceInfo.service_name];
diff --git a/ambari-web/app/mixins/common/widgets/widget_section.js b/ambari-web/app/mixins/common/widgets/widget_section.js
index 4eabf62..173ee2c 100644
--- a/ambari-web/app/mixins/common/widgets/widget_section.js
+++ b/ambari-web/app/mixins/common/widgets/widget_section.js
@@ -205,9 +205,9 @@ App.WidgetSectionMixin = Ember.Mixin.create({
 
   createLayouts: function (data) {
     var self = this;
-    var namespaces = App.HDFSService.find().objectAt(0).get('masterComponentGroups');
     if (data.items[0]) {
-      if (this.get('isHDFSFederatedSummary') && namespaces.length + 2 !== data.items.length) {
+      var hdfs = App.HDFSService.find().objectAt(0);
+      if (hdfs && this.get('isHDFSFederatedSummary') && hdfs.get('masterComponentGroups').length + 2 !== data.items.length) {
         this.createFederationWidgetLayouts(data);
       } else {
         self.getWidgetLayoutSuccessCallback(data);
diff --git a/ambari-web/app/templates/main/service/services/onefs.hbs b/ambari-web/app/templates/main/service/services/onefs.hbs
new file mode 100644
index 0000000..e4d6d27
--- /dev/null
+++ b/ambari-web/app/templates/main/service/services/onefs.hbs
@@ -0,0 +1,187 @@
+{{!
+* 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.
+}}
+
+<div class="row">
+  {{! Component Section }}
+  <div class="component-summary">
+    {{view view.dashboardMasterComponentView}}
+    <div class="col-md-12">
+      <div class="col-md-10 col-md-offset-2">
+        {{! NameNode Uptime }}
+        <div class="row namenode-uptime col-md-3">
+          <div class="summary-value main-info">{{view.nodeUptime}}</div>
+          <div class="summary-label">{{t dashboard.services.hdfs.nodes.uptime}}</div>
+        </div>
+        {{! NameNode Heap }}
+        <div class="row namenode-heap col-md-3">
+          <div class="summary-value">
+            <div class="main-info"> {{view.nodeHeapPercent}} </div>
+            <div class="info-desc"> {{view.nodeHeap}} </div>
+          </div>
+          <div class="summary-label">{{t dashboard.services.hdfs.nodes.heap}}</div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-12">
+      <div class="col-md-2">
+        {{#if view.hasMultipleMasterGroups}}
+          {{t dashboard.services.hdfs.summary.components}}
+        {{/if}}
+      </div>
+      <div class="col-md-10">
+        {{! Data Nodes }}
+        {{#if view.isDataNodeCreated}}
+          <div {{bindAttr class=":row :component :col-md-3 view.dataNodeComponent.componentName"}}>
+            <div class="summary-value main-info">
+              {{#if App.router.clusterController.isServiceContentFullyLoaded}}
+                <span>
+                  {{#view App.ComponentLiveTextView liveComponentsBinding="view.service.dataNodesStarted" totalComponentsBinding="view.service.dataNodesTotal"}}
+                    {{view.liveComponents}}/{{view.totalComponents}}
+                  {{/view}}
+                </span>
+                {{t common.started}}
+              {{else}}
+                {{t common.loading.eclipses}}
+              {{/if}}
+            </div>
+            <div class="summary-label">
+              <a href="#" {{action filterHosts view.dataNodeComponent}}>{{t dashboard.services.hdfs.datanodes}}</a>
+            </div>
+          </div>
+        {{/if}}
+        {{! indent next row}}
+        <div class="row"></div>
+        {{! Data Node Counts live }}
+        <div class="row datanode-count-live col-md-3">
+          <div class="summary-value">
+            {{#if view.service.metricsNotAvailable}}
+              <div class="main-info">
+                {{t services.service.summary.notAvailable}}
+              </div>
+            {{else}}
+              <span class="main-info" rel="tooltip"
+                {{translateAttr data-original-title="dashboard.services.hdfs.datanode.status.tooltip.live" }}>
+                {{view.service.liveDataNodes.length}}
+              </span>
+              <div class="info-desc">{{t dashboard.services.hdfs.nodes.live}}</div>
+            {{/if}}
+          </div>
+          <div class="summary-label">{{t dashboard.services.hdfs.datanodecounts}}</div>
+        </div>
+        {{! Data Node Counts dead }}
+        <div class="row datanode-count-dead col-md-3">
+          <div class="summary-value">
+            {{#if view.service.metricsNotAvailable}}
+              <div class="main-info">
+                {{t services.service.summary.notAvailable}}
+              </div>
+            {{else}}
+              <span class="main-info" rel="tooltip"
+                {{translateAttr data-original-title="dashboard.services.hdfs.datanode.status.tooltip.dead" }}>
+                {{view.service.deadDataNodes.length}}
+              </span>
+              <div class="info-desc">{{t dashboard.services.hdfs.nodes.dead}}</div>
+            {{/if}}
+          </div>
+          <div class="summary-label">{{t dashboard.services.hdfs.datanodecounts}}</div>
+        </div>
+        {{! Data Node Counts decommission }}
+        <div class="row datanode-count-decommission col-md-3">
+          <div class="summary-value">
+            {{#if view.service.metricsNotAvailable}}
+              <div class="main-info">
+                {{t services.service.summary.notAvailable}}
+              </div>
+            {{else}}
+              <span class="main-info" rel="tooltip"
+                {{translateAttr data-original-title="dashboard.services.hdfs.datanode.status.tooltip.decommission" }}>
+                {{view.service.decommissionDataNodes.length}}
+              </span>
+              <div class="info-desc">{{t dashboard.services.hdfs.nodes.decom}}</div>
+            {{/if}}
+          </div>
+          <div class="summary-label">{{t dashboard.services.hdfs.datanodecounts}}</div>
+        </div>
+      </div>
+    </div>
+  </div>
+  {{! left column end }}
+
+  {{! Service Metrics Section }}
+  <div class="col-md-12 metrics-summary">
+    <div class="col-md-2">{{t dashboard.services.hdfs.summary.service-metrics}}</div>
+    <div class="col-md-10">
+      {{! HDFS Capacity (Disk Usage)}}
+      <div class="row dfs-usage col-md-3">
+        <div class="summary-value">
+          <div class="main-info">{{view.dfsUsedDiskPercent}}</div>
+          <div class="info-desc">{{view.dfsUsedDisk}}</div>
+        </div>
+        <div class="summary-label">{{t dashboard.services.hdfs.capacity.dfsUsed}}</div>
+      </div>
+      <div class="row non-dfs-used col-md-3">
+        <div class="summary-value main-info">
+          <div class="main-info">{{view.nonDfsUsedDiskPercent}}</div>
+          <div class="info-desc">{{view.nonDfsUsedDisk}}</div>
+        </div>
+        <div class="summary-label">{{t dashboard.services.hdfs.capacity.nonDfsUsed}}</div>
+      </div>
+      <div class="row capacity-remaining col-md-3">
+        <div class="summary-value">
+          <div class="main-info">{{view.remainingDiskPercent}}</div>
+          <div class="info-desc">{{view.remainingDisk}}</div>
+        </div>
+        <div class="summary-label">{{t dashboard.services.hdfs.capacity.remaining}}</div>
+      </div>
+      {{! indent next row}}
+      <div class="row"></div>
+      {{! Block Errors corrupt }}
+      <div class="row block-errors-corrupt col-md-3">
+        <div class="summary-value main-info">
+          <div class="main-info">{{view.dfsCorruptBlocks}}</div>
+          <div class="info-desc">{{t dashboard.services.hdfs.blockErrors.corrupt}}</div>
+        </div>
+        <div class="summary-label">{{t services.service.summary.blockErrors}}</div>
+      </div>
+      {{! Block Errors missing }}
+      <div class="row block-errors-missing col-md-3">
+        <div class="summary-value main-info">
+          <div class="main-info">{{view.dfsMissingBlocks}}</div>
+          <div class="info-desc">{{t dashboard.services.hdfs.blockErrors.missing}}</div>
+        </div>
+        <div class="summary-label">{{t services.service.summary.blockErrors}}</div>
+      </div>
+      {{! Block Errors replicated }}
+      <div class="row block-errors-replicated col-md-3">
+        <div class="summary-value main-info">
+          <div class="main-info">{{view.dfsUnderReplicatedBlocks}}</div>
+          <div class="info-desc">{{t dashboard.services.hdfs.blockErrors.replicated}}</div>
+        </div>
+        <div class="summary-label">{{t services.service.summary.blockErrors}}</div>
+      </div>
+      {{! indent next row}}
+      <div class="row"></div>
+      {{! Total Files And Directories }}
+      <div class="row total-files-dirs col-md-3">
+        <div class="summary-value main-info">{{view.dfsTotalFiles}}</div>
+        <div class="summary-label">{{t dashboard.services.hdfs.totalFilesAndDirs}}</div>
+      </div>
+    </div>
+  </div>
+  {{! right column end }}
+</div>
\ No newline at end of file
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index 44301c4..da64f1d 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -296,6 +296,7 @@ require('views/main/dashboard/config_history_search_box');
 require('views/main/service');
 require('views/main/service/service');
 require('views/main/service/services/hdfs');
+require('views/main/service/services/onefs');
 require('views/main/service/services/yarn');
 require('views/main/service/services/mapreduce2');
 require('views/main/service/services/hbase');
diff --git a/ambari-web/app/views/main/service/info/summary.js b/ambari-web/app/views/main/service/info/summary.js
index 8ebfb92..d7c7a9f 100644
--- a/ambari-web/app/views/main/service/info/summary.js
+++ b/ambari-web/app/views/main/service/info/summary.js
@@ -80,7 +80,7 @@ App.MainServiceInfoSummaryView = Em.View.extend({
     return {
       HBASE: App.MainDashboardServiceHbaseView,
       HDFS: App.MainDashboardServiceHdfsView,
-      ONEFS: App.MainDashboardServiceHdfsView,
+      ONEFS: App.MainDashboardServiceOnefsView,
       STORM: App.MainDashboardServiceStormView,
       YARN: App.MainDashboardServiceYARNView,
       RANGER: App.MainDashboardServiceRangerView,
diff --git a/ambari-web/app/views/main/service/services/onefs.js b/ambari-web/app/views/main/service/services/onefs.js
new file mode 100644
index 0000000..8f7bec4
--- /dev/null
+++ b/ambari-web/app/views/main/service/services/onefs.js
@@ -0,0 +1,189 @@
+/**
+ * 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');
+var date = require('utils/date/date');
+var numberUtils = require('utils/number_utils');
+
+function diskPart(i18nKey, totalKey, usedKey) {
+  return Em.computed(totalKey, usedKey, function () {
+    var text = Em.I18n.t(i18nKey);
+    var total = this.get(totalKey);
+    var used = this.get(usedKey);
+    var percent = total > 0 ? ((used * 100) / total).toFixed(2) : 0;
+    if (percent == "NaN" || percent < 0) {
+      percent = Em.I18n.t('services.service.summary.notAvailable') + " ";
+    }
+    return text.format(numberUtils.bytesToSize(used, 1, 'parseFloat'), numberUtils.bytesToSize(total, 1, 'parseFloat'));
+  });
+}
+
+function diskPartPercent(i18nKey, totalKey, usedKey) {
+  return Em.computed(totalKey, usedKey, function () {
+    var text = Em.I18n.t(i18nKey);
+    var total = this.get(totalKey);
+    var used = this.get(usedKey);
+    var percent = total > 0 ? ((used * 100) / total).toFixed(2) : 0;
+    if (percent == "NaN" || percent < 0) {
+      percent = Em.I18n.t('services.service.summary.notAvailable') + " ";
+    }
+    return text.format(percent);
+  });
+}
+
+App.MainDashboardServiceOnefsView = App.MainDashboardServiceView.extend({
+  templateName: require('templates/main/service/services/onefs'),
+  serviceName: 'ONEFS',
+  Chart: App.ChartPieView.extend({
+    service: null,
+    color: '#0066B3',
+    stroke: '#0066B3',
+    palette: new Rickshaw.Color.Palette({
+      scheme: ['rgba(0,102,179,1)', 'rgba(0,102,179,0)']
+    }),
+    data: function () {
+      var remaining = Number(this.get('service.capacityRemaining'));
+      var used = Number(this.get('service.capacityTotal')) - remaining;
+      return [ used, remaining ];
+    }.property('service.capacityUsed', 'service.capacityTotal')
+  }),
+
+  metricsNotAvailableObserver: function () {
+    if(!this.get("service.metricsNotAvailable")) {
+      App.tooltip($("[rel='tooltip']"));
+    }
+  }.observes("service.metricsNotAvailable"),
+
+  willDestroyElement: function() {
+    $("[rel='tooltip']").tooltip('destroy');
+  },
+
+  dataNodesDead: Em.computed.alias('service.dataNodesInstalled'),
+
+  journalNodesLive: function () {
+    return this.get('service.journalNodes').filterProperty("workStatus", "STARTED").get("length");
+  }.property("service.journalNodes.@each.workStatus"),
+
+  journalNodesTotal: Em.computed.alias('service.journalNodes.length'),
+
+  dfsTotalBlocks: Em.computed.formatUnavailable('service.dfsTotalBlocks'),
+
+  dfsTotalFiles: Em.computed.formatUnavailable('service.dfsTotalFiles'),
+
+  dfsCorruptBlocks: Em.computed.formatUnavailable('service.dfsCorruptBlocks'),
+
+  dfsMissingBlocks: Em.computed.formatUnavailable('service.dfsMissingBlocks'),
+
+  dfsUnderReplicatedBlocks: Em.computed.formatUnavailable('service.dfsUnderReplicatedBlocks'),
+
+  nodeUptime: function () {
+    var uptime = this.get('service.nameNodeStartTime');
+    if (uptime && uptime > 0){
+      var diff = App.dateTime() - uptime;
+      if (diff < 0) {
+        diff = 0;
+      }
+      var formatted = date.timingFormat(diff);
+      return this.t('dashboard.services.uptime').format(formatted);
+    }
+    return this.t('services.service.summary.notRunning');
+  }.property("service.nameNodeStartTime"),
+
+  nodeHeapPercent: App.MainDashboardServiceView.formattedHeapPercent('dashboard.services.hdfs.nodes.heapUsedPercent', 'service.jvmMemoryHeapUsed', 'service.jvmMemoryHeapMax'),
+  nodeHeap: App.MainDashboardServiceView.formattedHeap('dashboard.services.hdfs.nodes.heapUsed', 'service.jvmMemoryHeapUsed', 'service.jvmMemoryHeapMax'),
+
+  dfsUsedDisk: diskPart('dashboard.services.hdfs.capacityUsed', 'service.capacityTotal', 'service.capacityUsed'),
+  dfsUsedDiskPercent: diskPartPercent('dashboard.services.hdfs.capacityUsedPercent', 'service.capacityTotal', 'service.capacityUsed'),
+
+  nonDfsUsed: function () {
+    var total = this.get('service.capacityTotal');
+    var remaining = this.get('service.capacityRemaining');
+    var dfsUsed = this.get('service.capacityUsed');
+    return (Em.isNone(total) || Em.isNone(remaining) || Em.isNone(dfsUsed)) ? null : total - remaining - dfsUsed;
+  }.property('service.capacityTotal', 'service.capacityRemaining', 'service.capacityUsed'),
+
+  nonDfsUsedDisk: diskPart('dashboard.services.hdfs.capacityUsed', 'service.capacityTotal', 'nonDfsUsed'),
+  nonDfsUsedDiskPercent: diskPartPercent('dashboard.services.hdfs.capacityUsedPercent', 'service.capacityTotal', 'nonDfsUsed'),
+
+  remainingDisk: diskPart('dashboard.services.hdfs.capacityUsed', 'service.capacityTotal', 'service.capacityRemaining'),
+  remainingDiskPercent: diskPartPercent('dashboard.services.hdfs.capacityUsedPercent', 'service.capacityTotal', 'service.capacityRemaining'),
+
+  dataNodeComponent: Em.Object.create({
+    componentName: 'DATANODE'
+  }),
+
+  nfsGatewayComponent: Em.Object.create({
+    componentName: 'NFS_GATEWAY'
+  }),
+
+  /**
+   * Define if NFS_GATEWAY is present in the installed stack
+   * @type {Boolean}
+   */
+  isNfsInStack: function () {
+    return App.StackServiceComponent.find().someProperty('componentName', 'NFS_GATEWAY');
+  }.property(),
+
+  journalNodeComponent: Em.Object.create({
+    componentName: 'JOURNALNODE'
+  }),
+
+  /**
+   * @type {string}
+   */
+  safeModeStatus: function () {
+    var safeMode = this.get('service.safeModeStatus');
+    if (Em.isNone(safeMode)) {
+      return Em.I18n.t("services.service.summary.notAvailable");
+    } else if (safeMode.length === 0) {
+      return Em.I18n.t("services.service.summary.safeModeStatus.notInSafeMode");
+    } else {
+      return Em.I18n.t("services.service.summary.safeModeStatus.inSafeMode");
+    }
+  }.property('service.safeModeStatus'),
+
+  /**
+   * @type {string}
+   */
+  upgradeStatus: function () {
+    var upgradeStatus = this.get('service.upgradeStatus');
+    var healthStatus = this.get('service.healthStatus');
+    if (upgradeStatus == 'true') {
+      return Em.I18n.t('services.service.summary.pendingUpgradeStatus.notPending');
+    } else if (upgradeStatus == 'false' && healthStatus == 'green') {
+      return Em.I18n.t('services.service.summary.pendingUpgradeStatus.notFinalized');
+    } else {
+      // upgrade status == null
+      return Em.I18n.t("services.service.summary.notAvailable");
+    }
+  }.property('service.upgradeStatus', 'service.healthStatus'),
+
+  /**
+   * @type {boolean}
+   */
+  isUpgradeStatusWarning: function () {
+    return this.get('service.upgradeStatus') == 'false' && this.get('service.healthStatus') == 'green';
+  }.property('service.upgradeStatus', 'service.healthStatus'),
+
+  isDataNodeCreated: function () {
+    return this.isServiceComponentCreated('DATANODE');
+  }.property('App.router.clusterController.isComponentsStateLoaded'),
+
+  isJournalNodeCreated: function () {
+    return this.isServiceComponentCreated('JOURNALNODE');
+  }.property('App.router.clusterController.isComponentsStateLoaded')
+});
diff --git a/contrib/management-packs/isilon-onefs-mpack/pom.xml b/contrib/management-packs/isilon-onefs-mpack/pom.xml
index 6d5411c..8ca0965 100644
--- a/contrib/management-packs/isilon-onefs-mpack/pom.xml
+++ b/contrib/management-packs/isilon-onefs-mpack/pom.xml
@@ -24,7 +24,7 @@
   <name>Isilon OneFS Ambari Management Pack</name>
   <url>http://ambari.apache.org/</url>
   <properties>
-    <minAmbariVersion>3.0.0.0</minAmbariVersion>
+    <minAmbariVersion>2.7.0.0</minAmbariVersion>
     <maxAmbariVersion></maxAmbariVersion>
     <nifiversion>1.0.0</nifiversion>
     <custom.tests>false</custom.tests>
diff --git a/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params_linux.py b/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params_linux.py
index bfa4aae..86642c6 100644
--- a/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params_linux.py
+++ b/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params_linux.py
@@ -24,7 +24,6 @@ from resource_management.libraries.functions.default import default
 from resource_management.libraries.functions.get_not_managed_resources import get_not_managed_resources
 from resource_management.libraries.resources.hdfs_resource import HdfsResource
 from resource_management.libraries.functions import stack_select
-from resource_management.libraries.functions import format
 
 config = Script.get_config()
 
@@ -44,9 +43,6 @@ hadoop_conf_dir = conf_select.get_hadoop_conf_dir()
 hdfs_site = config['configurations']['hdfs-site']
 default_fs = config['configurations']['core-site']['fs.defaultFS']
 
-java64_home = config['hostLevelParams']['java_home']
-java_exec = format("{java64_home}/bin/java")
-
 ambari_libs_dir = "/var/lib/ambari-agent/lib"
 
 import functools
diff --git a/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/service_advisor.py b/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/service_advisor.py
index 8d4f824..d3997f7 100644
--- a/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/service_advisor.py
+++ b/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/service_advisor.py
@@ -105,7 +105,7 @@ except Exception as e:
   traceback.print_exc()
   print "Failed to load parent"
 else:
-  class HDP26ONEFSServiceAdvisor(service_advisor.ServiceAdvisor):
+  class ONEFSServiceAdvisor(service_advisor.ServiceAdvisor):
     def getServiceConfigurationRecommendations(self, configs, clusterData, services, hosts):
       try:
         putCoreSiteProperty = self.putProperty(configs, "core-site", services)
@@ -139,5 +139,4 @@ else:
       validation_errors = []
       validation_errors.extend(self.toConfigurationValidationProblems(CoreSite(services).validate(), 'core-site'))
       validation_errors.extend(self.toConfigurationValidationProblems(HdfsSite(services).validate(), 'hdfs-site'))
-      return validation_errors
-
+      return validation_errors
\ No newline at end of file
diff --git a/contrib/management-packs/isilon-onefs-mpack/src/main/resources/mpack.json b/contrib/management-packs/isilon-onefs-mpack/src/main/resources/mpack.json
index f15fcb6..ad8389f 100644
--- a/contrib/management-packs/isilon-onefs-mpack/src/main/resources/mpack.json
+++ b/contrib/management-packs/isilon-onefs-mpack/src/main/resources/mpack.json
@@ -16,9 +16,8 @@
              "service_name" : "ONEFS",
              "service_version" : "1.0.0",
              "applicable_stacks" : [
-                 {
-                      "stack_name" : "HDP", "stack_version" : "2.6"
-                  }
+                 { "stack_name" : "HDP", "stack_version" : "2.6" },
+                 { "stack_name" : "HDP", "stack_version" : "3.0" }
               ]
           }
       ]

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