Remove hetzner content. (#1368)

This commit is contained in:
Felix Fontein 2020-11-24 06:34:23 +01:00 committed by GitHub
commit eab9a43d2e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 27 additions and 3192 deletions

View file

@ -1,268 +0,0 @@
# Copyright: (c) 2017 Ansible Project
# 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 copy
import json
import pytest
from mock import MagicMock
from ansible_collections.community.general.plugins.module_utils import hetzner
class ModuleFailException(Exception):
def __init__(self, msg, **kwargs):
super(ModuleFailException, self).__init__(msg)
self.fail_msg = msg
self.fail_kwargs = kwargs
def get_module_mock():
def f(msg, **kwargs):
raise ModuleFailException(msg, **kwargs)
module = MagicMock()
module.fail_json = f
module.from_json = json.loads
return module
# ########################################################################################
FETCH_URL_JSON_SUCCESS = [
(
(None, dict(
body=json.dumps(dict(
a='b'
)).encode('utf-8'),
)),
None,
(dict(
a='b'
), None)
),
(
(None, dict(
body=json.dumps(dict(
error=dict(
code="foo",
status=400,
message="bar",
),
a='b'
)).encode('utf-8'),
)),
['foo'],
(dict(
error=dict(
code="foo",
status=400,
message="bar",
),
a='b'
), 'foo')
),
]
FETCH_URL_JSON_FAIL = [
(
(None, dict(
body=json.dumps(dict(
error=dict(
code="foo",
status=400,
message="bar",
),
)).encode('utf-8'),
)),
None,
'Request failed: 400 foo (bar)'
),
(
(None, dict(
body=json.dumps(dict(
error=dict(
code="foo",
status=400,
message="bar",
),
)).encode('utf-8'),
)),
['bar'],
'Request failed: 400 foo (bar)'
),
]
@pytest.mark.parametrize("return_value, accept_errors, result", FETCH_URL_JSON_SUCCESS)
def test_fetch_url_json(monkeypatch, return_value, accept_errors, result):
module = get_module_mock()
hetzner.fetch_url = MagicMock(return_value=return_value)
assert hetzner.fetch_url_json(module, 'https://foo/bar', accept_errors=accept_errors) == result
@pytest.mark.parametrize("return_value, accept_errors, result", FETCH_URL_JSON_FAIL)
def test_fetch_url_json_fail(monkeypatch, return_value, accept_errors, result):
module = get_module_mock()
hetzner.fetch_url = MagicMock(return_value=return_value)
with pytest.raises(ModuleFailException) as exc:
hetzner.fetch_url_json(module, 'https://foo/bar', accept_errors=accept_errors)
assert exc.value.fail_msg == result
assert exc.value.fail_kwargs == dict()
# ########################################################################################
GET_FAILOVER_SUCCESS = [
(
'1.2.3.4',
(None, dict(
body=json.dumps(dict(
failover=dict(
active_server_ip='1.1.1.1',
ip='1.2.3.4',
netmask='255.255.255.255',
)
)).encode('utf-8'),
)),
'1.1.1.1',
dict(
active_server_ip='1.1.1.1',
ip='1.2.3.4',
netmask='255.255.255.255',
)
),
]
GET_FAILOVER_FAIL = [
(
'1.2.3.4',
(None, dict(
body=json.dumps(dict(
error=dict(
code="foo",
status=400,
message="bar",
),
)).encode('utf-8'),
)),
'Request failed: 400 foo (bar)'
),
]
@pytest.mark.parametrize("ip, return_value, result, record", GET_FAILOVER_SUCCESS)
def test_get_failover_record(monkeypatch, ip, return_value, result, record):
module = get_module_mock()
hetzner.fetch_url = MagicMock(return_value=copy.deepcopy(return_value))
assert hetzner.get_failover_record(module, ip) == record
@pytest.mark.parametrize("ip, return_value, result", GET_FAILOVER_FAIL)
def test_get_failover_record_fail(monkeypatch, ip, return_value, result):
module = get_module_mock()
hetzner.fetch_url = MagicMock(return_value=copy.deepcopy(return_value))
with pytest.raises(ModuleFailException) as exc:
hetzner.get_failover_record(module, ip)
assert exc.value.fail_msg == result
assert exc.value.fail_kwargs == dict()
@pytest.mark.parametrize("ip, return_value, result, record", GET_FAILOVER_SUCCESS)
def test_get_failover(monkeypatch, ip, return_value, result, record):
module = get_module_mock()
hetzner.fetch_url = MagicMock(return_value=copy.deepcopy(return_value))
assert hetzner.get_failover(module, ip) == result
@pytest.mark.parametrize("ip, return_value, result", GET_FAILOVER_FAIL)
def test_get_failover_fail(monkeypatch, ip, return_value, result):
module = get_module_mock()
hetzner.fetch_url = MagicMock(return_value=copy.deepcopy(return_value))
with pytest.raises(ModuleFailException) as exc:
hetzner.get_failover(module, ip)
assert exc.value.fail_msg == result
assert exc.value.fail_kwargs == dict()
# ########################################################################################
SET_FAILOVER_SUCCESS = [
(
'1.2.3.4',
'1.1.1.1',
(None, dict(
body=json.dumps(dict(
failover=dict(
active_server_ip='1.1.1.2',
)
)).encode('utf-8'),
)),
('1.1.1.2', True)
),
(
'1.2.3.4',
'1.1.1.1',
(None, dict(
body=json.dumps(dict(
error=dict(
code="FAILOVER_ALREADY_ROUTED",
status=400,
message="Failover already routed",
),
)).encode('utf-8'),
)),
('1.1.1.1', False)
),
]
SET_FAILOVER_FAIL = [
(
'1.2.3.4',
'1.1.1.1',
(None, dict(
body=json.dumps(dict(
error=dict(
code="foo",
status=400,
message="bar",
),
)).encode('utf-8'),
)),
'Request failed: 400 foo (bar)'
),
]
@pytest.mark.parametrize("ip, value, return_value, result", SET_FAILOVER_SUCCESS)
def test_set_failover(monkeypatch, ip, value, return_value, result):
module = get_module_mock()
hetzner.fetch_url = MagicMock(return_value=copy.deepcopy(return_value))
assert hetzner.set_failover(module, ip, value) == result
@pytest.mark.parametrize("ip, value, return_value, result", SET_FAILOVER_FAIL)
def test_set_failover_fail(monkeypatch, ip, value, return_value, result):
module = get_module_mock()
hetzner.fetch_url = MagicMock(return_value=copy.deepcopy(return_value))
with pytest.raises(ModuleFailException) as exc:
hetzner.set_failover(module, ip, value)
assert exc.value.fail_msg == result
assert exc.value.fail_kwargs == dict()

View file

@ -1,219 +0,0 @@
# (c) 2020 Felix Fontein <felix@fontein.de>
# 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
from ansible_collections.community.internal_test_tools.tests.unit.utils.fetch_url_module_framework import (
FetchUrlCall,
BaseTestModule,
)
from ansible_collections.community.general.plugins.module_utils.hetzner import BASE_URL
from ansible_collections.community.general.plugins.modules.net_tools import hetzner_failover_ip
class TestHetznerFailoverIP(BaseTestModule):
MOCK_ANSIBLE_MODULEUTILS_BASIC_ANSIBLEMODULE = 'ansible_collections.community.general.plugins.modules.net_tools.hetzner_failover_ip.AnsibleModule'
MOCK_ANSIBLE_MODULEUTILS_URLS_FETCH_URL = 'ansible_collections.community.general.plugins.module_utils.hetzner.fetch_url'
# Tests for state idempotence (routed and unrouted)
def test_unrouted(self, mocker):
result = self.run_module_success(mocker, hetzner_failover_ip, {
'hetzner_user': '',
'hetzner_password': '',
'failover_ip': '1.2.3.4',
'state': 'unrouted',
}, [
FetchUrlCall('GET', 200)
.result_json({
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': None,
},
})
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is False
assert result['value'] is None
assert result['state'] == 'unrouted'
def test_routed(self, mocker):
result = self.run_module_success(mocker, hetzner_failover_ip, {
'hetzner_user': '',
'hetzner_password': '',
'failover_ip': '1.2.3.4',
'state': 'routed',
'value': '4.3.2.1',
}, [
FetchUrlCall('GET', 200)
.result_json({
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': '4.3.2.1',
},
})
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is False
assert result['value'] == '4.3.2.1'
assert result['state'] == 'routed'
# Tests for changing state (unrouted to routed, vice versa)
def test_unrouted_to_routed(self, mocker):
result = self.run_module_success(mocker, hetzner_failover_ip, {
'hetzner_user': '',
'hetzner_password': '',
'failover_ip': '1.2.3.4',
'state': 'routed',
'value': '4.3.2.1',
}, [
FetchUrlCall('GET', 200)
.result_json({
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': None,
},
})
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
FetchUrlCall('POST', 200)
.result_json({
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': '4.3.2.1',
},
})
.expect_form_value('active_server_ip', '4.3.2.1')
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is True
assert result['value'] == '4.3.2.1'
assert result['state'] == 'routed'
def test_routed_to_unrouted(self, mocker):
result = self.run_module_success(mocker, hetzner_failover_ip, {
'hetzner_user': '',
'hetzner_password': '',
'failover_ip': '1.2.3.4',
'state': 'unrouted',
}, [
FetchUrlCall('GET', 200)
.result_json({
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': '4.3.2.1',
},
})
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
FetchUrlCall('DELETE', 200)
.result_json({
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': None,
},
})
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is True
assert result['value'] is None
assert result['state'] == 'unrouted'
# Tests for re-routing
def test_rerouting(self, mocker):
result = self.run_module_success(mocker, hetzner_failover_ip, {
'hetzner_user': '',
'hetzner_password': '',
'failover_ip': '1.2.3.4',
'state': 'routed',
'value': '4.3.2.1',
}, [
FetchUrlCall('GET', 200)
.result_json({
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': '5.4.3.2',
},
})
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
FetchUrlCall('POST', 200)
.result_json({
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': '4.3.2.1',
},
})
.expect_form_value('active_server_ip', '4.3.2.1')
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is True
assert result['value'] == '4.3.2.1'
assert result['state'] == 'routed'
def test_rerouting_already_routed(self, mocker):
result = self.run_module_success(mocker, hetzner_failover_ip, {
'hetzner_user': '',
'hetzner_password': '',
'failover_ip': '1.2.3.4',
'state': 'routed',
'value': '4.3.2.1',
}, [
FetchUrlCall('GET', 200)
.result_json({
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': '5.4.3.2',
},
})
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
FetchUrlCall('POST', 409)
.result_json({
'error': {
'status': 409,
'code': 'FAILOVER_ALREADY_ROUTED',
'message': 'Failover already routed',
},
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': '4.3.2.1',
},
})
.expect_form_value('active_server_ip', '4.3.2.1')
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is False
assert result['value'] == '4.3.2.1'
assert result['state'] == 'routed'

View file

@ -1,71 +0,0 @@
# (c) 2020 Felix Fontein <felix@fontein.de>
# 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
from ansible_collections.community.internal_test_tools.tests.unit.utils.fetch_url_module_framework import (
FetchUrlCall,
BaseTestModule,
)
from ansible_collections.community.general.plugins.module_utils.hetzner import BASE_URL
from ansible_collections.community.general.plugins.modules.net_tools import hetzner_failover_ip_info
class TestHetznerFailoverIPInfo(BaseTestModule):
MOCK_ANSIBLE_MODULEUTILS_BASIC_ANSIBLEMODULE = 'ansible_collections.community.general.plugins.modules.net_tools.hetzner_failover_ip_info.AnsibleModule'
MOCK_ANSIBLE_MODULEUTILS_URLS_FETCH_URL = 'ansible_collections.community.general.plugins.module_utils.hetzner.fetch_url'
# Tests for state (routed and unrouted)
def test_unrouted(self, mocker):
result = self.run_module_success(mocker, hetzner_failover_ip_info, {
'hetzner_user': '',
'hetzner_password': '',
'failover_ip': '1.2.3.4',
}, [
FetchUrlCall('GET', 200)
.result_json({
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': None,
},
})
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is False
assert result['value'] is None
assert result['state'] == 'unrouted'
assert result['failover_ip'] == '1.2.3.4'
assert result['server_ip'] == '2.3.4.5'
assert result['server_number'] == 2345
def test_routed(self, mocker):
result = self.run_module_success(mocker, hetzner_failover_ip_info, {
'hetzner_user': '',
'hetzner_password': '',
'failover_ip': '1.2.3.4',
}, [
FetchUrlCall('GET', 200)
.result_json({
'failover': {
'ip': '1.2.3.4',
'netmask': '255.255.255.255',
'server_ip': '2.3.4.5',
'server_number': 2345,
'active_server_ip': '4.3.2.1',
},
})
.expect_url('{0}/failover/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is False
assert result['value'] == '4.3.2.1'
assert result['state'] == 'routed'
assert result['failover_ip'] == '1.2.3.4'
assert result['server_ip'] == '2.3.4.5'
assert result['server_number'] == 2345

File diff suppressed because it is too large Load diff

View file

@ -1,240 +0,0 @@
# (c) 2019 Felix Fontein <felix@fontein.de>
# 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
from ansible_collections.community.internal_test_tools.tests.unit.utils.fetch_url_module_framework import (
FetchUrlCall,
BaseTestModule,
)
from ansible_collections.community.general.plugins.module_utils.hetzner import BASE_URL
from ansible_collections.community.general.plugins.modules.net_tools import hetzner_firewall_info
class TestHetznerFirewallInfo(BaseTestModule):
MOCK_ANSIBLE_MODULEUTILS_BASIC_ANSIBLEMODULE = 'ansible_collections.community.general.plugins.modules.net_tools.hetzner_firewall_info.AnsibleModule'
MOCK_ANSIBLE_MODULEUTILS_URLS_FETCH_URL = 'ansible_collections.community.general.plugins.module_utils.hetzner.fetch_url'
# Tests for state (absent and present)
def test_absent(self, mocker):
result = self.run_module_success(mocker, hetzner_firewall_info, {
'hetzner_user': '',
'hetzner_password': '',
'server_ip': '1.2.3.4',
}, [
FetchUrlCall('GET', 200)
.result_json({
'firewall': {
'server_ip': '1.2.3.4',
'server_number': 1,
'status': 'disabled',
'whitelist_hos': False,
'port': 'main',
'rules': {
'input': [],
},
},
})
.expect_url('{0}/firewall/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is False
assert result['firewall']['status'] == 'disabled'
assert result['firewall']['server_ip'] == '1.2.3.4'
assert result['firewall']['server_number'] == 1
def test_present(self, mocker):
result = self.run_module_success(mocker, hetzner_firewall_info, {
'hetzner_user': '',
'hetzner_password': '',
'server_ip': '1.2.3.4',
}, [
FetchUrlCall('GET', 200)
.result_json({
'firewall': {
'server_ip': '1.2.3.4',
'server_number': 1,
'status': 'active',
'whitelist_hos': False,
'port': 'main',
'rules': {
'input': [],
},
},
})
.expect_url('{0}/firewall/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is False
assert result['firewall']['status'] == 'active'
assert result['firewall']['server_ip'] == '1.2.3.4'
assert result['firewall']['server_number'] == 1
assert len(result['firewall']['rules']['input']) == 0
def test_present_w_rules(self, mocker):
result = self.run_module_success(mocker, hetzner_firewall_info, {
'hetzner_user': '',
'hetzner_password': '',
'server_ip': '1.2.3.4',
}, [
FetchUrlCall('GET', 200)
.result_json({
'firewall': {
'server_ip': '1.2.3.4',
'server_number': 1,
'status': 'active',
'whitelist_hos': False,
'port': 'main',
'rules': {
'input': [
{
'name': 'Accept HTTPS traffic',
'ip_version': 'ipv4',
'dst_ip': None,
'dst_port': '443',
'src_ip': None,
'src_port': None,
'protocol': 'tcp',
'tcp_flags': None,
'action': 'accept',
},
{
'name': None,
'ip_version': 'ipv4',
'dst_ip': None,
'dst_port': None,
'src_ip': None,
'src_port': None,
'protocol': None,
'tcp_flags': None,
'action': 'discard',
}
],
},
},
})
.expect_url('{0}/firewall/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is False
assert result['firewall']['status'] == 'active'
assert result['firewall']['server_ip'] == '1.2.3.4'
assert result['firewall']['server_number'] == 1
assert len(result['firewall']['rules']['input']) == 2
assert result['firewall']['rules']['input'][0]['name'] == 'Accept HTTPS traffic'
assert result['firewall']['rules']['input'][0]['dst_port'] == '443'
assert result['firewall']['rules']['input'][0]['action'] == 'accept'
assert result['firewall']['rules']['input'][1]['dst_port'] is None
assert result['firewall']['rules']['input'][1]['action'] == 'discard'
# Tests for wait_for_configured in getting status
def test_wait_get(self, mocker):
mocker.patch('time.sleep', lambda duration: None)
result = self.run_module_success(mocker, hetzner_firewall_info, {
'hetzner_user': '',
'hetzner_password': '',
'server_ip': '1.2.3.4',
'wait_for_configured': True,
}, [
FetchUrlCall('GET', 200)
.result_json({
'firewall': {
'server_ip': '1.2.3.4',
'server_number': 1,
'status': 'in process',
'whitelist_hos': False,
'port': 'main',
'rules': {
'input': [],
},
},
})
.expect_url('{0}/firewall/1.2.3.4'.format(BASE_URL)),
FetchUrlCall('GET', 200)
.result_json({
'firewall': {
'server_ip': '1.2.3.4',
'server_number': 1,
'status': 'active',
'whitelist_hos': False,
'port': 'main',
'rules': {
'input': [],
},
},
})
.expect_url('{0}/firewall/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is False
assert result['firewall']['status'] == 'active'
assert result['firewall']['server_ip'] == '1.2.3.4'
assert result['firewall']['server_number'] == 1
def test_wait_get_timeout(self, mocker):
mocker.patch('time.sleep', lambda duration: None)
result = self.run_module_failed(mocker, hetzner_firewall_info, {
'hetzner_user': '',
'hetzner_password': '',
'server_ip': '1.2.3.4',
'wait_for_configured': True,
'timeout': 0,
}, [
FetchUrlCall('GET', 200)
.result_json({
'firewall': {
'server_ip': '1.2.3.4',
'server_number': 1,
'status': 'in process',
'whitelist_hos': False,
'port': 'main',
'rules': {
'input': [],
},
},
})
.expect_url('{0}/firewall/1.2.3.4'.format(BASE_URL)),
FetchUrlCall('GET', 200)
.result_json({
'firewall': {
'server_ip': '1.2.3.4',
'server_number': 1,
'status': 'in process',
'whitelist_hos': False,
'port': 'main',
'rules': {
'input': [],
},
},
})
.expect_url('{0}/firewall/1.2.3.4'.format(BASE_URL)),
])
assert result['msg'] == 'Timeout while waiting for firewall to be configured.'
def test_nowait_get(self, mocker):
result = self.run_module_success(mocker, hetzner_firewall_info, {
'hetzner_user': '',
'hetzner_password': '',
'server_ip': '1.2.3.4',
'wait_for_configured': False,
}, [
FetchUrlCall('GET', 200)
.result_json({
'firewall': {
'server_ip': '1.2.3.4',
'server_number': 1,
'status': 'in process',
'whitelist_hos': False,
'port': 'main',
'rules': {
'input': [],
},
},
})
.expect_url('{0}/firewall/1.2.3.4'.format(BASE_URL)),
])
assert result['changed'] is False
assert result['firewall']['status'] == 'in process'
assert result['firewall']['server_ip'] == '1.2.3.4'
assert result['firewall']['server_number'] == 1