Code coverage report for app/views/main/host/details/host_component_views/datanode_view.js

Statements: 100% (34 / 34)      Branches: 92% (23 / 25)      Functions: 100% (8 / 8)      Lines: 100% (34 / 34)      Ignored: none     

All files » app/views/main/host/details/host_component_views/ » datanode_view.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122    1                                     1   1                   3   3                                   2 1 1                 1 1             1       1               7 7     7 12 12 12 12 12   3 3   6 6   3 3   12         7 3 4 1 3 1     2        
'use strict';
 
;require.register("views/main/host/details/host_component_views/datanode_view", function (exports, require, module) {
  /**
   * 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.DataNodeComponentView = App.HostComponentView.extend(App.Decommissionable, {
 
    componentForCheckDecommission: 'NAMENODE',
 
    /**
     * Get component decommission status from server
     * @returns {$.ajax}
     */
    getDNDecommissionStatus: function getDNDecommissionStatus() {
      // always get datanode decommission status from active namenodes (if NN HA or federation enabled)
      var hdfs = App.HDFSService.find().objectAt(0),
          activeNNHostNames = !hdfs.get('snameNode') && hdfs.get('activeNameNodes.length') ? hdfs.get('activeNameNodes').mapProperty('hostName').join(',') : hdfs.get('nameNode.hostName');
      return App.ajax.send({
        name: 'host.host_component.decommission_status_datanode',
        sender: this,
        data: {
          hostNames: activeNNHostNames,
          componentName: this.get('componentForCheckDecommission')
        },
        success: 'getDNDecommissionStatusSuccessCallback',
        error: 'getDNDecommissionStatusErrorCallback'
      });
    },
 
    /**
     * Set received value or null to <code>decommissionedStatusObject</code>
     * @param {Object} response
     * @returns {Object|null}
     */
    getDNDecommissionStatusSuccessCallback: function getDNDecommissionStatusSuccessCallback(response) {
      if (response && response.items) {
        var statusObjects = response.items.mapProperty('metrics.dfs.namenode');
        this.computeStatus(statusObjects);
      }
    },
 
    /**
     * Set null to <code>decommissionedStatusObject</code> if server returns error
     * @returns {null}
     */
    getDNDecommissionStatusErrorCallback: function getDNDecommissionStatusErrorCallback() {
      this.set('decommissionedStatusObject', null);
      return null;
    },
 
    /**
     * load Recommission/Decommission status from adminState of each live node
     */
    loadComponentDecommissionStatus: function loadComponentDecommissionStatus() {
      return this.getDNDecommissionStatus();
    },
 
    setDesiredAdminState: function setDesiredAdminState(desired_admin_state) {
      this.setStatusAs(desired_admin_state);
    },
 
    /**
     * compute and set decommission state by namenode metrics
     * @param metricObjects
     */
    computeStatus: function computeStatus(metricObjects) {
      var hostName = this.get('content.hostName');
      var inServiceCount = 0,
          decommissioningCount = 0,
          decommissionedCount = 0;
      metricObjects.forEach(function (curObj) {
        Eif (curObj) {
          var liveNodesJson = App.parseJSON(curObj.LiveNodes);
          for (var hostPort in liveNodesJson) {
            Eif (hostPort.indexOf(hostName) === 0) {
              switch (liveNodesJson[hostPort].adminState) {
                case 'In Service':
                  inServiceCount++;
                  break;
                case 'Decommission In Progress':
                  decommissioningCount++;
                  break;
                case 'Decommissioned':
                  decommissionedCount++;
                  break;
              }
              return;
            }
          }
        }
      });
      if (decommissioningCount) {
        this.setStatusAs('DECOMMISSIONING');
      } else if (inServiceCount && !decommissionedCount) {
        this.setStatusAs('INSERVICE');
      } else if (!inServiceCount && decommissionedCount) {
        this.setStatusAs('DECOMMISSIONED');
      } else {
        // if namenodes are down, get desired_admin_state to decide if the user had issued a decommission
        this.getDesiredAdminState();
      }
    }
  });
});