summaryrefslogtreecommitdiff
path: root/test/units/modules
diff options
context:
space:
mode:
authorTim Rupp <caphrim007@gmail.com>2017-10-27 22:31:52 -0700
committerGitHub <noreply@github.com>2017-10-27 22:31:52 -0700
commit2a5f6c28cfe91c5372a01385989463e7eea6d0c5 (patch)
tree6a9e4c14e3613b9e015d3eaf1d9f98dd9950d6e8 /test/units/modules
parent47fb002c8800bdcbacd92fd9216d396a8dec0d1c (diff)
downloadansible-2a5f6c28cfe91c5372a01385989463e7eea6d0c5.tar.gz
Adds bigip_asm_policy module (#32281)
This module can be used to import asm policies from file or existing template. Supported file types are xml, compact xml, and binary
Diffstat (limited to 'test/units/modules')
-rw-r--r--test/units/modules/network/f5/fixtures/load_asm_policy_active.json197
-rw-r--r--test/units/modules/network/f5/fixtures/load_asm_policy_inactive.json197
-rw-r--r--test/units/modules/network/f5/test_bigip_asm_policy.py600
3 files changed, 994 insertions, 0 deletions
diff --git a/test/units/modules/network/f5/fixtures/load_asm_policy_active.json b/test/units/modules/network/f5/fixtures/load_asm_policy_active.json
new file mode 100644
index 0000000000..001daa757a
--- /dev/null
+++ b/test/units/modules/network/f5/fixtures/load_asm_policy_active.json
@@ -0,0 +1,197 @@
+{
+ "plainTextProfileReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/plain-text-profiles?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "learningMode": "manual",
+ "dataGuardReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/data-guard?ver=12.1.2"
+ },
+ "stagingSettings": {
+ "signatureStaging": true,
+ "placeSignaturesInStaging": false,
+ "enforcementReadinessPeriod": 7
+ },
+ "createdDatetime": "2017-09-21T11:52:24Z",
+ "geolocationEnforcementReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/geolocation-enforcement?ver=12.1.2"
+ },
+ "versionLastChange": "Allowed Response Code 503 [add]: Response Code was set to 503.",
+ "name": "fake_policy",
+ "caseInsensitive": false,
+ "loginPageReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/login-pages?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "fullPath": "/Common/fake_policy",
+ "description": "",
+ "attributes": {
+ "pathParameterHandling": "as-parameters",
+ "triggerAsmIruleEvent": "disabled",
+ "inspectHttpUploads": false,
+ "maskCreditCardNumbersInRequest": true,
+ "maximumHttpHeaderLength": "8192",
+ "useDynamicSessionIdInUrl": false,
+ "maximumCookieHeaderLength": "8192"
+ },
+ "partition": "Common",
+ "webScrapingReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/web-scraping?ver=12.1.2"
+ },
+ "csrfProtectionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/csrf-protection?ver=12.1.2"
+ },
+ "customXffHeaders": [],
+ "kind": "tm:asm:policies:policystate",
+ "virtualServers": [],
+ "ipIntelligenceReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/ip-intelligence?ver=12.1.2"
+ },
+ "protocolIndependent": false,
+ "sessionAwarenessSettingsReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/session-tracking?ver=12.1.2"
+ },
+ "signatureSetReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/signature-sets?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "parameterReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/parameters?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "allowedResponseCodes": [
+ 400,
+ 401,
+ 404,
+ 407,
+ 417,
+ 503
+ ],
+ "applicationLanguage": "utf-8",
+ "enforcementMode": "transparent",
+ "loginEnforcementReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/login-enforcement?ver=12.1.2"
+ },
+ "navigationParameterReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/navigation-parameters?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "gwtProfileReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/gwt-profiles?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "whitelistIpReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/whitelist-ips?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "historyRevisionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/history-revisions?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "policyBuilderReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/policy-builder?ver=12.1.2"
+ },
+ "responsePageReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/response-pages?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "vulnerabilityAssessmentReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/vulnerability-assessment?ver=12.1.2"
+ },
+ "blockingSettingReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/blocking-settings?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "cookieReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/cookies?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "hostNameReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/host-names?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "versionDeviceName": "ltm4restlab.lab.local",
+ "selfLink": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw?ver=12.1.2",
+ "signatureReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/signatures?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "filetypeReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/filetypes?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "id": "0EHlYeS5noAOZLY3YsJjEw",
+ "manualVirtualServers": [],
+ "modifierName": "admin",
+ "versionDatetime": "2017-04-11T08:05:22Z",
+ "subPath": "/Common",
+ "sessionTrackingStatusReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/session-tracking-statuses?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "active": true,
+ "auditLogReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/audit-logs?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "trustXff": false,
+ "websocketUrlReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/websocket-urls?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "xmlProfileReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/xml-profiles?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "methodReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/methods?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "redirectionProtectionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/redirection-protection?ver=12.1.2"
+ },
+ "vulnerabilityReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/vulnerabilities?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "creatorName": "SYSTEM",
+ "urlReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/urls?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "headerReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/headers?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "xmlValidationFileReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/xml-validation-files?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "lastUpdateMicros": 1.506250903e+15,
+ "jsonProfileReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/json-profiles?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "bruteForceAttackPreventionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/brute-force-attack-preventions?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "extractionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/extractions?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "characterSetReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/character-sets?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "isModified": false,
+ "suggestionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/suggestions?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "sensitiveParameterReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/sensitive-parameters?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "versionPolicyName": "/Common/fake_policy"
+}
diff --git a/test/units/modules/network/f5/fixtures/load_asm_policy_inactive.json b/test/units/modules/network/f5/fixtures/load_asm_policy_inactive.json
new file mode 100644
index 0000000000..5198888142
--- /dev/null
+++ b/test/units/modules/network/f5/fixtures/load_asm_policy_inactive.json
@@ -0,0 +1,197 @@
+{
+ "plainTextProfileReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/plain-text-profiles?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "learningMode": "manual",
+ "dataGuardReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/data-guard?ver=12.1.2"
+ },
+ "stagingSettings": {
+ "signatureStaging": true,
+ "placeSignaturesInStaging": false,
+ "enforcementReadinessPeriod": 7
+ },
+ "createdDatetime": "2017-09-21T11:52:24Z",
+ "geolocationEnforcementReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/geolocation-enforcement?ver=12.1.2"
+ },
+ "versionLastChange": "Allowed Response Code 503 [add]: Response Code was set to 503.",
+ "name": "fake_policy",
+ "caseInsensitive": false,
+ "loginPageReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/login-pages?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "fullPath": "/Common/fake_policy",
+ "description": "",
+ "attributes": {
+ "pathParameterHandling": "as-parameters",
+ "triggerAsmIruleEvent": "disabled",
+ "inspectHttpUploads": false,
+ "maskCreditCardNumbersInRequest": true,
+ "maximumHttpHeaderLength": "8192",
+ "useDynamicSessionIdInUrl": false,
+ "maximumCookieHeaderLength": "8192"
+ },
+ "partition": "Common",
+ "webScrapingReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/web-scraping?ver=12.1.2"
+ },
+ "csrfProtectionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/csrf-protection?ver=12.1.2"
+ },
+ "customXffHeaders": [],
+ "kind": "tm:asm:policies:policystate",
+ "virtualServers": [],
+ "ipIntelligenceReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/ip-intelligence?ver=12.1.2"
+ },
+ "protocolIndependent": false,
+ "sessionAwarenessSettingsReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/session-tracking?ver=12.1.2"
+ },
+ "signatureSetReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/signature-sets?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "parameterReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/parameters?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "allowedResponseCodes": [
+ 400,
+ 401,
+ 404,
+ 407,
+ 417,
+ 503
+ ],
+ "applicationLanguage": "utf-8",
+ "enforcementMode": "transparent",
+ "loginEnforcementReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/login-enforcement?ver=12.1.2"
+ },
+ "navigationParameterReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/navigation-parameters?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "gwtProfileReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/gwt-profiles?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "whitelistIpReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/whitelist-ips?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "historyRevisionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/history-revisions?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "policyBuilderReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/policy-builder?ver=12.1.2"
+ },
+ "responsePageReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/response-pages?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "vulnerabilityAssessmentReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/vulnerability-assessment?ver=12.1.2"
+ },
+ "blockingSettingReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/blocking-settings?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "cookieReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/cookies?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "hostNameReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/host-names?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "versionDeviceName": "ltm4restlab.lab.local",
+ "selfLink": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw?ver=12.1.2",
+ "signatureReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/signatures?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "filetypeReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/filetypes?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "id": "0EHlYeS5noAOZLY3YsJjEw",
+ "manualVirtualServers": [],
+ "modifierName": "",
+ "versionDatetime": "2017-04-11T08:05:22Z",
+ "subPath": "/Common",
+ "sessionTrackingStatusReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/session-tracking-statuses?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "active": false,
+ "auditLogReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/audit-logs?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "trustXff": false,
+ "websocketUrlReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/websocket-urls?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "xmlProfileReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/xml-profiles?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "methodReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/methods?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "redirectionProtectionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/redirection-protection?ver=12.1.2"
+ },
+ "vulnerabilityReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/vulnerabilities?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "creatorName": "SYSTEM",
+ "urlReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/urls?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "headerReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/headers?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "xmlValidationFileReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/xml-validation-files?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "lastUpdateMicros": 0,
+ "jsonProfileReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/json-profiles?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "bruteForceAttackPreventionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/brute-force-attack-preventions?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "extractionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/extractions?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "characterSetReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/character-sets?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "isModified": false,
+ "suggestionReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/suggestions?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "sensitiveParameterReference": {
+ "link": "https://localhost/mgmt/tm/asm/policies/0EHlYeS5noAOZLY3YsJjEw/sensitive-parameters?ver=12.1.2",
+ "isSubCollection": true
+ },
+ "versionPolicyName": "/Common/fake_policy"
+}
diff --git a/test/units/modules/network/f5/test_bigip_asm_policy.py b/test/units/modules/network/f5/test_bigip_asm_policy.py
new file mode 100644
index 0000000000..226eabde04
--- /dev/null
+++ b/test/units/modules/network/f5/test_bigip_asm_policy.py
@@ -0,0 +1,600 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2017 F5 Networks Inc.
+# GNU General Public License v3.0 (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+import os
+import json
+import pytest
+import sys
+
+from nose.plugins.skip import SkipTest
+if sys.version_info < (2, 7):
+ raise SkipTest("F5 Ansible modules require Python >= 2.7")
+
+from ansible.compat.tests import unittest
+from ansible.compat.tests.mock import patch, Mock, PropertyMock
+from ansible.module_utils import basic
+from ansible.module_utils._text import to_bytes
+from ansible.module_utils.f5_utils import AnsibleF5Client
+from ansible.module_utils.f5_utils import F5ModuleError
+
+try:
+ from library.bigip_asm_policy import V1Parameters
+ from library.bigip_asm_policy import V2Parameters
+ from library.bigip_asm_policy import ModuleManager
+ from library.bigip_asm_policy import V1Manager
+ from library.bigip_asm_policy import V2Manager
+ from library.bigip_asm_policy import ArgumentSpec
+ from ansible.module_utils.f5_utils import iControlUnexpectedHTTPError
+except ImportError:
+ try:
+ from ansible.modules.network.f5.bigip_asm_policy import V1Parameters
+ from ansible.modules.network.f5.bigip_asm_policy import V2Parameters
+ from ansible.modules.network.f5.bigip_asm_policy import ModuleManager
+ from ansible.modules.network.f5.bigip_asm_policy import V1Manager
+ from ansible.modules.network.f5.bigip_asm_policy import V2Manager
+ from ansible.modules.network.f5.bigip_asm_policy import ArgumentSpec
+ from ansible.module_utils.f5_utils import iControlUnexpectedHTTPError
+ except ImportError:
+ raise SkipTest("F5 Ansible modules require the f5-sdk Python library")
+
+fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures')
+fixture_data = {}
+
+
+def set_module_args(args):
+ args = json.dumps({'ANSIBLE_MODULE_ARGS': args})
+ basic._ANSIBLE_ARGS = to_bytes(args)
+
+
+def load_fixture(name):
+ path = os.path.join(fixture_path, name)
+ with open(path) as f:
+ data = f.read()
+ try:
+ data = json.loads(data)
+ except Exception:
+ pass
+ return data
+
+
+class TestParameters(unittest.TestCase):
+ def test_module_parameters(self):
+ args = dict(
+ name='fake_policy',
+ state='present',
+ file='/var/fake/fake.xml'
+ )
+
+ p = V1Parameters(args)
+ assert p.name == 'fake_policy'
+ assert p.state == 'present'
+ assert p.file == '/var/fake/fake.xml'
+
+ def test_module_parameters_template(self):
+ args = dict(
+ name='fake_policy',
+ state='present',
+ template='LotusDomino 6.5 (http)'
+ )
+
+ p = V1Parameters(args)
+ assert p.name == 'fake_policy'
+ assert p.state == 'present'
+ assert p.template == 'POLICY_TEMPLATE_LOTUSDOMINO_6_5_HTTP'
+
+
+@patch('ansible.module_utils.f5_utils.AnsibleF5Client._get_mgmt_root',
+ return_value=True)
+class TestManager(unittest.TestCase):
+ def setUp(self):
+ self.spec = ArgumentSpec()
+ self.policy = os.path.join(fixture_path, 'fake_policy.xml')
+
+ def test_activate_import_from_file(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ file=self.policy,
+ state='present',
+ active='yes',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ current = V1Parameters(load_fixture('load_asm_policy_inactive.json'))
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=False)
+ v1.import_to_device = Mock(return_value=True)
+ v1.wait_for_task = Mock(side_effect=[True, True])
+ v1.read_current_from_device = Mock(return_value=current)
+ v1.apply_on_device = Mock(return_value=True)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ results = mm.exec_module()
+
+ assert results['changed'] is True
+ assert results['name'] == 'fake_policy'
+ assert results['file'] == self.policy
+ assert results['active'] is True
+
+ def test_activate_import_from_template(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ template='OWA Exchange 2007 (https)',
+ state='present',
+ active='yes',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ current = V1Parameters(load_fixture('load_asm_policy_inactive.json'))
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=False)
+ v1.import_to_device = Mock(return_value=True)
+ v1.wait_for_task = Mock(side_effect=[True, True])
+ v1.read_current_from_device = Mock(return_value=current)
+ v1.apply_on_device = Mock(return_value=True)
+ v1.create_from_template_on_device = Mock(return_value=True)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ results = mm.exec_module()
+
+ assert results['changed'] is True
+ assert results['name'] == 'fake_policy'
+ assert results['template'] == 'OWA Exchange 2007 (https)'
+ assert results['active'] is True
+
+ def test_activate_create_by_name(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ state='present',
+ active='yes',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ current = V1Parameters(load_fixture('load_asm_policy_inactive.json'))
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=False)
+ v1.import_to_device = Mock(return_value=True)
+ v1.wait_for_task = Mock(side_effect=[True, True])
+ v1.create_on_device = Mock(return_value=True)
+ v1.create_blank = Mock(return_value=True)
+ v1.read_current_from_device = Mock(return_value=current)
+ v1.apply_on_device = Mock(return_value=True)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ results = mm.exec_module()
+
+ assert results['changed'] is True
+ assert results['name'] == 'fake_policy'
+ assert results['active'] is True
+
+ def test_activate_policy_exists_inactive(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ state='present',
+ active='yes',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ current = V1Parameters(load_fixture('load_asm_policy_inactive.json'))
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=True)
+ v1.update_on_device = Mock(return_value=True)
+ v1.wait_for_task = Mock(side_effect=[True, True])
+ v1.read_current_from_device = Mock(return_value=current)
+ v1.apply_on_device = Mock(return_value=True)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ results = mm.exec_module()
+
+ assert results['changed'] is True
+ assert results['active'] is True
+
+ def test_activate_policy_exists_active(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ state='present',
+ active='yes',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ current = V1Parameters(load_fixture('load_asm_policy_active.json'))
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ # Override methods to force specific logic in the module to happen
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=True)
+ v1.read_current_from_device = Mock(return_value=current)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ results = mm.exec_module()
+
+ assert results['changed'] is False
+
+ def test_deactivate_policy_exists_active(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ state='present',
+ server='localhost',
+ password='password',
+ user='admin',
+ active='no'
+ ))
+
+ current = V1Parameters(load_fixture('load_asm_policy_active.json'))
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ # Override methods to force specific logic in the module to happen
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=True)
+ v1.read_current_from_device = Mock(return_value=current)
+ v1.update_on_device = Mock(return_value=True)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ results = mm.exec_module()
+
+ assert results['changed'] is True
+ assert results['active'] is False
+
+ def test_deactivate_policy_exists_inactive(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ state='present',
+ server='localhost',
+ password='password',
+ user='admin',
+ active='no'
+ ))
+
+ current = V1Parameters(load_fixture('load_asm_policy_inactive.json'))
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ # Override methods to force specific logic in the module to happen
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=True)
+ v1.read_current_from_device = Mock(return_value=current)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ results = mm.exec_module()
+
+ assert results['changed'] is False
+
+ def test_import_from_file(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ file=self.policy,
+ state='present',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ current = V1Parameters(load_fixture('load_asm_policy_inactive.json'))
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ # Override methods to force specific logic in the module to happen
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=False)
+ v1.import_to_device = Mock(return_value=True)
+ v1.wait_for_task = Mock(side_effect=[True, True])
+ v1.read_current_from_device = Mock(return_value=current)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ results = mm.exec_module()
+
+ assert results['changed'] is True
+ assert results['name'] == 'fake_policy'
+ assert results['file'] == self.policy
+ assert results['active'] is False
+
+ def test_import_from_template(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ template='LotusDomino 6.5 (http)',
+ state='present',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ current = V1Parameters(load_fixture('load_asm_policy_inactive.json'))
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ # Override methods to force specific logic in the module to happen
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=False)
+ v1.create_from_template_on_device = Mock(return_value=True)
+ v1.wait_for_task = Mock(side_effect=[True, True])
+ v1.read_current_from_device = Mock(return_value=current)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ results = mm.exec_module()
+
+ assert results['changed'] is True
+ assert results['name'] == 'fake_policy'
+ assert results['template'] == 'LotusDomino 6.5 (http)'
+ assert results['active'] is False
+
+ def test_create_by_name(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ state='present',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ current = V1Parameters(load_fixture('load_asm_policy_inactive.json'))
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=False)
+ v1.import_to_device = Mock(return_value=True)
+ v1.wait_for_task = Mock(side_effect=[True, True])
+ v1.create_on_device = Mock(return_value=True)
+ v1.create_blank = Mock(return_value=True)
+ v1.read_current_from_device = Mock(return_value=current)
+ v1.apply_on_device = Mock(return_value=True)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ results = mm.exec_module()
+
+ assert results['changed'] is True
+ assert results['name'] == 'fake_policy'
+ assert results['active'] is False
+
+ def test_delete_policy(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ state='absent',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ # Override methods to force specific logic in the module to happen
+ v1 = V1Manager(client)
+ v1.exists = Mock(side_effect=[True, False])
+ v1.remove_from_device = Mock(return_value=True)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ results = mm.exec_module()
+
+ assert results['changed'] is True
+
+ def test_policy_import_raises(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ file=self.policy,
+ state='present',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ msg = 'Import policy task failed.'
+ # Override methods to force specific logic in the module to happen
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=False)
+ v1.import_to_device = Mock(return_value=True)
+ v1.wait_for_task = Mock(return_value=False)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ with pytest.raises(F5ModuleError) as err:
+ mm.exec_module()
+ assert str(err.value) == msg
+
+ def test_activate_policy_raises(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ state='present',
+ active='yes',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ current = V1Parameters(load_fixture('load_asm_policy_inactive.json'))
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ msg = 'Apply policy task failed.'
+ # Override methods to force specific logic in the module to happen
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=True)
+ v1.wait_for_task = Mock(return_value=False)
+ v1.update_on_device = Mock(return_value=True)
+ v1.read_current_from_device = Mock(return_value=current)
+ v1.apply_on_device = Mock(return_value=True)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ with pytest.raises(F5ModuleError) as err:
+ mm.exec_module()
+ assert str(err.value) == msg
+
+ def test_create_policy_raises(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ state='present',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+
+ msg = 'Failed to create ASM policy: fake_policy'
+ # Override methods to force specific logic in the module to happen
+ v1 = V1Manager(client)
+ v1.exists = Mock(return_value=False)
+ v1.create_on_device = Mock(return_value=False)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ with pytest.raises(F5ModuleError) as err:
+ mm.exec_module()
+ assert str(err.value) == msg
+
+ def test_delete_policy_raises(self, *args):
+ set_module_args(dict(
+ name='fake_policy',
+ state='absent',
+ server='localhost',
+ password='password',
+ user='admin',
+ ))
+
+ client = AnsibleF5Client(
+ argument_spec=self.spec.argument_spec,
+ supports_check_mode=self.spec.supports_check_mode,
+ f5_product_name=self.spec.f5_product_name
+ )
+ msg = 'Failed to delete ASM policy: fake_policy'
+ # Override methods to force specific logic in the module to happen
+ v1 = V1Manager(client)
+ v1.exists = Mock(side_effect=[True, True])
+ v1.remove_from_device = Mock(return_value=True)
+
+ # Override methods to force specific logic in the module to happen
+ mm = ModuleManager(client)
+ mm.version_is_less_than_13 = Mock(return_value=False)
+ mm.get_manager = Mock(return_value=v1)
+
+ with pytest.raises(F5ModuleError) as err:
+ mm.exec_module()
+ assert str(err.value) == msg