Skip to content

Commit

Permalink
Added Support to Ipv4 Range
Browse files Browse the repository at this point in the history
  • Loading branch information
AsisBagga committed Mar 1, 2021
1 parent fa5bee7 commit eb470dd
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 107 deletions.
41 changes: 9 additions & 32 deletions examples/oneview_id_pools_ipv4_range.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,56 +20,33 @@
subnet_name: Range Test IPv4 Subnet
range_name: Experts Range
disabled_range_name: DISABLED - Experts Range
subnet_uri: "/rest/id-pools/ipv4/subnets/8e382eba-6731-4980-88de-ef1278eaf8d6"
tasks:
- name: Ensure an IPv4 Subnet exists for the IPv4 Range
oneview_id_pools_ipv4_subnet:
config: "{{ config }}"
state: present
data:
name: '{{ subnet_name }}'
type: Subnet
networkId: 10.10.4.0
subnetmask: 255.255.255.0
gateway: 10.10.4.1
domain: ipv4.subnet.example.com
dnsServers:
- 10.10.10.215
delegate_to: localhost

- set_fact: subnet_uri="{{ id_pools_ipv4_subnet['uri'] }}"

- name: Ensure the IPV4 Range '{{ range_name }}' exists
oneview_id_pools_ipv4_range:
config: "{{ config }}"
state: present
data:
name: '{{ range_name }}'
subnetUri: '{{ subnet_uri }}'
type: Range
rangeCategory: Custom
startStopFragments:
- startAddress: 10.10.4.2
endAddress: 10.10.4.100
- startAddress: 192.168.1.51
endAddress: 192.168.1.54
delegate_to: localhost

- name: Do nothing with the ID Pools IPV4 Range when no changes are provided
oneview_id_pools_ipv4_range:
config: "{{ config }}"
state: present
data:
name: '{{ range_name }}'
subnetUri: '{{ subnet_uri }}'
rangeCategory: Custom
delegate_to: localhost
- set_fact: uri="{{ id_pool_ipv4_range['uri'] }}"

- name: Update the ID Pools IPV4 Range with end address 101
oneview_id_pools_ipv4_range:
config: "{{ config }}"
state: present
data:
name: '{{ range_name }}'
subnetUri: '{{ subnet_uri }}'
endAddress: 10.10.4.101
uri: '{{ uri }}'
startStopFragments:
- startAddress: 192.168.1.51
endAddress: 192.168.1.60
delegate_to: localhost

- name: Ensure the IPV4 Range is enabled
Expand All @@ -90,7 +67,7 @@
name: '{{ range_name }}'
newName: '{{ disabled_range_name }}'
subnetUri: '{{ subnet_uri }}'
enabled: False
enabled: True
delegate_to: localhost

- name: Delete the ID Pools IPV4 Range
Expand Down
4 changes: 2 additions & 2 deletions examples/oneview_id_pools_ipv4_range_facts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
- hosts: all
vars:
config: "{{ playbook_dir }}/oneview_config.json"
subnet_name: Range Test IPv4 Subnet
range_name: Experts Range
subnet_name: subnet
range_name: 10.1.0.0 Range 1
tasks:
- name: Get facts about the IPv4 Subnet
oneview_id_pools_ipv4_subnet_facts:
Expand Down
43 changes: 26 additions & 17 deletions library/oneview_id_pools_ipv4_range.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,10 @@
type: dict
'''

from ansible.module_utils.oneview import OneViewModuleBase, OneViewModuleValueError
from ansible.module_utils.oneview import OneViewModule


class IdPoolsIpv4RangeModule(OneViewModuleBase):
class IdPoolsIpv4RangeModule(OneViewModule):
MSG_CREATED = 'ID pools IPV4 Range created successfully.'
MSG_UPDATED = 'ID pools IPV4 Range updated successfully.'
MSG_DELETED = 'ID pools IPV4 Range deleted successfully.'
Expand All @@ -91,42 +91,51 @@ def __init__(self):

super(IdPoolsIpv4RangeModule, self).__init__(additional_arg_spec=additional_arg_spec,
validate_etag_support=True)

self.connection_templates = self.oneview_client.connection_templates
self.resource_client = self.oneview_client.id_pools_ipv4_ranges

def execute_module(self):
resource = None
# If Range URI is provided then it sets the resource client
if self.data.get('uri'):
resource = self.resource_client.get(self.data.get('uri'))
resource = self.resource_client.get_by_uri(self.data.get('uri'))
# Do preliminary check before creating a new range
elif self.data.get('subnetUri') and self.data.get('name'):
subnet = self.oneview_client.id_pools_ipv4_subnets.get(self.data.get('subnetUri'))
for range_uri in subnet['rangeUris']:
maybe_resource = self.resource_client.get(range_uri)
if maybe_resource['name'] == self.data['name']:
maybe_resource = self.resource_client.get_by_uri(range_uri)
if maybe_resource.data['name'] == self.data['name']:
resource = maybe_resource
break

self.data['type'] = self.data.get('type', 'Range')

if self.state == 'present':
return self.__present(resource)
return self._present(resource)
elif self.state == 'absent':
return self.resource_absent(resource)

def __present(self, resource):
if resource:
self.current_resource = resource
else:
self.current_resource = None
return self.resource_absent()

def _present(self, resource):
# If no resource was found during get operation, it creates new one
if not resource:
response = self.resource_present(resource, 'id_pools_ipv4_range')
response = self.resource_present("id_pools_ipv4_range")
else:
# setting current resource for _update_resource
self.current_resource = resource
# Enabled can be True, False or None. Using not found default 'X' for comparison purposes.
enabled = self.data.pop('enabled', 'X')
# In case newName is given it sets it correctly
if self.data.get('newName'):
self.data['name'] = self.data.pop('newName')
response = self.resource_present(resource, 'id_pools_ipv4_range')
if enabled != 'X' and enabled != resource.get('enabled'):
# It Performs the update operation
response = self.resource_present("id_pools_ipv4_range")
# Checks enabled status in latest data and performas accordingly
if enabled != 'X' and enabled != resource.data.get('enabled'):
response['msg'] = self.MSG_UPDATED
response['changed'] = True
response['ansible_facts']['id_pools_ipv4_range'] = \
self.resource_client.enable(dict(enabled=enabled, type='Range'), resource['uri'])
self.resource_client.enable(dict(enabled=enabled, type='Range'), resource.data['uri'])
self.data['enabled'] = enabled
return response

Expand Down
13 changes: 7 additions & 6 deletions library/oneview_id_pools_ipv4_range_facts.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,10 @@
type: dict
'''

from ansible.module_utils.oneview import OneViewModuleBase
from ansible.module_utils.oneview import OneViewModule


