Explorar el Código

AMBARI-8003 UI changes for Ambari Datanode directories need to allow for heterogeneous storage tags. (ababiichuk)

aBabiichuk hace 10 años
padre
commit
2afa44ae48

+ 13 - 2
ambari-web/app/data/HDP2.2/site_properties.js

@@ -30,7 +30,8 @@ var excludedConfigs = [
   'tez.runtime.intermediate-input.compress.codec',
   'tez.runtime.intermediate-input.is-compressed',
   'tez.runtime.intermediate-output.compress.codec',
-  'tez.runtime.intermediate-output.should-compress'
+  'tez.runtime.intermediate-output.should-compress',
+  'dfs.datanode.data.dir' //this property is overridden with different properties
 ];
 var hdp22properties = hdp2properties.filter(function (item) {
   return !excludedConfigs.contains(item.name);
@@ -66,7 +67,17 @@ hdp22properties.push(
     "isVisible": true,
     "serviceName": "YARN",
     "category": "Advanced yarn-site"
-});
+  },
+  {
+    "id": "site property",
+    "name": "dfs.datanode.data.dir",
+    "displayName": "DataNode directories",
+    "defaultDirectory": "/hadoop/hdfs/data",
+    "displayType": "datanodedirs",
+    "category": "DATANODE",
+    "serviceName": "HDFS",
+    "index": 1
+  });
 
 module.exports =
 {

+ 12 - 0
ambari-web/app/models/service_config.js

@@ -806,6 +806,18 @@ App.ServiceConfigProperty = Ember.Object.extend({
           break;
         case 'checkbox':
           break;
+        case 'datanodedirs':
+          if (!validator.isValidDataNodeDir(value)) {
+            this.set('errorMessage', 'dir format is wrong, can be "[{storage type}] /{dir name}"');
+            isError = true;
+          }
+          else {
+            if (!validator.isAllowedDir(value)) {
+              this.set('errorMessage', 'Cannot start with "home(s)"');
+              isError = true;
+            }
+          }
+          break;
         case 'directories':
         case 'directory':
           if (!validator.isValidDir(value)) {

+ 16 - 0
ambari-web/app/utils/validator.js

@@ -56,6 +56,22 @@ module.exports = {
     return true;
   },
 
+  /**
+   * validate directory with slash at the start
+   * @param value
+   * @returns {boolean}
+   */
+  isValidDataNodeDir: function(value) {
+    var floatRegex = /(^\[[0-9a-z]+\]$)|(^\/[0-9a-z]*)/;
+    var dirs = value.replace(/,/g,' ').trim().split(new RegExp("\\s+", "g"));
+    for(var i = 0; i < dirs.length; i++){
+      if(!floatRegex.test(dirs[i])){
+        return false;
+      }
+    }
+    return true;
+  },
+
   /**
    * validate directory doesn't start "home" or "homes"
    * @param value

+ 23 - 0
ambari-web/test/utils/validator_test.js

@@ -296,6 +296,29 @@ describe('validator', function () {
       })
     });
   });
+  describe.only('#isValidDataNodeDir(value)', function() {
+    var tests = [
+      {m:'"dir" - invalid',i:'dir',e:false},
+      {m:'"/dir" - valid',i:'/dir',e:true},
+      {m:'"/dir1,dir2" - invalid',i:'/dir1,dir2',e:false},
+      {m:'"/dir1,/dir2" - valid',i:'/dir1,/dir2',e:true},
+      {m:'"/123" - valid',i:'/111',e:true},
+      {m:'"/abc" - valid',i:'/abc',e:true},
+      {m:'"/1a2b3c" - valid',i:'/1a2b3c',e:true},
+      {m:'"[ssd] /1a2b3c" - valid',i:'[ssd] /1a2b3c',e:true},
+      {m:'"[] /1a2b3c" - invalid',i:'[] /1a2b3c',e:false},
+      {m:'"[ssd]/1a2b3c" - invalid',i:'[ssd]/1a2b3c',e:false},
+      {m:'"[/1a2b3c]" - invalid',i:'[/1a2b3c]',e:false},
+      {m:'"[s]ss /sd" - invalid',i:'[s]ss /sd',e:false}
+
+
+    ];
+    tests.forEach(function(test) {
+      it(test.m + ' ', function () {
+        expect(validator.isValidDataNodeDir(test.i)).to.equal(test.e);
+      })
+    });
+  });
   describe('#isAllowedDir(value)', function() {
     var tests = [
       {m:'"/home" - not allowed',i:'/home',e:false},