Repository: ambari Updated Branches: refs/heads/branch-feature-AMBARI-12556 f650e351c -> 9f6387157
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/301896a1 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/301896a1 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/301896a1 Branch: refs/heads/branch-feature-AMBARI-12556 Commit: 301896a12d7bb3b3a1402138ebf10667fc54a369 Parents: 01e3727 Author: Di Li <d...@apache.org> Authored: Thu Apr 6 16:58:57 2017 -0400 Committer: Di Li <d...@apache.org> Committed: Thu Apr 6 16:58:57 2017 -0400 ---------------------------------------------------------------------- .../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/301896a1/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/301896a1/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/301896a1/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/301896a1/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/301896a1/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/301896a1/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/301896a1/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/301896a1/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/301896a1/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/301896a1/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/301896a1/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/301896a1/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':