docs: function parseSdrData(sdrData) {
          var sdrArray = sdrData.split('\n\n');
          var sdrObjArray = _.transform(sdrArray, function(result, sdr) {
              var lines = sdr.trim().split('\n');
              var key = '';
              var value = '';
              var sdrObj = {
                  sensorId: "",
                  entityId: "",
                  entryIdName: "",
                  sdrType: "",
                  sensorType: "",
                  sensorReading: "",
                  sensorReadingUnits: "",
                  nominalReading: "",
                  normalMinimum: "",
                  normalMaximum: "",
                  statesAsserted: []
              };
  
              // The value associated with these keys is a list
              var listKeys = [
                  'statesAsserted',
                  'assertionsEnabled',
                  'deassertionsEnabled'
              ];
  
              // Expect all of these keys to have non-empty values.
              var requiredKeys = [
                  'sensorId',
                  'entityId',
                  'sdrType',
                  'sensorType',
                  'sensorReading'
              ];
  
              _.forEach(lines, function(line) {
                  if (line.search(':') >= 0) {
                      key = _.camelCase(line.split(':')[0]);
                      value = line.split(':')[1].trim();
  
                      // The sensorType key requires a bit of additional processing.  Converting
                      // to camelCase will yield 'sensorTypeDiscrete' or 'sensorTypeThreshold'
                      // We want to add an additional sdrType key with a value of Discrete or
                      // Threshold and change the key from sensorTypeXxx to sensorType.
                      if (key.search(/sensorType/) >= 0) {
                          var sensorTypeKey = key.slice(0, 'sensorType'.length);
                          var sdrTypeValue = key.slice('sensorType'.length, key.length);
                          var match = value.match(/(.+) (\(0x.+\))?/);
                          key = sensorTypeKey;
                          if (match) {
                              value = match[1].trim();
                          }
                          sdrObj.sdrType = sdrTypeValue;
                      }
                      // The sensorReading key requires a bit of additional processing.
                      // sensorReading also includes sensorReadingUnits value, and we need
                      // to extract from sensorReading
                      if (key.search(/sensorReading/) >= 0) {
                          key = "sensorReadingUnits";
                          var sensorReading = "";
                          if (value.split(/\)/)[1]) {
                              sensorReading = value.split(/\(/)[0];
                              value = value.split(/\)/)[1].trim();
                          }
                          else {
                              // Sensor that does not have any SensorReadingUnits, assign NA
                              sensorReading = value;
                              value = "";
                          }
                          sdrObj.sensorReading = sensorReading.trim();
                      }
                      // The entityId key requires a bit of additional processing.
                      // entityId also includes entryIdName value, and we need
                      // to extract from entityId.
                      if (key.search(/entityId/) >= 0) {
                          key = "entryIdName";
                          var entityId = value.split(/\(([^)]+)\)/)[0];
                          value = value.split(/\(([^)]+)\)/)[1];
                          sdrObj.entityId = entityId.trim();
                      }
                  }
                  else {
                          value = line.trim();
                  }
  
                  //ipmitool displays states as [state name] so remove the []
                  value = value.replace('[', '').replace(']', '');
                  if (key.length > 0) {
                      if (_.contains(listKeys, key)) {
                          //The key needs to be mapped to a list.
                          //There is a bit of ugliness here.
                          // 1. For some reason, ipmitool includes the sensor type name in
                          //    the state lists.  We'll remove it by omitting values that
                          //    match the sensor type name.
                          // 2. The first time the key is processed, its value is undefined.
                          //    Thus, we can't use .push since it isn't a list yet.  So check
                          //    if the key exists in the object first.
                          var sensorTypeName = _.has(sdrObj, 'sensorType') ? sdrObj.sensorType : null;
                          if (sensorTypeName === null  || !sensorTypeName.match(value)) {
                              if (_.has(sdrObj, key)) {
                                  sdrObj[key].push(value);
                              } else {
                                  sdrObj[key] = [value];
                              }
                          }
                      } else {
                          sdrObj[key] = value;
                      }
                  }
              });
              
              // For ipmitool v1.8.11, sensor reading '0h' doesn't exist
              // It is presumed that ipmitool v1.8.13 generates '0h' if sensor reading doesn't exit
              // To accommodate both v1.8.11 and v1.8.13, sensor reading will be automatically
              // generated if it doesn't exist
              if (sdrObj.sensorReading === "") {
                 sdrObj.sensorReading = "0h";
                 sdrObj.sensorReadingUnits = "";
              }
  
              // For ipmitool v1.8.11 sdr type is "Discrete" and "Analog"
              // For ipmitool v1.8.13 sdr type is "Discrete" and "Threshold"
              // Align sdr type to "Discrete" and "Threshold"
              if(sdrObj.sdrType === "Analog") {
                  sdrObj.sdrType = "Threshold";
              }
  
              // if sdrObj has a non-empty value in every required key.
              if (_.every(requiredKeys, function(key) {return _.has(sdrObj, key) && sdrObj[key];})) {
                  result.push(sdrObj);
              }
          });
          return sdrObjArray;
      }