Refactors the bigip_sys_global module (#34438)

Changes include the current f5 coding standards and unit tests
for the module
This commit is contained in:
Tim Rupp 2018-01-03 20:39:08 -08:00 committed by GitHub
commit bdafb42156
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 425 additions and 206 deletions

View file

@ -0,0 +1,24 @@
{
"kind": "tm:sys:global-settings:global-settingsstate",
"selfLink": "https://localhost/mgmt/tm/sys/global-settings?ver=13.0.0",
"awsApiMaxConcurrency": 1,
"consoleInactivityTimeout": 0,
"customAddr": "none",
"failsafeAction": "go-offline-restart-tm",
"fileBlacklistPathPrefix": "{/shared/3dns/} {/shared/bin/} {/shared/core/} {/shared/datasync/} {/shared/em/} {/shared/GeoIP/} {/shared/images/} {/shared/lib/} {/shared/lib64/} {/shared/log/} {/shared/lost+found/} {/shared/mgmt/} {/shared/nfb/} {/shared/ssh/} {/shared/statsd/} {/shared/tmstat/} {/shared/vadc/} {/config/aaa/} {/config/big3d/} {/config/bigip/} {/config/filestore/} {/config/gtm/} {/config/httpd/} {/config/ntp.conf} {/config/rndc.key} {/config/ssh/} {/config/ssl/}",
"fileBlacklistReadOnlyPathPrefix": "{/etc/shadow}",
"fileLocalPathPrefix": "{/shared/} {/tmp/}",
"fileWhitelistPathPrefix": "{/var/local/scf} {/tmp/} {/shared/} {/config/} {/usr/share/aws/}",
"guiSecurityBanner": "enabled",
"guiSecurityBannerText": "Welcome to the BIG-IP Configuration Utility.\n\nLog in with your username and password using the fields on the left.",
"guiSetup": "disabled",
"hostAddrMode": "management",
"hostname": "bigip1",
"lcdDisplay": "enabled",
"ledLocator": "disabled",
"mgmtDhcp": "enabled",
"netReboot": "disabled",
"passwordPrompt": "Password",
"quietBoot": "enabled",
"usernamePrompt": "Username"
}

View file

@ -0,0 +1,131 @@
# -*- coding: utf-8 -*-
#
# Copyright (c) 2017 F5 Networks Inc.
# 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
import os
import json
import sys
from nose.plugins.skip import SkipTest
if sys.version_info < (2, 7):
raise SkipTest("F5 Ansible modules require Python >= 2.7")
from ansible.compat.tests import unittest
from ansible.compat.tests.mock import Mock
from ansible.compat.tests.mock import patch
from ansible.module_utils.f5_utils import AnsibleF5Client
try:
from library.bigip_sys_global import ApiParameters
from library.bigip_sys_global import ModuleParameters
from library.bigip_sys_global import ModuleManager
from library.bigip_sys_global import ArgumentSpec
from ansible.module_utils.f5_utils import iControlUnexpectedHTTPError
from test.unit.modules.utils import set_module_args
except ImportError:
try:
from ansible.modules.network.f5.bigip_sys_global import ApiParameters
from ansible.modules.network.f5.bigip_sys_global import ModuleParameters
from ansible.modules.network.f5.bigip_sys_global import ModuleManager
from ansible.modules.network.f5.bigip_sys_global import ArgumentSpec
from ansible.module_utils.f5_utils import iControlUnexpectedHTTPError
from units.modules.utils import set_module_args
except ImportError:
raise SkipTest("F5 Ansible modules require the f5-sdk Python library")
fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
fixture_data = {}
def load_fixture(name):
path = os.path.join(fixture_path, name)
if path in fixture_data:
return fixture_data[path]
with open(path) as f:
data = f.read()
try:
data = json.loads(data)
except Exception:
pass
fixture_data[path] = data
return data
class TestParameters(unittest.TestCase):
def test_module_parameters(self):
args = dict(
banner_text='this is a banner',
console_timeout=100,
gui_setup='yes',
lcd_display='yes',
mgmt_dhcp='yes',
net_reboot='yes',
quiet_boot='yes',
security_banner='yes',
)
p = ModuleParameters(args)
assert p.banner_text == 'this is a banner'
assert p.console_timeout == 100
assert p.gui_setup == 'enabled'
assert p.lcd_display == 'enabled'
assert p.mgmt_dhcp == 'enabled'
assert p.net_reboot == 'enabled'
assert p.quiet_boot == 'enabled'
assert p.security_banner == 'enabled'
def test_api_parameters(self):
args = load_fixture('load_sys_global_settings.json')
p = ApiParameters(args)
assert 'Welcome to the BIG-IP Configuration Utility' in p.banner_text
assert p.console_timeout == 0
assert p.gui_setup == 'disabled'
assert p.lcd_display == 'enabled'
assert p.mgmt_dhcp == 'enabled'
assert p.net_reboot == 'disabled'
assert p.quiet_boot == 'enabled'
assert p.security_banner == 'enabled'
@patch('ansible.module_utils.f5_utils.AnsibleF5Client._get_mgmt_root',
return_value=True)
class TestManager(unittest.TestCase):
def setUp(self):
self.spec = ArgumentSpec()
def test_update(self, *args):
set_module_args(dict(
banner_text='this is a banner',
console_timeout=100,
password='admin',
server='localhost',
user='admin',
state='present'
))
# Configure the parameters that would be returned by querying the
# remote device
current = ApiParameters(load_fixture('load_sys_global_settings.json'))
client = AnsibleF5Client(
argument_spec=self.spec.argument_spec,
supports_check_mode=self.spec.supports_check_mode,
f5_product_name=self.spec.f5_product_name
)
mm = ModuleManager(client)
# Override methods to force specific logic in the module to happen
mm.exists = Mock(return_value=False)
mm.read_current_from_device = Mock(return_value=current)
mm.update_on_device = Mock(return_value=True)
results = mm.exec_module()
assert results['changed'] is True