ios_facts: Report space of file systems (#41850)

* ios_facts: Report file system space

Parse total and free space from dir output. For this, add a hash
filesystems_info containing the keys spacetotal_kb and spacefree_kb.

* ios_facts: Add unit test for file system space reporting

* ios_facts: Add integration test for file system space reporting
pull/42514/head
Paul Neumann 6 years ago committed by Nathaniel Case
parent dbb58b34c3
commit dfb2b3fdd5

@ -105,6 +105,10 @@ ansible_net_filesystems:
description: All file system names available on the device description: All file system names available on the device
returned: when hardware is configured returned: when hardware is configured
type: list type: list
ansible_net_filesystems_info:
description: A hash of all file systems containing info about each file system (e.g. free and total space)
returned: when hardware is configured
type: dict
ansible_net_memfree_mb: ansible_net_memfree_mb:
description: The available free memory on the remote device in Mb description: The available free memory on the remote device in Mb
returned: when hardware is configured returned: when hardware is configured
@ -225,6 +229,7 @@ class Hardware(FactsBase):
data = self.responses[0] data = self.responses[0]
if data: if data:
self.facts['filesystems'] = self.parse_filesystems(data) self.facts['filesystems'] = self.parse_filesystems(data)
self.facts['filesystems_info'] = self.parse_filesystems_info(data)
data = self.responses[1] data = self.responses[1]
if data: if data:
@ -241,6 +246,21 @@ class Hardware(FactsBase):
def parse_filesystems(self, data): def parse_filesystems(self, data):
return re.findall(r'^Directory of (\S+)/', data, re.M) return re.findall(r'^Directory of (\S+)/', data, re.M)
def parse_filesystems_info(self, data):
facts = dict()
fs = ''
for line in data.split('\n'):
match = re.match(r'^Directory of (\S+)/', line)
if match:
fs = match.group(1)
facts[fs] = dict()
continue
match = re.match(r'^(\d+) bytes total \((\d+) bytes free\)', line)
if match:
facts[fs]['spacetotal_kb'] = int(match.group(1)) / 1024
facts[fs]['spacefree_kb'] = int(match.group(2)) / 1024
return facts
class Config(FactsBase): class Config(FactsBase):

@ -28,4 +28,8 @@
- "result.ansible_facts.ansible_net_memfree_mb > 1" - "result.ansible_facts.ansible_net_memfree_mb > 1"
- "result.ansible_facts.ansible_net_memtotal_mb > 1" - "result.ansible_facts.ansible_net_memtotal_mb > 1"
- assert:
that: "{{ item.value.spacetotal_kb }} > {{ item.value.spacefree_kb }}"
loop: "{{ lookup('dict', result.ansible_facts.ansible_net_filesystems_info, wantlist=True) }}"
- debug: msg="END cli/all_facts.yaml on connection={{ ansible_connection }}" - debug: msg="END cli/all_facts.yaml on connection={{ ansible_connection }}"

@ -28,4 +28,8 @@
# ... and not present # ... and not present
- "result.ansible_facts.ansible_net_config is not defined" # config - "result.ansible_facts.ansible_net_config is not defined" # config
- assert:
that: "{{ item.value.spacetotal_kb }} > {{ item.value.spacefree_kb }}"
loop: "{{ lookup('dict', result.ansible_facts.ansible_net_filesystems_info, wantlist=True) }}"
- debug: msg="END cli/default.yaml on connection={{ ansible_connection }}" - debug: msg="END cli/default.yaml on connection={{ ansible_connection }}"

@ -26,5 +26,6 @@
- "result.ansible_facts.ansible_net_interfaces | length > 1" # more than one interface returned - "result.ansible_facts.ansible_net_interfaces | length > 1" # more than one interface returned
# ... and not present # ... and not present
- "result.ansible_facts.ansible_net_filesystems is not defined" - "result.ansible_facts.ansible_net_filesystems is not defined"
- "result.ansible_facts.ansible_net_filesystems_info is not defined"
- debug: msg="END cli/not_hardware_facts.yaml on connection={{ ansible_connection }}" - debug: msg="END cli/not_hardware_facts.yaml on connection={{ ansible_connection }}"

@ -0,0 +1,23 @@
Directory of bootflash:/
11 drwx 16384 Jun 1 2017 13:03:27 +00:00 lost+found
325121 drwx 4096 Jun 1 2017 13:03:54 +00:00 .super.iso.dir
12 -rw- 31 Jun 22 2018 15:17:06 +00:00 .CsrLxc_LastInstall
13 -rw- 69 Jun 1 2017 13:05:53 +00:00 virtual-instance.conf
438913 drwx 4096 Jun 1 2017 13:04:57 +00:00 core
15 -rw- 125736960 Jun 1 2017 13:03:54 +00:00 iosxe-remote-mgmt.16.03.04.ova
105667 -rw- 292164568 Jun 1 2017 13:04:04 +00:00 csr1000v-mono-universalk9.16.03.04.SPA.pkg
105668 -rw- 34370768 Jun 1 2017 13:04:10 +00:00 csr1000v-rpboot.16.03.04.SPA.pkg
105666 -rw- 5317 Jun 1 2017 13:04:10 +00:00 packages.conf
195073 drwx 4096 Jun 1 2017 13:04:51 +00:00 .prst_sync
414529 drwx 4096 Jun 1 2017 13:04:57 +00:00 .rollback_timer
16 -rw- 0 Jun 1 2017 13:05:00 +00:00 tracelogs.kZn
16257 drwx 24576 Jun 22 2018 16:03:11 +00:00 tracelogs
349505 drwx 4096 Jun 1 2017 13:05:08 +00:00 .installer
292609 drwx 4096 Jun 1 2017 13:05:59 +00:00 virtual-instance
17 -rw- 30 Jun 22 2018 15:17:59 +00:00 throughput_monitor_params
48769 drwx 4096 Jun 1 2017 13:06:04 +00:00 onep
19 -rw- 376 Jun 22 2018 15:18:11 +00:00 csrlxc-cfg.log
20 -rw- 0 Jun 22 2018 15:17:59 +00:00 cvac.log
7897796608 bytes total (6608056320 bytes free)

@ -77,3 +77,13 @@ class TestIosFactsModule(TestIosModule):
self.assertIsNone( self.assertIsNone(
result['ansible_facts']['ansible_net_interfaces']['Tunnel1110']['macaddress'] result['ansible_facts']['ansible_net_interfaces']['Tunnel1110']['macaddress']
) )
def test_ios_facts_filesystems_info(self):
set_module_args(dict(gather_subset='hardware'))
result = self.execute_module()
self.assertEqual(
result['ansible_facts']['ansible_net_filesystems_info']['bootflash:']['spacetotal_kb'], 7712692.0
)
self.assertEqual(
result['ansible_facts']['ansible_net_filesystems_info']['bootflash:']['spacefree_kb'], 6453180.0
)

Loading…
Cancel
Save