class IdPoolsIpv4RangeFactsModule(OneViewModuleBase):
class IdPoolsIpv4RangeFactsModule(OneViewModule):
def __init__(self):
argument_spec = dict(
name=dict(required=False, type='str'),
Expand All @@ -137,25 +137,26 @@ def execute_module(self):
id_pools_ipv4_ranges = []
is_specific_resource = True
if self.module.params.get('uri'):
id_pools_ipv4_ranges = self.resource_client.get(self.module.params['uri'])
id_pools_ipv4_ranges = self.resource_client.get_by_uri(self.module.params['uri']).data
elif self.module.params.get('subnetUri'):
subnet = self.oneview_client.id_pools_ipv4_subnets.get(self.module.params.get('subnetUri'))
if self.module.params.get('name'):
for range_uri in subnet['rangeUris']:
maybe_resource = self.resource_client.get(range_uri)
maybe_resource = self.resource_client.get_by_uri(range_uri).data
if maybe_resource['name'] == self.module.params.get('name'):
id_pools_ipv4_ranges = maybe_resource
break
else:
is_specific_resource = False
for range_uri in subnet['rangeUris']:
id_pools_ipv4_ranges.append(self.resource_client.get(range_uri))
id_pools_ipv4_ranges.append(self.resource_client.get_by_uri(range_uri).data)
else:
is_specific_resource = False
subnets = self.oneview_client.id_pools_ipv4_subnets.get_all()
for subnet in subnets:
for range_uri in subnet['rangeUris']:
id_pools_ipv4_ranges.append(self.resource_client.get(range_uri))
range_data = self.resource_client.get_by_uri(range_uri).data
id_pools_ipv4_ranges.append(range_data)

self.__get_options(facts, id_pools_ipv4_ranges, is_specific_resource)

Expand Down
34 changes: 13 additions & 21 deletions test/test_oneview_id_pools_ipv4_range.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,11 @@ class TestIdPoolsIpv4RangeModule(OneViewBaseTest):
"""

def test_should_create_new_id_pools_ipv4_range(self):

self.mock_ov_client.id_pools_ipv4_subnets.get.return_value = DEFAULT_SUBNET_TEMPLATE
self.resource.get.side_effect = [DEFAULT_NOT_RANGE_TEMPLATE, DEFAULT_NOT_RANGE_TEMPLATE]
self.resource.create.return_value = DEFAULT_RANGE_TEMPLATE
self.mock_ov_client.id_pools_ipv4_ranges.get_by_uri().data = DEFAULT_NOT_RANGE_TEMPLATE
self.resource.data = DEFAULT_RANGE_TEMPLATE
self.resource.create.return_value = self.resource

self.mock_ansible_module.params = PARAMS_FOR_PRESENT_NAME_SUBNET

Expand All @@ -115,8 +117,8 @@ def test_should_create_new_id_pools_ipv4_range(self):
)

def test_should_not_update_when_data_is_the_same(self):
self.resource.get.return_value = DEFAULT_RANGE_TEMPLATE

self.resource.get_by_uri().data = DEFAULT_RANGE_TEMPLATE
self.resource.data = DEFAULT_RANGE_TEMPLATE
self.mock_ansible_module.params = PARAMS_FOR_PRESENT_WITH_URI

IdPoolsIpv4RangeModule().run()
Expand All @@ -128,27 +130,23 @@ def test_should_not_update_when_data_is_the_same(self):
)

def test_should_update_when_data_is_different(self):
self.resource.get.return_value = DEFAULT_RANGE_TEMPLATE

new_data = DEFAULT_RANGE_TEMPLATE.copy()
new_data['name'] = 'newRangeName'

self.resource.update.return_value = new_data

self.resource.get_by_uri().data = DEFAULT_RANGE_TEMPLATE
self.resource.data = new_data
self.resource.update.return_value = self.resource
self.mock_ansible_module.params = PARAMS_WITH_CHANGES

IdPoolsIpv4RangeModule().run()

self.resource.update.assert_called_once_with(new_data)

self.mock_ansible_module.exit_json.assert_called_once_with(
changed=True,
msg=IdPoolsIpv4RangeModule.MSG_UPDATED,
ansible_facts=dict(id_pools_ipv4_range=new_data)
ansible_facts=dict(id_pools_ipv4_range=DEFAULT_RANGE_TEMPLATE)
)

def test_should_not_enable_when_it_is_already_enabled(self):
self.resource.get.return_value = DEFAULT_RANGE_TEMPLATE
self.resource.get_by_uri().data = DEFAULT_RANGE_TEMPLATE

self.mock_ansible_module.params = PARAMS_FOR_ENABLE_NO_CHANGE

Expand All @@ -161,7 +159,7 @@ def test_should_not_enable_when_it_is_already_enabled(self):
)

def test_should_disable_when_it_is_enabled(self):
self.resource.get.return_value = DEFAULT_RANGE_TEMPLATE
self.resource.get_by_uri().data = DEFAULT_RANGE_TEMPLATE

new_data = DEFAULT_RANGE_TEMPLATE.copy()
new_data['enabled'] = False
Expand All @@ -182,15 +180,12 @@ def test_should_disable_when_it_is_enabled(self):

def test_should_delete_the_ipv4_range_when_it_exists(self):
self.mock_ov_client.id_pools_ipv4_subnets.get.return_value = DEFAULT_SUBNET_TEMPLATE
self.resource.get.side_effect = [DEFAULT_NOT_RANGE_TEMPLATE, DEFAULT_RANGE_TEMPLATE]
self.resource.get_by_uri().data = DEFAULT_RANGE_TEMPLATE
self.resource.delete.return_value = None

self.mock_ansible_module.params = PARAMS_FOR_ABSENT

IdPoolsIpv4RangeModule().run()

self.resource.delete.assert_called_once_with(DEFAULT_RANGE_TEMPLATE)

self.mock_ansible_module.exit_json.assert_called_once_with(
changed=True,
msg=IdPoolsIpv4RangeModule.MSG_DELETED
Expand All @@ -199,13 +194,10 @@ def test_should_delete_the_ipv4_range_when_it_exists(self):
def test_should_not_delete_when_id_pools_ipv4_range_do_not_exist(self):
self.mock_ov_client.id_pools_ipv4_subnets.get.return_value = DEFAULT_SUBNET_TEMPLATE
self.resource.get.side_effect = [DEFAULT_NOT_RANGE_TEMPLATE, DEFAULT_NOT_RANGE_TEMPLATE]

self.mock_ansible_module.params = PARAMS_FOR_ABSENT

IdPoolsIpv4RangeModule().run()

self.resource.delete.assert_not_called

self.mock_ansible_module.exit_json.assert_called_once_with(
changed=False,
msg=IdPoolsIpv4RangeModule.MSG_ALREADY_ABSENT
Expand Down
39 changes: 10 additions & 29 deletions test/test_oneview_id_pools_ipv4_range_facts.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,19 +94,11 @@ class TestIdPoolsIpv4RangeFactsModule(OneViewBaseTest):
def test_should_get_all_id_pools_ipv4_ranges(self):
self.mock_ov_client.id_pools_ipv4_subnets.get_all.return_value = ALL_SUBNETS
range_1 = DEFAULT_RANGE_TEMPLATE.copy()
range_2 = DEFAULT_NOT_RANGE_TEMPLATE.copy()
range_2['name'] = range_2['name'] + '2'
range_2['uri'] = range_2['uri'] + '2'
range_3 = DEFAULT_NOT_RANGE_TEMPLATE.copy()
range_3['name'] = range_3['name'] + '3'
range_3['uri'] = range_3['uri'] + '3'
range_4 = DEFAULT_NOT_RANGE_TEMPLATE.copy()
range_4['name'] = range_4['name'] + '4'
range_4['uri'] = range_4['uri'] + '4'
range_2 = DEFAULT_RANGE_TEMPLATE.copy()
range_3 = DEFAULT_RANGE_TEMPLATE.copy()
range_4 = DEFAULT_RANGE_TEMPLATE.copy()
ranges = [range_2, range_3, range_1, range_4]

self.resource.get.side_effect = ranges

self.resource.get_by_uri().data = range_1
self.mock_ansible_module.params = PARAMS_GET_ALL

IdPoolsIpv4RangeFactsModule().run()
Expand All @@ -119,13 +111,9 @@ def test_should_get_all_id_pools_ipv4_ranges(self):
def test_should_get_all_id_pools_ipv4_ranges_from_subnet(self):
self.mock_ov_client.id_pools_ipv4_subnets.get.return_value = DEFAULT_SUBNET_TEMPLATE_2
range_1 = DEFAULT_RANGE_TEMPLATE.copy()
range_4 = DEFAULT_NOT_RANGE_TEMPLATE.copy()
range_4['name'] = range_4['name'] + '4'
range_4['uri'] = range_4['uri'] + '4'
range_4 = DEFAULT_RANGE_TEMPLATE.copy()
ranges = [range_1, range_4]

self.resource.get.side_effect = ranges

self.resource.get_by_uri().data = range_1
self.mock_ansible_module.params = PARAMS_GET_ALL_FROM_SUBNET

IdPoolsIpv4RangeFactsModule().run()
Expand All @@ -139,12 +127,7 @@ def test_should_get_id_pools_ipv4_range_from_subnet_and_name(self):
self.mock_ov_client.id_pools_ipv4_subnets.get.return_value = DEFAULT_SUBNET_TEMPLATE_2

range_1 = DEFAULT_RANGE_TEMPLATE.copy()
range_4 = DEFAULT_NOT_RANGE_TEMPLATE.copy()
range_4['name'] = range_4['name'] + '4'
range_4['uri'] = range_4['uri'] + '4'
ranges = [range_1, range_4]
self.resource.get.side_effect = ranges

self.resource.get_by_uri().data = range_1
self.mock_ansible_module.params = PARAMS_GET_BY_NAME_AND_SUBNET_URI

IdPoolsIpv4RangeFactsModule().run()
Expand All @@ -155,8 +138,8 @@ def test_should_get_id_pools_ipv4_range_from_subnet_and_name(self):
)

def test_should_get_id_pools_ipv4_range_from_uri(self):
self.resource.get.return_value = DEFAULT_RANGE_TEMPLATE.copy()

self.resource.get_by_uri().data = DEFAULT_RANGE_TEMPLATE.copy()
self.mock_ansible_module.params = PARAMS_GET_BY_URI

IdPoolsIpv4RangeFactsModule().run()
Expand All @@ -167,9 +150,8 @@ def test_should_get_id_pools_ipv4_range_from_uri(self):
)

def test_should_get_id_pools_ipv4_ranges_allocated_fragments(self):
self.resource.get.return_value = DEFAULT_RANGE_TEMPLATE.copy()
self.resource.get_by_uri().data = DEFAULT_RANGE_TEMPLATE.copy()
self.resource.get_allocated_fragments.return_value = [{'frag': 'test'}]

self.mock_ansible_module.params = PARAMS_GET_ALLOCATED_FRAGMENTS

IdPoolsIpv4RangeFactsModule().run()
Expand All @@ -181,9 +163,8 @@ def test_should_get_id_pools_ipv4_ranges_allocated_fragments(self):
)

def test_should_get_id_pools_ipv4_ranges_free_fragments(self):
self.resource.get.return_value = DEFAULT_RANGE_TEMPLATE.copy()
self.resource.get_by_uri().data = DEFAULT_RANGE_TEMPLATE.copy()
self.resource.get_free_fragments.return_value = [{'frag': 'testfree'}]

self.mock_ansible_module.params = PARAMS_GET_FREE_FRAGMENTS

IdPoolsIpv4RangeFactsModule().run()
Expand Down

0 comments on commit eb470dd

Please sign in to comment.