mirror of
				https://github.com/ansible-collections/community.general.git
				synced 2025-10-26 13:56:09 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			257 lines
		
	
	
	
		
			9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
	
		
			9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/python
 | |
| # -*- coding: utf-8 -*-
 | |
| # Copyright (c) 2016-2017 Hewlett Packard Enterprise Development LP
 | |
| # GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
 | |
| # SPDX-License-Identifier: GPL-3.0-or-later
 | |
| 
 | |
| from __future__ import (absolute_import, division, print_function)
 | |
| __metaclass__ = type
 | |
| 
 | |
| DOCUMENTATION = '''
 | |
| ---
 | |
| module: oneview_ethernet_network
 | |
| short_description: Manage OneView Ethernet Network resources
 | |
| description:
 | |
|     - Provides an interface to manage Ethernet Network resources. Can create, update, or delete.
 | |
| requirements:
 | |
|     - hpOneView >= 3.1.0
 | |
| author:
 | |
|     - Felipe Bulsoni (@fgbulsoni)
 | |
|     - Thiago Miotto (@tmiotto)
 | |
|     - Adriane Cardozo (@adriane-cardozo)
 | |
| attributes:
 | |
|     check_mode:
 | |
|         support: none
 | |
|     diff_mode:
 | |
|         support: none
 | |
| options:
 | |
|     state:
 | |
|         description:
 | |
|             - Indicates the desired state for the Ethernet Network resource.
 | |
|                 - V(present) will ensure data properties are compliant with OneView.
 | |
|                 - V(absent) will remove the resource from OneView, if it exists.
 | |
|                 - V(default_bandwidth_reset) will reset the network connection template to the default.
 | |
|         type: str
 | |
|         default: present
 | |
|         choices: [present, absent, default_bandwidth_reset]
 | |
|     data:
 | |
|         description:
 | |
|             - List with Ethernet Network properties.
 | |
|         type: dict
 | |
|         required: true
 | |
| extends_documentation_fragment:
 | |
|     - community.general.oneview
 | |
|     - community.general.oneview.validateetag
 | |
|     - community.general.attributes
 | |
| 
 | |
| '''
 | |
| 
 | |
| EXAMPLES = '''
 | |
| - name: Ensure that the Ethernet Network is present using the default configuration
 | |
|   community.general.oneview_ethernet_network:
 | |
|     config: '/etc/oneview/oneview_config.json'
 | |
|     state: present
 | |
|     data:
 | |
|       name: 'Test Ethernet Network'
 | |
|       vlanId: '201'
 | |
|   delegate_to: localhost
 | |
| 
 | |
| - name: Update the Ethernet Network changing bandwidth and purpose
 | |
|   community.general.oneview_ethernet_network:
 | |
|     config: '/etc/oneview/oneview_config.json'
 | |
|     state: present
 | |
|     data:
 | |
|       name: 'Test Ethernet Network'
 | |
|       purpose: Management
 | |
|       bandwidth:
 | |
|           maximumBandwidth: 3000
 | |
|           typicalBandwidth: 2000
 | |
|   delegate_to: localhost
 | |
| 
 | |
| - name: Ensure that the Ethernet Network is present with name 'Renamed Ethernet Network'
 | |
|   community.general.oneview_ethernet_network:
 | |
|     config: '/etc/oneview/oneview_config.json'
 | |
|     state: present
 | |
|     data:
 | |
|       name: 'Test Ethernet Network'
 | |
|       newName: 'Renamed Ethernet Network'
 | |
|   delegate_to: localhost
 | |
| 
 | |
| - name: Ensure that the Ethernet Network is absent
 | |
|   community.general.oneview_ethernet_network:
 | |
|     config: '/etc/oneview/oneview_config.json'
 | |
|     state: absent
 | |
|     data:
 | |
|       name: 'New Ethernet Network'
 | |
|   delegate_to: localhost
 | |
| 
 | |
| - name: Create Ethernet networks in bulk
 | |
|   community.general.oneview_ethernet_network:
 | |
|     config: '/etc/oneview/oneview_config.json'
 | |
|     state: present
 | |
|     data:
 | |
|       vlanIdRange: '1-10,15,17'
 | |
|       purpose: General
 | |
|       namePrefix: TestNetwork
 | |
|       smartLink: false
 | |
|       privateNetwork: false
 | |
|       bandwidth:
 | |
|         maximumBandwidth: 10000
 | |
|         typicalBandwidth: 2000
 | |
|   delegate_to: localhost
 | |
| 
 | |
| - name: Reset to the default network connection template
 | |
|   community.general.oneview_ethernet_network:
 | |
|     config: '/etc/oneview/oneview_config.json'
 | |
|     state: default_bandwidth_reset
 | |
|     data:
 | |
|       name: 'Test Ethernet Network'
 | |
|   delegate_to: localhost
 | |
| '''
 | |
