Facts: Use vm_stat instead of sysctl for free memory (#52917)
Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
This commit is contained in:
parent
7ab77f6c8a
commit
014cb73694
2 changed files with 34 additions and 6 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
minor_changes:
|
||||||
|
- Add better parsing for gathering facts about free memory in Mac OS (https://github.com/ansible/ansible/pull/52917).
|
|
@ -17,8 +17,8 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
|
from ansible.module_utils.common.process import get_bin_path
|
||||||
from ansible.module_utils.facts.hardware.base import Hardware, HardwareCollector
|
from ansible.module_utils.facts.hardware.base import Hardware, HardwareCollector
|
||||||
|
|
||||||
from ansible.module_utils.facts.sysctl import get_sysctl
|
from ansible.module_utils.facts.sysctl import get_sysctl
|
||||||
|
|
||||||
|
|
||||||
|
@ -84,13 +84,39 @@ class DarwinHardware(Hardware):
|
||||||
return cpu_facts
|
return cpu_facts
|
||||||
|
|
||||||
def get_memory_facts(self):
|
def get_memory_facts(self):
|
||||||
memory_facts = {}
|
memory_facts = {
|
||||||
|
'memtotal_mb': int(self.sysctl['hw.memsize']) // 1024 // 1024
|
||||||
|
}
|
||||||
|
|
||||||
memory_facts['memtotal_mb'] = int(self.sysctl['hw.memsize']) // 1024 // 1024
|
total_used = 0
|
||||||
|
page_size = 4096
|
||||||
rc, out, err = self.module.run_command("sysctl hw.usermem")
|
vm_stat_command = get_bin_path('vm_stat')
|
||||||
|
rc, out, err = self.module.run_command(vm_stat_command)
|
||||||
if rc == 0:
|
if rc == 0:
|
||||||
memory_facts['memfree_mb'] = int(out.splitlines()[-1].split()[1]) // 1024 // 1024
|
# Free = Total - (Wired + active + inactive)
|
||||||
|
# Get a generator of tuples from the command output so we can later
|
||||||
|
# turn it into a dictionary
|
||||||
|
memory_stats = (line.rstrip('.').split(':', 1) for line in out.splitlines())
|
||||||
|
|
||||||
|
# Strip extra left spaces from the value
|
||||||
|
memory_stats = dict((k, v.lstrip()) for k, v in memory_stats)
|
||||||
|
|
||||||
|
for k, v in memory_stats.items():
|
||||||
|
try:
|
||||||
|
memory_stats[k] = int(v)
|
||||||
|
except ValueError as ve:
|
||||||
|
# Most values convert cleanly to integer values but if the field does
|
||||||
|
# not convert to an integer, just leave it alone.
|
||||||
|
pass
|
||||||
|
|
||||||
|
if memory_stats.get('Pages wired down'):
|
||||||
|
total_used += memory_stats['Pages wired down'] * page_size
|
||||||
|
if memory_stats.get('Pages active'):
|
||||||
|
total_used += memory_stats['Pages active'] * page_size
|
||||||
|
if memory_stats.get('Pages inactive'):
|
||||||
|
total_used += memory_stats['Pages inactive'] * page_size
|
||||||
|
|
||||||
|
memory_facts['memfree_mb'] = memory_facts['memtotal_mb'] - (total_used // 1024 // 1024)
|
||||||
|
|
||||||
return memory_facts
|
return memory_facts
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue