<!--- 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 -->

except Exception as e:
            return {'ret': False,
                    'msg': "Failed PATCH request to '%s': '%s'" % (uri, to_text(e))}
        return {'ret': True, 'resp': resp}
    def delete_request(self, uri, pyld=None):
        try:
            data = json.dumps(pyld) if pyld else None
            resp = open_url(uri, data=data,
                            headers=DELETE_HEADERS, method="DELETE",
                            url_username=self.creds['user'],
                            url_password=self.creds['pswd'],
                            force_basic_auth=True, validate_certs=False,
                            follow_redirects='all',
                            use_proxy=False, timeout=self.timeout)
        except HTTPError as e:
            msg = self._get_extended_message(e)
            return {'ret': False,
                    'msg': "HTTP Error %s on DELETE request to '%s', extended message: '%s'"
                           % (e.code, uri, msg),
                    'status': e.code}
        except URLError as e:
            return {'ret': False, 'msg': "URL Error on DELETE request to '%s': '%s'"
                                         % (uri, e.reason)}
        
        except Exception as e:
            return {'ret': False,
                    'msg': "Failed DELETE request to '%s': '%s'" % (uri, to_text(e))}
        return {'ret': True, 'resp': resp}
    @staticmethod
    def _get_extended_message(error):