mirror of https://github.com/ansible/ansible.git
FortiOS modules for 2.9 - 10 (#61367)
* FortiOS modules for 2.9 - 10 * Fortios User Device was wrongly set to 2.8 instead of 2.9 * Retriggering shippable due to random failurepull/61387/head
parent
d29aaffb16
commit
5e4e32b45e
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,209 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_user_adgrp
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_user_adgrp.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_adgrp_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_adgrp': {
|
||||||
|
'name': 'default_name_3',
|
||||||
|
'server_name': 'test_value_4'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_adgrp.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'name': 'default_name_3',
|
||||||
|
'server-name': 'test_value_4'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'adgrp', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_adgrp_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_adgrp': {
|
||||||
|
'name': 'default_name_3',
|
||||||
|
'server_name': 'test_value_4'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_adgrp.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'name': 'default_name_3',
|
||||||
|
'server-name': 'test_value_4'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'adgrp', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_adgrp_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'user_adgrp': {
|
||||||
|
'name': 'default_name_3',
|
||||||
|
'server_name': 'test_value_4'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_adgrp.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('user', 'adgrp', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_adgrp_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'user_adgrp': {
|
||||||
|
'name': 'default_name_3',
|
||||||
|
'server_name': 'test_value_4'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_adgrp.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('user', 'adgrp', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_adgrp_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_adgrp': {
|
||||||
|
'name': 'default_name_3',
|
||||||
|
'server_name': 'test_value_4'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_adgrp.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'name': 'default_name_3',
|
||||||
|
'server-name': 'test_value_4'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'adgrp', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_adgrp_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_adgrp': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'name': 'default_name_3',
|
||||||
|
'server_name': 'test_value_4'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_adgrp.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'name': 'default_name_3',
|
||||||
|
'server-name': 'test_value_4'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'adgrp', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,539 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_user_radius
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_user_radius.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_radius_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_radius': {'acct_all_servers': 'enable',
|
||||||
|
'acct_interim_interval': '4',
|
||||||
|
'all_usergroup': 'disable',
|
||||||
|
'auth_type': 'auto',
|
||||||
|
'h3c_compatibility': 'enable',
|
||||||
|
'name': 'default_name_8',
|
||||||
|
'nas_ip': 'test_value_9',
|
||||||
|
'password_encoding': 'auto',
|
||||||
|
'password_renewal': 'enable',
|
||||||
|
'radius_coa': 'enable',
|
||||||
|
'radius_port': '13',
|
||||||
|
'rsso': 'enable',
|
||||||
|
'rsso_context_timeout': '15',
|
||||||
|
'rsso_endpoint_attribute': 'User-Name',
|
||||||
|
'rsso_endpoint_block_attribute': 'User-Name',
|
||||||
|
'rsso_ep_one_ip_only': 'enable',
|
||||||
|
'rsso_flush_ip_session': 'enable',
|
||||||
|
'rsso_log_flags': 'protocol-error',
|
||||||
|
'rsso_log_period': '21',
|
||||||
|
'rsso_radius_response': 'enable',
|
||||||
|
'rsso_radius_server_port': '23',
|
||||||
|
'rsso_secret': 'test_value_24',
|
||||||
|
'rsso_validate_request_secret': 'enable',
|
||||||
|
'secondary_secret': 'test_value_26',
|
||||||
|
'secondary_server': 'test_value_27',
|
||||||
|
'secret': 'test_value_28',
|
||||||
|
'server': '192.168.100.29',
|
||||||
|
'source_ip': '84.230.14.30',
|
||||||
|
'sso_attribute': 'User-Name',
|
||||||
|
'sso_attribute_key': 'test_value_32',
|
||||||
|
'sso_attribute_value_override': 'enable',
|
||||||
|
'tertiary_secret': 'test_value_34',
|
||||||
|
'tertiary_server': 'test_value_35',
|
||||||
|
'timeout': '36',
|
||||||
|
'use_management_vdom': 'enable',
|
||||||
|
'username_case_sensitive': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_radius.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'acct-all-servers': 'enable',
|
||||||
|
'acct-interim-interval': '4',
|
||||||
|
'all-usergroup': 'disable',
|
||||||
|
'auth-type': 'auto',
|
||||||
|
'h3c-compatibility': 'enable',
|
||||||
|
'name': 'default_name_8',
|
||||||
|
'nas-ip': 'test_value_9',
|
||||||
|
'password-encoding': 'auto',
|
||||||
|
'password-renewal': 'enable',
|
||||||
|
'radius-coa': 'enable',
|
||||||
|
'radius-port': '13',
|
||||||
|
'rsso': 'enable',
|
||||||
|
'rsso-context-timeout': '15',
|
||||||
|
'rsso-endpoint-attribute': 'User-Name',
|
||||||
|
'rsso-endpoint-block-attribute': 'User-Name',
|
||||||
|
'rsso-ep-one-ip-only': 'enable',
|
||||||
|
'rsso-flush-ip-session': 'enable',
|
||||||
|
'rsso-log-flags': 'protocol-error',
|
||||||
|
'rsso-log-period': '21',
|
||||||
|
'rsso-radius-response': 'enable',
|
||||||
|
'rsso-radius-server-port': '23',
|
||||||
|
'rsso-secret': 'test_value_24',
|
||||||
|
'rsso-validate-request-secret': 'enable',
|
||||||
|
'secondary-secret': 'test_value_26',
|
||||||
|
'secondary-server': 'test_value_27',
|
||||||
|
'secret': 'test_value_28',
|
||||||
|
'server': '192.168.100.29',
|
||||||
|
'source-ip': '84.230.14.30',
|
||||||
|
'sso-attribute': 'User-Name',
|
||||||
|
'sso-attribute-key': 'test_value_32',
|
||||||
|
'sso-attribute-value-override': 'enable',
|
||||||
|
'tertiary-secret': 'test_value_34',
|
||||||
|
'tertiary-server': 'test_value_35',
|
||||||
|
'timeout': '36',
|
||||||
|
'use-management-vdom': 'enable',
|
||||||
|
'username-case-sensitive': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'radius', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_radius_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_radius': {'acct_all_servers': 'enable',
|
||||||
|
'acct_interim_interval': '4',
|
||||||
|
'all_usergroup': 'disable',
|
||||||
|
'auth_type': 'auto',
|
||||||
|
'h3c_compatibility': 'enable',
|
||||||
|
'name': 'default_name_8',
|
||||||
|
'nas_ip': 'test_value_9',
|
||||||
|
'password_encoding': 'auto',
|
||||||
|
'password_renewal': 'enable',
|
||||||
|
'radius_coa': 'enable',
|
||||||
|
'radius_port': '13',
|
||||||
|
'rsso': 'enable',
|
||||||
|
'rsso_context_timeout': '15',
|
||||||
|
'rsso_endpoint_attribute': 'User-Name',
|
||||||
|
'rsso_endpoint_block_attribute': 'User-Name',
|
||||||
|
'rsso_ep_one_ip_only': 'enable',
|
||||||
|
'rsso_flush_ip_session': 'enable',
|
||||||
|
'rsso_log_flags': 'protocol-error',
|
||||||
|
'rsso_log_period': '21',
|
||||||
|
'rsso_radius_response': 'enable',
|
||||||
|
'rsso_radius_server_port': '23',
|
||||||
|
'rsso_secret': 'test_value_24',
|
||||||
|
'rsso_validate_request_secret': 'enable',
|
||||||
|
'secondary_secret': 'test_value_26',
|
||||||
|
'secondary_server': 'test_value_27',
|
||||||
|
'secret': 'test_value_28',
|
||||||
|
'server': '192.168.100.29',
|
||||||
|
'source_ip': '84.230.14.30',
|
||||||
|
'sso_attribute': 'User-Name',
|
||||||
|
'sso_attribute_key': 'test_value_32',
|
||||||
|
'sso_attribute_value_override': 'enable',
|
||||||
|
'tertiary_secret': 'test_value_34',
|
||||||
|
'tertiary_server': 'test_value_35',
|
||||||
|
'timeout': '36',
|
||||||
|
'use_management_vdom': 'enable',
|
||||||
|
'username_case_sensitive': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_radius.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'acct-all-servers': 'enable',
|
||||||
|
'acct-interim-interval': '4',
|
||||||
|
'all-usergroup': 'disable',
|
||||||
|
'auth-type': 'auto',
|
||||||
|
'h3c-compatibility': 'enable',
|
||||||
|
'name': 'default_name_8',
|
||||||
|
'nas-ip': 'test_value_9',
|
||||||
|
'password-encoding': 'auto',
|
||||||
|
'password-renewal': 'enable',
|
||||||
|
'radius-coa': 'enable',
|
||||||
|
'radius-port': '13',
|
||||||
|
'rsso': 'enable',
|
||||||
|
'rsso-context-timeout': '15',
|
||||||
|
'rsso-endpoint-attribute': 'User-Name',
|
||||||
|
'rsso-endpoint-block-attribute': 'User-Name',
|
||||||
|
'rsso-ep-one-ip-only': 'enable',
|
||||||
|
'rsso-flush-ip-session': 'enable',
|
||||||
|
'rsso-log-flags': 'protocol-error',
|
||||||
|
'rsso-log-period': '21',
|
||||||
|
'rsso-radius-response': 'enable',
|
||||||
|
'rsso-radius-server-port': '23',
|
||||||
|
'rsso-secret': 'test_value_24',
|
||||||
|
'rsso-validate-request-secret': 'enable',
|
||||||
|
'secondary-secret': 'test_value_26',
|
||||||
|
'secondary-server': 'test_value_27',
|
||||||
|
'secret': 'test_value_28',
|
||||||
|
'server': '192.168.100.29',
|
||||||
|
'source-ip': '84.230.14.30',
|
||||||
|
'sso-attribute': 'User-Name',
|
||||||
|
'sso-attribute-key': 'test_value_32',
|
||||||
|
'sso-attribute-value-override': 'enable',
|
||||||
|
'tertiary-secret': 'test_value_34',
|
||||||
|
'tertiary-server': 'test_value_35',
|
||||||
|
'timeout': '36',
|
||||||
|
'use-management-vdom': 'enable',
|
||||||
|
'username-case-sensitive': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'radius', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_radius_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'user_radius': {'acct_all_servers': 'enable',
|
||||||
|
'acct_interim_interval': '4',
|
||||||
|
'all_usergroup': 'disable',
|
||||||
|
'auth_type': 'auto',
|
||||||
|
'h3c_compatibility': 'enable',
|
||||||
|
'name': 'default_name_8',
|
||||||
|
'nas_ip': 'test_value_9',
|
||||||
|
'password_encoding': 'auto',
|
||||||
|
'password_renewal': 'enable',
|
||||||
|
'radius_coa': 'enable',
|
||||||
|
'radius_port': '13',
|
||||||
|
'rsso': 'enable',
|
||||||
|
'rsso_context_timeout': '15',
|
||||||
|
'rsso_endpoint_attribute': 'User-Name',
|
||||||
|
'rsso_endpoint_block_attribute': 'User-Name',
|
||||||
|
'rsso_ep_one_ip_only': 'enable',
|
||||||
|
'rsso_flush_ip_session': 'enable',
|
||||||
|
'rsso_log_flags': 'protocol-error',
|
||||||
|
'rsso_log_period': '21',
|
||||||
|
'rsso_radius_response': 'enable',
|
||||||
|
'rsso_radius_server_port': '23',
|
||||||
|
'rsso_secret': 'test_value_24',
|
||||||
|
'rsso_validate_request_secret': 'enable',
|
||||||
|
'secondary_secret': 'test_value_26',
|
||||||
|
'secondary_server': 'test_value_27',
|
||||||
|
'secret': 'test_value_28',
|
||||||
|
'server': '192.168.100.29',
|
||||||
|
'source_ip': '84.230.14.30',
|
||||||
|
'sso_attribute': 'User-Name',
|
||||||
|
'sso_attribute_key': 'test_value_32',
|
||||||
|
'sso_attribute_value_override': 'enable',
|
||||||
|
'tertiary_secret': 'test_value_34',
|
||||||
|
'tertiary_server': 'test_value_35',
|
||||||
|
'timeout': '36',
|
||||||
|
'use_management_vdom': 'enable',
|
||||||
|
'username_case_sensitive': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_radius.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('user', 'radius', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_radius_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'user_radius': {'acct_all_servers': 'enable',
|
||||||
|
'acct_interim_interval': '4',
|
||||||
|
'all_usergroup': 'disable',
|
||||||
|
'auth_type': 'auto',
|
||||||
|
'h3c_compatibility': 'enable',
|
||||||
|
'name': 'default_name_8',
|
||||||
|
'nas_ip': 'test_value_9',
|
||||||
|
'password_encoding': 'auto',
|
||||||
|
'password_renewal': 'enable',
|
||||||
|
'radius_coa': 'enable',
|
||||||
|
'radius_port': '13',
|
||||||
|
'rsso': 'enable',
|
||||||
|
'rsso_context_timeout': '15',
|
||||||
|
'rsso_endpoint_attribute': 'User-Name',
|
||||||
|
'rsso_endpoint_block_attribute': 'User-Name',
|
||||||
|
'rsso_ep_one_ip_only': 'enable',
|
||||||
|
'rsso_flush_ip_session': 'enable',
|
||||||
|
'rsso_log_flags': 'protocol-error',
|
||||||
|
'rsso_log_period': '21',
|
||||||
|
'rsso_radius_response': 'enable',
|
||||||
|
'rsso_radius_server_port': '23',
|
||||||
|
'rsso_secret': 'test_value_24',
|
||||||
|
'rsso_validate_request_secret': 'enable',
|
||||||
|
'secondary_secret': 'test_value_26',
|
||||||
|
'secondary_server': 'test_value_27',
|
||||||
|
'secret': 'test_value_28',
|
||||||
|
'server': '192.168.100.29',
|
||||||
|
'source_ip': '84.230.14.30',
|
||||||
|
'sso_attribute': 'User-Name',
|
||||||
|
'sso_attribute_key': 'test_value_32',
|
||||||
|
'sso_attribute_value_override': 'enable',
|
||||||
|
'tertiary_secret': 'test_value_34',
|
||||||
|
'tertiary_server': 'test_value_35',
|
||||||
|
'timeout': '36',
|
||||||
|
'use_management_vdom': 'enable',
|
||||||
|
'username_case_sensitive': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_radius.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('user', 'radius', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_radius_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_radius': {'acct_all_servers': 'enable',
|
||||||
|
'acct_interim_interval': '4',
|
||||||
|
'all_usergroup': 'disable',
|
||||||
|
'auth_type': 'auto',
|
||||||
|
'h3c_compatibility': 'enable',
|
||||||
|
'name': 'default_name_8',
|
||||||
|
'nas_ip': 'test_value_9',
|
||||||
|
'password_encoding': 'auto',
|
||||||
|
'password_renewal': 'enable',
|
||||||
|
'radius_coa': 'enable',
|
||||||
|
'radius_port': '13',
|
||||||
|
'rsso': 'enable',
|
||||||
|
'rsso_context_timeout': '15',
|
||||||
|
'rsso_endpoint_attribute': 'User-Name',
|
||||||
|
'rsso_endpoint_block_attribute': 'User-Name',
|
||||||
|
'rsso_ep_one_ip_only': 'enable',
|
||||||
|
'rsso_flush_ip_session': 'enable',
|
||||||
|
'rsso_log_flags': 'protocol-error',
|
||||||
|
'rsso_log_period': '21',
|
||||||
|
'rsso_radius_response': 'enable',
|
||||||
|
'rsso_radius_server_port': '23',
|
||||||
|
'rsso_secret': 'test_value_24',
|
||||||
|
'rsso_validate_request_secret': 'enable',
|
||||||
|
'secondary_secret': 'test_value_26',
|
||||||
|
'secondary_server': 'test_value_27',
|
||||||
|
'secret': 'test_value_28',
|
||||||
|
'server': '192.168.100.29',
|
||||||
|
'source_ip': '84.230.14.30',
|
||||||
|
'sso_attribute': 'User-Name',
|
||||||
|
'sso_attribute_key': 'test_value_32',
|
||||||
|
'sso_attribute_value_override': 'enable',
|
||||||
|
'tertiary_secret': 'test_value_34',
|
||||||
|
'tertiary_server': 'test_value_35',
|
||||||
|
'timeout': '36',
|
||||||
|
'use_management_vdom': 'enable',
|
||||||
|
'username_case_sensitive': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_radius.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'acct-all-servers': 'enable',
|
||||||
|
'acct-interim-interval': '4',
|
||||||
|
'all-usergroup': 'disable',
|
||||||
|
'auth-type': 'auto',
|
||||||
|
'h3c-compatibility': 'enable',
|
||||||
|
'name': 'default_name_8',
|
||||||
|
'nas-ip': 'test_value_9',
|
||||||
|
'password-encoding': 'auto',
|
||||||
|
'password-renewal': 'enable',
|
||||||
|
'radius-coa': 'enable',
|
||||||
|
'radius-port': '13',
|
||||||
|
'rsso': 'enable',
|
||||||
|
'rsso-context-timeout': '15',
|
||||||
|
'rsso-endpoint-attribute': 'User-Name',
|
||||||
|
'rsso-endpoint-block-attribute': 'User-Name',
|
||||||
|
'rsso-ep-one-ip-only': 'enable',
|
||||||
|
'rsso-flush-ip-session': 'enable',
|
||||||
|
'rsso-log-flags': 'protocol-error',
|
||||||
|
'rsso-log-period': '21',
|
||||||
|
'rsso-radius-response': 'enable',
|
||||||
|
'rsso-radius-server-port': '23',
|
||||||
|
'rsso-secret': 'test_value_24',
|
||||||
|
'rsso-validate-request-secret': 'enable',
|
||||||
|
'secondary-secret': 'test_value_26',
|
||||||
|
'secondary-server': 'test_value_27',
|
||||||
|
'secret': 'test_value_28',
|
||||||
|
'server': '192.168.100.29',
|
||||||
|
'source-ip': '84.230.14.30',
|
||||||
|
'sso-attribute': 'User-Name',
|
||||||
|
'sso-attribute-key': 'test_value_32',
|
||||||
|
'sso-attribute-value-override': 'enable',
|
||||||
|
'tertiary-secret': 'test_value_34',
|
||||||
|
'tertiary-server': 'test_value_35',
|
||||||
|
'timeout': '36',
|
||||||
|
'use-management-vdom': 'enable',
|
||||||
|
'username-case-sensitive': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'radius', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_radius_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_radius': {
|
||||||
|
'random_attribute_not_valid': 'tag', 'acct_all_servers': 'enable',
|
||||||
|
'acct_interim_interval': '4',
|
||||||
|
'all_usergroup': 'disable',
|
||||||
|
'auth_type': 'auto',
|
||||||
|
'h3c_compatibility': 'enable',
|
||||||
|
'name': 'default_name_8',
|
||||||
|
'nas_ip': 'test_value_9',
|
||||||
|
'password_encoding': 'auto',
|
||||||
|
'password_renewal': 'enable',
|
||||||
|
'radius_coa': 'enable',
|
||||||
|
'radius_port': '13',
|
||||||
|
'rsso': 'enable',
|
||||||
|
'rsso_context_timeout': '15',
|
||||||
|
'rsso_endpoint_attribute': 'User-Name',
|
||||||
|
'rsso_endpoint_block_attribute': 'User-Name',
|
||||||
|
'rsso_ep_one_ip_only': 'enable',
|
||||||
|
'rsso_flush_ip_session': 'enable',
|
||||||
|
'rsso_log_flags': 'protocol-error',
|
||||||
|
'rsso_log_period': '21',
|
||||||
|
'rsso_radius_response': 'enable',
|
||||||
|
'rsso_radius_server_port': '23',
|
||||||
|
'rsso_secret': 'test_value_24',
|
||||||
|
'rsso_validate_request_secret': 'enable',
|
||||||
|
'secondary_secret': 'test_value_26',
|
||||||
|
'secondary_server': 'test_value_27',
|
||||||
|
'secret': 'test_value_28',
|
||||||
|
'server': '192.168.100.29',
|
||||||
|
'source_ip': '84.230.14.30',
|
||||||
|
'sso_attribute': 'User-Name',
|
||||||
|
'sso_attribute_key': 'test_value_32',
|
||||||
|
'sso_attribute_value_override': 'enable',
|
||||||
|
'tertiary_secret': 'test_value_34',
|
||||||
|
'tertiary_server': 'test_value_35',
|
||||||
|
'timeout': '36',
|
||||||
|
'use_management_vdom': 'enable',
|
||||||
|
'username_case_sensitive': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_radius.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'acct-all-servers': 'enable',
|
||||||
|
'acct-interim-interval': '4',
|
||||||
|
'all-usergroup': 'disable',
|
||||||
|
'auth-type': 'auto',
|
||||||
|
'h3c-compatibility': 'enable',
|
||||||
|
'name': 'default_name_8',
|
||||||
|
'nas-ip': 'test_value_9',
|
||||||
|
'password-encoding': 'auto',
|
||||||
|
'password-renewal': 'enable',
|
||||||
|
'radius-coa': 'enable',
|
||||||
|
'radius-port': '13',
|
||||||
|
'rsso': 'enable',
|
||||||
|
'rsso-context-timeout': '15',
|
||||||
|
'rsso-endpoint-attribute': 'User-Name',
|
||||||
|
'rsso-endpoint-block-attribute': 'User-Name',
|
||||||
|
'rsso-ep-one-ip-only': 'enable',
|
||||||
|
'rsso-flush-ip-session': 'enable',
|
||||||
|
'rsso-log-flags': 'protocol-error',
|
||||||
|
'rsso-log-period': '21',
|
||||||
|
'rsso-radius-response': 'enable',
|
||||||
|
'rsso-radius-server-port': '23',
|
||||||
|
'rsso-secret': 'test_value_24',
|
||||||
|
'rsso-validate-request-secret': 'enable',
|
||||||
|
'secondary-secret': 'test_value_26',
|
||||||
|
'secondary-server': 'test_value_27',
|
||||||
|
'secret': 'test_value_28',
|
||||||
|
'server': '192.168.100.29',
|
||||||
|
'source-ip': '84.230.14.30',
|
||||||
|
'sso-attribute': 'User-Name',
|
||||||
|
'sso-attribute-key': 'test_value_32',
|
||||||
|
'sso-attribute-value-override': 'enable',
|
||||||
|
'tertiary-secret': 'test_value_34',
|
||||||
|
'tertiary-server': 'test_value_35',
|
||||||
|
'timeout': '36',
|
||||||
|
'use-management-vdom': 'enable',
|
||||||
|
'username-case-sensitive': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'radius', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,299 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_user_tacacsplus
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_user_tacacsplus.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_tacacsplus_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_tacacsplus': {
|
||||||
|
'authen_type': 'mschap',
|
||||||
|
'authorization': 'enable',
|
||||||
|
'key': 'test_value_5',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
'port': '7',
|
||||||
|
'secondary_key': 'test_value_8',
|
||||||
|
'secondary_server': 'test_value_9',
|
||||||
|
'server': '192.168.100.10',
|
||||||
|
'source_ip': '84.230.14.11',
|
||||||
|
'tertiary_key': 'test_value_12',
|
||||||
|
'tertiary_server': 'test_value_13'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_tacacsplus.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'authen-type': 'mschap',
|
||||||
|
'authorization': 'enable',
|
||||||
|
'key': 'test_value_5',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
'port': '7',
|
||||||
|
'secondary-key': 'test_value_8',
|
||||||
|
'secondary-server': 'test_value_9',
|
||||||
|
'server': '192.168.100.10',
|
||||||
|
'source-ip': '84.230.14.11',
|
||||||
|
'tertiary-key': 'test_value_12',
|
||||||
|
'tertiary-server': 'test_value_13'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'tacacs+', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_tacacsplus_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_tacacsplus': {
|
||||||
|
'authen_type': 'mschap',
|
||||||
|
'authorization': 'enable',
|
||||||
|
'key': 'test_value_5',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
'port': '7',
|
||||||
|
'secondary_key': 'test_value_8',
|
||||||
|
'secondary_server': 'test_value_9',
|
||||||
|
'server': '192.168.100.10',
|
||||||
|
'source_ip': '84.230.14.11',
|
||||||
|
'tertiary_key': 'test_value_12',
|
||||||
|
'tertiary_server': 'test_value_13'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_tacacsplus.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'authen-type': 'mschap',
|
||||||
|
'authorization': 'enable',
|
||||||
|
'key': 'test_value_5',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
'port': '7',
|
||||||
|
'secondary-key': 'test_value_8',
|
||||||
|
'secondary-server': 'test_value_9',
|
||||||
|
'server': '192.168.100.10',
|
||||||
|
'source-ip': '84.230.14.11',
|
||||||
|
'tertiary-key': 'test_value_12',
|
||||||
|
'tertiary-server': 'test_value_13'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'tacacs+', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_tacacsplus_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'user_tacacsplus': {
|
||||||
|
'authen_type': 'mschap',
|
||||||
|
'authorization': 'enable',
|
||||||
|
'key': 'test_value_5',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
'port': '7',
|
||||||
|
'secondary_key': 'test_value_8',
|
||||||
|
'secondary_server': 'test_value_9',
|
||||||
|
'server': '192.168.100.10',
|
||||||
|
'source_ip': '84.230.14.11',
|
||||||
|
'tertiary_key': 'test_value_12',
|
||||||
|
'tertiary_server': 'test_value_13'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_tacacsplus.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('user', 'tacacs+', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_tacacsplus_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'user_tacacsplus': {
|
||||||
|
'authen_type': 'mschap',
|
||||||
|
'authorization': 'enable',
|
||||||
|
'key': 'test_value_5',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
'port': '7',
|
||||||
|
'secondary_key': 'test_value_8',
|
||||||
|
'secondary_server': 'test_value_9',
|
||||||
|
'server': '192.168.100.10',
|
||||||
|
'source_ip': '84.230.14.11',
|
||||||
|
'tertiary_key': 'test_value_12',
|
||||||
|
'tertiary_server': 'test_value_13'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_tacacsplus.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('user', 'tacacs+', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_tacacsplus_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_tacacsplus': {
|
||||||
|
'authen_type': 'mschap',
|
||||||
|
'authorization': 'enable',
|
||||||
|
'key': 'test_value_5',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
'port': '7',
|
||||||
|
'secondary_key': 'test_value_8',
|
||||||
|
'secondary_server': 'test_value_9',
|
||||||
|
'server': '192.168.100.10',
|
||||||
|
'source_ip': '84.230.14.11',
|
||||||
|
'tertiary_key': 'test_value_12',
|
||||||
|
'tertiary_server': 'test_value_13'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_tacacsplus.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'authen-type': 'mschap',
|
||||||
|
'authorization': 'enable',
|
||||||
|
'key': 'test_value_5',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
'port': '7',
|
||||||
|
'secondary-key': 'test_value_8',
|
||||||
|
'secondary-server': 'test_value_9',
|
||||||
|
'server': '192.168.100.10',
|
||||||
|
'source-ip': '84.230.14.11',
|
||||||
|
'tertiary-key': 'test_value_12',
|
||||||
|
'tertiary-server': 'test_value_13'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'tacacs+', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_tacacsplus_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'user_tacacsplus': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'authen_type': 'mschap',
|
||||||
|
'authorization': 'enable',
|
||||||
|
'key': 'test_value_5',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
'port': '7',
|
||||||
|
'secondary_key': 'test_value_8',
|
||||||
|
'secondary_server': 'test_value_9',
|
||||||
|
'server': '192.168.100.10',
|
||||||
|
'source_ip': '84.230.14.11',
|
||||||
|
'tertiary_key': 'test_value_12',
|
||||||
|
'tertiary_server': 'test_value_13'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_user_tacacsplus.fortios_user(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'authen-type': 'mschap',
|
||||||
|
'authorization': 'enable',
|
||||||
|
'key': 'test_value_5',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
'port': '7',
|
||||||
|
'secondary-key': 'test_value_8',
|
||||||
|
'secondary-server': 'test_value_9',
|
||||||
|
'server': '192.168.100.10',
|
||||||
|
'source-ip': '84.230.14.11',
|
||||||
|
'tertiary-key': 'test_value_12',
|
||||||
|
'tertiary-server': 'test_value_13'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('user', 'tacacs+', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,219 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_voip_profile
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_voip_profile.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_voip_profile_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'voip_profile': {
|
||||||
|
'comment': 'Comment.',
|
||||||
|
'name': 'default_name_4',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_voip_profile.fortios_voip(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Comment.',
|
||||||
|
'name': 'default_name_4',
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('voip', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_voip_profile_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'voip_profile': {
|
||||||
|
'comment': 'Comment.',
|
||||||
|
'name': 'default_name_4',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_voip_profile.fortios_voip(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Comment.',
|
||||||
|
'name': 'default_name_4',
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('voip', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_voip_profile_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'voip_profile': {
|
||||||
|
'comment': 'Comment.',
|
||||||
|
'name': 'default_name_4',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_voip_profile.fortios_voip(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('voip', 'profile', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_voip_profile_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'voip_profile': {
|
||||||
|
'comment': 'Comment.',
|
||||||
|
'name': 'default_name_4',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_voip_profile.fortios_voip(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('voip', 'profile', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_voip_profile_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'voip_profile': {
|
||||||
|
'comment': 'Comment.',
|
||||||
|
'name': 'default_name_4',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_voip_profile.fortios_voip(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Comment.',
|
||||||
|
'name': 'default_name_4',
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('voip', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_voip_profile_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'voip_profile': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'comment': 'Comment.',
|
||||||
|
'name': 'default_name_4',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_voip_profile.fortios_voip(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Comment.',
|
||||||
|
'name': 'default_name_4',
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('voip', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,199 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_vpn_ipsec_concentrator
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_vpn_ipsec_concentrator.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_concentrator_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_concentrator': {'name': 'default_name_3',
|
||||||
|
'src_check': 'disable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_concentrator.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'name': 'default_name_3',
|
||||||
|
'src-check': 'disable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'concentrator', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_concentrator_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_concentrator': {'name': 'default_name_3',
|
||||||
|
'src_check': 'disable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_concentrator.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'name': 'default_name_3',
|
||||||
|
'src-check': 'disable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'concentrator', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_concentrator_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_concentrator': {'name': 'default_name_3',
|
||||||
|
'src_check': 'disable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_concentrator.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'concentrator', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_concentrator_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_concentrator': {'name': 'default_name_3',
|
||||||
|
'src_check': 'disable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_concentrator.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'concentrator', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_concentrator_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_concentrator': {'name': 'default_name_3',
|
||||||
|
'src_check': 'disable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_concentrator.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'name': 'default_name_3',
|
||||||
|
'src-check': 'disable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'concentrator', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_concentrator_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_concentrator': {
|
||||||
|
'random_attribute_not_valid': 'tag', 'name': 'default_name_3',
|
||||||
|
'src_check': 'disable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_concentrator.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'name': 'default_name_3',
|
||||||
|
'src-check': 'disable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'concentrator', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,229 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_vpn_ipsec_forticlient
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_vpn_ipsec_forticlient.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_forticlient_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_forticlient': {
|
||||||
|
'phase2name': 'test_value_3',
|
||||||
|
'realm': 'test_value_4',
|
||||||
|
'status': 'enable',
|
||||||
|
'usergroupname': 'test_value_6'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_forticlient.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'phase2name': 'test_value_3',
|
||||||
|
'realm': 'test_value_4',
|
||||||
|
'status': 'enable',
|
||||||
|
'usergroupname': 'test_value_6'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'forticlient', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_forticlient_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_forticlient': {
|
||||||
|
'phase2name': 'test_value_3',
|
||||||
|
'realm': 'test_value_4',
|
||||||
|
'status': 'enable',
|
||||||
|
'usergroupname': 'test_value_6'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_forticlient.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'phase2name': 'test_value_3',
|
||||||
|
'realm': 'test_value_4',
|
||||||
|
'status': 'enable',
|
||||||
|
'usergroupname': 'test_value_6'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'forticlient', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_forticlient_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_forticlient': {
|
||||||
|
'phase2name': 'test_value_3',
|
||||||
|
'realm': 'test_value_4',
|
||||||
|
'status': 'enable',
|
||||||
|
'usergroupname': 'test_value_6'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_forticlient.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'forticlient', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_forticlient_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_forticlient': {
|
||||||
|
'phase2name': 'test_value_3',
|
||||||
|
'realm': 'test_value_4',
|
||||||
|
'status': 'enable',
|
||||||
|
'usergroupname': 'test_value_6'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_forticlient.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'forticlient', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_forticlient_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_forticlient': {
|
||||||
|
'phase2name': 'test_value_3',
|
||||||
|
'realm': 'test_value_4',
|
||||||
|
'status': 'enable',
|
||||||
|
'usergroupname': 'test_value_6'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_forticlient.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'phase2name': 'test_value_3',
|
||||||
|
'realm': 'test_value_4',
|
||||||
|
'status': 'enable',
|
||||||
|
'usergroupname': 'test_value_6'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'forticlient', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_forticlient_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_forticlient': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'phase2name': 'test_value_3',
|
||||||
|
'realm': 'test_value_4',
|
||||||
|
'status': 'enable',
|
||||||
|
'usergroupname': 'test_value_6'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_forticlient.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'phase2name': 'test_value_3',
|
||||||
|
'realm': 'test_value_4',
|
||||||
|
'status': 'enable',
|
||||||
|
'usergroupname': 'test_value_6'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'forticlient', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,289 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_vpn_ipsec_manualkey
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_vpn_ipsec_manualkey.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_manualkey': {
|
||||||
|
'authentication': 'null',
|
||||||
|
'authkey': 'test_value_4',
|
||||||
|
'enckey': 'test_value_5',
|
||||||
|
'encryption': 'null',
|
||||||
|
'interface': 'test_value_7',
|
||||||
|
'local_gw': 'test_value_8',
|
||||||
|
'localspi': 'test_value_9',
|
||||||
|
'name': 'default_name_10',
|
||||||
|
'remote_gw': 'test_value_11',
|
||||||
|
'remotespi': 'test_value_12'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'authentication': 'null',
|
||||||
|
'authkey': 'test_value_4',
|
||||||
|
'enckey': 'test_value_5',
|
||||||
|
'encryption': 'null',
|
||||||
|
'interface': 'test_value_7',
|
||||||
|
'local-gw': 'test_value_8',
|
||||||
|
'localspi': 'test_value_9',
|
||||||
|
'name': 'default_name_10',
|
||||||
|
'remote-gw': 'test_value_11',
|
||||||
|
'remotespi': 'test_value_12'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'manualkey', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_manualkey': {
|
||||||
|
'authentication': 'null',
|
||||||
|
'authkey': 'test_value_4',
|
||||||
|
'enckey': 'test_value_5',
|
||||||
|
'encryption': 'null',
|
||||||
|
'interface': 'test_value_7',
|
||||||
|
'local_gw': 'test_value_8',
|
||||||
|
'localspi': 'test_value_9',
|
||||||
|
'name': 'default_name_10',
|
||||||
|
'remote_gw': 'test_value_11',
|
||||||
|
'remotespi': 'test_value_12'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'authentication': 'null',
|
||||||
|
'authkey': 'test_value_4',
|
||||||
|
'enckey': 'test_value_5',
|
||||||
|
'encryption': 'null',
|
||||||
|
'interface': 'test_value_7',
|
||||||
|
'local-gw': 'test_value_8',
|
||||||
|
'localspi': 'test_value_9',
|
||||||
|
'name': 'default_name_10',
|
||||||
|
'remote-gw': 'test_value_11',
|
||||||
|
'remotespi': 'test_value_12'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'manualkey', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_manualkey': {
|
||||||
|
'authentication': 'null',
|
||||||
|
'authkey': 'test_value_4',
|
||||||
|
'enckey': 'test_value_5',
|
||||||
|
'encryption': 'null',
|
||||||
|
'interface': 'test_value_7',
|
||||||
|
'local_gw': 'test_value_8',
|
||||||
|
'localspi': 'test_value_9',
|
||||||
|
'name': 'default_name_10',
|
||||||
|
'remote_gw': 'test_value_11',
|
||||||
|
'remotespi': 'test_value_12'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'manualkey', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_manualkey': {
|
||||||
|
'authentication': 'null',
|
||||||
|
'authkey': 'test_value_4',
|
||||||
|
'enckey': 'test_value_5',
|
||||||
|
'encryption': 'null',
|
||||||
|
'interface': 'test_value_7',
|
||||||
|
'local_gw': 'test_value_8',
|
||||||
|
'localspi': 'test_value_9',
|
||||||
|
'name': 'default_name_10',
|
||||||
|
'remote_gw': 'test_value_11',
|
||||||
|
'remotespi': 'test_value_12'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'manualkey', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_manualkey': {
|
||||||
|
'authentication': 'null',
|
||||||
|
'authkey': 'test_value_4',
|
||||||
|
'enckey': 'test_value_5',
|
||||||
|
'encryption': 'null',
|
||||||
|
'interface': 'test_value_7',
|
||||||
|
'local_gw': 'test_value_8',
|
||||||
|
'localspi': 'test_value_9',
|
||||||
|
'name': 'default_name_10',
|
||||||
|
'remote_gw': 'test_value_11',
|
||||||
|
'remotespi': 'test_value_12'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'authentication': 'null',
|
||||||
|
'authkey': 'test_value_4',
|
||||||
|
'enckey': 'test_value_5',
|
||||||
|
'encryption': 'null',
|
||||||
|
'interface': 'test_value_7',
|
||||||
|
'local-gw': 'test_value_8',
|
||||||
|
'localspi': 'test_value_9',
|
||||||
|
'name': 'default_name_10',
|
||||||
|
'remote-gw': 'test_value_11',
|
||||||
|
'remotespi': 'test_value_12'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'manualkey', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_manualkey': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'authentication': 'null',
|
||||||
|
'authkey': 'test_value_4',
|
||||||
|
'enckey': 'test_value_5',
|
||||||
|
'encryption': 'null',
|
||||||
|
'interface': 'test_value_7',
|
||||||
|
'local_gw': 'test_value_8',
|
||||||
|
'localspi': 'test_value_9',
|
||||||
|
'name': 'default_name_10',
|
||||||
|
'remote_gw': 'test_value_11',
|
||||||
|
'remotespi': 'test_value_12'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'authentication': 'null',
|
||||||
|
'authkey': 'test_value_4',
|
||||||
|
'enckey': 'test_value_5',
|
||||||
|
'encryption': 'null',
|
||||||
|
'interface': 'test_value_7',
|
||||||
|
'local-gw': 'test_value_8',
|
||||||
|
'localspi': 'test_value_9',
|
||||||
|
'name': 'default_name_10',
|
||||||
|
'remote-gw': 'test_value_11',
|
||||||
|
'remotespi': 'test_value_12'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'manualkey', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,329 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_vpn_ipsec_manualkey_interface
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_vpn_ipsec_manualkey_interface.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_interface_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_manualkey_interface': {
|
||||||
|
'addr_type': '4',
|
||||||
|
'auth_alg': 'null',
|
||||||
|
'auth_key': 'test_value_5',
|
||||||
|
'enc_alg': 'null',
|
||||||
|
'enc_key': 'test_value_7',
|
||||||
|
'interface': 'test_value_8',
|
||||||
|
'ip_version': '4',
|
||||||
|
'local_gw': 'test_value_10',
|
||||||
|
'local_gw6': 'test_value_11',
|
||||||
|
'local_spi': 'test_value_12',
|
||||||
|
'name': 'default_name_13',
|
||||||
|
'remote_gw': 'test_value_14',
|
||||||
|
'remote_gw6': 'test_value_15',
|
||||||
|
'remote_spi': 'test_value_16'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'addr-type': '4',
|
||||||
|
'auth-alg': 'null',
|
||||||
|
'auth-key': 'test_value_5',
|
||||||
|
'enc-alg': 'null',
|
||||||
|
'enc-key': 'test_value_7',
|
||||||
|
'interface': 'test_value_8',
|
||||||
|
'ip-version': '4',
|
||||||
|
'local-gw': 'test_value_10',
|
||||||
|
'local-gw6': 'test_value_11',
|
||||||
|
'local-spi': 'test_value_12',
|
||||||
|
'name': 'default_name_13',
|
||||||
|
'remote-gw': 'test_value_14',
|
||||||
|
'remote-gw6': 'test_value_15',
|
||||||
|
'remote-spi': 'test_value_16'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'manualkey-interface', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_interface_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_manualkey_interface': {
|
||||||
|
'addr_type': '4',
|
||||||
|
'auth_alg': 'null',
|
||||||
|
'auth_key': 'test_value_5',
|
||||||
|
'enc_alg': 'null',
|
||||||
|
'enc_key': 'test_value_7',
|
||||||
|
'interface': 'test_value_8',
|
||||||
|
'ip_version': '4',
|
||||||
|
'local_gw': 'test_value_10',
|
||||||
|
'local_gw6': 'test_value_11',
|
||||||
|
'local_spi': 'test_value_12',
|
||||||
|
'name': 'default_name_13',
|
||||||
|
'remote_gw': 'test_value_14',
|
||||||
|
'remote_gw6': 'test_value_15',
|
||||||
|
'remote_spi': 'test_value_16'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'addr-type': '4',
|
||||||
|
'auth-alg': 'null',
|
||||||
|
'auth-key': 'test_value_5',
|
||||||
|
'enc-alg': 'null',
|
||||||
|
'enc-key': 'test_value_7',
|
||||||
|
'interface': 'test_value_8',
|
||||||
|
'ip-version': '4',
|
||||||
|
'local-gw': 'test_value_10',
|
||||||
|
'local-gw6': 'test_value_11',
|
||||||
|
'local-spi': 'test_value_12',
|
||||||
|
'name': 'default_name_13',
|
||||||
|
'remote-gw': 'test_value_14',
|
||||||
|
'remote-gw6': 'test_value_15',
|
||||||
|
'remote-spi': 'test_value_16'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'manualkey-interface', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_interface_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_manualkey_interface': {
|
||||||
|
'addr_type': '4',
|
||||||
|
'auth_alg': 'null',
|
||||||
|
'auth_key': 'test_value_5',
|
||||||
|
'enc_alg': 'null',
|
||||||
|
'enc_key': 'test_value_7',
|
||||||
|
'interface': 'test_value_8',
|
||||||
|
'ip_version': '4',
|
||||||
|
'local_gw': 'test_value_10',
|
||||||
|
'local_gw6': 'test_value_11',
|
||||||
|
'local_spi': 'test_value_12',
|
||||||
|
'name': 'default_name_13',
|
||||||
|
'remote_gw': 'test_value_14',
|
||||||
|
'remote_gw6': 'test_value_15',
|
||||||
|
'remote_spi': 'test_value_16'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'manualkey-interface', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_interface_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_manualkey_interface': {
|
||||||
|
'addr_type': '4',
|
||||||
|
'auth_alg': 'null',
|
||||||
|
'auth_key': 'test_value_5',
|
||||||
|
'enc_alg': 'null',
|
||||||
|
'enc_key': 'test_value_7',
|
||||||
|
'interface': 'test_value_8',
|
||||||
|
'ip_version': '4',
|
||||||
|
'local_gw': 'test_value_10',
|
||||||
|
'local_gw6': 'test_value_11',
|
||||||
|
'local_spi': 'test_value_12',
|
||||||
|
'name': 'default_name_13',
|
||||||
|
'remote_gw': 'test_value_14',
|
||||||
|
'remote_gw6': 'test_value_15',
|
||||||
|
'remote_spi': 'test_value_16'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'manualkey-interface', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_interface_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_manualkey_interface': {
|
||||||
|
'addr_type': '4',
|
||||||
|
'auth_alg': 'null',
|
||||||
|
'auth_key': 'test_value_5',
|
||||||
|
'enc_alg': 'null',
|
||||||
|
'enc_key': 'test_value_7',
|
||||||
|
'interface': 'test_value_8',
|
||||||
|
'ip_version': '4',
|
||||||
|
'local_gw': 'test_value_10',
|
||||||
|
'local_gw6': 'test_value_11',
|
||||||
|
'local_spi': 'test_value_12',
|
||||||
|
'name': 'default_name_13',
|
||||||
|
'remote_gw': 'test_value_14',
|
||||||
|
'remote_gw6': 'test_value_15',
|
||||||
|
'remote_spi': 'test_value_16'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'addr-type': '4',
|
||||||
|
'auth-alg': 'null',
|
||||||
|
'auth-key': 'test_value_5',
|
||||||
|
'enc-alg': 'null',
|
||||||
|
'enc-key': 'test_value_7',
|
||||||
|
'interface': 'test_value_8',
|
||||||
|
'ip-version': '4',
|
||||||
|
'local-gw': 'test_value_10',
|
||||||
|
'local-gw6': 'test_value_11',
|
||||||
|
'local-spi': 'test_value_12',
|
||||||
|
'name': 'default_name_13',
|
||||||
|
'remote-gw': 'test_value_14',
|
||||||
|
'remote-gw6': 'test_value_15',
|
||||||
|
'remote-spi': 'test_value_16'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'manualkey-interface', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_manualkey_interface_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_manualkey_interface': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'addr_type': '4',
|
||||||
|
'auth_alg': 'null',
|
||||||
|
'auth_key': 'test_value_5',
|
||||||
|
'enc_alg': 'null',
|
||||||
|
'enc_key': 'test_value_7',
|
||||||
|
'interface': 'test_value_8',
|
||||||
|
'ip_version': '4',
|
||||||
|
'local_gw': 'test_value_10',
|
||||||
|
'local_gw6': 'test_value_11',
|
||||||
|
'local_spi': 'test_value_12',
|
||||||
|
'name': 'default_name_13',
|
||||||
|
'remote_gw': 'test_value_14',
|
||||||
|
'remote_gw6': 'test_value_15',
|
||||||
|
'remote_spi': 'test_value_16'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_manualkey_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'addr-type': '4',
|
||||||
|
'auth-alg': 'null',
|
||||||
|
'auth-key': 'test_value_5',
|
||||||
|
'enc-alg': 'null',
|
||||||
|
'enc-key': 'test_value_7',
|
||||||
|
'interface': 'test_value_8',
|
||||||
|
'ip-version': '4',
|
||||||
|
'local-gw': 'test_value_10',
|
||||||
|
'local-gw6': 'test_value_11',
|
||||||
|
'local-spi': 'test_value_12',
|
||||||
|
'name': 'default_name_13',
|
||||||
|
'remote-gw': 'test_value_14',
|
||||||
|
'remote-gw6': 'test_value_15',
|
||||||
|
'remote-spi': 'test_value_16'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'manualkey-interface', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,599 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_vpn_ipsec_phase2
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_vpn_ipsec_phase2.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_phase2': {
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_5',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_9',
|
||||||
|
'dst_end_ip6': 'test_value_10',
|
||||||
|
'dst_name': 'test_value_11',
|
||||||
|
'dst_name6': 'test_value_12',
|
||||||
|
'dst_port': '13',
|
||||||
|
'dst_start_ip': 'test_value_14',
|
||||||
|
'dst_start_ip6': 'test_value_15',
|
||||||
|
'dst_subnet': 'test_value_16',
|
||||||
|
'dst_subnet6': 'test_value_17',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '21',
|
||||||
|
'keylifeseconds': '22',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_24',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_26',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '28',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'selector_match': 'exact',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_34',
|
||||||
|
'src_end_ip6': 'test_value_35',
|
||||||
|
'src_name': 'test_value_36',
|
||||||
|
'src_name6': 'test_value_37',
|
||||||
|
'src_port': '38',
|
||||||
|
'src_start_ip': 'test_value_39',
|
||||||
|
'src_start_ip6': 'test_value_40',
|
||||||
|
'src_subnet': 'test_value_41',
|
||||||
|
'src_subnet6': 'test_value_42',
|
||||||
|
'use_natip': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'add-route': 'phase1',
|
||||||
|
'auto-negotiate': 'enable',
|
||||||
|
'comments': 'test_value_5',
|
||||||
|
'dhcp-ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst-addr-type': 'subnet',
|
||||||
|
'dst-end-ip': 'test_value_9',
|
||||||
|
'dst-end-ip6': 'test_value_10',
|
||||||
|
'dst-name': 'test_value_11',
|
||||||
|
'dst-name6': 'test_value_12',
|
||||||
|
'dst-port': '13',
|
||||||
|
'dst-start-ip': 'test_value_14',
|
||||||
|
'dst-start-ip6': 'test_value_15',
|
||||||
|
'dst-subnet': 'test_value_16',
|
||||||
|
'dst-subnet6': 'test_value_17',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife-type': 'seconds',
|
||||||
|
'keylifekbs': '21',
|
||||||
|
'keylifeseconds': '22',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_24',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_26',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '28',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route-overlap': 'use-old',
|
||||||
|
'selector-match': 'exact',
|
||||||
|
'single-source': 'enable',
|
||||||
|
'src-addr-type': 'subnet',
|
||||||
|
'src-end-ip': 'test_value_34',
|
||||||
|
'src-end-ip6': 'test_value_35',
|
||||||
|
'src-name': 'test_value_36',
|
||||||
|
'src-name6': 'test_value_37',
|
||||||
|
'src-port': '38',
|
||||||
|
'src-start-ip': 'test_value_39',
|
||||||
|
'src-start-ip6': 'test_value_40',
|
||||||
|
'src-subnet': 'test_value_41',
|
||||||
|
'src-subnet6': 'test_value_42',
|
||||||
|
'use-natip': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'phase2', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_phase2': {
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_5',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_9',
|
||||||
|
'dst_end_ip6': 'test_value_10',
|
||||||
|
'dst_name': 'test_value_11',
|
||||||
|
'dst_name6': 'test_value_12',
|
||||||
|
'dst_port': '13',
|
||||||
|
'dst_start_ip': 'test_value_14',
|
||||||
|
'dst_start_ip6': 'test_value_15',
|
||||||
|
'dst_subnet': 'test_value_16',
|
||||||
|
'dst_subnet6': 'test_value_17',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '21',
|
||||||
|
'keylifeseconds': '22',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_24',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_26',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '28',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'selector_match': 'exact',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_34',
|
||||||
|
'src_end_ip6': 'test_value_35',
|
||||||
|
'src_name': 'test_value_36',
|
||||||
|
'src_name6': 'test_value_37',
|
||||||
|
'src_port': '38',
|
||||||
|
'src_start_ip': 'test_value_39',
|
||||||
|
'src_start_ip6': 'test_value_40',
|
||||||
|
'src_subnet': 'test_value_41',
|
||||||
|
'src_subnet6': 'test_value_42',
|
||||||
|
'use_natip': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'add-route': 'phase1',
|
||||||
|
'auto-negotiate': 'enable',
|
||||||
|
'comments': 'test_value_5',
|
||||||
|
'dhcp-ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst-addr-type': 'subnet',
|
||||||
|
'dst-end-ip': 'test_value_9',
|
||||||
|
'dst-end-ip6': 'test_value_10',
|
||||||
|
'dst-name': 'test_value_11',
|
||||||
|
'dst-name6': 'test_value_12',
|
||||||
|
'dst-port': '13',
|
||||||
|
'dst-start-ip': 'test_value_14',
|
||||||
|
'dst-start-ip6': 'test_value_15',
|
||||||
|
'dst-subnet': 'test_value_16',
|
||||||
|
'dst-subnet6': 'test_value_17',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife-type': 'seconds',
|
||||||
|
'keylifekbs': '21',
|
||||||
|
'keylifeseconds': '22',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_24',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_26',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '28',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route-overlap': 'use-old',
|
||||||
|
'selector-match': 'exact',
|
||||||
|
'single-source': 'enable',
|
||||||
|
'src-addr-type': 'subnet',
|
||||||
|
'src-end-ip': 'test_value_34',
|
||||||
|
'src-end-ip6': 'test_value_35',
|
||||||
|
'src-name': 'test_value_36',
|
||||||
|
'src-name6': 'test_value_37',
|
||||||
|
'src-port': '38',
|
||||||
|
'src-start-ip': 'test_value_39',
|
||||||
|
'src-start-ip6': 'test_value_40',
|
||||||
|
'src-subnet': 'test_value_41',
|
||||||
|
'src-subnet6': 'test_value_42',
|
||||||
|
'use-natip': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'phase2', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_phase2': {
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_5',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_9',
|
||||||
|
'dst_end_ip6': 'test_value_10',
|
||||||
|
'dst_name': 'test_value_11',
|
||||||
|
'dst_name6': 'test_value_12',
|
||||||
|
'dst_port': '13',
|
||||||
|
'dst_start_ip': 'test_value_14',
|
||||||
|
'dst_start_ip6': 'test_value_15',
|
||||||
|
'dst_subnet': 'test_value_16',
|
||||||
|
'dst_subnet6': 'test_value_17',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '21',
|
||||||
|
'keylifeseconds': '22',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_24',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_26',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '28',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'selector_match': 'exact',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_34',
|
||||||
|
'src_end_ip6': 'test_value_35',
|
||||||
|
'src_name': 'test_value_36',
|
||||||
|
'src_name6': 'test_value_37',
|
||||||
|
'src_port': '38',
|
||||||
|
'src_start_ip': 'test_value_39',
|
||||||
|
'src_start_ip6': 'test_value_40',
|
||||||
|
'src_subnet': 'test_value_41',
|
||||||
|
'src_subnet6': 'test_value_42',
|
||||||
|
'use_natip': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'phase2', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_phase2': {
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_5',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_9',
|
||||||
|
'dst_end_ip6': 'test_value_10',
|
||||||
|
'dst_name': 'test_value_11',
|
||||||
|
'dst_name6': 'test_value_12',
|
||||||
|
'dst_port': '13',
|
||||||
|
'dst_start_ip': 'test_value_14',
|
||||||
|
'dst_start_ip6': 'test_value_15',
|
||||||
|
'dst_subnet': 'test_value_16',
|
||||||
|
'dst_subnet6': 'test_value_17',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '21',
|
||||||
|
'keylifeseconds': '22',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_24',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_26',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '28',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'selector_match': 'exact',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_34',
|
||||||
|
'src_end_ip6': 'test_value_35',
|
||||||
|
'src_name': 'test_value_36',
|
||||||
|
'src_name6': 'test_value_37',
|
||||||
|
'src_port': '38',
|
||||||
|
'src_start_ip': 'test_value_39',
|
||||||
|
'src_start_ip6': 'test_value_40',
|
||||||
|
'src_subnet': 'test_value_41',
|
||||||
|
'src_subnet6': 'test_value_42',
|
||||||
|
'use_natip': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'phase2', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_phase2': {
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_5',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_9',
|
||||||
|
'dst_end_ip6': 'test_value_10',
|
||||||
|
'dst_name': 'test_value_11',
|
||||||
|
'dst_name6': 'test_value_12',
|
||||||
|
'dst_port': '13',
|
||||||
|
'dst_start_ip': 'test_value_14',
|
||||||
|
'dst_start_ip6': 'test_value_15',
|
||||||
|
'dst_subnet': 'test_value_16',
|
||||||
|
'dst_subnet6': 'test_value_17',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '21',
|
||||||
|
'keylifeseconds': '22',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_24',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_26',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '28',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'selector_match': 'exact',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_34',
|
||||||
|
'src_end_ip6': 'test_value_35',
|
||||||
|
'src_name': 'test_value_36',
|
||||||
|
'src_name6': 'test_value_37',
|
||||||
|
'src_port': '38',
|
||||||
|
'src_start_ip': 'test_value_39',
|
||||||
|
'src_start_ip6': 'test_value_40',
|
||||||
|
'src_subnet': 'test_value_41',
|
||||||
|
'src_subnet6': 'test_value_42',
|
||||||
|
'use_natip': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'add-route': 'phase1',
|
||||||
|
'auto-negotiate': 'enable',
|
||||||
|
'comments': 'test_value_5',
|
||||||
|
'dhcp-ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst-addr-type': 'subnet',
|
||||||
|
'dst-end-ip': 'test_value_9',
|
||||||
|
'dst-end-ip6': 'test_value_10',
|
||||||
|
'dst-name': 'test_value_11',
|
||||||
|
'dst-name6': 'test_value_12',
|
||||||
|
'dst-port': '13',
|
||||||
|
'dst-start-ip': 'test_value_14',
|
||||||
|
'dst-start-ip6': 'test_value_15',
|
||||||
|
'dst-subnet': 'test_value_16',
|
||||||
|
'dst-subnet6': 'test_value_17',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife-type': 'seconds',
|
||||||
|
'keylifekbs': '21',
|
||||||
|
'keylifeseconds': '22',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_24',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_26',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '28',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route-overlap': 'use-old',
|
||||||
|
'selector-match': 'exact',
|
||||||
|
'single-source': 'enable',
|
||||||
|
'src-addr-type': 'subnet',
|
||||||
|
'src-end-ip': 'test_value_34',
|
||||||
|
'src-end-ip6': 'test_value_35',
|
||||||
|
'src-name': 'test_value_36',
|
||||||
|
'src-name6': 'test_value_37',
|
||||||
|
'src-port': '38',
|
||||||
|
'src-start-ip': 'test_value_39',
|
||||||
|
'src-start-ip6': 'test_value_40',
|
||||||
|
'src-subnet': 'test_value_41',
|
||||||
|
'src-subnet6': 'test_value_42',
|
||||||
|
'use-natip': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'phase2', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_phase2': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_5',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_9',
|
||||||
|
'dst_end_ip6': 'test_value_10',
|
||||||
|
'dst_name': 'test_value_11',
|
||||||
|
'dst_name6': 'test_value_12',
|
||||||
|
'dst_port': '13',
|
||||||
|
'dst_start_ip': 'test_value_14',
|
||||||
|
'dst_start_ip6': 'test_value_15',
|
||||||
|
'dst_subnet': 'test_value_16',
|
||||||
|
'dst_subnet6': 'test_value_17',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '21',
|
||||||
|
'keylifeseconds': '22',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_24',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_26',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '28',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'selector_match': 'exact',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_34',
|
||||||
|
'src_end_ip6': 'test_value_35',
|
||||||
|
'src_name': 'test_value_36',
|
||||||
|
'src_name6': 'test_value_37',
|
||||||
|
'src_port': '38',
|
||||||
|
'src_start_ip': 'test_value_39',
|
||||||
|
'src_start_ip6': 'test_value_40',
|
||||||
|
'src_subnet': 'test_value_41',
|
||||||
|
'src_subnet6': 'test_value_42',
|
||||||
|
'use_natip': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'add-route': 'phase1',
|
||||||
|
'auto-negotiate': 'enable',
|
||||||
|
'comments': 'test_value_5',
|
||||||
|
'dhcp-ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst-addr-type': 'subnet',
|
||||||
|
'dst-end-ip': 'test_value_9',
|
||||||
|
'dst-end-ip6': 'test_value_10',
|
||||||
|
'dst-name': 'test_value_11',
|
||||||
|
'dst-name6': 'test_value_12',
|
||||||
|
'dst-port': '13',
|
||||||
|
'dst-start-ip': 'test_value_14',
|
||||||
|
'dst-start-ip6': 'test_value_15',
|
||||||
|
'dst-subnet': 'test_value_16',
|
||||||
|
'dst-subnet6': 'test_value_17',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife-type': 'seconds',
|
||||||
|
'keylifekbs': '21',
|
||||||
|
'keylifeseconds': '22',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_24',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_26',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '28',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route-overlap': 'use-old',
|
||||||
|
'selector-match': 'exact',
|
||||||
|
'single-source': 'enable',
|
||||||
|
'src-addr-type': 'subnet',
|
||||||
|
'src-end-ip': 'test_value_34',
|
||||||
|
'src-end-ip6': 'test_value_35',
|
||||||
|
'src-name': 'test_value_36',
|
||||||
|
'src-name6': 'test_value_37',
|
||||||
|
'src-port': '38',
|
||||||
|
'src-start-ip': 'test_value_39',
|
||||||
|
'src-start-ip6': 'test_value_40',
|
||||||
|
'src-subnet': 'test_value_41',
|
||||||
|
'src-subnet6': 'test_value_42',
|
||||||
|
'use-natip': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'phase2', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,599 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_vpn_ipsec_phase2_interface
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_vpn_ipsec_phase2_interface.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_interface_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_phase2_interface': {
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_discovery_forwarder': 'phase1',
|
||||||
|
'auto_discovery_sender': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_7',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_11',
|
||||||
|
'dst_end_ip6': 'test_value_12',
|
||||||
|
'dst_name': 'test_value_13',
|
||||||
|
'dst_name6': 'test_value_14',
|
||||||
|
'dst_port': '15',
|
||||||
|
'dst_start_ip': 'test_value_16',
|
||||||
|
'dst_start_ip6': 'test_value_17',
|
||||||
|
'dst_subnet': 'test_value_18',
|
||||||
|
'dst_subnet6': 'test_value_19',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '23',
|
||||||
|
'keylifeseconds': '24',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_26',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_28',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '30',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_35',
|
||||||
|
'src_end_ip6': 'test_value_36',
|
||||||
|
'src_name': 'test_value_37',
|
||||||
|
'src_name6': 'test_value_38',
|
||||||
|
'src_port': '39',
|
||||||
|
'src_start_ip': 'test_value_40',
|
||||||
|
'src_start_ip6': 'test_value_41',
|
||||||
|
'src_subnet': 'test_value_42',
|
||||||
|
'src_subnet6': 'test_value_43'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'add-route': 'phase1',
|
||||||
|
'auto-discovery-forwarder': 'phase1',
|
||||||
|
'auto-discovery-sender': 'phase1',
|
||||||
|
'auto-negotiate': 'enable',
|
||||||
|
'comments': 'test_value_7',
|
||||||
|
'dhcp-ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst-addr-type': 'subnet',
|
||||||
|
'dst-end-ip': 'test_value_11',
|
||||||
|
'dst-end-ip6': 'test_value_12',
|
||||||
|
'dst-name': 'test_value_13',
|
||||||
|
'dst-name6': 'test_value_14',
|
||||||
|
'dst-port': '15',
|
||||||
|
'dst-start-ip': 'test_value_16',
|
||||||
|
'dst-start-ip6': 'test_value_17',
|
||||||
|
'dst-subnet': 'test_value_18',
|
||||||
|
'dst-subnet6': 'test_value_19',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife-type': 'seconds',
|
||||||
|
'keylifekbs': '23',
|
||||||
|
'keylifeseconds': '24',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_26',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_28',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '30',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route-overlap': 'use-old',
|
||||||
|
'single-source': 'enable',
|
||||||
|
'src-addr-type': 'subnet',
|
||||||
|
'src-end-ip': 'test_value_35',
|
||||||
|
'src-end-ip6': 'test_value_36',
|
||||||
|
'src-name': 'test_value_37',
|
||||||
|
'src-name6': 'test_value_38',
|
||||||
|
'src-port': '39',
|
||||||
|
'src-start-ip': 'test_value_40',
|
||||||
|
'src-start-ip6': 'test_value_41',
|
||||||
|
'src-subnet': 'test_value_42',
|
||||||
|
'src-subnet6': 'test_value_43'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'phase2-interface', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_interface_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_phase2_interface': {
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_discovery_forwarder': 'phase1',
|
||||||
|
'auto_discovery_sender': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_7',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_11',
|
||||||
|
'dst_end_ip6': 'test_value_12',
|
||||||
|
'dst_name': 'test_value_13',
|
||||||
|
'dst_name6': 'test_value_14',
|
||||||
|
'dst_port': '15',
|
||||||
|
'dst_start_ip': 'test_value_16',
|
||||||
|
'dst_start_ip6': 'test_value_17',
|
||||||
|
'dst_subnet': 'test_value_18',
|
||||||
|
'dst_subnet6': 'test_value_19',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '23',
|
||||||
|
'keylifeseconds': '24',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_26',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_28',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '30',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_35',
|
||||||
|
'src_end_ip6': 'test_value_36',
|
||||||
|
'src_name': 'test_value_37',
|
||||||
|
'src_name6': 'test_value_38',
|
||||||
|
'src_port': '39',
|
||||||
|
'src_start_ip': 'test_value_40',
|
||||||
|
'src_start_ip6': 'test_value_41',
|
||||||
|
'src_subnet': 'test_value_42',
|
||||||
|
'src_subnet6': 'test_value_43'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'add-route': 'phase1',
|
||||||
|
'auto-discovery-forwarder': 'phase1',
|
||||||
|
'auto-discovery-sender': 'phase1',
|
||||||
|
'auto-negotiate': 'enable',
|
||||||
|
'comments': 'test_value_7',
|
||||||
|
'dhcp-ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst-addr-type': 'subnet',
|
||||||
|
'dst-end-ip': 'test_value_11',
|
||||||
|
'dst-end-ip6': 'test_value_12',
|
||||||
|
'dst-name': 'test_value_13',
|
||||||
|
'dst-name6': 'test_value_14',
|
||||||
|
'dst-port': '15',
|
||||||
|
'dst-start-ip': 'test_value_16',
|
||||||
|
'dst-start-ip6': 'test_value_17',
|
||||||
|
'dst-subnet': 'test_value_18',
|
||||||
|
'dst-subnet6': 'test_value_19',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife-type': 'seconds',
|
||||||
|
'keylifekbs': '23',
|
||||||
|
'keylifeseconds': '24',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_26',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_28',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '30',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route-overlap': 'use-old',
|
||||||
|
'single-source': 'enable',
|
||||||
|
'src-addr-type': 'subnet',
|
||||||
|
'src-end-ip': 'test_value_35',
|
||||||
|
'src-end-ip6': 'test_value_36',
|
||||||
|
'src-name': 'test_value_37',
|
||||||
|
'src-name6': 'test_value_38',
|
||||||
|
'src-port': '39',
|
||||||
|
'src-start-ip': 'test_value_40',
|
||||||
|
'src-start-ip6': 'test_value_41',
|
||||||
|
'src-subnet': 'test_value_42',
|
||||||
|
'src-subnet6': 'test_value_43'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'phase2-interface', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_interface_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_phase2_interface': {
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_discovery_forwarder': 'phase1',
|
||||||
|
'auto_discovery_sender': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_7',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_11',
|
||||||
|
'dst_end_ip6': 'test_value_12',
|
||||||
|
'dst_name': 'test_value_13',
|
||||||
|
'dst_name6': 'test_value_14',
|
||||||
|
'dst_port': '15',
|
||||||
|
'dst_start_ip': 'test_value_16',
|
||||||
|
'dst_start_ip6': 'test_value_17',
|
||||||
|
'dst_subnet': 'test_value_18',
|
||||||
|
'dst_subnet6': 'test_value_19',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '23',
|
||||||
|
'keylifeseconds': '24',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_26',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_28',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '30',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_35',
|
||||||
|
'src_end_ip6': 'test_value_36',
|
||||||
|
'src_name': 'test_value_37',
|
||||||
|
'src_name6': 'test_value_38',
|
||||||
|
'src_port': '39',
|
||||||
|
'src_start_ip': 'test_value_40',
|
||||||
|
'src_start_ip6': 'test_value_41',
|
||||||
|
'src_subnet': 'test_value_42',
|
||||||
|
'src_subnet6': 'test_value_43'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'phase2-interface', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_interface_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ipsec_phase2_interface': {
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_discovery_forwarder': 'phase1',
|
||||||
|
'auto_discovery_sender': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_7',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_11',
|
||||||
|
'dst_end_ip6': 'test_value_12',
|
||||||
|
'dst_name': 'test_value_13',
|
||||||
|
'dst_name6': 'test_value_14',
|
||||||
|
'dst_port': '15',
|
||||||
|
'dst_start_ip': 'test_value_16',
|
||||||
|
'dst_start_ip6': 'test_value_17',
|
||||||
|
'dst_subnet': 'test_value_18',
|
||||||
|
'dst_subnet6': 'test_value_19',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '23',
|
||||||
|
'keylifeseconds': '24',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_26',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_28',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '30',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_35',
|
||||||
|
'src_end_ip6': 'test_value_36',
|
||||||
|
'src_name': 'test_value_37',
|
||||||
|
'src_name6': 'test_value_38',
|
||||||
|
'src_port': '39',
|
||||||
|
'src_start_ip': 'test_value_40',
|
||||||
|
'src_start_ip6': 'test_value_41',
|
||||||
|
'src_subnet': 'test_value_42',
|
||||||
|
'src_subnet6': 'test_value_43'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ipsec', 'phase2-interface', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_interface_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_phase2_interface': {
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_discovery_forwarder': 'phase1',
|
||||||
|
'auto_discovery_sender': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_7',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_11',
|
||||||
|
'dst_end_ip6': 'test_value_12',
|
||||||
|
'dst_name': 'test_value_13',
|
||||||
|
'dst_name6': 'test_value_14',
|
||||||
|
'dst_port': '15',
|
||||||
|
'dst_start_ip': 'test_value_16',
|
||||||
|
'dst_start_ip6': 'test_value_17',
|
||||||
|
'dst_subnet': 'test_value_18',
|
||||||
|
'dst_subnet6': 'test_value_19',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '23',
|
||||||
|
'keylifeseconds': '24',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_26',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_28',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '30',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_35',
|
||||||
|
'src_end_ip6': 'test_value_36',
|
||||||
|
'src_name': 'test_value_37',
|
||||||
|
'src_name6': 'test_value_38',
|
||||||
|
'src_port': '39',
|
||||||
|
'src_start_ip': 'test_value_40',
|
||||||
|
'src_start_ip6': 'test_value_41',
|
||||||
|
'src_subnet': 'test_value_42',
|
||||||
|
'src_subnet6': 'test_value_43'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'add-route': 'phase1',
|
||||||
|
'auto-discovery-forwarder': 'phase1',
|
||||||
|
'auto-discovery-sender': 'phase1',
|
||||||
|
'auto-negotiate': 'enable',
|
||||||
|
'comments': 'test_value_7',
|
||||||
|
'dhcp-ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst-addr-type': 'subnet',
|
||||||
|
'dst-end-ip': 'test_value_11',
|
||||||
|
'dst-end-ip6': 'test_value_12',
|
||||||
|
'dst-name': 'test_value_13',
|
||||||
|
'dst-name6': 'test_value_14',
|
||||||
|
'dst-port': '15',
|
||||||
|
'dst-start-ip': 'test_value_16',
|
||||||
|
'dst-start-ip6': 'test_value_17',
|
||||||
|
'dst-subnet': 'test_value_18',
|
||||||
|
'dst-subnet6': 'test_value_19',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife-type': 'seconds',
|
||||||
|
'keylifekbs': '23',
|
||||||
|
'keylifeseconds': '24',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_26',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_28',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '30',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route-overlap': 'use-old',
|
||||||
|
'single-source': 'enable',
|
||||||
|
'src-addr-type': 'subnet',
|
||||||
|
'src-end-ip': 'test_value_35',
|
||||||
|
'src-end-ip6': 'test_value_36',
|
||||||
|
'src-name': 'test_value_37',
|
||||||
|
'src-name6': 'test_value_38',
|
||||||
|
'src-port': '39',
|
||||||
|
'src-start-ip': 'test_value_40',
|
||||||
|
'src-start-ip6': 'test_value_41',
|
||||||
|
'src-subnet': 'test_value_42',
|
||||||
|
'src-subnet6': 'test_value_43'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'phase2-interface', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ipsec_phase2_interface_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ipsec_phase2_interface': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'add_route': 'phase1',
|
||||||
|
'auto_discovery_forwarder': 'phase1',
|
||||||
|
'auto_discovery_sender': 'phase1',
|
||||||
|
'auto_negotiate': 'enable',
|
||||||
|
'comments': 'test_value_7',
|
||||||
|
'dhcp_ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst_addr_type': 'subnet',
|
||||||
|
'dst_end_ip': 'test_value_11',
|
||||||
|
'dst_end_ip6': 'test_value_12',
|
||||||
|
'dst_name': 'test_value_13',
|
||||||
|
'dst_name6': 'test_value_14',
|
||||||
|
'dst_port': '15',
|
||||||
|
'dst_start_ip': 'test_value_16',
|
||||||
|
'dst_start_ip6': 'test_value_17',
|
||||||
|
'dst_subnet': 'test_value_18',
|
||||||
|
'dst_subnet6': 'test_value_19',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife_type': 'seconds',
|
||||||
|
'keylifekbs': '23',
|
||||||
|
'keylifeseconds': '24',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_26',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_28',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '30',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route_overlap': 'use-old',
|
||||||
|
'single_source': 'enable',
|
||||||
|
'src_addr_type': 'subnet',
|
||||||
|
'src_end_ip': 'test_value_35',
|
||||||
|
'src_end_ip6': 'test_value_36',
|
||||||
|
'src_name': 'test_value_37',
|
||||||
|
'src_name6': 'test_value_38',
|
||||||
|
'src_port': '39',
|
||||||
|
'src_start_ip': 'test_value_40',
|
||||||
|
'src_start_ip6': 'test_value_41',
|
||||||
|
'src_subnet': 'test_value_42',
|
||||||
|
'src_subnet6': 'test_value_43'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ipsec_phase2_interface.fortios_vpn_ipsec(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'add-route': 'phase1',
|
||||||
|
'auto-discovery-forwarder': 'phase1',
|
||||||
|
'auto-discovery-sender': 'phase1',
|
||||||
|
'auto-negotiate': 'enable',
|
||||||
|
'comments': 'test_value_7',
|
||||||
|
'dhcp-ipsec': 'enable',
|
||||||
|
'dhgrp': '1',
|
||||||
|
'dst-addr-type': 'subnet',
|
||||||
|
'dst-end-ip': 'test_value_11',
|
||||||
|
'dst-end-ip6': 'test_value_12',
|
||||||
|
'dst-name': 'test_value_13',
|
||||||
|
'dst-name6': 'test_value_14',
|
||||||
|
'dst-port': '15',
|
||||||
|
'dst-start-ip': 'test_value_16',
|
||||||
|
'dst-start-ip6': 'test_value_17',
|
||||||
|
'dst-subnet': 'test_value_18',
|
||||||
|
'dst-subnet6': 'test_value_19',
|
||||||
|
'encapsulation': 'tunnel-mode',
|
||||||
|
'keepalive': 'enable',
|
||||||
|
'keylife-type': 'seconds',
|
||||||
|
'keylifekbs': '23',
|
||||||
|
'keylifeseconds': '24',
|
||||||
|
'l2tp': 'enable',
|
||||||
|
'name': 'default_name_26',
|
||||||
|
'pfs': 'enable',
|
||||||
|
'phase1name': 'test_value_28',
|
||||||
|
'proposal': 'null-md5',
|
||||||
|
'protocol': '30',
|
||||||
|
'replay': 'enable',
|
||||||
|
'route-overlap': 'use-old',
|
||||||
|
'single-source': 'enable',
|
||||||
|
'src-addr-type': 'subnet',
|
||||||
|
'src-end-ip': 'test_value_35',
|
||||||
|
'src-end-ip6': 'test_value_36',
|
||||||
|
'src-name': 'test_value_37',
|
||||||
|
'src-name6': 'test_value_38',
|
||||||
|
'src-port': '39',
|
||||||
|
'src-start-ip': 'test_value_40',
|
||||||
|
'src-start-ip6': 'test_value_41',
|
||||||
|
'src-subnet': 'test_value_42',
|
||||||
|
'src-subnet6': 'test_value_43'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ipsec', 'phase2-interface', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,495 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_vpn_ssl_settings
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_vpn_ssl_settings.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ssl_settings_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ssl_settings': {
|
||||||
|
'auth_timeout': '3',
|
||||||
|
'auto_tunnel_static_route': 'enable',
|
||||||
|
'banned_cipher': 'RSA',
|
||||||
|
'check_referer': 'enable',
|
||||||
|
'default_portal': 'test_value_7',
|
||||||
|
'deflate_compression_level': '8',
|
||||||
|
'deflate_min_data_size': '9',
|
||||||
|
'dns_server1': 'test_value_10',
|
||||||
|
'dns_server2': 'test_value_11',
|
||||||
|
'dns_suffix': 'test_value_12',
|
||||||
|
'dtls_hello_timeout': '13',
|
||||||
|
'dtls_tunnel': 'enable',
|
||||||
|
'force_two_factor_auth': 'enable',
|
||||||
|
'header_x_forwarded_for': 'pass',
|
||||||
|
'http_compression': 'enable',
|
||||||
|
'http_only_cookie': 'enable',
|
||||||
|
'http_request_body_timeout': '19',
|
||||||
|
'http_request_header_timeout': '20',
|
||||||
|
'https_redirect': 'enable',
|
||||||
|
'idle_timeout': '22',
|
||||||
|
'ipv6_dns_server1': 'test_value_23',
|
||||||
|
'ipv6_dns_server2': 'test_value_24',
|
||||||
|
'ipv6_wins_server1': 'test_value_25',
|
||||||
|
'ipv6_wins_server2': 'test_value_26',
|
||||||
|
'login_attempt_limit': '27',
|
||||||
|
'login_block_time': '28',
|
||||||
|
'login_timeout': '29',
|
||||||
|
'port': '30',
|
||||||
|
'port_precedence': 'enable',
|
||||||
|
'reqclientcert': 'enable',
|
||||||
|
'route_source_interface': 'enable',
|
||||||
|
'servercert': 'test_value_34',
|
||||||
|
'source_address_negate': 'enable',
|
||||||
|
'source_address6_negate': 'enable',
|
||||||
|
'ssl_client_renegotiation': 'disable',
|
||||||
|
'ssl_insert_empty_fragment': 'enable',
|
||||||
|
'tlsv1_0': 'enable',
|
||||||
|
'tlsv1_1': 'enable',
|
||||||
|
'tlsv1_2': 'enable',
|
||||||
|
'unsafe_legacy_renegotiation': 'enable',
|
||||||
|
'url_obscuration': 'enable',
|
||||||
|
'wins_server1': 'test_value_44',
|
||||||
|
'wins_server2': 'test_value_45',
|
||||||
|
'x_content_type_options': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ssl_settings.fortios_vpn_ssl(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auth-timeout': '3',
|
||||||
|
'auto-tunnel-static-route': 'enable',
|
||||||
|
'banned-cipher': 'RSA',
|
||||||
|
'check-referer': 'enable',
|
||||||
|
'default-portal': 'test_value_7',
|
||||||
|
'deflate-compression-level': '8',
|
||||||
|
'deflate-min-data-size': '9',
|
||||||
|
'dns-server1': 'test_value_10',
|
||||||
|
'dns-server2': 'test_value_11',
|
||||||
|
'dns-suffix': 'test_value_12',
|
||||||
|
'dtls-hello-timeout': '13',
|
||||||
|
'dtls-tunnel': 'enable',
|
||||||
|
'force-two-factor-auth': 'enable',
|
||||||
|
'header-x-forwarded-for': 'pass',
|
||||||
|
'http-compression': 'enable',
|
||||||
|
'http-only-cookie': 'enable',
|
||||||
|
'http-request-body-timeout': '19',
|
||||||
|
'http-request-header-timeout': '20',
|
||||||
|
'https-redirect': 'enable',
|
||||||
|
'idle-timeout': '22',
|
||||||
|
'ipv6-dns-server1': 'test_value_23',
|
||||||
|
'ipv6-dns-server2': 'test_value_24',
|
||||||
|
'ipv6-wins-server1': 'test_value_25',
|
||||||
|
'ipv6-wins-server2': 'test_value_26',
|
||||||
|
'login-attempt-limit': '27',
|
||||||
|
'login-block-time': '28',
|
||||||
|
'login-timeout': '29',
|
||||||
|
'port': '30',
|
||||||
|
'port-precedence': 'enable',
|
||||||
|
'reqclientcert': 'enable',
|
||||||
|
'route-source-interface': 'enable',
|
||||||
|
'servercert': 'test_value_34',
|
||||||
|
'source-address-negate': 'enable',
|
||||||
|
'source-address6-negate': 'enable',
|
||||||
|
'ssl-client-renegotiation': 'disable',
|
||||||
|
'ssl-insert-empty-fragment': 'enable',
|
||||||
|
'tlsv1-0': 'enable',
|
||||||
|
'tlsv1-1': 'enable',
|
||||||
|
'tlsv1-2': 'enable',
|
||||||
|
'unsafe-legacy-renegotiation': 'enable',
|
||||||
|
'url-obscuration': 'enable',
|
||||||
|
'wins-server1': 'test_value_44',
|
||||||
|
'wins-server2': 'test_value_45',
|
||||||
|
'x-content-type-options': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ssl', 'settings', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ssl_settings_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ssl_settings': {
|
||||||
|
'auth_timeout': '3',
|
||||||
|
'auto_tunnel_static_route': 'enable',
|
||||||
|
'banned_cipher': 'RSA',
|
||||||
|
'check_referer': 'enable',
|
||||||
|
'default_portal': 'test_value_7',
|
||||||
|
'deflate_compression_level': '8',
|
||||||
|
'deflate_min_data_size': '9',
|
||||||
|
'dns_server1': 'test_value_10',
|
||||||
|
'dns_server2': 'test_value_11',
|
||||||
|
'dns_suffix': 'test_value_12',
|
||||||
|
'dtls_hello_timeout': '13',
|
||||||
|
'dtls_tunnel': 'enable',
|
||||||
|
'force_two_factor_auth': 'enable',
|
||||||
|
'header_x_forwarded_for': 'pass',
|
||||||
|
'http_compression': 'enable',
|
||||||
|
'http_only_cookie': 'enable',
|
||||||
|
'http_request_body_timeout': '19',
|
||||||
|
'http_request_header_timeout': '20',
|
||||||
|
'https_redirect': 'enable',
|
||||||
|
'idle_timeout': '22',
|
||||||
|
'ipv6_dns_server1': 'test_value_23',
|
||||||
|
'ipv6_dns_server2': 'test_value_24',
|
||||||
|
'ipv6_wins_server1': 'test_value_25',
|
||||||
|
'ipv6_wins_server2': 'test_value_26',
|
||||||
|
'login_attempt_limit': '27',
|
||||||
|
'login_block_time': '28',
|
||||||
|
'login_timeout': '29',
|
||||||
|
'port': '30',
|
||||||
|
'port_precedence': 'enable',
|
||||||
|
'reqclientcert': 'enable',
|
||||||
|
'route_source_interface': 'enable',
|
||||||
|
'servercert': 'test_value_34',
|
||||||
|
'source_address_negate': 'enable',
|
||||||
|
'source_address6_negate': 'enable',
|
||||||
|
'ssl_client_renegotiation': 'disable',
|
||||||
|
'ssl_insert_empty_fragment': 'enable',
|
||||||
|
'tlsv1_0': 'enable',
|
||||||
|
'tlsv1_1': 'enable',
|
||||||
|
'tlsv1_2': 'enable',
|
||||||
|
'unsafe_legacy_renegotiation': 'enable',
|
||||||
|
'url_obscuration': 'enable',
|
||||||
|
'wins_server1': 'test_value_44',
|
||||||
|
'wins_server2': 'test_value_45',
|
||||||
|
'x_content_type_options': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ssl_settings.fortios_vpn_ssl(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auth-timeout': '3',
|
||||||
|
'auto-tunnel-static-route': 'enable',
|
||||||
|
'banned-cipher': 'RSA',
|
||||||
|
'check-referer': 'enable',
|
||||||
|
'default-portal': 'test_value_7',
|
||||||
|
'deflate-compression-level': '8',
|
||||||
|
'deflate-min-data-size': '9',
|
||||||
|
'dns-server1': 'test_value_10',
|
||||||
|
'dns-server2': 'test_value_11',
|
||||||
|
'dns-suffix': 'test_value_12',
|
||||||
|
'dtls-hello-timeout': '13',
|
||||||
|
'dtls-tunnel': 'enable',
|
||||||
|
'force-two-factor-auth': 'enable',
|
||||||
|
'header-x-forwarded-for': 'pass',
|
||||||
|
'http-compression': 'enable',
|
||||||
|
'http-only-cookie': 'enable',
|
||||||
|
'http-request-body-timeout': '19',
|
||||||
|
'http-request-header-timeout': '20',
|
||||||
|
'https-redirect': 'enable',
|
||||||
|
'idle-timeout': '22',
|
||||||
|
'ipv6-dns-server1': 'test_value_23',
|
||||||
|
'ipv6-dns-server2': 'test_value_24',
|
||||||
|
'ipv6-wins-server1': 'test_value_25',
|
||||||
|
'ipv6-wins-server2': 'test_value_26',
|
||||||
|
'login-attempt-limit': '27',
|
||||||
|
'login-block-time': '28',
|
||||||
|
'login-timeout': '29',
|
||||||
|
'port': '30',
|
||||||
|
'port-precedence': 'enable',
|
||||||
|
'reqclientcert': 'enable',
|
||||||
|
'route-source-interface': 'enable',
|
||||||
|
'servercert': 'test_value_34',
|
||||||
|
'source-address-negate': 'enable',
|
||||||
|
'source-address6-negate': 'enable',
|
||||||
|
'ssl-client-renegotiation': 'disable',
|
||||||
|
'ssl-insert-empty-fragment': 'enable',
|
||||||
|
'tlsv1-0': 'enable',
|
||||||
|
'tlsv1-1': 'enable',
|
||||||
|
'tlsv1-2': 'enable',
|
||||||
|
'unsafe-legacy-renegotiation': 'enable',
|
||||||
|
'url-obscuration': 'enable',
|
||||||
|
'wins-server1': 'test_value_44',
|
||||||
|
'wins-server2': 'test_value_45',
|
||||||
|
'x-content-type-options': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ssl', 'settings', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ssl_settings_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ssl_settings': {
|
||||||
|
'auth_timeout': '3',
|
||||||
|
'auto_tunnel_static_route': 'enable',
|
||||||
|
'banned_cipher': 'RSA',
|
||||||
|
'check_referer': 'enable',
|
||||||
|
'default_portal': 'test_value_7',
|
||||||
|
'deflate_compression_level': '8',
|
||||||
|
'deflate_min_data_size': '9',
|
||||||
|
'dns_server1': 'test_value_10',
|
||||||
|
'dns_server2': 'test_value_11',
|
||||||
|
'dns_suffix': 'test_value_12',
|
||||||
|
'dtls_hello_timeout': '13',
|
||||||
|
'dtls_tunnel': 'enable',
|
||||||
|
'force_two_factor_auth': 'enable',
|
||||||
|
'header_x_forwarded_for': 'pass',
|
||||||
|
'http_compression': 'enable',
|
||||||
|
'http_only_cookie': 'enable',
|
||||||
|
'http_request_body_timeout': '19',
|
||||||
|
'http_request_header_timeout': '20',
|
||||||
|
'https_redirect': 'enable',
|
||||||
|
'idle_timeout': '22',
|
||||||
|
'ipv6_dns_server1': 'test_value_23',
|
||||||
|
'ipv6_dns_server2': 'test_value_24',
|
||||||
|
'ipv6_wins_server1': 'test_value_25',
|
||||||
|
'ipv6_wins_server2': 'test_value_26',
|
||||||
|
'login_attempt_limit': '27',
|
||||||
|
'login_block_time': '28',
|
||||||
|
'login_timeout': '29',
|
||||||
|
'port': '30',
|
||||||
|
'port_precedence': 'enable',
|
||||||
|
'reqclientcert': 'enable',
|
||||||
|
'route_source_interface': 'enable',
|
||||||
|
'servercert': 'test_value_34',
|
||||||
|
'source_address_negate': 'enable',
|
||||||
|
'source_address6_negate': 'enable',
|
||||||
|
'ssl_client_renegotiation': 'disable',
|
||||||
|
'ssl_insert_empty_fragment': 'enable',
|
||||||
|
'tlsv1_0': 'enable',
|
||||||
|
'tlsv1_1': 'enable',
|
||||||
|
'tlsv1_2': 'enable',
|
||||||
|
'unsafe_legacy_renegotiation': 'enable',
|
||||||
|
'url_obscuration': 'enable',
|
||||||
|
'wins_server1': 'test_value_44',
|
||||||
|
'wins_server2': 'test_value_45',
|
||||||
|
'x_content_type_options': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ssl_settings.fortios_vpn_ssl(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auth-timeout': '3',
|
||||||
|
'auto-tunnel-static-route': 'enable',
|
||||||
|
'banned-cipher': 'RSA',
|
||||||
|
'check-referer': 'enable',
|
||||||
|
'default-portal': 'test_value_7',
|
||||||
|
'deflate-compression-level': '8',
|
||||||
|
'deflate-min-data-size': '9',
|
||||||
|
'dns-server1': 'test_value_10',
|
||||||
|
'dns-server2': 'test_value_11',
|
||||||
|
'dns-suffix': 'test_value_12',
|
||||||
|
'dtls-hello-timeout': '13',
|
||||||
|
'dtls-tunnel': 'enable',
|
||||||
|
'force-two-factor-auth': 'enable',
|
||||||
|
'header-x-forwarded-for': 'pass',
|
||||||
|
'http-compression': 'enable',
|
||||||
|
'http-only-cookie': 'enable',
|
||||||
|
'http-request-body-timeout': '19',
|
||||||
|
'http-request-header-timeout': '20',
|
||||||
|
'https-redirect': 'enable',
|
||||||
|
'idle-timeout': '22',
|
||||||
|
'ipv6-dns-server1': 'test_value_23',
|
||||||
|
'ipv6-dns-server2': 'test_value_24',
|
||||||
|
'ipv6-wins-server1': 'test_value_25',
|
||||||
|
'ipv6-wins-server2': 'test_value_26',
|
||||||
|
'login-attempt-limit': '27',
|
||||||
|
'login-block-time': '28',
|
||||||
|
'login-timeout': '29',
|
||||||
|
'port': '30',
|
||||||
|
'port-precedence': 'enable',
|
||||||
|
'reqclientcert': 'enable',
|
||||||
|
'route-source-interface': 'enable',
|
||||||
|
'servercert': 'test_value_34',
|
||||||
|
'source-address-negate': 'enable',
|
||||||
|
'source-address6-negate': 'enable',
|
||||||
|
'ssl-client-renegotiation': 'disable',
|
||||||
|
'ssl-insert-empty-fragment': 'enable',
|
||||||
|
'tlsv1-0': 'enable',
|
||||||
|
'tlsv1-1': 'enable',
|
||||||
|
'tlsv1-2': 'enable',
|
||||||
|
'unsafe-legacy-renegotiation': 'enable',
|
||||||
|
'url-obscuration': 'enable',
|
||||||
|
'wins-server1': 'test_value_44',
|
||||||
|
'wins-server2': 'test_value_45',
|
||||||
|
'x-content-type-options': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ssl', 'settings', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ssl_settings_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ssl_settings': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'auth_timeout': '3',
|
||||||
|
'auto_tunnel_static_route': 'enable',
|
||||||
|
'banned_cipher': 'RSA',
|
||||||
|
'check_referer': 'enable',
|
||||||
|
'default_portal': 'test_value_7',
|
||||||
|
'deflate_compression_level': '8',
|
||||||
|
'deflate_min_data_size': '9',
|
||||||
|
'dns_server1': 'test_value_10',
|
||||||
|
'dns_server2': 'test_value_11',
|
||||||
|
'dns_suffix': 'test_value_12',
|
||||||
|
'dtls_hello_timeout': '13',
|
||||||
|
'dtls_tunnel': 'enable',
|
||||||
|
'force_two_factor_auth': 'enable',
|
||||||
|
'header_x_forwarded_for': 'pass',
|
||||||
|
'http_compression': 'enable',
|
||||||
|
'http_only_cookie': 'enable',
|
||||||
|
'http_request_body_timeout': '19',
|
||||||
|
'http_request_header_timeout': '20',
|
||||||
|
'https_redirect': 'enable',
|
||||||
|
'idle_timeout': '22',
|
||||||
|
'ipv6_dns_server1': 'test_value_23',
|
||||||
|
'ipv6_dns_server2': 'test_value_24',
|
||||||
|
'ipv6_wins_server1': 'test_value_25',
|
||||||
|
'ipv6_wins_server2': 'test_value_26',
|
||||||
|
'login_attempt_limit': '27',
|
||||||
|
'login_block_time': '28',
|
||||||
|
'login_timeout': '29',
|
||||||
|
'port': '30',
|
||||||
|
'port_precedence': 'enable',
|
||||||
|
'reqclientcert': 'enable',
|
||||||
|
'route_source_interface': 'enable',
|
||||||
|
'servercert': 'test_value_34',
|
||||||
|
'source_address_negate': 'enable',
|
||||||
|
'source_address6_negate': 'enable',
|
||||||
|
'ssl_client_renegotiation': 'disable',
|
||||||
|
'ssl_insert_empty_fragment': 'enable',
|
||||||
|
'tlsv1_0': 'enable',
|
||||||
|
'tlsv1_1': 'enable',
|
||||||
|
'tlsv1_2': 'enable',
|
||||||
|
'unsafe_legacy_renegotiation': 'enable',
|
||||||
|
'url_obscuration': 'enable',
|
||||||
|
'wins_server1': 'test_value_44',
|
||||||
|
'wins_server2': 'test_value_45',
|
||||||
|
'x_content_type_options': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ssl_settings.fortios_vpn_ssl(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auth-timeout': '3',
|
||||||
|
'auto-tunnel-static-route': 'enable',
|
||||||
|
'banned-cipher': 'RSA',
|
||||||
|
'check-referer': 'enable',
|
||||||
|
'default-portal': 'test_value_7',
|
||||||
|
'deflate-compression-level': '8',
|
||||||
|
'deflate-min-data-size': '9',
|
||||||
|
'dns-server1': 'test_value_10',
|
||||||
|
'dns-server2': 'test_value_11',
|
||||||
|
'dns-suffix': 'test_value_12',
|
||||||
|
'dtls-hello-timeout': '13',
|
||||||
|
'dtls-tunnel': 'enable',
|
||||||
|
'force-two-factor-auth': 'enable',
|
||||||
|
'header-x-forwarded-for': 'pass',
|
||||||
|
'http-compression': 'enable',
|
||||||
|
'http-only-cookie': 'enable',
|
||||||
|
'http-request-body-timeout': '19',
|
||||||
|
'http-request-header-timeout': '20',
|
||||||
|
'https-redirect': 'enable',
|
||||||
|
'idle-timeout': '22',
|
||||||
|
'ipv6-dns-server1': 'test_value_23',
|
||||||
|
'ipv6-dns-server2': 'test_value_24',
|
||||||
|
'ipv6-wins-server1': 'test_value_25',
|
||||||
|
'ipv6-wins-server2': 'test_value_26',
|
||||||
|
'login-attempt-limit': '27',
|
||||||
|
'login-block-time': '28',
|
||||||
|
'login-timeout': '29',
|
||||||
|
'port': '30',
|
||||||
|
'port-precedence': 'enable',
|
||||||
|
'reqclientcert': 'enable',
|
||||||
|
'route-source-interface': 'enable',
|
||||||
|
'servercert': 'test_value_34',
|
||||||
|
'source-address-negate': 'enable',
|
||||||
|
'source-address6-negate': 'enable',
|
||||||
|
'ssl-client-renegotiation': 'disable',
|
||||||
|
'ssl-insert-empty-fragment': 'enable',
|
||||||
|
'tlsv1-0': 'enable',
|
||||||
|
'tlsv1-1': 'enable',
|
||||||
|
'tlsv1-2': 'enable',
|
||||||
|
'unsafe-legacy-renegotiation': 'enable',
|
||||||
|
'url-obscuration': 'enable',
|
||||||
|
'wins-server1': 'test_value_44',
|
||||||
|
'wins-server2': 'test_value_45',
|
||||||
|
'x-content-type-options': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ssl', 'settings', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,689 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_vpn_ssl_web_portal
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_vpn_ssl_web_portal.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ssl_web_portal_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ssl_web_portal': {
|
||||||
|
'allow_user_access': 'web',
|
||||||
|
'auto_connect': 'enable',
|
||||||
|
'custom_lang': 'test_value_5',
|
||||||
|
'customize_forticlient_download_url': 'enable',
|
||||||
|
'display_bookmark': 'enable',
|
||||||
|
'display_connection_tools': 'enable',
|
||||||
|
'display_history': 'enable',
|
||||||
|
'display_status': 'enable',
|
||||||
|
'dns_server1': 'test_value_11',
|
||||||
|
'dns_server2': 'test_value_12',
|
||||||
|
'dns_suffix': 'test_value_13',
|
||||||
|
'exclusive_routing': 'enable',
|
||||||
|
'forticlient_download': 'enable',
|
||||||
|
'forticlient_download_method': 'direct',
|
||||||
|
'heading': 'test_value_17',
|
||||||
|
'hide_sso_credential': 'enable',
|
||||||
|
'host_check': 'none',
|
||||||
|
'host_check_interval': '20',
|
||||||
|
'ip_mode': 'range',
|
||||||
|
'ipv6_dns_server1': 'test_value_22',
|
||||||
|
'ipv6_dns_server2': 'test_value_23',
|
||||||
|
'ipv6_exclusive_routing': 'enable',
|
||||||
|
'ipv6_service_restriction': 'enable',
|
||||||
|
'ipv6_split_tunneling': 'enable',
|
||||||
|
'ipv6_tunnel_mode': 'enable',
|
||||||
|
'ipv6_wins_server1': 'test_value_28',
|
||||||
|
'ipv6_wins_server2': 'test_value_29',
|
||||||
|
'keep_alive': 'enable',
|
||||||
|
'limit_user_logins': 'enable',
|
||||||
|
'mac_addr_action': 'allow',
|
||||||
|
'mac_addr_check': 'enable',
|
||||||
|
'macos_forticlient_download_url': 'test_value_34',
|
||||||
|
'name': 'default_name_35',
|
||||||
|
'os_check': 'enable',
|
||||||
|
'redir_url': 'test_value_37',
|
||||||
|
'save_password': 'enable',
|
||||||
|
'service_restriction': 'enable',
|
||||||
|
'skip_check_for_unsupported_browser': 'enable',
|
||||||
|
'skip_check_for_unsupported_os': 'enable',
|
||||||
|
'smb_ntlmv1_auth': 'enable',
|
||||||
|
'smbv1': 'enable',
|
||||||
|
'split_tunneling': 'enable',
|
||||||
|
'theme': 'blue',
|
||||||
|
'tunnel_mode': 'enable',
|
||||||
|
'user_bookmark': 'enable',
|
||||||
|
'user_group_bookmark': 'enable',
|
||||||
|
'web_mode': 'enable',
|
||||||
|
'windows_forticlient_download_url': 'test_value_50',
|
||||||
|
'wins_server1': 'test_value_51',
|
||||||
|
'wins_server2': 'test_value_52'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ssl_web_portal.fortios_vpn_ssl_web(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'allow-user-access': 'web',
|
||||||
|
'auto-connect': 'enable',
|
||||||
|
'custom-lang': 'test_value_5',
|
||||||
|
'customize-forticlient-download-url': 'enable',
|
||||||
|
'display-bookmark': 'enable',
|
||||||
|
'display-connection-tools': 'enable',
|
||||||
|
'display-history': 'enable',
|
||||||
|
'display-status': 'enable',
|
||||||
|
'dns-server1': 'test_value_11',
|
||||||
|
'dns-server2': 'test_value_12',
|
||||||
|
'dns-suffix': 'test_value_13',
|
||||||
|
'exclusive-routing': 'enable',
|
||||||
|
'forticlient-download': 'enable',
|
||||||
|
'forticlient-download-method': 'direct',
|
||||||
|
'heading': 'test_value_17',
|
||||||
|
'hide-sso-credential': 'enable',
|
||||||
|
'host-check': 'none',
|
||||||
|
'host-check-interval': '20',
|
||||||
|
'ip-mode': 'range',
|
||||||
|
'ipv6-dns-server1': 'test_value_22',
|
||||||
|
'ipv6-dns-server2': 'test_value_23',
|
||||||
|
'ipv6-exclusive-routing': 'enable',
|
||||||
|
'ipv6-service-restriction': 'enable',
|
||||||
|
'ipv6-split-tunneling': 'enable',
|
||||||
|
'ipv6-tunnel-mode': 'enable',
|
||||||
|
'ipv6-wins-server1': 'test_value_28',
|
||||||
|
'ipv6-wins-server2': 'test_value_29',
|
||||||
|
'keep-alive': 'enable',
|
||||||
|
'limit-user-logins': 'enable',
|
||||||
|
'mac-addr-action': 'allow',
|
||||||
|
'mac-addr-check': 'enable',
|
||||||
|
'macos-forticlient-download-url': 'test_value_34',
|
||||||
|
'name': 'default_name_35',
|
||||||
|
'os-check': 'enable',
|
||||||
|
'redir-url': 'test_value_37',
|
||||||
|
'save-password': 'enable',
|
||||||
|
'service-restriction': 'enable',
|
||||||
|
'skip-check-for-unsupported-browser': 'enable',
|
||||||
|
'skip-check-for-unsupported-os': 'enable',
|
||||||
|
'smb-ntlmv1-auth': 'enable',
|
||||||
|
'smbv1': 'enable',
|
||||||
|
'split-tunneling': 'enable',
|
||||||
|
'theme': 'blue',
|
||||||
|
'tunnel-mode': 'enable',
|
||||||
|
'user-bookmark': 'enable',
|
||||||
|
'user-group-bookmark': 'enable',
|
||||||
|
'web-mode': 'enable',
|
||||||
|
'windows-forticlient-download-url': 'test_value_50',
|
||||||
|
'wins-server1': 'test_value_51',
|
||||||
|
'wins-server2': 'test_value_52'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ssl.web', 'portal', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ssl_web_portal_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ssl_web_portal': {
|
||||||
|
'allow_user_access': 'web',
|
||||||
|
'auto_connect': 'enable',
|
||||||
|
'custom_lang': 'test_value_5',
|
||||||
|
'customize_forticlient_download_url': 'enable',
|
||||||
|
'display_bookmark': 'enable',
|
||||||
|
'display_connection_tools': 'enable',
|
||||||
|
'display_history': 'enable',
|
||||||
|
'display_status': 'enable',
|
||||||
|
'dns_server1': 'test_value_11',
|
||||||
|
'dns_server2': 'test_value_12',
|
||||||
|
'dns_suffix': 'test_value_13',
|
||||||
|
'exclusive_routing': 'enable',
|
||||||
|
'forticlient_download': 'enable',
|
||||||
|
'forticlient_download_method': 'direct',
|
||||||
|
'heading': 'test_value_17',
|
||||||
|
'hide_sso_credential': 'enable',
|
||||||
|
'host_check': 'none',
|
||||||
|
'host_check_interval': '20',
|
||||||
|
'ip_mode': 'range',
|
||||||
|
'ipv6_dns_server1': 'test_value_22',
|
||||||
|
'ipv6_dns_server2': 'test_value_23',
|
||||||
|
'ipv6_exclusive_routing': 'enable',
|
||||||
|
'ipv6_service_restriction': 'enable',
|
||||||
|
'ipv6_split_tunneling': 'enable',
|
||||||
|
'ipv6_tunnel_mode': 'enable',
|
||||||
|
'ipv6_wins_server1': 'test_value_28',
|
||||||
|
'ipv6_wins_server2': 'test_value_29',
|
||||||
|
'keep_alive': 'enable',
|
||||||
|
'limit_user_logins': 'enable',
|
||||||
|
'mac_addr_action': 'allow',
|
||||||
|
'mac_addr_check': 'enable',
|
||||||
|
'macos_forticlient_download_url': 'test_value_34',
|
||||||
|
'name': 'default_name_35',
|
||||||
|
'os_check': 'enable',
|
||||||
|
'redir_url': 'test_value_37',
|
||||||
|
'save_password': 'enable',
|
||||||
|
'service_restriction': 'enable',
|
||||||
|
'skip_check_for_unsupported_browser': 'enable',
|
||||||
|
'skip_check_for_unsupported_os': 'enable',
|
||||||
|
'smb_ntlmv1_auth': 'enable',
|
||||||
|
'smbv1': 'enable',
|
||||||
|
'split_tunneling': 'enable',
|
||||||
|
'theme': 'blue',
|
||||||
|
'tunnel_mode': 'enable',
|
||||||
|
'user_bookmark': 'enable',
|
||||||
|
'user_group_bookmark': 'enable',
|
||||||
|
'web_mode': 'enable',
|
||||||
|
'windows_forticlient_download_url': 'test_value_50',
|
||||||
|
'wins_server1': 'test_value_51',
|
||||||
|
'wins_server2': 'test_value_52'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ssl_web_portal.fortios_vpn_ssl_web(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'allow-user-access': 'web',
|
||||||
|
'auto-connect': 'enable',
|
||||||
|
'custom-lang': 'test_value_5',
|
||||||
|
'customize-forticlient-download-url': 'enable',
|
||||||
|
'display-bookmark': 'enable',
|
||||||
|
'display-connection-tools': 'enable',
|
||||||
|
'display-history': 'enable',
|
||||||
|
'display-status': 'enable',
|
||||||
|
'dns-server1': 'test_value_11',
|
||||||
|
'dns-server2': 'test_value_12',
|
||||||
|
'dns-suffix': 'test_value_13',
|
||||||
|
'exclusive-routing': 'enable',
|
||||||
|
'forticlient-download': 'enable',
|
||||||
|
'forticlient-download-method': 'direct',
|
||||||
|
'heading': 'test_value_17',
|
||||||
|
'hide-sso-credential': 'enable',
|
||||||
|
'host-check': 'none',
|
||||||
|
'host-check-interval': '20',
|
||||||
|
'ip-mode': 'range',
|
||||||
|
'ipv6-dns-server1': 'test_value_22',
|
||||||
|
'ipv6-dns-server2': 'test_value_23',
|
||||||
|
'ipv6-exclusive-routing': 'enable',
|
||||||
|
'ipv6-service-restriction': 'enable',
|
||||||
|
'ipv6-split-tunneling': 'enable',
|
||||||
|
'ipv6-tunnel-mode': 'enable',
|
||||||
|
'ipv6-wins-server1': 'test_value_28',
|
||||||
|
'ipv6-wins-server2': 'test_value_29',
|
||||||
|
'keep-alive': 'enable',
|
||||||
|
'limit-user-logins': 'enable',
|
||||||
|
'mac-addr-action': 'allow',
|
||||||
|
'mac-addr-check': 'enable',
|
||||||
|
'macos-forticlient-download-url': 'test_value_34',
|
||||||
|
'name': 'default_name_35',
|
||||||
|
'os-check': 'enable',
|
||||||
|
'redir-url': 'test_value_37',
|
||||||
|
'save-password': 'enable',
|
||||||
|
'service-restriction': 'enable',
|
||||||
|
'skip-check-for-unsupported-browser': 'enable',
|
||||||
|
'skip-check-for-unsupported-os': 'enable',
|
||||||
|
'smb-ntlmv1-auth': 'enable',
|
||||||
|
'smbv1': 'enable',
|
||||||
|
'split-tunneling': 'enable',
|
||||||
|
'theme': 'blue',
|
||||||
|
'tunnel-mode': 'enable',
|
||||||
|
'user-bookmark': 'enable',
|
||||||
|
'user-group-bookmark': 'enable',
|
||||||
|
'web-mode': 'enable',
|
||||||
|
'windows-forticlient-download-url': 'test_value_50',
|
||||||
|
'wins-server1': 'test_value_51',
|
||||||
|
'wins-server2': 'test_value_52'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ssl.web', 'portal', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ssl_web_portal_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ssl_web_portal': {
|
||||||
|
'allow_user_access': 'web',
|
||||||
|
'auto_connect': 'enable',
|
||||||
|
'custom_lang': 'test_value_5',
|
||||||
|
'customize_forticlient_download_url': 'enable',
|
||||||
|
'display_bookmark': 'enable',
|
||||||
|
'display_connection_tools': 'enable',
|
||||||
|
'display_history': 'enable',
|
||||||
|
'display_status': 'enable',
|
||||||
|
'dns_server1': 'test_value_11',
|
||||||
|
'dns_server2': 'test_value_12',
|
||||||
|
'dns_suffix': 'test_value_13',
|
||||||
|
'exclusive_routing': 'enable',
|
||||||
|
'forticlient_download': 'enable',
|
||||||
|
'forticlient_download_method': 'direct',
|
||||||
|
'heading': 'test_value_17',
|
||||||
|
'hide_sso_credential': 'enable',
|
||||||
|
'host_check': 'none',
|
||||||
|
'host_check_interval': '20',
|
||||||
|
'ip_mode': 'range',
|
||||||
|
'ipv6_dns_server1': 'test_value_22',
|
||||||
|
'ipv6_dns_server2': 'test_value_23',
|
||||||
|
'ipv6_exclusive_routing': 'enable',
|
||||||
|
'ipv6_service_restriction': 'enable',
|
||||||
|
'ipv6_split_tunneling': 'enable',
|
||||||
|
'ipv6_tunnel_mode': 'enable',
|
||||||
|
'ipv6_wins_server1': 'test_value_28',
|
||||||
|
'ipv6_wins_server2': 'test_value_29',
|
||||||
|
'keep_alive': 'enable',
|
||||||
|
'limit_user_logins': 'enable',
|
||||||
|
'mac_addr_action': 'allow',
|
||||||
|
'mac_addr_check': 'enable',
|
||||||
|
'macos_forticlient_download_url': 'test_value_34',
|
||||||
|
'name': 'default_name_35',
|
||||||
|
'os_check': 'enable',
|
||||||
|
'redir_url': 'test_value_37',
|
||||||
|
'save_password': 'enable',
|
||||||
|
'service_restriction': 'enable',
|
||||||
|
'skip_check_for_unsupported_browser': 'enable',
|
||||||
|
'skip_check_for_unsupported_os': 'enable',
|
||||||
|
'smb_ntlmv1_auth': 'enable',
|
||||||
|
'smbv1': 'enable',
|
||||||
|
'split_tunneling': 'enable',
|
||||||
|
'theme': 'blue',
|
||||||
|
'tunnel_mode': 'enable',
|
||||||
|
'user_bookmark': 'enable',
|
||||||
|
'user_group_bookmark': 'enable',
|
||||||
|
'web_mode': 'enable',
|
||||||
|
'windows_forticlient_download_url': 'test_value_50',
|
||||||
|
'wins_server1': 'test_value_51',
|
||||||
|
'wins_server2': 'test_value_52'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ssl_web_portal.fortios_vpn_ssl_web(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ssl.web', 'portal', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ssl_web_portal_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'vpn_ssl_web_portal': {
|
||||||
|
'allow_user_access': 'web',
|
||||||
|
'auto_connect': 'enable',
|
||||||
|
'custom_lang': 'test_value_5',
|
||||||
|
'customize_forticlient_download_url': 'enable',
|
||||||
|
'display_bookmark': 'enable',
|
||||||
|
'display_connection_tools': 'enable',
|
||||||
|
'display_history': 'enable',
|
||||||
|
'display_status': 'enable',
|
||||||
|
'dns_server1': 'test_value_11',
|
||||||
|
'dns_server2': 'test_value_12',
|
||||||
|
'dns_suffix': 'test_value_13',
|
||||||
|
'exclusive_routing': 'enable',
|
||||||
|
'forticlient_download': 'enable',
|
||||||
|
'forticlient_download_method': 'direct',
|
||||||
|
'heading': 'test_value_17',
|
||||||
|
'hide_sso_credential': 'enable',
|
||||||
|
'host_check': 'none',
|
||||||
|
'host_check_interval': '20',
|
||||||
|
'ip_mode': 'range',
|
||||||
|
'ipv6_dns_server1': 'test_value_22',
|
||||||
|
'ipv6_dns_server2': 'test_value_23',
|
||||||
|
'ipv6_exclusive_routing': 'enable',
|
||||||
|
'ipv6_service_restriction': 'enable',
|
||||||
|
'ipv6_split_tunneling': 'enable',
|
||||||
|
'ipv6_tunnel_mode': 'enable',
|
||||||
|
'ipv6_wins_server1': 'test_value_28',
|
||||||
|
'ipv6_wins_server2': 'test_value_29',
|
||||||
|
'keep_alive': 'enable',
|
||||||
|
'limit_user_logins': 'enable',
|
||||||
|
'mac_addr_action': 'allow',
|
||||||
|
'mac_addr_check': 'enable',
|
||||||
|
'macos_forticlient_download_url': 'test_value_34',
|
||||||
|
'name': 'default_name_35',
|
||||||
|
'os_check': 'enable',
|
||||||
|
'redir_url': 'test_value_37',
|
||||||
|
'save_password': 'enable',
|
||||||
|
'service_restriction': 'enable',
|
||||||
|
'skip_check_for_unsupported_browser': 'enable',
|
||||||
|
'skip_check_for_unsupported_os': 'enable',
|
||||||
|
'smb_ntlmv1_auth': 'enable',
|
||||||
|
'smbv1': 'enable',
|
||||||
|
'split_tunneling': 'enable',
|
||||||
|
'theme': 'blue',
|
||||||
|
'tunnel_mode': 'enable',
|
||||||
|
'user_bookmark': 'enable',
|
||||||
|
'user_group_bookmark': 'enable',
|
||||||
|
'web_mode': 'enable',
|
||||||
|
'windows_forticlient_download_url': 'test_value_50',
|
||||||
|
'wins_server1': 'test_value_51',
|
||||||
|
'wins_server2': 'test_value_52'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ssl_web_portal.fortios_vpn_ssl_web(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('vpn.ssl.web', 'portal', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ssl_web_portal_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ssl_web_portal': {
|
||||||
|
'allow_user_access': 'web',
|
||||||
|
'auto_connect': 'enable',
|
||||||
|
'custom_lang': 'test_value_5',
|
||||||
|
'customize_forticlient_download_url': 'enable',
|
||||||
|
'display_bookmark': 'enable',
|
||||||
|
'display_connection_tools': 'enable',
|
||||||
|
'display_history': 'enable',
|
||||||
|
'display_status': 'enable',
|
||||||
|
'dns_server1': 'test_value_11',
|
||||||
|
'dns_server2': 'test_value_12',
|
||||||
|
'dns_suffix': 'test_value_13',
|
||||||
|
'exclusive_routing': 'enable',
|
||||||
|
'forticlient_download': 'enable',
|
||||||
|
'forticlient_download_method': 'direct',
|
||||||
|
'heading': 'test_value_17',
|
||||||
|
'hide_sso_credential': 'enable',
|
||||||
|
'host_check': 'none',
|
||||||
|
'host_check_interval': '20',
|
||||||
|
'ip_mode': 'range',
|
||||||
|
'ipv6_dns_server1': 'test_value_22',
|
||||||
|
'ipv6_dns_server2': 'test_value_23',
|
||||||
|
'ipv6_exclusive_routing': 'enable',
|
||||||
|
'ipv6_service_restriction': 'enable',
|
||||||
|
'ipv6_split_tunneling': 'enable',
|
||||||
|
'ipv6_tunnel_mode': 'enable',
|
||||||
|
'ipv6_wins_server1': 'test_value_28',
|
||||||
|
'ipv6_wins_server2': 'test_value_29',
|
||||||
|
'keep_alive': 'enable',
|
||||||
|
'limit_user_logins': 'enable',
|
||||||
|
'mac_addr_action': 'allow',
|
||||||
|
'mac_addr_check': 'enable',
|
||||||
|
'macos_forticlient_download_url': 'test_value_34',
|
||||||
|
'name': 'default_name_35',
|
||||||
|
'os_check': 'enable',
|
||||||
|
'redir_url': 'test_value_37',
|
||||||
|
'save_password': 'enable',
|
||||||
|
'service_restriction': 'enable',
|
||||||
|
'skip_check_for_unsupported_browser': 'enable',
|
||||||
|
'skip_check_for_unsupported_os': 'enable',
|
||||||
|
'smb_ntlmv1_auth': 'enable',
|
||||||
|
'smbv1': 'enable',
|
||||||
|
'split_tunneling': 'enable',
|
||||||
|
'theme': 'blue',
|
||||||
|
'tunnel_mode': 'enable',
|
||||||
|
'user_bookmark': 'enable',
|
||||||
|
'user_group_bookmark': 'enable',
|
||||||
|
'web_mode': 'enable',
|
||||||
|
'windows_forticlient_download_url': 'test_value_50',
|
||||||
|
'wins_server1': 'test_value_51',
|
||||||
|
'wins_server2': 'test_value_52'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ssl_web_portal.fortios_vpn_ssl_web(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'allow-user-access': 'web',
|
||||||
|
'auto-connect': 'enable',
|
||||||
|
'custom-lang': 'test_value_5',
|
||||||
|
'customize-forticlient-download-url': 'enable',
|
||||||
|
'display-bookmark': 'enable',
|
||||||
|
'display-connection-tools': 'enable',
|
||||||
|
'display-history': 'enable',
|
||||||
|
'display-status': 'enable',
|
||||||
|
'dns-server1': 'test_value_11',
|
||||||
|
'dns-server2': 'test_value_12',
|
||||||
|
'dns-suffix': 'test_value_13',
|
||||||
|
'exclusive-routing': 'enable',
|
||||||
|
'forticlient-download': 'enable',
|
||||||
|
'forticlient-download-method': 'direct',
|
||||||
|
'heading': 'test_value_17',
|
||||||
|
'hide-sso-credential': 'enable',
|
||||||
|
'host-check': 'none',
|
||||||
|
'host-check-interval': '20',
|
||||||
|
'ip-mode': 'range',
|
||||||
|
'ipv6-dns-server1': 'test_value_22',
|
||||||
|
'ipv6-dns-server2': 'test_value_23',
|
||||||
|
'ipv6-exclusive-routing': 'enable',
|
||||||
|
'ipv6-service-restriction': 'enable',
|
||||||
|
'ipv6-split-tunneling': 'enable',
|
||||||
|
'ipv6-tunnel-mode': 'enable',
|
||||||
|
'ipv6-wins-server1': 'test_value_28',
|
||||||
|
'ipv6-wins-server2': 'test_value_29',
|
||||||
|
'keep-alive': 'enable',
|
||||||
|
'limit-user-logins': 'enable',
|
||||||
|
'mac-addr-action': 'allow',
|
||||||
|
'mac-addr-check': 'enable',
|
||||||
|
'macos-forticlient-download-url': 'test_value_34',
|
||||||
|
'name': 'default_name_35',
|
||||||
|
'os-check': 'enable',
|
||||||
|
'redir-url': 'test_value_37',
|
||||||
|
'save-password': 'enable',
|
||||||
|
'service-restriction': 'enable',
|
||||||
|
'skip-check-for-unsupported-browser': 'enable',
|
||||||
|
'skip-check-for-unsupported-os': 'enable',
|
||||||
|
'smb-ntlmv1-auth': 'enable',
|
||||||
|
'smbv1': 'enable',
|
||||||
|
'split-tunneling': 'enable',
|
||||||
|
'theme': 'blue',
|
||||||
|
'tunnel-mode': 'enable',
|
||||||
|
'user-bookmark': 'enable',
|
||||||
|
'user-group-bookmark': 'enable',
|
||||||
|
'web-mode': 'enable',
|
||||||
|
'windows-forticlient-download-url': 'test_value_50',
|
||||||
|
'wins-server1': 'test_value_51',
|
||||||
|
'wins-server2': 'test_value_52'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ssl.web', 'portal', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_vpn_ssl_web_portal_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'vpn_ssl_web_portal': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'allow_user_access': 'web',
|
||||||
|
'auto_connect': 'enable',
|
||||||
|
'custom_lang': 'test_value_5',
|
||||||
|
'customize_forticlient_download_url': 'enable',
|
||||||
|
'display_bookmark': 'enable',
|
||||||
|
'display_connection_tools': 'enable',
|
||||||
|
'display_history': 'enable',
|
||||||
|
'display_status': 'enable',
|
||||||
|
'dns_server1': 'test_value_11',
|
||||||
|
'dns_server2': 'test_value_12',
|
||||||
|
'dns_suffix': 'test_value_13',
|
||||||
|
'exclusive_routing': 'enable',
|
||||||
|
'forticlient_download': 'enable',
|
||||||
|
'forticlient_download_method': 'direct',
|
||||||
|
'heading': 'test_value_17',
|
||||||
|
'hide_sso_credential': 'enable',
|
||||||
|
'host_check': 'none',
|
||||||
|
'host_check_interval': '20',
|
||||||
|
'ip_mode': 'range',
|
||||||
|
'ipv6_dns_server1': 'test_value_22',
|
||||||
|
'ipv6_dns_server2': 'test_value_23',
|
||||||
|
'ipv6_exclusive_routing': 'enable',
|
||||||
|
'ipv6_service_restriction': 'enable',
|
||||||
|
'ipv6_split_tunneling': 'enable',
|
||||||
|
'ipv6_tunnel_mode': 'enable',
|
||||||
|
'ipv6_wins_server1': 'test_value_28',
|
||||||
|
'ipv6_wins_server2': 'test_value_29',
|
||||||
|
'keep_alive': 'enable',
|
||||||
|
'limit_user_logins': 'enable',
|
||||||
|
'mac_addr_action': 'allow',
|
||||||
|
'mac_addr_check': 'enable',
|
||||||
|
'macos_forticlient_download_url': 'test_value_34',
|
||||||
|
'name': 'default_name_35',
|
||||||
|
'os_check': 'enable',
|
||||||
|
'redir_url': 'test_value_37',
|
||||||
|
'save_password': 'enable',
|
||||||
|
'service_restriction': 'enable',
|
||||||
|
'skip_check_for_unsupported_browser': 'enable',
|
||||||
|
'skip_check_for_unsupported_os': 'enable',
|
||||||
|
'smb_ntlmv1_auth': 'enable',
|
||||||
|
'smbv1': 'enable',
|
||||||
|
'split_tunneling': 'enable',
|
||||||
|
'theme': 'blue',
|
||||||
|
'tunnel_mode': 'enable',
|
||||||
|
'user_bookmark': 'enable',
|
||||||
|
'user_group_bookmark': 'enable',
|
||||||
|
'web_mode': 'enable',
|
||||||
|
'windows_forticlient_download_url': 'test_value_50',
|
||||||
|
'wins_server1': 'test_value_51',
|
||||||
|
'wins_server2': 'test_value_52'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_vpn_ssl_web_portal.fortios_vpn_ssl_web(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'allow-user-access': 'web',
|
||||||
|
'auto-connect': 'enable',
|
||||||
|
'custom-lang': 'test_value_5',
|
||||||
|
'customize-forticlient-download-url': 'enable',
|
||||||
|
'display-bookmark': 'enable',
|
||||||
|
'display-connection-tools': 'enable',
|
||||||
|
'display-history': 'enable',
|
||||||
|
'display-status': 'enable',
|
||||||
|
'dns-server1': 'test_value_11',
|
||||||
|
'dns-server2': 'test_value_12',
|
||||||
|
'dns-suffix': 'test_value_13',
|
||||||
|
'exclusive-routing': 'enable',
|
||||||
|
'forticlient-download': 'enable',
|
||||||
|
'forticlient-download-method': 'direct',
|
||||||
|
'heading': 'test_value_17',
|
||||||
|
'hide-sso-credential': 'enable',
|
||||||
|
'host-check': 'none',
|
||||||
|
'host-check-interval': '20',
|
||||||
|
'ip-mode': 'range',
|
||||||
|
'ipv6-dns-server1': 'test_value_22',
|
||||||
|
'ipv6-dns-server2': 'test_value_23',
|
||||||
|
'ipv6-exclusive-routing': 'enable',
|
||||||
|
'ipv6-service-restriction': 'enable',
|
||||||
|
'ipv6-split-tunneling': 'enable',
|
||||||
|
'ipv6-tunnel-mode': 'enable',
|
||||||
|
'ipv6-wins-server1': 'test_value_28',
|
||||||
|
'ipv6-wins-server2': 'test_value_29',
|
||||||
|
'keep-alive': 'enable',
|
||||||
|
'limit-user-logins': 'enable',
|
||||||
|
'mac-addr-action': 'allow',
|
||||||
|
'mac-addr-check': 'enable',
|
||||||
|
'macos-forticlient-download-url': 'test_value_34',
|
||||||
|
'name': 'default_name_35',
|
||||||
|
'os-check': 'enable',
|
||||||
|
'redir-url': 'test_value_37',
|
||||||
|
'save-password': 'enable',
|
||||||
|
'service-restriction': 'enable',
|
||||||
|
'skip-check-for-unsupported-browser': 'enable',
|
||||||
|
'skip-check-for-unsupported-os': 'enable',
|
||||||
|
'smb-ntlmv1-auth': 'enable',
|
||||||
|
'smbv1': 'enable',
|
||||||
|
'split-tunneling': 'enable',
|
||||||
|
'theme': 'blue',
|
||||||
|
'tunnel-mode': 'enable',
|
||||||
|
'user-bookmark': 'enable',
|
||||||
|
'user-group-bookmark': 'enable',
|
||||||
|
'web-mode': 'enable',
|
||||||
|
'windows-forticlient-download-url': 'test_value_50',
|
||||||
|
'wins-server1': 'test_value_51',
|
||||||
|
'wins-server2': 'test_value_52'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('vpn.ssl.web', 'portal', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,229 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_waf_profile
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_waf_profile.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_waf_profile_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'waf_profile': {'comment': 'Comment.',
|
||||||
|
'extended_log': 'enable',
|
||||||
|
'external': 'disable',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_waf_profile.fortios_waf(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'comment': 'Comment.',
|
||||||
|
'extended-log': 'enable',
|
||||||
|
'external': 'disable',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('waf', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_waf_profile_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'waf_profile': {'comment': 'Comment.',
|
||||||
|
'extended_log': 'enable',
|
||||||
|
'external': 'disable',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_waf_profile.fortios_waf(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'comment': 'Comment.',
|
||||||
|
'extended-log': 'enable',
|
||||||
|
'external': 'disable',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('waf', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_waf_profile_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'waf_profile': {'comment': 'Comment.',
|
||||||
|
'extended_log': 'enable',
|
||||||
|
'external': 'disable',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_waf_profile.fortios_waf(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('waf', 'profile', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_waf_profile_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'waf_profile': {'comment': 'Comment.',
|
||||||
|
'extended_log': 'enable',
|
||||||
|
'external': 'disable',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_waf_profile.fortios_waf(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('waf', 'profile', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_waf_profile_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'waf_profile': {'comment': 'Comment.',
|
||||||
|
'extended_log': 'enable',
|
||||||
|
'external': 'disable',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_waf_profile.fortios_waf(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'comment': 'Comment.',
|
||||||
|
'extended-log': 'enable',
|
||||||
|
'external': 'disable',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('waf', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_waf_profile_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'waf_profile': {
|
||||||
|
'random_attribute_not_valid': 'tag', 'comment': 'Comment.',
|
||||||
|
'extended_log': 'enable',
|
||||||
|
'external': 'disable',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_waf_profile.fortios_waf(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {'comment': 'Comment.',
|
||||||
|
'extended-log': 'enable',
|
||||||
|
'external': 'disable',
|
||||||
|
'name': 'default_name_6',
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('waf', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,229 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_wanopt_profile
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_wanopt_profile.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_wanopt_profile_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'wanopt_profile': {
|
||||||
|
'auth_group': 'test_value_3',
|
||||||
|
'comments': 'test_value_4',
|
||||||
|
'name': 'default_name_5',
|
||||||
|
'transparent': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_wanopt_profile.fortios_wanopt(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auth-group': 'test_value_3',
|
||||||
|
'comments': 'test_value_4',
|
||||||
|
'name': 'default_name_5',
|
||||||
|
'transparent': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('wanopt', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_wanopt_profile_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'wanopt_profile': {
|
||||||
|
'auth_group': 'test_value_3',
|
||||||
|
'comments': 'test_value_4',
|
||||||
|
'name': 'default_name_5',
|
||||||
|
'transparent': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_wanopt_profile.fortios_wanopt(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auth-group': 'test_value_3',
|
||||||
|
'comments': 'test_value_4',
|
||||||
|
'name': 'default_name_5',
|
||||||
|
'transparent': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('wanopt', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_wanopt_profile_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'wanopt_profile': {
|
||||||
|
'auth_group': 'test_value_3',
|
||||||
|
'comments': 'test_value_4',
|
||||||
|
'name': 'default_name_5',
|
||||||
|
'transparent': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_wanopt_profile.fortios_wanopt(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('wanopt', 'profile', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_wanopt_profile_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'wanopt_profile': {
|
||||||
|
'auth_group': 'test_value_3',
|
||||||
|
'comments': 'test_value_4',
|
||||||
|
'name': 'default_name_5',
|
||||||
|
'transparent': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_wanopt_profile.fortios_wanopt(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('wanopt', 'profile', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_wanopt_profile_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'wanopt_profile': {
|
||||||
|
'auth_group': 'test_value_3',
|
||||||
|
'comments': 'test_value_4',
|
||||||
|
'name': 'default_name_5',
|
||||||
|
'transparent': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_wanopt_profile.fortios_wanopt(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auth-group': 'test_value_3',
|
||||||
|
'comments': 'test_value_4',
|
||||||
|
'name': 'default_name_5',
|
||||||
|
'transparent': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('wanopt', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_wanopt_profile_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'wanopt_profile': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'auth_group': 'test_value_3',
|
||||||
|
'comments': 'test_value_4',
|
||||||
|
'name': 'default_name_5',
|
||||||
|
'transparent': 'enable'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_wanopt_profile.fortios_wanopt(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auth-group': 'test_value_3',
|
||||||
|
'comments': 'test_value_4',
|
||||||
|
'name': 'default_name_5',
|
||||||
|
'transparent': 'enable'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('wanopt', 'profile', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,167 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_wanopt_settings
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_wanopt_settings.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_wanopt_settings_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'wanopt_settings': {
|
||||||
|
'auto_detect_algorithm': 'simple',
|
||||||
|
'host_id': 'myhostname4',
|
||||||
|
'tunnel_ssl_algorithm': 'low'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_wanopt_settings.fortios_wanopt(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auto-detect-algorithm': 'simple',
|
||||||
|
'host-id': 'myhostname4',
|
||||||
|
'tunnel-ssl-algorithm': 'low'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('wanopt', 'settings', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_wanopt_settings_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'wanopt_settings': {
|
||||||
|
'auto_detect_algorithm': 'simple',
|
||||||
|
'host_id': 'myhostname4',
|
||||||
|
'tunnel_ssl_algorithm': 'low'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_wanopt_settings.fortios_wanopt(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auto-detect-algorithm': 'simple',
|
||||||
|
'host-id': 'myhostname4',
|
||||||
|
'tunnel-ssl-algorithm': 'low'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('wanopt', 'settings', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_wanopt_settings_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'wanopt_settings': {
|
||||||
|
'auto_detect_algorithm': 'simple',
|
||||||
|
'host_id': 'myhostname4',
|
||||||
|
'tunnel_ssl_algorithm': 'low'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_wanopt_settings.fortios_wanopt(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auto-detect-algorithm': 'simple',
|
||||||
|
'host-id': 'myhostname4',
|
||||||
|
'tunnel-ssl-algorithm': 'low'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('wanopt', 'settings', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_wanopt_settings_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'wanopt_settings': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'auto_detect_algorithm': 'simple',
|
||||||
|
'host_id': 'myhostname4',
|
||||||
|
'tunnel_ssl_algorithm': 'low'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_wanopt_settings.fortios_wanopt(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'auto-detect-algorithm': 'simple',
|
||||||
|
'host-id': 'myhostname4',
|
||||||
|
'tunnel-ssl-algorithm': 'low'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('wanopt', 'settings', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,219 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_webfilter_content
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_webfilter_content.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'webfilter_content': {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('webfilter', 'content', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'webfilter_content': {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('webfilter', 'content', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'webfilter_content': {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('webfilter', 'content', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'webfilter_content': {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('webfilter', 'content', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'webfilter_content': {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('webfilter', 'content', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'webfilter_content': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('webfilter', 'content', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
@ -0,0 +1,219 @@
|
|||||||
|
# Copyright 2019 Fortinet, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# Make coding more python3-ish
|
||||||
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import pytest
|
||||||
|
from mock import ANY
|
||||||
|
from ansible.module_utils.network.fortios.fortios import FortiOSHandler
|
||||||
|
|
||||||
|
try:
|
||||||
|
from ansible.modules.network.fortios import fortios_webfilter_content_header
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Could not load required modules for testing", allow_module_level=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def connection_mock(mocker):
|
||||||
|
connection_class_mock = mocker.patch('ansible.modules.network.fortios.fortios_webfilter_content_header.Connection')
|
||||||
|
return connection_class_mock
|
||||||
|
|
||||||
|
|
||||||
|
fos_instance = FortiOSHandler(connection_mock)
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_header_creation(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'webfilter_content_header': {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content_header.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('webfilter', 'content-header', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_header_creation_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'webfilter_content_header': {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content_header.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('webfilter', 'content-header', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_header_removal(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'webfilter_content_header': {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content_header.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('webfilter', 'content-header', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_header_deletion_fails(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
delete_method_result = {'status': 'error', 'http_method': 'POST', 'http_status': 500}
|
||||||
|
delete_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.delete', return_value=delete_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'absent',
|
||||||
|
'webfilter_content_header': {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content_header.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
delete_method_mock.assert_called_with('webfilter', 'content-header', mkey=ANY, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 500
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_header_idempotent(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'error', 'http_method': 'DELETE', 'http_status': 404}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'webfilter_content_header': {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content_header.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('webfilter', 'content-header', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert not changed
|
||||||
|
assert response['status'] == 'error'
|
||||||
|
assert response['http_status'] == 404
|
||||||
|
|
||||||
|
|
||||||
|
def test_webfilter_content_header_filter_foreign_attributes(mocker):
|
||||||
|
schema_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.schema')
|
||||||
|
|
||||||
|
set_method_result = {'status': 'success', 'http_method': 'POST', 'http_status': 200}
|
||||||
|
set_method_mock = mocker.patch('ansible.module_utils.network.fortios.fortios.FortiOSHandler.set', return_value=set_method_result)
|
||||||
|
|
||||||
|
input_data = {
|
||||||
|
'username': 'admin',
|
||||||
|
'state': 'present',
|
||||||
|
'webfilter_content_header': {
|
||||||
|
'random_attribute_not_valid': 'tag',
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
},
|
||||||
|
'vdom': 'root'}
|
||||||
|
|
||||||
|
is_error, changed, response = fortios_webfilter_content_header.fortios_webfilter(input_data, fos_instance)
|
||||||
|
|
||||||
|
expected_data = {
|
||||||
|
'comment': 'Optional comments.',
|
||||||
|
'id': '4',
|
||||||
|
'name': 'default_name_5'
|
||||||
|
}
|
||||||
|
|
||||||
|
set_method_mock.assert_called_with('webfilter', 'content-header', data=expected_data, vdom='root')
|
||||||
|
schema_method_mock.assert_not_called()
|
||||||
|
assert not is_error
|
||||||
|
assert changed
|
||||||
|
assert response['status'] == 'success'
|
||||||
|
assert response['http_status'] == 200
|
Loading…
Reference in New Issue