mirror of
https://github.com/ansible-collections/community.general.git
synced 2026-05-06 13:22:48 +00:00
[GCE] [GCP] UrlMap module (#24422)
* [GCP] UrlMap module This module provides support for UrlMaps on Google Cloud Platform. UrlMaps allow users to segment requests by hostname and path and direct those requests to Backend Services. UrlMaps are a powerful and necessary part of HTTP(S) Global Load Balancing on Google Cloud Platform. UrlMap takes advantage of the python-api so the appropriate infrastructure has been added to module_utils. More about UrlMaps can be found at: https://cloud.google.com/compute/docs/load-balancing/http/url-map UrlMap API: https://cloud.google.com/compute/docs/reference/latest/ Google Cloud Platform HTTP(S) Cross-Region Load Balancer: https://cloud.google.com/compute/docs/load-balancing/http/ * updated documentation, remmoved parens * fixed tabs
This commit is contained in:
@@ -7,4 +7,5 @@
|
||||
- { role: test_gcdns, tags: test_gcdns }
|
||||
- { role: test_gce_tag, tags: test_gce_tag }
|
||||
- { role: test_gce_net, tags: test_gce_net }
|
||||
- { role: test_gcp_url_map, tags: test_gcp_url_map }
|
||||
# TODO: tests for gce_lb, gc_storage
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
# defaults file for test_gcp_url_map
|
||||
service_account_email: "{{ gce_service_account_email }}"
|
||||
credentials_file: "{{ gce_pem_file }}"
|
||||
project_id: "{{ gce_project_id }}"
|
||||
urlmap: "ans-int-urlmap-{{ resource_prefix|lower }}"
|
||||
178
test/integration/roles/test_gcp_url_map/tasks/main.yml
Normal file
178
test/integration/roles/test_gcp_url_map/tasks/main.yml
Normal file
@@ -0,0 +1,178 @@
|
||||
# GCP UrlMap Integration Tests.
|
||||
# Only parameter tests are currently done in this file as this module requires
|
||||
# a significant amount of infrastructure.
|
||||
######
|
||||
# ============================================================
|
||||
- name: "Create UrlMap with no default service (changed == False)"
|
||||
# ============================================================
|
||||
gcp_url_map:
|
||||
service_account_email: "{{ service_account_email }}"
|
||||
credentials_file: "{{ credentials_file }}"
|
||||
project_id: "{{ project_id }}"
|
||||
url_map_name: "{{ urlmap }}"
|
||||
host_rules:
|
||||
- hosts:
|
||||
- '*.'
|
||||
path_matcher: 'path-matcher-one'
|
||||
state: "present"
|
||||
register: result
|
||||
ignore_errors: True
|
||||
tags:
|
||||
- param-check
|
||||
- name: "assert urlmap no default service (msg error ignored, changed==False)"
|
||||
assert:
|
||||
that:
|
||||
- 'not result.changed'
|
||||
- 'result.msg == "missing required arguments: default_service"'
|
||||
|
||||
# ============================================================
|
||||
- name: "Create UrlMap with no pathmatcher (changed == False)"
|
||||
# ============================================================
|
||||
gcp_url_map:
|
||||
service_account_email: "{{ service_account_email }}"
|
||||
credentials_file: "{{ credentials_file }}"
|
||||
project_id: "{{ project_id }}"
|
||||
url_map_name: "{{ urlmap }}"
|
||||
default_service: "gfr2-bes"
|
||||
host_rules:
|
||||
- hosts:
|
||||
- '*.'
|
||||
path_matcher: 'path-matcher-one'
|
||||
state: "present"
|
||||
register: result
|
||||
ignore_errors: True
|
||||
tags:
|
||||
- param-check
|
||||
- name: "assert urlmap no path_matcher (msg error ignored, changed==False)"
|
||||
assert:
|
||||
that:
|
||||
- 'not result.changed'
|
||||
- 'result.msg == "parameters are required together: [''path_matchers'', ''host_rules'']"'
|
||||
|
||||
# ============================================================
|
||||
- name: "Create UrlMap with no hostrules (changed == False)"
|
||||
# ============================================================
|
||||
gcp_url_map:
|
||||
service_account_email: "{{ service_account_email }}"
|
||||
credentials_file: "{{ credentials_file }}"
|
||||
project_id: "{{ project_id }}"
|
||||
url_map_name: "{{ urlmap }}"
|
||||
default_service: "gfr2-bes"
|
||||
path_matchers:
|
||||
- name: 'path-matcher-one'
|
||||
description: 'path matcher one'
|
||||
default_service: 'gfr-bes'
|
||||
path_rules:
|
||||
- service: 'gfr2-bes'
|
||||
paths:
|
||||
- '/data'
|
||||
- '/aboutus'
|
||||
state: "present"
|
||||
tags:
|
||||
- param-check
|
||||
register: result
|
||||
ignore_errors: True
|
||||
- name: "assert no host_rules (msg error ignored, changed==False)"
|
||||
assert:
|
||||
that:
|
||||
- 'not result.changed'
|
||||
- 'result.msg == "parameters are required together: [''path_matchers'', ''host_rules'']"'
|
||||
|
||||
# ============================================================
|
||||
- name: "Update UrlMap with non-absolute paths (changed==False)"
|
||||
# ============================================================
|
||||
gcp_url_map:
|
||||
service_account_email: "{{ service_account_email }}"
|
||||
credentials_file: "{{ credentials_file }}"
|
||||
project_id: "{{ project_id }}"
|
||||
url_map_name: "{{ urlmap }}"
|
||||
default_service: "gfr2-bes"
|
||||
path_matchers:
|
||||
- name: 'path-matcher-one'
|
||||
description: 'path matcher one'
|
||||
default_service: 'gfr-bes'
|
||||
path_rules:
|
||||
- service: 'gfr2-bes'
|
||||
paths:
|
||||
- 'data'
|
||||
- 'aboutus'
|
||||
host_rules:
|
||||
- hosts:
|
||||
- '*.'
|
||||
path_matcher: 'path-matcher-one'
|
||||
state: "present"
|
||||
tags:
|
||||
- param-check
|
||||
ignore_errors: True
|
||||
register: result
|
||||
- name: "assert path error updated (changed==False)"
|
||||
assert:
|
||||
that:
|
||||
- 'not result.changed'
|
||||
- 'result.msg == "path for path-matcher-one must start with /"'
|
||||
|
||||
# ============================================================
|
||||
- name: "Update UrlMap with invalid wildcard host (changed==False)"
|
||||
# ============================================================
|
||||
gcp_url_map:
|
||||
service_account_email: "{{ service_account_email }}"
|
||||
credentials_file: "{{ credentials_file }}"
|
||||
project_id: "{{ project_id }}"
|
||||
url_map_name: "{{ urlmap }}"
|
||||
default_service: "gfr2-bes"
|
||||
path_matchers:
|
||||
- name: 'path-matcher-one'
|
||||
description: 'path matcher one'
|
||||
default_service: 'gfr-bes'
|
||||
path_rules:
|
||||
- service: 'gfr2-bes'
|
||||
paths:
|
||||
- '/data'
|
||||
- '/aboutus'
|
||||
host_rules:
|
||||
- hosts:
|
||||
- 'foobar*'
|
||||
path_matcher: 'path-matcher-one'
|
||||
state: "present"
|
||||
tags:
|
||||
- param-check
|
||||
ignore_errors: True
|
||||
register: result
|
||||
- name: "assert host wildcard error (error msg ignored, changed==False)"
|
||||
assert:
|
||||
that:
|
||||
- 'not result.changed'
|
||||
- 'result.msg == "wildcard must be first char in host, foobar*"'
|
||||
|
||||
# ============================================================
|
||||
- name: "Update UrlMap with invalid wildcard host second char (changed==False)"
|
||||
# ============================================================
|
||||
gcp_url_map:
|
||||
service_account_email: "{{ service_account_email }}"
|
||||
credentials_file: "{{ credentials_file }}"
|
||||
project_id: "{{ project_id }}"
|
||||
url_map_name: "{{ urlmap }}"
|
||||
default_service: "gfr2-bes"
|
||||
path_matchers:
|
||||
- name: 'path-matcher-one'
|
||||
description: 'path matcher one'
|
||||
default_service: 'gfr-bes'
|
||||
path_rules:
|
||||
- service: 'gfr2-bes'
|
||||
paths:
|
||||
- '/data'
|
||||
- '/aboutus'
|
||||
host_rules:
|
||||
- hosts:
|
||||
- '*='
|
||||
path_matcher: 'path-matcher-one'
|
||||
state: "present"
|
||||
tags:
|
||||
- param-check
|
||||
ignore_errors: True
|
||||
register: result
|
||||
- name: "assert wildcard error second char (error msg ignored, changed==False)"
|
||||
assert:
|
||||
that:
|
||||
- 'not result.changed'
|
||||
- 'result.msg == "wildcard be followed by a ''.'' or ''-'', *="'
|
||||
@@ -913,7 +913,6 @@ test/units/module_utils/basic/test_safe_eval.py
|
||||
test/units/module_utils/basic/test_set_mode_if_different.py
|
||||
test/units/module_utils/ec2/test_aws.py
|
||||
test/units/module_utils/gcp/test_auth.py
|
||||
test/units/module_utils/gcp/test_utils.py
|
||||
test/units/module_utils/json_utils/test_filter_non_json_lines.py
|
||||
test/units/module_utils/test_basic.py
|
||||
test/units/module_utils/test_distribution_version.py
|
||||
|
||||
@@ -19,7 +19,8 @@ import os
|
||||
import sys
|
||||
|
||||
from ansible.compat.tests import mock, unittest
|
||||
from ansible.module_utils.gcp import (check_min_pkg_version)
|
||||
from ansible.module_utils.gcp import check_min_pkg_version, GCPUtils, GCPInvalidURLError
|
||||
|
||||
|
||||
def build_distribution(version):
|
||||
obj = mock.MagicMock()
|
||||
@@ -28,9 +29,316 @@ def build_distribution(version):
|
||||
|
||||
|
||||
class GCPUtilsTestCase(unittest.TestCase):
|
||||
params_dict = {
|
||||
'url_map_name': 'foo_url_map_name',
|
||||
'description': 'foo_url_map description',
|
||||
'host_rules': [
|
||||
{
|
||||
'description': 'host rules description',
|
||||
'hosts': [
|
||||
'www.example.com',
|
||||
'www2.example.com'
|
||||
],
|
||||
'path_matcher': 'host_rules_path_matcher'
|
||||
}
|
||||
],
|
||||
'path_matchers': [
|
||||
{
|
||||
'name': 'path_matcher_one',
|
||||
'description': 'path matcher one',
|
||||
'defaultService': 'bes-pathmatcher-one-default',
|
||||
'pathRules': [
|
||||
{
|
||||
'service': 'my-one-bes',
|
||||
'paths': [
|
||||
'/',
|
||||
'/aboutus'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'name': 'path_matcher_two',
|
||||
'description': 'path matcher two',
|
||||
'defaultService': 'bes-pathmatcher-two-default',
|
||||
'pathRules': [
|
||||
{
|
||||
'service': 'my-two-bes',
|
||||
'paths': [
|
||||
'/webapp',
|
||||
'/graphs'
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@mock.patch("pkg_resources.get_distribution", side_effect=build_distribution)
|
||||
def test_check_minimum_pkg_version(self, mockobj):
|
||||
self.assertTrue(check_min_pkg_version('foobar', '0.4.0'))
|
||||
self.assertTrue(check_min_pkg_version('foobar', '0.5.0'))
|
||||
self.assertFalse(check_min_pkg_version('foobar', '0.6.0'))
|
||||
|
||||
def test_parse_gcp_url(self):
|
||||
# region, resource, entity, method
|
||||
input_url = 'https://www.googleapis.com/compute/v1/projects/myproject/regions/us-east1/instanceGroupManagers/my-mig/recreateInstances'
|
||||
actual = GCPUtils.parse_gcp_url(input_url)
|
||||
self.assertEquals('compute', actual['service'])
|
||||
self.assertEquals('v1', actual['api_version'])
|
||||
self.assertEquals('myproject', actual['project'])
|
||||
self.assertEquals('us-east1', actual['region'])
|
||||
self.assertEquals('instanceGroupManagers', actual['resource_name'])
|
||||
self.assertEquals('my-mig', actual['entity_name'])
|
||||
self.assertEquals('recreateInstances', actual['method_name'])
|
||||
|
||||
# zone, resource, entity, method
|
||||
input_url = 'https://www.googleapis.com/compute/v1/projects/myproject/zones/us-east1-c/instanceGroupManagers/my-mig/recreateInstances'
|
||||
actual = GCPUtils.parse_gcp_url(input_url)
|
||||
self.assertEquals('compute', actual['service'])
|
||||
self.assertEquals('v1', actual['api_version'])
|
||||
self.assertEquals('myproject', actual['project'])
|
||||
self.assertEquals('us-east1-c', actual['zone'])
|
||||
self.assertEquals('instanceGroupManagers', actual['resource_name'])
|
||||
self.assertEquals('my-mig', actual['entity_name'])
|
||||
self.assertEquals('recreateInstances', actual['method_name'])
|
||||
|
||||
# global, resource
|
||||
input_url = 'https://www.googleapis.com/compute/v1/projects/myproject/global/urlMaps'
|
||||
actual = GCPUtils.parse_gcp_url(input_url)
|
||||
self.assertEquals('compute', actual['service'])
|
||||
self.assertEquals('v1', actual['api_version'])
|
||||
self.assertEquals('myproject', actual['project'])
|
||||
self.assertTrue('global' in actual)
|
||||
self.assertTrue(actual['global'])
|
||||
self.assertEquals('urlMaps', actual['resource_name'])
|
||||
|
||||
# global, resource, entity
|
||||
input_url = 'https://www.googleapis.com/compute/v1/projects/myproject/global/urlMaps/my-url-map'
|
||||
actual = GCPUtils.parse_gcp_url(input_url)
|
||||
self.assertEquals('myproject', actual['project'])
|
||||
self.assertTrue('global' in actual)
|
||||
self.assertTrue(actual['global'])
|
||||
self.assertEquals('v1', actual['api_version'])
|
||||
self.assertEquals('compute', actual['service'])
|
||||
|
||||
# global URL, resource, entity, method_name
|
||||
input_url = 'https://www.googleapis.com/compute/v1/projects/myproject/global/backendServices/mybackendservice/getHealth'
|
||||
actual = GCPUtils.parse_gcp_url(input_url)
|
||||
self.assertEquals('compute', actual['service'])
|
||||
self.assertEquals('v1', actual['api_version'])
|
||||
self.assertEquals('myproject', actual['project'])
|
||||
self.assertTrue('global' in actual)
|
||||
self.assertTrue(actual['global'])
|
||||
self.assertEquals('backendServices', actual['resource_name'])
|
||||
self.assertEquals('mybackendservice', actual['entity_name'])
|
||||
self.assertEquals('getHealth', actual['method_name'])
|
||||
|
||||
# no location in URL
|
||||
input_url = 'https://www.googleapis.com/compute/v1/projects/myproject/targetHttpProxies/mytargetproxy/setUrlMap'
|
||||
actual = GCPUtils.parse_gcp_url(input_url)
|
||||
self.assertEquals('compute', actual['service'])
|
||||
self.assertEquals('v1', actual['api_version'])
|
||||
self.assertEquals('myproject', actual['project'])
|
||||
self.assertFalse('global' in actual)
|
||||
self.assertEquals('targetHttpProxies', actual['resource_name'])
|
||||
self.assertEquals('mytargetproxy', actual['entity_name'])
|
||||
self.assertEquals('setUrlMap', actual['method_name'])
|
||||
|
||||
input_url = 'https://www.googleapis.com/compute/v1/projects/myproject/targetHttpProxies/mytargetproxy'
|
||||
actual = GCPUtils.parse_gcp_url(input_url)
|
||||
self.assertEquals('compute', actual['service'])
|
||||
self.assertEquals('v1', actual['api_version'])
|
||||
self.assertEquals('myproject', actual['project'])
|
||||
self.assertFalse('global' in actual)
|
||||
self.assertEquals('targetHttpProxies', actual['resource_name'])
|
||||
self.assertEquals('mytargetproxy', actual['entity_name'])
|
||||
|
||||
input_url = 'https://www.googleapis.com/compute/v1/projects/myproject/targetHttpProxies'
|
||||
actual = GCPUtils.parse_gcp_url(input_url)
|
||||
self.assertEquals('compute', actual['service'])
|
||||
self.assertEquals('v1', actual['api_version'])
|
||||
self.assertEquals('myproject', actual['project'])
|
||||
self.assertFalse('global' in actual)
|
||||
self.assertEquals('targetHttpProxies', actual['resource_name'])
|
||||
|
||||
# test exceptions
|
||||
no_projects_input_url = 'https://www.googleapis.com/compute/v1/not-projects/myproject/global/backendServices/mybackendservice/getHealth'
|
||||
no_resource_input_url = 'https://www.googleapis.com/compute/v1/not-projects/myproject/global'
|
||||
|
||||
no_resource_no_loc_input_url = 'https://www.googleapis.com/compute/v1/not-projects/myproject'
|
||||
|
||||
with self.assertRaises(GCPInvalidURLError) as cm:
|
||||
GCPUtils.parse_gcp_url(no_projects_input_url)
|
||||
self.assertTrue(cm.exception, GCPInvalidURLError)
|
||||
|
||||
with self.assertRaises(GCPInvalidURLError) as cm:
|
||||
GCPUtils.parse_gcp_url(no_resource_input_url)
|
||||
self.assertTrue(cm.exception, GCPInvalidURLError)
|
||||
|
||||
with self.assertRaises(GCPInvalidURLError) as cm:
|
||||
GCPUtils.parse_gcp_url(no_resource_no_loc_input_url)
|
||||
self.assertTrue(cm.exception, GCPInvalidURLError)
|
||||
|
||||
def test_params_to_gcp_dict(self):
|
||||
|
||||
expected = {
|
||||
'description': 'foo_url_map description',
|
||||
'hostRules': [
|
||||
{
|
||||
'description': 'host rules description',
|
||||
'hosts': [
|
||||
'www.example.com',
|
||||
'www2.example.com'
|
||||
],
|
||||
'pathMatcher': 'host_rules_path_matcher'
|
||||
}
|
||||
],
|
||||
'name': 'foo_url_map_name',
|
||||
'pathMatchers': [
|
||||
{
|
||||
'defaultService': 'bes-pathmatcher-one-default',
|
||||
'description': 'path matcher one',
|
||||
'name': 'path_matcher_one',
|
||||
'pathRules': [
|
||||
{
|
||||
'paths': [
|
||||
'/',
|
||||
'/aboutus'
|
||||
],
|
||||
'service': 'my-one-bes'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'defaultService': 'bes-pathmatcher-two-default',
|
||||
'description': 'path matcher two',
|
||||
'name': 'path_matcher_two',
|
||||
'pathRules': [
|
||||
{
|
||||
'paths': [
|
||||
'/webapp',
|
||||
'/graphs'
|
||||
],
|
||||
'service': 'my-two-bes'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
actual = GCPUtils.params_to_gcp_dict(self.params_dict, 'url_map_name')
|
||||
self.assertEqual(expected, actual)
|
||||
|
||||
def test_get_gcp_resource_from_methodId(self):
|
||||
input_data = 'compute.urlMaps.list'
|
||||
actual = GCPUtils.get_gcp_resource_from_methodId(input_data)
|
||||
self.assertEqual('urlMaps', actual)
|
||||
input_data = None
|
||||
actual = GCPUtils.get_gcp_resource_from_methodId(input_data)
|
||||
self.assertFalse(actual)
|
||||
input_data = 666
|
||||
actual = GCPUtils.get_gcp_resource_from_methodId(input_data)
|
||||
self.assertFalse(actual)
|
||||
|
||||
def test_get_entity_name_from_resource_name(self):
|
||||
input_data = 'urlMaps'
|
||||
actual = GCPUtils.get_entity_name_from_resource_name(input_data)
|
||||
self.assertEqual('urlMap', actual)
|
||||
input_data = 'targetHttpProxies'
|
||||
actual = GCPUtils.get_entity_name_from_resource_name(input_data)
|
||||
self.assertEqual('targetHttpProxy', actual)
|
||||
input_data = 'globalForwardingRules'
|
||||
actual = GCPUtils.get_entity_name_from_resource_name(input_data)
|
||||
self.assertEqual('forwardingRule', actual)
|
||||
input_data = ''
|
||||
actual = GCPUtils.get_entity_name_from_resource_name(input_data)
|
||||
self.assertEqual(None, actual)
|
||||
input_data = 666
|
||||
actual = GCPUtils.get_entity_name_from_resource_name(input_data)
|
||||
self.assertEqual(None, actual)
|
||||
|
||||
def test_are_params_equal(self):
|
||||
params1 = {'one': 1}
|
||||
params2 = {'one': 1}
|
||||
actual = GCPUtils.are_params_equal(params1, params2)
|
||||
self.assertTrue(actual)
|
||||
|
||||
params1 = {'one': 1}
|
||||
params2 = {'two': 2}
|
||||
actual = GCPUtils.are_params_equal(params1, params2)
|
||||
self.assertFalse(actual)
|
||||
|
||||
params1 = {'three': 3, 'two': 2, 'one': 1}
|
||||
params2 = {'one': 1, 'two': 2, 'three': 3}
|
||||
actual = GCPUtils.are_params_equal(params1, params2)
|
||||
self.assertTrue(actual)
|
||||
|
||||
params1 = {
|
||||
"creationTimestamp": "2017-04-21T11:19:20.718-07:00",
|
||||
"defaultService": "https://www.googleapis.com/compute/v1/projects/myproject/global/backendServices/default-backend-service",
|
||||
"description": "",
|
||||
"fingerprint": "ickr_pwlZPU=",
|
||||
"hostRules": [
|
||||
{
|
||||
"description": "",
|
||||
"hosts": [
|
||||
"*."
|
||||
],
|
||||
"pathMatcher": "path-matcher-one"
|
||||
}
|
||||
],
|
||||
"id": "8566395781175047111",
|
||||
"kind": "compute#urlMap",
|
||||
"name": "newtesturlmap-foo",
|
||||
"pathMatchers": [
|
||||
{
|
||||
"defaultService": "https://www.googleapis.com/compute/v1/projects/myproject/global/backendServices/bes-pathmatcher-one-default",
|
||||
"description": "path matcher one",
|
||||
"name": "path-matcher-one",
|
||||
"pathRules": [
|
||||
{
|
||||
"paths": [
|
||||
"/data",
|
||||
"/aboutus"
|
||||
],
|
||||
"service": "https://www.googleapis.com/compute/v1/projects/myproject/global/backendServices/my-one-bes"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"selfLink": "https://www.googleapis.com/compute/v1/projects/myproject/global/urlMaps/newtesturlmap-foo"
|
||||
}
|
||||
params2 = {
|
||||
"defaultService": "https://www.googleapis.com/compute/v1/projects/myproject/global/backendServices/default-backend-service",
|
||||
"hostRules": [
|
||||
{
|
||||
"description": "",
|
||||
"hosts": [
|
||||
"*."
|
||||
],
|
||||
"pathMatcher": "path-matcher-one"
|
||||
}
|
||||
],
|
||||
"name": "newtesturlmap-foo",
|
||||
"pathMatchers": [
|
||||
{
|
||||
"defaultService": "https://www.googleapis.com/compute/v1/projects/myproject/global/backendServices/bes-pathmatcher-one-default",
|
||||
"description": "path matcher one",
|
||||
"name": "path-matcher-one",
|
||||
"pathRules": [
|
||||
{
|
||||
"paths": [
|
||||
"/data",
|
||||
"/aboutus"
|
||||
],
|
||||
"service": "https://www.googleapis.com/compute/v1/projects/myproject/global/backendServices/my-one-bes"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
}
|
||||
|
||||
# params1 has exclude fields, params2 doesn't. Should be equal
|
||||
actual = GCPUtils.are_params_equal(params1, params2)
|
||||
self.assertTrue(actual)
|
||||
|
||||
164
test/units/modules/cloud/google/test_gcp_url_map.py
Normal file
164
test/units/modules/cloud/google/test_gcp_url_map.py
Normal file
@@ -0,0 +1,164 @@
|
||||
import unittest
|
||||
|
||||
from ansible.modules.cloud.google.gcp_url_map import _build_path_matchers, _build_url_map_dict
|
||||
|
||||
|
||||
class TestGCPUrlMap(unittest.TestCase):
|
||||
"""Unit tests for gcp_url_map module."""
|
||||
params_dict = {
|
||||
'url_map_name': 'foo_url_map_name',
|
||||
'description': 'foo_url_map description',
|
||||
'host_rules': [
|
||||
{
|
||||
'description': 'host rules description',
|
||||
'hosts': [
|
||||
'www.example.com',
|
||||
'www2.example.com'
|
||||
],
|
||||
'path_matcher': 'host_rules_path_matcher'
|
||||
}
|
||||
],
|
||||
'path_matchers': [
|
||||
{
|
||||
'name': 'path_matcher_one',
|
||||
'description': 'path matcher one',
|
||||
'defaultService': 'bes-pathmatcher-one-default',
|
||||
'pathRules': [
|
||||
{
|
||||
'service': 'my-one-bes',
|
||||
'paths': [
|
||||
'/',
|
||||
'/aboutus'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'name': 'path_matcher_two',
|
||||
'description': 'path matcher two',
|
||||
'defaultService': 'bes-pathmatcher-two-default',
|
||||
'pathRules': [
|
||||
{
|
||||
'service': 'my-two-bes',
|
||||
'paths': [
|
||||
'/webapp',
|
||||
'/graphs'
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
def test__build_path_matchers(self):
|
||||
input_list = [
|
||||
{
|
||||
'defaultService': 'bes-pathmatcher-one-default',
|
||||
'description': 'path matcher one',
|
||||
'name': 'path_matcher_one',
|
||||
'pathRules': [
|
||||
{
|
||||
'paths': [
|
||||
'/',
|
||||
'/aboutus'
|
||||
],
|
||||
'service': 'my-one-bes'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'defaultService': 'bes-pathmatcher-two-default',
|
||||
'description': 'path matcher two',
|
||||
'name': 'path_matcher_two',
|
||||
'pathRules': [
|
||||
{
|
||||
'paths': [
|
||||
'/webapp',
|
||||
'/graphs'
|
||||
],
|
||||
'service': 'my-two-bes'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
expected = [
|
||||
{
|
||||
'defaultService': 'https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/bes-pathmatcher-one-default',
|
||||
'description': 'path matcher one',
|
||||
'name': 'path_matcher_one',
|
||||
'pathRules': [
|
||||
{
|
||||
'paths': [
|
||||
'/',
|
||||
'/aboutus'
|
||||
],
|
||||
'service': 'https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/my-one-bes'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'defaultService': 'https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/bes-pathmatcher-two-default',
|
||||
'description': 'path matcher two',
|
||||
'name': 'path_matcher_two',
|
||||
'pathRules': [
|
||||
{
|
||||
'paths': [
|
||||
'/webapp',
|
||||
'/graphs'
|
||||
],
|
||||
'service': 'https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/my-two-bes'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
actual = _build_path_matchers(input_list, 'my-project')
|
||||
self.assertEqual(expected, actual)
|
||||
|
||||
def test__build_url_map_dict(self):
|
||||
|
||||
expected = {
|
||||
'description': 'foo_url_map description',
|
||||
'hostRules': [
|
||||
{
|
||||
'description': 'host rules description',
|
||||
'hosts': [
|
||||
'www.example.com',
|
||||
'www2.example.com'
|
||||
],
|
||||
'pathMatcher': 'host_rules_path_matcher'
|
||||
}
|
||||
],
|
||||
'name': 'foo_url_map_name',
|
||||
'pathMatchers': [
|
||||
{
|
||||
'defaultService': 'https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/bes-pathmatcher-one-default',
|
||||
'description': 'path matcher one',
|
||||
'name': 'path_matcher_one',
|
||||
'pathRules': [
|
||||
{
|
||||
'paths': [
|
||||
'/',
|
||||
'/aboutus'
|
||||
],
|
||||
'service': 'https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/my-one-bes'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'defaultService': 'https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/bes-pathmatcher-two-default',
|
||||
'description': 'path matcher two',
|
||||
'name': 'path_matcher_two',
|
||||
'pathRules': [
|
||||
{
|
||||
'paths': [
|
||||
'/webapp',
|
||||
'/graphs'
|
||||
],
|
||||
'service': 'https://www.googleapis.com/compute/v1/projects/my-project/global/backendServices/my-two-bes'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
actual = _build_url_map_dict(self.params_dict, 'my-project')
|
||||
self.assertEqual(expected, actual)
|
||||
Reference in New Issue
Block a user