text: #!/usr/bin/python
  # Copyright (c) 2016-2017 Hewlett Packard Enterprise Development LP
  # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
  
  from __future__ import (absolute_import, division, print_function)
  __metaclass__ = type
  
  DOCUMENTATION = '''
  ---
  module: oneview_san_manager
  short_description: Manage OneView SAN Manager resources
  description:
      - Provides an interface to manage SAN Manager resources. Can create, update, or delete.
  requirements:
      - hpOneView >= 3.1.1
  author:
      - Felipe Bulsoni (@fgbulsoni)
      - Thiago Miotto (@tmiotto)
      - Adriane Cardozo (@adriane-cardozo)
  options:
      state:
          description:
              - Indicates the desired state for the Uplink Set resource.
                  - C(present) ensures data properties are compliant with OneView.
                  - C(absent) removes the resource from OneView, if it exists.
                  - C(connection_information_set) updates the connection information for the SAN Manager. This operation is non-idempotent.
          default: present
          choices: [present, absent, connection_information_set]
      data:
        description:
          - List with SAN Manager properties.
        required: true
  
  extends_documentation_fragment:
  - community.general.oneview
  - community.general.oneview.validateetag
  
  '''
  
  EXAMPLES = '''
  - name: Creates a Device Manager for the Brocade SAN provider with the given hostname and credentials
    community.general.oneview_san_manager:
      config: /etc/oneview/oneview_config.json
      state: present
      data:
        providerDisplayName: Brocade Network Advisor
        connectionInfo:
          - name: Host
            value: 172.18.15.1
          - name: Port
            value: 5989
          - name: Username
            value: username
          - name: Password
            value: password
          - name: UseSsl
            value: true
    delegate_to: localhost
  
  - name: Ensure a Device Manager for the Cisco SAN Provider is present
    community.general.oneview_san_manager:
      config: /etc/oneview/oneview_config.json
      state: present
      data:
        name: 172.18.20.1
        providerDisplayName: Cisco
        connectionInfo:
          - name: Host
            value: 172.18.20.1
          - name: SnmpPort
            value: 161
          - name: SnmpUserName
            value: admin
          - name: SnmpAuthLevel
            value: authnopriv
          - name: SnmpAuthProtocol
            value: sha
          - name: SnmpAuthString
            value: password
    delegate_to: localhost
  
  - name: Sets the SAN Manager connection information
    community.general.oneview_san_manager:
      config: /etc/oneview/oneview_config.json
      state: connection_information_set
      data:
        connectionInfo:
          - name: Host
            value: '172.18.15.1'
          - name: Port
            value: '5989'
          - name: Username
            value: 'username'
          - name: Password
            value: 'password'
          - name: UseSsl
            value: true
    delegate_to: localhost
  
  - name: Refreshes the SAN Manager
    community.general.oneview_san_manager:
      config: /etc/oneview/oneview_config.json
      state: present
      data:
        name: 172.18.15.1
        refreshState: RefreshPending
    delegate_to: localhost
  
  - name: Delete the SAN Manager recently created
    community.general.oneview_san_manager:
      config: /etc/oneview/oneview_config.json
      state: absent
      data:
        name: '172.18.15.1'
    delegate_to: localhost
  '''
  
  RETURN = '''
  san_manager:
      description: Has the OneView facts about the SAN Manager.
      returned: On state 'present'. Can be null.
      type: dict
  '''
  
  from ansible_collections.community.general.plugins.module_utils.oneview import OneViewModuleBase, OneViewModuleValueError
  
  
  class SanManagerModule(OneViewModuleBase):
      MSG_CREATED = 'SAN Manager created successfully.'
      MSG_UPDATED = 'SAN Manager updated successfully.'
      MSG_DELETED = 'SAN Manager deleted successfully.'
      MSG_ALREADY_PRESENT = 'SAN Manager is already present.'
      MSG_ALREADY_ABSENT = 'SAN Manager is already absent.'
      MSG_SAN_MANAGER_PROVIDER_DISPLAY_NAME_NOT_FOUND = "The provider '{0}' was not found."
  
      argument_spec = dict(
          state=dict(type='str', default='present', choices=['absent', 'present', 'connection_information_set']),
          data=dict(type='dict', required=True)
      )
  
      def __init__(self):
          super(SanManagerModule, self).__init__(additional_arg_spec=self.argument_spec, validate_etag_support=True)
          self.resource_client = self.oneview_client.san_managers
  
      def execute_module(self):
          if self.data.get('connectionInfo'):
              for connection_hash in self.data.get('connectionInfo'):
                  if connection_hash.get('name') == 'Host':
                      resource_name = connection_hash.get('value')
          elif self.data.get('name'):
              resource_name = self.data.get('name')
          else:
              msg = 'A "name" or "connectionInfo" must be provided inside the "data" field for this operation. '
              msg += 'If a "connectionInfo" is provided, the "Host" name is considered as the "name" for the resource.'
              raise OneViewModuleValueError(msg.format())
  
          resource = self.resource_client.get_by_name(resource_name)
  
          if self.state == 'present':
              changed, msg, san_manager = self._present(resource)
              return dict(changed=changed, msg=msg, ansible_facts=dict(san_manager=san_manager))
  
          elif self.state == 'absent':
              return self.resource_absent(resource, method='remove')
  
          elif self.state == 'connection_information_set':
              changed, msg, san_manager = self._connection_information_set(resource)
              return dict(changed=changed, msg=msg, ansible_facts=dict(san_manager=san_manager))
  
      def _present(self, resource):
          if not resource:
              provider_uri = self.data.get('providerUri', self._get_provider_uri_by_display_name(self.data))
              return True, self.MSG_CREATED, self.resource_client.add(self.data, provider_uri)
          else:
              merged_data = resource.copy()
              merged_data.update(self.data)
  
              # Remove 'connectionInfo' from comparison, since it is not possible to validate it.
              resource.pop('connectionInfo', None)
              merged_data.pop('connectionInfo', None)
  
              if self.compare(resource, merged_data):
                  return False, self.MSG_ALREADY_PRESENT, resource
              else:
                  updated_san_manager = self.resource_client.update(resource=merged_data, id_or_uri=resource['uri'])
                  return True, self.MSG_UPDATED, updated_san_manager
  
      def _connection_information_set(self, resource):
          if not resource:
              return self._present(resource)
          else:
              merged_data = resource.copy()
              merged_data.update(self.data)
              merged_data.pop('refreshState', None)
              if not self.data.get('connectionInfo', None):
                  raise OneViewModuleValueError('A connectionInfo field is required for this operation.')
              updated_san_manager = self.resource_client.update(resource=merged_data, id_or_uri=resource['uri'])
              return True, self.MSG_UPDATED, updated_san_manager
  
      def _get_provider_uri_by_display_name(self, data):
          display_name = data.get('providerDisplayName')
          provider_uri = self.resource_client.get_provider_uri(display_name)
  
          if not provider_uri:
              raise OneViewModuleValueError(self.MSG_SAN_MANAGER_PROVIDER_DISPLAY_NAME_NOT_FOUND.format(display_name))
  
          return provider_uri
  
  
  def main():
      SanManagerModule().run()
  
  
  if __name__ == '__main__':
      main()
  