| 
 | |
| RETURN = '''
 | |
| ethernet_network:
 | |
|     description: Has the facts about the Ethernet Networks.
 | |
|     returned: On state 'present'. Can be null.
 | |
|     type: dict
 | |
| 
 | |
| ethernet_network_bulk:
 | |
|     description: Has the facts about the Ethernet Networks affected by the bulk insert.
 | |
|     returned: When 'vlanIdRange' attribute is in data argument. Can be null.
 | |
|     type: dict
 | |
| 
 | |
| ethernet_network_connection_template:
 | |
|     description: Has the facts about the Ethernet Network Connection Template.
 | |
|     returned: On state 'default_bandwidth_reset'. Can be null.
 | |
|     type: dict
 | |
| '''
 | |
| 
 | |
| from ansible_collections.community.general.plugins.module_utils.oneview import OneViewModuleBase, OneViewModuleResourceNotFound
 | |
| 
 | |
| 
 | |
| class EthernetNetworkModule(OneViewModuleBase):
 | |
|     MSG_CREATED = 'Ethernet Network created successfully.'
 | |
|     MSG_UPDATED = 'Ethernet Network updated successfully.'
 | |
|     MSG_DELETED = 'Ethernet Network deleted successfully.'
 | |
|     MSG_ALREADY_PRESENT = 'Ethernet Network is already present.'
 | |
|     MSG_ALREADY_ABSENT = 'Ethernet Network is already absent.'
 | |
| 
 | |
|     MSG_BULK_CREATED = 'Ethernet Networks created successfully.'
 | |
|     MSG_MISSING_BULK_CREATED = 'Some missing Ethernet Networks were created successfully.'
 | |
|     MSG_BULK_ALREADY_EXIST = 'The specified Ethernet Networks already exist.'
 | |
|     MSG_CONNECTION_TEMPLATE_RESET = 'Ethernet Network connection template was reset to the default.'
 | |
|     MSG_ETHERNET_NETWORK_NOT_FOUND = 'Ethernet Network was not found.'
 | |
| 
 | |
|     RESOURCE_FACT_NAME = 'ethernet_network'
 | |
| 
 | |
|     def __init__(self):
 | |
| 
 | |
|         argument_spec = dict(
 | |
|             state=dict(type='str', default='present', choices=['absent', 'default_bandwidth_reset', 'present']),
 | |
|             data=dict(type='dict', required=True),
 | |
|         )
 | |
| 
 | |
|         super(EthernetNetworkModule, self).__init__(additional_arg_spec=argument_spec, validate_etag_support=True)
 | |
| 
 | |
|         self.resource_client = self.oneview_client.ethernet_networks
 | |
| 
 | |
|     def execute_module(self):
 | |
| 
 | |
|         changed, msg, ansible_facts, resource = False, '', {}, None
 | |
| 
 | |
|         if self.data.get('name'):
 | |
|             resource = self.get_by_name(self.data['name'])
 | |
| 
 | |
|         if self.state == 'present':
 | |
|             if self.data.get('vlanIdRange'):
 | |
|                 return self._bulk_present()
 | |
|             else:
 | |
|                 return self._present(resource)
 | |
|         elif self.state == 'absent':
 | |
|             return self.resource_absent(resource)
 | |
|         elif self.state == 'default_bandwidth_reset':
 | |
