map: function()

in ambari-web/app/mappers/status_mapper.js [61:169]


  map: function (json) {
    console.time('App.statusMapper execution time');
    if (json.items) {
      var hostsCache = App.cache['Hosts'];
      var hostStatuses = {};
      var hostComponentStatuses = {};
      var addedHostComponents = [];
      var componentServiceMap = this.get('componentServiceMap');
      var currentComponentStatuses = {};
      var currentHostStatuses = {};
      var previousHostStatuses = App.cache['previousHostStatuses'];
      var previousComponentStatuses = App.cache['previousComponentStatuses'];
      var hostComponentsOnService = {};

      json.items.forEach(function (host) {
        //update hosts, which have status changed
        if (previousHostStatuses[host.Hosts.host_name] !== host.Hosts.host_status) {
          hostStatuses[host.Hosts.host_name] = host.Hosts.host_status;
        }
        currentHostStatuses[host.Hosts.host_name] = host.Hosts.host_status;
        var hostComponentsOnHost = [];
        host.host_components.forEach(function (host_component) {
          host_component.id = host_component.HostRoles.component_name + "_" + host_component.HostRoles.host_name;
          var existedComponent = previousComponentStatuses[host_component.id];
          var service = componentServiceMap[host_component.HostRoles.component_name];

          if (existedComponent) {
            //update host-components, which have status changed
            if (existedComponent !== host_component.HostRoles.state) {
              hostComponentStatuses[host_component.id] = host_component.HostRoles.state;
            }
          } else {
            addedHostComponents.push({
              id: host_component.id,
              component_name: host_component.HostRoles.component_name,
              work_status: host_component.HostRoles.state,
              host_id: host.Hosts.host_name,
              service_id: service
            });
            //update host-components only on adding due to Ember Data features
            if (hostsCache[host.Hosts.host_name]) hostsCache[host.Hosts.host_name].is_modified = true;
          }
          currentComponentStatuses[host_component.id] = host_component.HostRoles.state;

          //host-components to host relations
          hostComponentsOnHost.push(host_component.id);
          //host-component to service relations
          if (!hostComponentsOnService[service]) {
            hostComponentsOnService[service] = {
              host_components: [],
              running_host_components: [],
              unknown_host_components: []
            };
          }
          if (host_component.HostRoles.state === App.HostComponentStatus.started) {
            hostComponentsOnService[service].running_host_components.push(host_component.id);
          }
          if (host_component.HostRoles.state === App.HostComponentStatus.unknown) {
            hostComponentsOnService[service].unknown_host_components.push(host_component.id);
          }
          hostComponentsOnService[service].host_components.push(host_component.id);


        }, this);
        /**
         * updating relation between Host and his host-components
         */
        if (hostsCache[host.Hosts.host_name]) {
          hostsCache[host.Hosts.host_name].host_components = hostComponentsOnHost;
        }
      }, this);

      var hostComponents = App.HostComponent.find();
      var hosts = App.Host.find();

      hostComponents.forEach(function (hostComponent) {
        if (hostComponent) {
          var status = currentComponentStatuses[hostComponent.get('id')];
          //check whether component present in current response
          if (status) {
            //check whether component has status changed
            if (hostComponentStatuses[hostComponent.get('id')]) {
              hostComponent.set('workStatus', status);
            }
          } else {
            hostComponent.deleteRecord();
            App.store.commit();
            hostComponent.get('stateManager').transitionTo('loading');
          }
        }
      }, this);

      if (addedHostComponents.length) {
        App.store.loadMany(this.get('model'), addedHostComponents);
      }

      App.cache['previousHostStatuses'] = currentHostStatuses;
      App.cache['previousComponentStatuses'] = currentComponentStatuses;
      App.cache['hostComponentsOnService'] = hostComponentsOnService;

      hosts.forEach(function (host) {
        var status = hostStatuses[host.get('id')];
        if (status) {
          host.set('healthStatus', status);
        }
      });
    }
    console.timeEnd('App.statusMapper execution time');
  }