<!--- Verify first that your feature was not already discussed on GitHub -->
<!--- Complete *all* sections as described, this form is processed automatically -->

##### SUMMARY
<!--- Describe the new feature/improvement briefly below -->
During the 2019 APTS Plugfest, it was noted that the `GetFirmwareInventory` command was gathering the `FirmwareInventory` from the `UpdateService`, but not the `SoftwareInventory`.

There are two options to address this request:

1. Update the `GetFirmwareInventory` command to also gather the `SoftwareInventory`.
2. Add a new `GetSoftwareInventory` command.

I'll get input on these two options. [Per Tools Task Force call, agreed on option 2.]

##### ISSUE TYPE
- Feature Idea

##### COMPONENT NAME
<!--- Write the short name of the module, plugin, task or feature below, use your best guess if unsure -->
redfish_facts.py
redfish_utils.py

##### ADDITIONAL INFORMATION
<!--- Describe how the feature would be used, why it is needed and what it would solve -->
Operators want to be able to get `SoftwareInventory` as well as `FirmwareInventory`. There is currently no way the gather the `SoftwareInventory` using the Ansible Redfish modules.

<!--- Paste example playbooks or commands between quotes below -->
**Option 1:**
```yaml
  tasks:

  - name: Get Firmware and Software Inventory
    redfish_facts:
      category: Update
      command: GetFirmwareInventory
      baseuri: "{{ baseuri }}"
      username: "{{ username }}"
      password: "{{ password }}"
    register: result
```

**Option 2:**
```yaml
  tasks:

  - name: Get Firmware Inventory
    redfish_facts:
      category: Update
      command: GetFirmwareInventory
      baseuri: "{{ baseuri }}"
      username: "{{ username }}"
      password: "{{ password }}"
    register: result

  - name: Get Software Inventory
    redfish_facts:
      category: Update
      command: GetSoftwareInventory
      baseuri: "{{ baseuri }}"
      username: "{{ username }}"
      password: "{{ password }}"
    register: result
```


<!--- HINT: You can also paste gist.github.com links for larger files -->

return {'ret': False,
                    'msg': 'target URI missing from Action #ComputerSystem.Reset'}
        action_uri = reset_action['target']
        
        allowable_values = None
        if '@Redfish.ActionInfo' in reset_action:
            action_info_uri = reset_action.get('@Redfish.ActionInfo')
            response = self.get_request(self.root_uri + action_info_uri)
            if response['ret'] is True:
                data = response['data']
                if 'Parameters' in data:
                    params = data['Parameters']
                    for param in params:
                        if param.get('Name') == 'ResetType':
                            allowable_values = param.get('AllowableValues')
                            break
        
        if allowable_values is None:
            allowable_values = reset_action.get('ResetType@Redfish.AllowableValues', [])
        
        if reset_type not in allowable_values:
            reset_type = self._map_reset_type(reset_type, allowable_values)
        
        payload = {'ResetType': reset_type}
        
        response = self.post_request(self.root_uri + action_uri, payload)
        if response['ret'] is False:
            return response
        return {'ret': True, 'changed': True}
    def _find_account_uri(self, username=None, acct_id=None):