|             changed, msg, ansible_facts = self._default_bandwidth_reset(resource)
 | |
|             return dict(changed=changed, msg=msg, ansible_facts=ansible_facts)
 | |
| 
 | |
|     def _present(self, resource):
 | |
| 
 | |
|         bandwidth = self.data.pop('bandwidth', None)
 | |
|         scope_uris = self.data.pop('scopeUris', None)
 | |
|         result = self.resource_present(resource, self.RESOURCE_FACT_NAME)
 | |
| 
 | |
|         if bandwidth:
 | |
|             if self._update_connection_template(result['ansible_facts']['ethernet_network'], bandwidth)[0]:
 | |
|                 result['changed'] = True
 | |
|                 result['msg'] = self.MSG_UPDATED
 | |
| 
 | |
|         if scope_uris is not None:
 | |
|             result = self.resource_scopes_set(result, 'ethernet_network', scope_uris)
 | |
| 
 | |
|         return result
 | |
| 
 | |
|     def _bulk_present(self):
 | |
|         vlan_id_range = self.data['vlanIdRange']
 | |
|         result = dict(ansible_facts={})
 | |
|         ethernet_networks = self.resource_client.get_range(self.data['namePrefix'], vlan_id_range)
 | |
| 
 | |
|         if not ethernet_networks:
 | |
|             self.resource_client.create_bulk(self.data)
 | |
|             result['changed'] = True
 | |
|             result['msg'] = self.MSG_BULK_CREATED
 | |
| 
 | |
|         else:
 | |
|             vlan_ids = self.resource_client.dissociate_values_or_ranges(vlan_id_range)
 | |
|             for net in ethernet_networks[:]:
 | |
|                 vlan_ids.remove(net['vlanId'])
 | |
| 
 | |
|             if len(vlan_ids) == 0:
 | |
|                 result['msg'] = self.MSG_BULK_ALREADY_EXIST
 | |
|                 result['changed'] = False
 | |
|             else:
 | |
|                 if len(vlan_ids) == 1:
 | |
|                     self.data['vlanIdRange'] = '{0}-{1}'.format(vlan_ids[0], vlan_ids[0])
 | |
|                 else:
 | |
|                     self.data['vlanIdRange'] = ','.join(map(str, vlan_ids))
 | |
| 
 | |
|                 self.resource_client.create_bulk(self.data)
 | |
|                 result['changed'] = True
 | |
|                 result['msg'] = self.MSG_MISSING_BULK_CREATED
 | |
|         result['ansible_facts']['ethernet_network_bulk'] = self.resource_client.get_range(self.data['namePrefix'], vlan_id_range)
 | |
| 
 | |
|         return result
 | |
| 
 | |
|     def _update_connection_template(self, ethernet_network, bandwidth):
 | |
| 
 | |
|         if 'connectionTemplateUri' not in ethernet_network:
 | |
|             return False, None
 | |
| 
 | |
|         connection_template = self.oneview_client.connection_templates.get(ethernet_network['connectionTemplateUri'])
 | |
| 
 | |
|         merged_data = connection_template.copy()
 | |
|         merged_data.update({'bandwidth': bandwidth})
 | |
| 
 | |
|         if not self.compare(connection_template, merged_data):
 | |
|             connection_template = self.oneview_client.connection_templates.update(merged_data)
 | |
|             return True, connection_template
 | |
|         else:
 | |
|             return False, None
 | |
| 
 | |
|     def _default_bandwidth_reset(self, resource):
 | |
| 
 | |
|         if not resource:
 | |
|             raise OneViewModuleResourceNotFound(self.MSG_ETHERNET_NETWORK_NOT_FOUND)
 | |
| 
 | |
|         default_connection_template = self.oneview_client.connection_templates.get_default()
 | |
| 
 | |
|         changed, connection_template = self._update_connection_template(resource, default_connection_template['bandwidth'])
 | |
| 
 | |
|         return changed, self.MSG_CONNECTION_TEMPLATE_RESET, dict(
 | |
|             ethernet_network_connection_template=connection_template)
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     EthernetNetworkModule().run()
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |