You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ao...@apache.org on 2017/04/11 11:14:40 UTC

[18/22] ambari git commit: AMBARI-20674 Able to hide the Delete menu item from UI for a given service (dili)

AMBARI-20674 Able to hide the Delete menu item from UI for a given service (dili)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/784ceeaa
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/784ceeaa
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/784ceeaa

Branch: refs/heads/branch-3.0-perf
Commit: 784ceeaaffeca873be49ee80e38c7de3cdaea2dd
Parents: 532ab59
Author: Di Li <di...@apache.org>
Authored: Thu Apr 6 16:58:57 2017 -0400
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Tue Apr 11 14:14:12 2017 +0300

----------------------------------------------------------------------
 .../server/controller/StackServiceResponse.java |  8 ++++
 .../internal/StackServiceResourceProvider.java  |  6 +++
 .../ambari/server/stack/ServiceModule.java      |  4 ++
 .../apache/ambari/server/state/ServiceInfo.java | 26 +++++++++++
 .../src/main/resources/properties.json          |  1 +
 .../ambari/server/state/ServiceInfoTest.java    | 47 ++++++++++++++++++++
 ambari-web/app/app.js                           |  4 ++
 ambari-web/app/mappers/stack_service_mapper.js  |  1 +
 ambari-web/app/models/host_component.js         |  3 +-
 ambari-web/app/models/stack_service.js          |  1 +
 .../test/mappers/stack_service_mapper_test.js   |  7 ++-
 ambari-web/test/views/main/service/item_test.js |  3 ++
 12 files changed, 109 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceResponse.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceResponse.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceResponse.java
index cbff300..8e4200d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceResponse.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/StackServiceResponse.java
@@ -75,6 +75,8 @@ public class StackServiceResponse {
    */
   private boolean credentialStoreRequired;
 
+  private boolean isSupportDeleteViaUI;
+
   /**
    * Constructor.
    *
@@ -112,6 +114,8 @@ public class StackServiceResponse {
     credentialStoreSupported = service.isCredentialStoreSupported();
 
     credentialStoreEnabled = service.isCredentialStoreEnabled();
+
+    isSupportDeleteViaUI = service.isSupportDeleteViaUI();
   }
 
   public ServiceInfo.Selection getSelection() {
@@ -305,4 +309,8 @@ public class StackServiceResponse {
   public void setCredentialStoreRequired(boolean credentialStoreRequired) {
     this.credentialStoreRequired = credentialStoreRequired;
   }
+
+  public boolean isSupportDeleteViaUI(){
+    return isSupportDeleteViaUI;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java
index a30d783..2964560 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java
@@ -98,6 +98,9 @@ public class StackServiceResourceProvider extends ReadOnlyResourceProvider {
   private static final String CREDENTIAL_STORE_ENABLED = PropertyHelper.getPropertyId(
       "StackServices", "credential_store_enabled");
 
+  private static final String SUPPORT_DELETE_VIA_UI = PropertyHelper.getPropertyId(
+      "StackServices", "support_delete_via_ui");
+
   private static Set<String> pkPropertyIds = new HashSet<>(
     Arrays.asList(new String[]{STACK_NAME_PROPERTY_ID,
       STACK_VERSION_PROPERTY_ID, SERVICE_NAME_PROPERTY_ID}));
@@ -206,6 +209,9 @@ public class StackServiceResourceProvider extends ReadOnlyResourceProvider {
     setResourceProperty(resource, CREDENTIAL_STORE_ENABLED,
         response.isCredentialStoreEnabled(), requestedIds);
 
+    setResourceProperty(resource, SUPPORT_DELETE_VIA_UI,
+        response.isSupportDeleteViaUI(), requestedIds);
+
     return resource;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceModule.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceModule.java
index fd65268..d65e758 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/ServiceModule.java
@@ -278,6 +278,10 @@ public class ServiceModule extends BaseModule<ServiceModule, ServiceInfo> implem
       serviceInfo.setSelection(parent.getSelection());
     }
 
+    if(null == serviceInfo.getSupportDeleteViaUIField()){
+      serviceInfo.setSupportDeleteViaUI(parent.isSupportDeleteViaUI());
+    }
+
     mergeCustomCommands(parent.getCustomCommands(), serviceInfo.getCustomCommands());
     mergeConfigDependencies(parent);
     mergeComponents(parentModule, allStacks, commonServices, extensions);

http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java
index 0d0b78b..512ca18 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceInfo.java
@@ -82,6 +82,11 @@ public class ServiceInfo implements Validable{
   @XmlElement(name="deleted")
   private boolean isDeleted = false;
 
+  @XmlElement(name="supportDeleteViaUI")
+  private Boolean supportDeleteViaUIField;
+
+  private boolean supportDeleteViaUIInternal = true;
+
   @JsonIgnore
   @XmlTransient
   private volatile Map<String, Set<String>> configLayout = null;
@@ -291,6 +296,27 @@ public class ServiceInfo implements Validable{
     isDeleted = deleted;
   }
 
+  public Boolean getSupportDeleteViaUIField(){
+    return supportDeleteViaUIField;
+  }
+
+  public void setSupportDeleteViaUIField(Boolean supportDeleteViaUIField) {
+    this.supportDeleteViaUIField = supportDeleteViaUIField;
+  }
+
+  public boolean isSupportDeleteViaUI() {
+    if (null != supportDeleteViaUIField) {
+      return supportDeleteViaUIField.booleanValue();
+    }
+    // If set to null and has a parent, then the value would have already been resolved and set.
+    // Otherwise, return the default value (true).
+    return this.supportDeleteViaUIInternal;
+  }
+
+  public void setSupportDeleteViaUI(boolean supportDeleteViaUI){
+    this.supportDeleteViaUIInternal = supportDeleteViaUI;
+  }
+
   public String getName() {
     return name;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-server/src/main/resources/properties.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/properties.json b/ambari-server/src/main/resources/properties.json
index 04d32ea..c2545fe 100644
--- a/ambari-server/src/main/resources/properties.json
+++ b/ambari-server/src/main/resources/properties.json
@@ -224,6 +224,7 @@
         "StackServices/credential_store_enabled",
         "StackServices/credential_store_required",
         "StackServices/properties",
+        "StackServices/support_delete_via_ui",
         "_"
     ],
     "StackConfiguration":[

http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceInfoTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceInfoTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceInfoTest.java
index 1b9296e..c10c243 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceInfoTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceInfoTest.java
@@ -651,6 +651,53 @@ public class ServiceInfoTest {
     assertTrue("true".equals(serviceProperties.get(ServiceInfo.DEFAULT_SERVICE_MONITORED_PROPERTY.getKey())));
   }
 
+  @Test
+  public void testSupportDeleteViaUI() throws Exception {
+    //Explicitly set to true
+    String serviceInfoXml =
+      "<metainfo>" +
+      "  <schemaVersion>2.0</schemaVersion>" +
+      "  <services>" +
+      "    <service>" +
+      "      <name>HDFS</name>" +
+      "      <displayName>HDFS</displayName>" +
+      "      <supportDeleteViaUI>true</supportDeleteViaUI>" +
+      "    </service>" +
+      "  </services>" +
+      "</metainfo>";
+    Map<String, ServiceInfo> serviceInfoMap = getServiceInfo(serviceInfoXml);
+    assertTrue(serviceInfoMap.get("HDFS").isSupportDeleteViaUI());
+
+    //Explicitly set to false
+    serviceInfoXml =
+        "<metainfo>" +
+        "  <schemaVersion>2.0</schemaVersion>" +
+        "  <services>" +
+        "    <service>" +
+        "      <name>HDFS</name>" +
+        "      <displayName>HDFS</displayName>" +
+        "      <supportDeleteViaUI>false</supportDeleteViaUI>" +
+        "    </service>" +
+        "  </services>" +
+        "</metainfo>";
+      serviceInfoMap = getServiceInfo(serviceInfoXml);
+      assertFalse(serviceInfoMap.get("HDFS").isSupportDeleteViaUI());
+
+      //Default to true
+      serviceInfoXml =
+          "<metainfo>" +
+          "  <schemaVersion>2.0</schemaVersion>" +
+          "  <services>" +
+          "    <service>" +
+          "      <name>HDFS</name>" +
+          "      <displayName>HDFS</displayName>" +
+          "    </service>" +
+          "  </services>" +
+          "</metainfo>";
+        serviceInfoMap = getServiceInfo(serviceInfoXml);
+        assertTrue(serviceInfoMap.get("HDFS").isSupportDeleteViaUI());
+  }
+
   public static Map<String, ServiceInfo> getServiceInfo(String xml) throws JAXBException {
     InputStream configStream = new ByteArrayInputStream(xml.getBytes());
     JAXBContext jaxbContext = JAXBContext.newInstance(ServiceMetainfoXml.class);

http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-web/app/app.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/app.js b/ambari-web/app/app.js
index 9c7d874..e32084c 100644
--- a/ambari-web/app/app.js
+++ b/ambari-web/app/app.js
@@ -304,6 +304,10 @@ module.exports = Em.Application.create({
 
     supportsServiceCheck: function() {
       return App.StackService.find().filterProperty('serviceCheckSupported').mapProperty('serviceName');
+    }.property('App.router.clusterController.isLoaded'),
+
+    supportsDeleteViaUI: function() {
+      return App.StackService.find().filterProperty('supportDeleteViaUi').mapProperty('serviceName');
     }.property('App.router.clusterController.isLoaded')
   }),
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-web/app/mappers/stack_service_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/stack_service_mapper.js b/ambari-web/app/mappers/stack_service_mapper.js
index 4bda89d..8931066 100644
--- a/ambari-web/app/mappers/stack_service_mapper.js
+++ b/ambari-web/app/mappers/stack_service_mapper.js
@@ -40,6 +40,7 @@ App.stackServiceMapper = App.QuickDataMapper.create({
     is_service_with_widgets: 'is_service_with_widgets',
     required_services: 'required_services',
     service_check_supported: 'service_check_supported',
+    support_delete_via_ui: 'support_delete_via_ui',
     service_components_key: 'service_components',
     service_components_type: 'array',
     service_components: {

http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-web/app/models/host_component.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/host_component.js b/ambari-web/app/models/host_component.js
index 3950f97..cdcf991 100644
--- a/ambari-web/app/models/host_component.js
+++ b/ambari-web/app/models/host_component.js
@@ -412,7 +412,8 @@ App.HostComponentActionMap = {
         action: 'deleteService',
         context: ctx.get('serviceName'),
         label: Em.I18n.t('services.service.actions.deleteService'),
-        cssClass: 'glyphicon glyphicon-remove'
+        cssClass: 'glyphicon glyphicon-remove',
+        isHidden: !App.get('services.supportsDeleteViaUI').contains(ctx.get('serviceName')) //hide the menu item when the service has a custom behavior setting in its metainfo.xml to disallow Delete Services via UI
       },
       IMMEDIATE_STOP_HAWQ_SERVICE: {
         action: 'executeHawqCustomCommand',

http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-web/app/models/stack_service.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/stack_service.js b/ambari-web/app/models/stack_service.js
index 4f21288..241f6ab 100644
--- a/ambari-web/app/models/stack_service.js
+++ b/ambari-web/app/models/stack_service.js
@@ -34,6 +34,7 @@ App.StackService = DS.Model.extend({
   configTypes: DS.attr('object'),
   serviceVersion: DS.attr('string'),
   serviceCheckSupported: DS.attr('boolean'),
+  supportDeleteViaUi: DS.attr('boolean'),
   stackName: DS.attr('string'),
   stackVersion: DS.attr('string'),
   selection: DS.attr('string'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-web/test/mappers/stack_service_mapper_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mappers/stack_service_mapper_test.js b/ambari-web/test/mappers/stack_service_mapper_test.js
index 9da8b24..88b4b43 100644
--- a/ambari-web/test/mappers/stack_service_mapper_test.js
+++ b/ambari-web/test/mappers/stack_service_mapper_test.js
@@ -36,6 +36,7 @@ describe('App.stackServiceMapper', function () {
                 "ZOOKEEPER"
               ],
               "service_check_supported" : true,
+              "support_delete_via_ui" : false,
               "service_name" : "KAFKA",
               "service_version" : "0.8.1.2.2",
               "stack_name" : "HDP",
@@ -102,7 +103,8 @@ describe('App.stackServiceMapper', function () {
           },
           {
             "StackServices" : {
-              "service_name" : "ZOOKEEPER"
+              "service_name" : "ZOOKEEPER",
+              "support_delete_via_ui" : true
             },
             "components" : [ ],
             "artifacts" : [ ]
@@ -202,6 +204,7 @@ describe('App.stackServiceMapper', function () {
         isInstallable: true,
         isServiceWithWidgets: false,
         serviceCheckSupported: true,
+        supportDeleteViaUi : false,
         requiredServices: ["ZOOKEEPER"]
       },
       componentResult = {
@@ -253,6 +256,8 @@ describe('App.stackServiceMapper', function () {
       expect(components.findProperty('componentName', 'DATANODE').get('bulkCommandsMasterComponentName')).to.eql("NAMENODE");
       expect(components.findProperty('componentName', 'DATANODE').get('decommissionAllowed')).to.be.true;
       expect(components.findProperty('componentName', 'DATANODE').get('reassignAllowed')).to.be.true;
+
+      expect(services.findProperty('serviceName', 'ZOOKEEPER').get('supportDeleteViaUi')).to.be.true;
     });
 
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/784ceeaa/ambari-web/test/views/main/service/item_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/service/item_test.js b/ambari-web/test/views/main/service/item_test.js
index 4b2e6f9..e4a1940 100644
--- a/ambari-web/test/views/main/service/item_test.js
+++ b/ambari-web/test/views/main/service/item_test.js
@@ -144,6 +144,7 @@ describe('App.MainServiceItemView', function () {
         {
           serviceName: "HDFS",
           displayName: "HDFS",
+          supportDeleteViaUi: true,
           isSingleNode: true,
           serviceTypes: ["HA_MODE"],
           slaveComponents: [
@@ -449,6 +450,8 @@ describe('App.MainServiceItemView', function () {
             return ["NAMENODE", "SECONDARY_NAMENODE", "APP_TIMELINE_SERVER", "RESOURCEMANAGER", "WEBHCAT_SERVER", "OOZIE_SERVER"];
           case 'services.supportsServiceCheck':
             return ["HDFS", "MAPREDUCE2", "YARN", "HIVE", "HBASE", "PIG", "SQOOP", "OOZIE", "ZOOKEEPER", "FALCON", "STORM", "FLUME", "SLIDER", "KNOX", "KAFKA"];
+          case 'services.supportsDeleteViaUI':
+            return ["HDFS", "MAPREDUCE2", "YARN", "HIVE", "HBASE", "PIG", "SQOOP", "OOZIE", "ZOOKEEPER", "FALCON", "STORM", "FLUME", "SLIDER", "KNOX", "KAFKA"];
           case 'components.addableToHost':
             return ["DATANODE", "HDFS_CLIENT", "MAPREDUCE2_CLIENT", "NODEMANAGER", "YARN_CLIENT", "TEZ_CLIENT", "GANGLIA_MONITOR", "HCAT", "HIVE_CLIENT", "HIVE_METASTORE", "HIVE_SERVER", "WEBHCAT_SERVER", "HBASE_CLIENT", "HBASE_MASTER", "HBASE_REGIONSERVER", "PIG", "SQOOP", "OOZIE_CLIENT", "OOZIE_SERVER", "ZOOKEEPER_CLIENT", "ZOOKEEPER_SERVER", "FALCON_CLIENT", "SUPERVISOR", "FLUME_HANDLER", "METRICS_MONITOR", "KAFKA_BROKER", "KERBEROS_CLIENT", "KNOX_GATEWAY", "SLIDER", "SPARK_CLIENT"];
           case 'allHostNames.length':