mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-27 21:01:27 -07:00
[GCP] Healthcheck module (#24564)
* [GCP] Healthcheck module * fix return YAML block * removed update_ return value; removed python26 check; typos and docs updates * doc fix * Updated int test for no-update conditions * added filter_gcp_fields test * fixed bug in update where dictionary wasn't built correctly and port was not being set. * added default values to documentation block
This commit is contained in:
parent
ed2f13b3db
commit
c99c3b2b5d
5 changed files with 682 additions and 0 deletions
469
lib/ansible/modules/cloud/google/gcp_healthcheck.py
Normal file
469
lib/ansible/modules/cloud/google/gcp_healthcheck.py
Normal file
|
@ -0,0 +1,469 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# Copyright 2017 Google Inc.
|
||||||
|
#
|
||||||
|
# This file is part of Ansible
|
||||||
|
#
|
||||||
|
# Ansible 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.
|
||||||
|
#
|
||||||
|
# Ansible 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
ANSIBLE_METADATA = {'metadata_version': '1.0',
|
||||||
|
'status': ['preview'],
|
||||||
|
'supported_by': 'community'}
|
||||||
|
|
||||||
|
|
||||||
|
DOCUMENTATION = '''
|
||||||
|
---
|
||||||
|
module: gcp_healthcheck
|
||||||
|
version_added: "2.4"
|
||||||
|
short_description: Create, Update or Destroy a Healthcheck.
|
||||||
|
description:
|
||||||
|
- Create, Update or Destroy a Healthcheck. Currently only HTTP and
|
||||||
|
HTTPS Healthchecks are supported. Healthchecks are used to monitor
|
||||||
|
individual instances, managed instance groups and/or backend
|
||||||
|
services. Healtchecks are reusable.
|
||||||
|
- Visit
|
||||||
|
U(https://cloud.google.com/compute/docs/load-balancing/health-checks)
|
||||||
|
for an overview of Healthchecks on GCP.
|
||||||
|
- See
|
||||||
|
U(https://cloud.google.com/compute/docs/reference/latest/httpHealthChecks) for
|
||||||
|
API details on HTTP Healthchecks.
|
||||||
|
- See
|
||||||
|
U(https://cloud.google.com/compute/docs/reference/latest/httpsHealthChecks)
|
||||||
|
for more details on the HTTPS Healtcheck API.
|
||||||
|
requirements:
|
||||||
|
- "python >= 2.6"
|
||||||
|
- "google-api-python-client >= 1.6.2"
|
||||||
|
- "google-auth >= 0.9.0"
|
||||||
|
- "google-auth-httplib2 >= 0.0.2"
|
||||||
|
notes:
|
||||||
|
- Only supports HTTP and HTTPS Healthchecks currently.
|
||||||
|
author:
|
||||||
|
- "Tom Melendez (@supertom) <tom@supertom.com>"
|
||||||
|
options:
|
||||||
|
check_interval:
|
||||||
|
description:
|
||||||
|
- How often (in seconds) to send a health check.
|
||||||
|
required: false
|
||||||
|
default: 5
|
||||||
|
healthcheck_name:
|
||||||
|
description:
|
||||||
|
- Name of the Healthcheck.
|
||||||
|
required: true
|
||||||
|
healthcheck_type:
|
||||||
|
description:
|
||||||
|
- Type of Healthcheck.
|
||||||
|
required: true
|
||||||
|
choices: ["HTTP", "HTTPS"]
|
||||||
|
host_header:
|
||||||
|
description:
|
||||||
|
- The value of the host header in the health check request. If left
|
||||||
|
empty, the public IP on behalf of which this health
|
||||||
|
check is performed will be used.
|
||||||
|
required: true
|
||||||
|
default: ""
|
||||||
|
port:
|
||||||
|
description:
|
||||||
|
- The TCP port number for the health check request. The default value is
|
||||||
|
443 for HTTPS and 80 for HTTP.
|
||||||
|
required: false
|
||||||
|
request_path:
|
||||||
|
description:
|
||||||
|
- The request path of the HTTPS health check request.
|
||||||
|
required: false
|
||||||
|
default: "/"
|
||||||
|
state:
|
||||||
|
description: State of the Healthcheck.
|
||||||
|
required: true
|
||||||
|
choices: ["present", "absent"]
|
||||||
|
timeout:
|
||||||
|
description:
|
||||||
|
- How long (in seconds) to wait for a response before claiming
|
||||||
|
failure. It is invalid for timeout
|
||||||
|
to have a greater value than check_interval.
|
||||||
|
required: false
|
||||||
|
default: 5
|
||||||
|
unhealthy_threshold:
|
||||||
|
description:
|
||||||
|
- A so-far healthy instance will be marked unhealthy after this
|
||||||
|
many consecutive failures.
|
||||||
|
required: false
|
||||||
|
default: 2
|
||||||
|
healthy_threshold:
|
||||||
|
description:
|
||||||
|
- A so-far unhealthy instance will be marked healthy after this
|
||||||
|
many consecutive successes.
|
||||||
|
required: false
|
||||||
|
default: 2
|
||||||
|
service_account_email:
|
||||||
|
description:
|
||||||
|
- service account email
|
||||||
|
required: false
|
||||||
|
default: null
|
||||||
|
service_account_permissions:
|
||||||
|
version_added: "2.0"
|
||||||
|
description:
|
||||||
|
- service account permissions (see
|
||||||
|
U(https://cloud.google.com/sdk/gcloud/reference/compute/instances/create),
|
||||||
|
--scopes section for detailed information)
|
||||||
|
required: false
|
||||||
|
default: null
|
||||||
|
choices: [
|
||||||
|
"bigquery", "cloud-platform", "compute-ro", "compute-rw",
|
||||||
|
"useraccounts-ro", "useraccounts-rw", "datastore", "logging-write",
|
||||||
|
"monitoring", "sql-admin", "storage-full", "storage-ro",
|
||||||
|
"storage-rw", "taskqueue", "userinfo-email"
|
||||||
|
]
|
||||||
|
credentials_file:
|
||||||
|
description:
|
||||||
|
- Path to the JSON file associated with the service account email
|
||||||
|
default: null
|
||||||
|
required: false
|
||||||
|
project_id:
|
||||||
|
description:
|
||||||
|
- Your GCP project ID
|
||||||
|
required: false
|
||||||
|
default: null
|
||||||
|
'''
|
||||||
|
|
||||||
|
EXAMPLES = '''
|
||||||
|
- name: Create Minimum HealthCheck
|
||||||
|
gcp_healthcheck:
|
||||||
|
service_account_email: "{{ service_account_email }}"
|
||||||
|
credentials_file: "{{ credentials_file }}"
|
||||||
|
project_id: "{{ project_id }}"
|
||||||
|
healthcheck_name: my-healthcheck
|
||||||
|
healthcheck_type: HTTP
|
||||||
|
state: present
|
||||||
|
- name: Create HTTP HealthCheck
|
||||||
|
gcp_healthcheck:
|
||||||
|
service_account_email: "{{ service_account_email }}"
|
||||||
|
credentials_file: "{{ credentials_file }}"
|
||||||
|
project_id: "{{ project_id }}"
|
||||||
|
healthcheck_name: my-healthcheck
|
||||||
|
healthcheck_type: HTTP
|
||||||
|
host: my-host
|
||||||
|
request_path: /hc
|
||||||
|
check_interval: 10
|
||||||
|
timeout: 30
|
||||||
|
unhealthy_threshhold: 2
|
||||||
|
healthy_threshhold: 1
|
||||||
|
state: present
|
||||||
|
- name: Create HTTPS HealthCheck
|
||||||
|
gcp_healthcheck:
|
||||||
|
service_account_email: "{{ service_account_email }}"
|
||||||
|
credentials_file: "{{ credentials_file }}"
|
||||||
|
project_id: "{{ project_id }}"
|
||||||
|
healthcheck_name: "{{ https_healthcheck }}"
|
||||||
|
healthcheck_type: HTTPS
|
||||||
|
host_header: my-host
|
||||||
|
request_path: /hc
|
||||||
|
check_interval: 5
|
||||||
|
timeout: 5
|
||||||
|
unhealthy_threshold: 2
|
||||||
|
healthy_threshold: 1
|
||||||
|
state: present
|
||||||
|
'''
|
||||||
|
|
||||||
|
RETURN = '''
|
||||||
|
state:
|
||||||
|
description: state of the Healthcheck
|
||||||
|
returned: Always.
|
||||||
|
type: str
|
||||||
|
sample: present
|
||||||
|
healthcheck_name:
|
||||||
|
description: Name of the Healthcheck
|
||||||
|
returned: Always
|
||||||
|
type: str
|
||||||
|
sample: my-url-map
|
||||||
|
healthcheck_type:
|
||||||
|
description: Type of the Healthcheck
|
||||||
|
returned: Always
|
||||||
|
type: str
|
||||||
|
sample: HTTP
|
||||||
|
healthcheck:
|
||||||
|
description: GCP Healthcheck dictionary
|
||||||
|
returned: Always. Refer to GCP documentation for detailed field descriptions.
|
||||||
|
type: dict
|
||||||
|
sample: { "name": "my-hc", "port": 443, "requestPath": "/foo" }
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
# import module snippets
|
||||||
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
|
from ansible.module_utils.gcp import check_params, get_google_api_client, GCPUtils
|
||||||
|
|
||||||
|
USER_AGENT_PRODUCT = 'ansible-healthcheck'
|
||||||
|
USER_AGENT_VERSION = '0.0.1'
|
||||||
|
|
||||||
|
|
||||||
|
def _validate_healthcheck_params(params):
|
||||||
|
"""
|
||||||
|
Validate healthcheck params.
|
||||||
|
|
||||||
|
Simple validation has already assumed by AnsibleModule.
|
||||||
|
|
||||||
|
:param params: Ansible dictionary containing configuration.
|
||||||
|
:type params: ``dict``
|
||||||
|
|
||||||
|
:return: True or raises ValueError
|
||||||
|
:rtype: ``bool`` or `class:ValueError`
|
||||||
|
"""
|
||||||
|
if params['timeout'] > params['check_interval']:
|
||||||
|
raise ValueError("timeout (%s) is greater than check_interval (%s)" % (
|
||||||
|
params['timeout'], params['check_interval']))
|
||||||
|
|
||||||
|
return (True, '')
|
||||||
|
|
||||||
|
|
||||||
|
def _build_healthcheck_dict(params):
|
||||||
|
"""
|
||||||
|
Reformat services in Ansible Params for GCP.
|
||||||
|
|
||||||
|
:param params: Params from AnsibleModule object
|
||||||
|
:type params: ``dict``
|
||||||
|
|
||||||
|
:param project_id: The GCP project ID.
|
||||||
|
:type project_id: ``str``
|
||||||
|
|
||||||
|
:return: dictionary suitable for submission to GCP
|
||||||
|
HealthCheck (HTTP/HTTPS) API.
|
||||||
|
:rtype ``dict``
|
||||||
|
"""
|
||||||
|
gcp_dict = GCPUtils.params_to_gcp_dict(params, 'healthcheck_name')
|
||||||
|
if 'timeout' in gcp_dict:
|
||||||
|
gcp_dict['timeoutSec'] = gcp_dict['timeout']
|
||||||
|
del gcp_dict['timeout']
|
||||||
|
|
||||||
|
if 'checkInterval' in gcp_dict:
|
||||||
|
gcp_dict['checkIntervalSec'] = gcp_dict['checkInterval']
|
||||||
|
del gcp_dict['checkInterval']
|
||||||
|
|
||||||
|
if 'hostHeader' in gcp_dict:
|
||||||
|
gcp_dict['host'] = gcp_dict['hostHeader']
|
||||||
|
del gcp_dict['hostHeader']
|
||||||
|
|
||||||
|
if 'healthcheckType' in gcp_dict:
|
||||||
|
del gcp_dict['healthcheckType']
|
||||||
|
return gcp_dict
|
||||||
|
|
||||||
|
|
||||||
|
def _get_req_resource(client, resource_type):
|
||||||
|
if resource_type == 'HTTPS':
|
||||||
|
return (client.httpsHealthChecks(), 'httpsHealthCheck')
|
||||||
|
else:
|
||||||
|
return (client.httpHealthChecks(), 'httpHealthCheck')
|
||||||
|
|
||||||
|
|
||||||
|
def get_healthcheck(client, name, project_id=None, resource_type='HTTP'):
|
||||||
|
"""
|
||||||
|
Get a Healthcheck from GCP.
|
||||||
|
|
||||||
|
:param client: An initialized GCE Compute Disovery resource.
|
||||||
|
:type client: :class: `googleapiclient.discovery.Resource`
|
||||||
|
|
||||||
|
:param name: Name of the Url Map.
|
||||||
|
:type name: ``str``
|
||||||
|
|
||||||
|
:param project_id: The GCP project ID.
|
||||||
|
:type project_id: ``str``
|
||||||
|
|
||||||
|
:return: A dict resp from the respective GCP 'get' request.
|
||||||
|
:rtype: ``dict``
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
resource, entity_name = _get_req_resource(client, resource_type)
|
||||||
|
args = {'project': project_id, entity_name: name}
|
||||||
|
req = resource.get(**args)
|
||||||
|
return GCPUtils.execute_api_client_req(req, raise_404=False)
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def create_healthcheck(client, params, project_id, resource_type='HTTP'):
|
||||||
|
"""
|
||||||
|
Create a new Healthcheck.
|
||||||
|
|
||||||
|
:param client: An initialized GCE Compute Disovery resource.
|
||||||
|
:type client: :class: `googleapiclient.discovery.Resource`
|
||||||
|
|
||||||
|
:param params: Dictionary of arguments from AnsibleModule.
|
||||||
|
:type params: ``dict``
|
||||||
|
|
||||||
|
:return: Tuple with changed status and response dict
|
||||||
|
:rtype: ``tuple`` in the format of (bool, dict)
|
||||||
|
"""
|
||||||
|
gcp_dict = _build_healthcheck_dict(params)
|
||||||
|
try:
|
||||||
|
resource, _ = _get_req_resource(client, resource_type)
|
||||||
|
args = {'project': project_id, 'body': gcp_dict}
|
||||||
|
req = resource.insert(**args)
|
||||||
|
return_data = GCPUtils.execute_api_client_req(req, client, raw=False)
|
||||||
|
if not return_data:
|
||||||
|
return_data = get_healthcheck(client,
|
||||||
|
name=params['healthcheck_name'],
|
||||||
|
project_id=project_id)
|
||||||
|
return (True, return_data)
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def delete_healthcheck(client, name, project_id, resource_type='HTTP'):
|
||||||
|
"""
|
||||||
|
Delete a Healthcheck.
|
||||||
|
|
||||||
|
:param client: An initialized GCE Compute Disover resource.
|
||||||
|
:type client: :class: `googleapiclient.discovery.Resource`
|
||||||
|
|
||||||
|
:param name: Name of the Url Map.
|
||||||
|
:type name: ``str``
|
||||||
|
|
||||||
|
:param project_id: The GCP project ID.
|
||||||
|
:type project_id: ``str``
|
||||||
|
|
||||||
|
:return: Tuple with changed status and response dict
|
||||||
|
:rtype: ``tuple`` in the format of (bool, dict)
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
resource, entity_name = _get_req_resource(client, resource_type)
|
||||||
|
args = {'project': project_id, entity_name: name}
|
||||||
|
req = resource.delete(**args)
|
||||||
|
return_data = GCPUtils.execute_api_client_req(req, client)
|
||||||
|
return (True, return_data)
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def update_healthcheck(client, healthcheck, params, name, project_id,
|
||||||
|
resource_type='HTTP'):
|
||||||
|
"""
|
||||||
|
Update a Healthcheck.
|
||||||
|
|
||||||
|
If the healthcheck has not changed, the update will not occur.
|
||||||
|
|
||||||
|
:param client: An initialized GCE Compute Disovery resource.
|
||||||
|
:type client: :class: `googleapiclient.discovery.Resource`
|
||||||
|
|
||||||
|
:param healthcheck: Name of the Url Map.
|
||||||
|
:type healthcheck: ``dict``
|
||||||
|
|
||||||
|
:param params: Dictionary of arguments from AnsibleModule.
|
||||||
|
:type params: ``dict``
|
||||||
|
|
||||||
|
:param name: Name of the Url Map.
|
||||||
|
:type name: ``str``
|
||||||
|
|
||||||
|
:param project_id: The GCP project ID.
|
||||||
|
:type project_id: ``str``
|
||||||
|
|
||||||
|
:return: Tuple with changed status and response dict
|
||||||
|
:rtype: ``tuple`` in the format of (bool, dict)
|
||||||
|
"""
|
||||||
|
gcp_dict = _build_healthcheck_dict(params)
|
||||||
|
ans = GCPUtils.are_params_equal(healthcheck, gcp_dict)
|
||||||
|
if ans:
|
||||||
|
return (False, 'no update necessary')
|
||||||
|
|
||||||
|
try:
|
||||||
|
resource, entity_name = _get_req_resource(client, resource_type)
|
||||||
|
args = {'project': project_id, entity_name: name, 'body': gcp_dict}
|
||||||
|
req = resource.update(**args)
|
||||||
|
return_data = GCPUtils.execute_api_client_req(
|
||||||
|
req, client=client, raw=False)
|
||||||
|
return (True, return_data)
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
module = AnsibleModule(argument_spec=dict(
|
||||||
|
healthcheck_name=dict(required=True),
|
||||||
|
healthcheck_type=dict(required=True,
|
||||||
|
choices=['HTTP', 'HTTPS']),
|
||||||
|
request_path=dict(required=False, default='/'),
|
||||||
|
check_interval=dict(required=False, type='int', default=5),
|
||||||
|
healthy_threshold=dict(required=False, type='int', default=2),
|
||||||
|
unhealthy_threshold=dict(required=False, type='int', default=2),
|
||||||
|
host_header=dict(required=False, type='str', default=''),
|
||||||
|
timeout=dict(required=False, type='int', default=5),
|
||||||
|
port=dict(required=False, type='int'),
|
||||||
|
state=dict(choices=['absent', 'present'], default='present'),
|
||||||
|
service_account_email=dict(),
|
||||||
|
service_account_permissions=dict(type='list'),
|
||||||
|
credentials_file=dict(),
|
||||||
|
project_id=dict(), ), )
|
||||||
|
|
||||||
|
client, conn_params = get_google_api_client(module, 'compute', user_agent_product=USER_AGENT_PRODUCT,
|
||||||
|
user_agent_version=USER_AGENT_VERSION)
|
||||||
|
|
||||||
|
params = {}
|
||||||
|
|
||||||
|
params['healthcheck_name'] = module.params.get('healthcheck_name')
|
||||||
|
params['healthcheck_type'] = module.params.get('healthcheck_type')
|
||||||
|
params['request_path'] = module.params.get('request_path')
|
||||||
|
params['check_interval'] = module.params.get('check_interval')
|
||||||
|
params['healthy_threshold'] = module.params.get('healthy_threshold')
|
||||||
|
params['unhealthy_threshold'] = module.params.get('unhealthy_threshold')
|
||||||
|
params['host_header'] = module.params.get('host_header')
|
||||||
|
params['timeout'] = module.params.get('timeout')
|
||||||
|
params['port'] = module.params.get('port', None)
|
||||||
|
params['state'] = module.params.get('state')
|
||||||
|
|
||||||
|
if not params['port']:
|
||||||
|
params['port'] = 80
|
||||||
|
if params['healthcheck_type'] == 'HTTPS':
|
||||||
|
params['port'] = 443
|
||||||
|
try:
|
||||||
|
_validate_healthcheck_params(params)
|
||||||
|
except Exception as e:
|
||||||
|
module.fail_json(msg=e.message, changed=False)
|
||||||
|
|
||||||
|
changed = False
|
||||||
|
json_output = {'state': params['state']}
|
||||||
|
healthcheck = get_healthcheck(client,
|
||||||
|
name=params['healthcheck_name'],
|
||||||
|
project_id=conn_params['project_id'],
|
||||||
|
resource_type=params['healthcheck_type'])
|
||||||
|
|
||||||
|
if not healthcheck:
|
||||||
|
if params['state'] == 'absent':
|
||||||
|
# Doesn't exist in GCE, and state==absent.
|
||||||
|
changed = False
|
||||||
|
module.fail_json(
|
||||||
|
msg="Cannot delete unknown healthcheck: %s" %
|
||||||
|
(params['healthcheck_name']))
|
||||||
|
else:
|
||||||
|
# Create
|
||||||
|
changed, json_output['healthcheck'] = create_healthcheck(client,
|
||||||
|
params=params,
|
||||||
|
project_id=conn_params['project_id'],
|
||||||
|
resource_type=params['healthcheck_type'])
|
||||||
|
elif params['state'] == 'absent':
|
||||||
|
# Delete
|
||||||
|
changed, json_output['healthcheck'] = delete_healthcheck(client,
|
||||||
|
name=params['healthcheck_name'],
|
||||||
|
project_id=conn_params['project_id'],
|
||||||
|
resource_type=params['healthcheck_type'])
|
||||||
|
else:
|
||||||
|
changed, json_output['healthcheck'] = update_healthcheck(client,
|
||||||
|
healthcheck=healthcheck,
|
||||||
|
params=params,
|
||||||
|
name=params['healthcheck_name'],
|
||||||
|
project_id=conn_params['project_id'],
|
||||||
|
resource_type=params['healthcheck_type'])
|
||||||
|
json_output['changed'] = changed
|
||||||
|
json_output.update(params)
|
||||||
|
module.exit_json(**json_output)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -8,4 +8,5 @@
|
||||||
- { role: test_gce_tag, tags: test_gce_tag }
|
- { role: test_gce_tag, tags: test_gce_tag }
|
||||||
- { role: test_gce_net, tags: test_gce_net }
|
- { role: test_gce_net, tags: test_gce_net }
|
||||||
- { role: test_gcp_url_map, tags: test_gcp_url_map }
|
- { role: test_gcp_url_map, tags: test_gcp_url_map }
|
||||||
|
- { role: test_gcp_healthcheck, tags: test_gcp_healthcheck }
|
||||||
# TODO: tests for gce_lb, gc_storage
|
# TODO: tests for gce_lb, gc_storage
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
# defaults file for test_gcp_healthcheck
|
||||||
|
service_account_email: "{{ gce_service_account_email }}"
|
||||||
|
credentials_file: "{{ gce_pem_file }}"
|
||||||
|
project_id: "{{ gce_project_id }}"
|
||||||
|
http_healthcheck: "ans-int-healthcheck-http-{{ resource_prefix|lower }}"
|
||||||
|
https_healthcheck: "ans-int-healthcheck-https-{{ resource_prefix|lower }}"
|
176
test/integration/roles/test_gcp_healthcheck/tasks/main.yml
Normal file
176
test/integration/roles/test_gcp_healthcheck/tasks/main.yml
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
# GCP Healthcheck Integration Tests.
|
||||||
|
######
|
||||||
|
# ============================================================
|
||||||
|
- name: param check
|
||||||
|
# ============================================================
|
||||||
|
gcp_healthcheck:
|
||||||
|
service_account_email: "{{ service_account_email }}"
|
||||||
|
credentials_file: "{{ credentials_file }}"
|
||||||
|
project_id: "{{ project_id }}"
|
||||||
|
healthcheck_name: "{{ http_healthcheck }}"
|
||||||
|
healthcheck_type: HTTP
|
||||||
|
host_header: my-host
|
||||||
|
request_path: /hc
|
||||||
|
check_interval: 10
|
||||||
|
timeout: 30
|
||||||
|
unhealthy_threshold: 2
|
||||||
|
healthy_threshold: 1
|
||||||
|
state: present
|
||||||
|
ignore_errors: True
|
||||||
|
register: result
|
||||||
|
- name: check interval
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
'result.msg == "timeout (30) is greater than check_interval (10)"'
|
||||||
|
# ============================================================
|
||||||
|
- name: create "{{ http_healthcheck }}"
|
||||||
|
# ============================================================
|
||||||
|
gcp_healthcheck:
|
||||||
|
service_account_email: "{{ service_account_email }}"
|
||||||
|
credentials_file: "{{ credentials_file }}"
|
||||||
|
project_id: "{{ project_id }}"
|
||||||
|
healthcheck_name: "{{ http_healthcheck }}"
|
||||||
|
healthcheck_type: HTTP
|
||||||
|
host_header: my-host
|
||||||
|
request_path: /hc
|
||||||
|
check_interval: 5
|
||||||
|
timeout: 5
|
||||||
|
unhealthy_threshold: 2
|
||||||
|
healthy_threshold: 1
|
||||||
|
state: present
|
||||||
|
register: result
|
||||||
|
- name: assert create
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- 'result.state == "present"'
|
||||||
|
- 'result.changed'
|
||||||
|
# ============================================================
|
||||||
|
- name: "update {{ http_healthcheck }}, no change"
|
||||||
|
# ============================================================
|
||||||
|
gcp_healthcheck:
|
||||||
|
service_account_email: "{{ service_account_email }}"
|
||||||
|
credentials_file: "{{ credentials_file }}"
|
||||||
|
project_id: "{{ project_id }}"
|
||||||
|
healthcheck_name: "{{ http_healthcheck }}"
|
||||||
|
healthcheck_type: HTTP
|
||||||
|
host_header: my-host
|
||||||
|
request_path: /hc
|
||||||
|
check_interval: 5
|
||||||
|
timeout: 5
|
||||||
|
unhealthy_threshold: 2
|
||||||
|
healthy_threshold: 1
|
||||||
|
state: present
|
||||||
|
register: result
|
||||||
|
- name: assert update no change
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- 'result.state == "present"'
|
||||||
|
- 'not result.changed'
|
||||||
|
- 'result.port == 80'
|
||||||
|
# ============================================================
|
||||||
|
- name: create minimum "{{ https_healthcheck }}"
|
||||||
|
# ============================================================
|
||||||
|
gcp_healthcheck:
|
||||||
|
service_account_email: "{{ service_account_email }}"
|
||||||
|
credentials_file: "{{ credentials_file }}"
|
||||||
|
project_id: "{{ project_id }}"
|
||||||
|
healthcheck_name: "{{ https_healthcheck }}"
|
||||||
|
healthcheck_type: HTTPS
|
||||||
|
state: present
|
||||||
|
register: result
|
||||||
|
- name: assert create
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- 'result.state == "present"'
|
||||||
|
- 'result.changed'
|
||||||
|
# ============================================================
|
||||||
|
- name: "update {{ https_healthcheck }}, no change"
|
||||||
|
# ============================================================
|
||||||
|
gcp_healthcheck:
|
||||||
|
service_account_email: "{{ service_account_email }}"
|
||||||
|
credentials_file: "{{ credentials_file }}"
|
||||||
|
project_id: "{{ project_id }}"
|
||||||
|
healthcheck_name: "{{ https_healthcheck }}"
|
||||||
|
healthcheck_type: HTTPS
|
||||||
|
state: present
|
||||||
|
register: result
|
||||||
|
- name: assert not updated
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- 'result.state == "present"'
|
||||||
|
- 'result.port == 443'
|
||||||
|
- 'not result.changed'
|
||||||
|
# ============================================================
|
||||||
|
- name: update "{{ https_healthcheck }}"
|
||||||
|
# ============================================================
|
||||||
|
gcp_healthcheck:
|
||||||
|
service_account_email: "{{ service_account_email }}"
|
||||||
|
credentials_file: "{{ credentials_file }}"
|
||||||
|
project_id: "{{ project_id }}"
|
||||||
|
healthcheck_name: "{{ https_healthcheck }}"
|
||||||
|
healthcheck_type: HTTPS
|
||||||
|
host_header: my-host
|
||||||
|
request_path: /hc
|
||||||
|
check_interval: 5
|
||||||
|
timeout: 5
|
||||||
|
unhealthy_threshold: 2
|
||||||
|
healthy_threshold: 1
|
||||||
|
port: 444
|
||||||
|
state: present
|
||||||
|
register: result
|
||||||
|
- name: assert update "{{ https_healthcheck }}"
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- 'result.state == "present"'
|
||||||
|
- 'result.changed'
|
||||||
|
- 'result.port == 444'
|
||||||
|
# ============================================================
|
||||||
|
- pause: seconds=5
|
||||||
|
# ============================================================
|
||||||
|
- name: delete "{{ http_healthcheck }}"
|
||||||
|
# ============================================================
|
||||||
|
gcp_healthcheck:
|
||||||
|
service_account_email: "{{ service_account_email }}"
|
||||||
|
credentials_file: "{{ credentials_file }}"
|
||||||
|
project_id: "{{ project_id }}"
|
||||||
|
healthcheck_name: "{{ http_healthcheck }}"
|
||||||
|
healthcheck_type: HTTP
|
||||||
|
host_header: my-host
|
||||||
|
request_path: /hc
|
||||||
|
check_interval: 5
|
||||||
|
timeout: 5
|
||||||
|
unhealthy_threshold: 2
|
||||||
|
healthy_threshold: 1
|
||||||
|
state: absent
|
||||||
|
register: result
|
||||||
|
tags:
|
||||||
|
- delete
|
||||||
|
- name: assert absent
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- 'result.state == "absent"'
|
||||||
|
- 'result.changed'
|
||||||
|
# ============================================================
|
||||||
|
- name: delete "{{ https_healthcheck }}"
|
||||||
|
# ============================================================
|
||||||
|
gcp_healthcheck:
|
||||||
|
service_account_email: "{{ service_account_email }}"
|
||||||
|
credentials_file: "{{ credentials_file }}"
|
||||||
|
project_id: "{{ project_id }}"
|
||||||
|
healthcheck_name: "{{ https_healthcheck }}"
|
||||||
|
healthcheck_type: HTTPS
|
||||||
|
host_header: my-host
|
||||||
|
request_path: /hc
|
||||||
|
check_interval: 5
|
||||||
|
timeout: 5
|
||||||
|
unhealthy_threshold: 2
|
||||||
|
healthy_threshold: 1
|
||||||
|
state: absent
|
||||||
|
register: result
|
||||||
|
tags:
|
||||||
|
- delete
|
||||||
|
- name: assert absent
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- 'result.state == "absent"'
|
||||||
|
- 'result.changed'
|
|
@ -342,3 +342,32 @@ class GCPUtilsTestCase(unittest.TestCase):
|
||||||
# params1 has exclude fields, params2 doesn't. Should be equal
|
# params1 has exclude fields, params2 doesn't. Should be equal
|
||||||
actual = GCPUtils.are_params_equal(params1, params2)
|
actual = GCPUtils.are_params_equal(params1, params2)
|
||||||
self.assertTrue(actual)
|
self.assertTrue(actual)
|
||||||
|
|
||||||
|
def test_filter_gcp_fields(self):
|
||||||
|
input_data = {
|
||||||
|
u'kind': u'compute#httpsHealthCheck',
|
||||||
|
u'description': u'',
|
||||||
|
u'timeoutSec': 5,
|
||||||
|
u'checkIntervalSec': 5,
|
||||||
|
u'port': 443,
|
||||||
|
u'healthyThreshold': 2,
|
||||||
|
u'host': u'',
|
||||||
|
u'requestPath': u'/',
|
||||||
|
u'unhealthyThreshold': 2,
|
||||||
|
u'creationTimestamp': u'2017-05-16T15:09:36.546-07:00',
|
||||||
|
u'id': u'8727093129334146639',
|
||||||
|
u'selfLink': u'https://www.googleapis.com/compute/v1/projects/myproject/global/httpsHealthChecks/myhealthcheck',
|
||||||
|
u'name': u'myhealthcheck'}
|
||||||
|
|
||||||
|
expected = {
|
||||||
|
'name': 'myhealthcheck',
|
||||||
|
'checkIntervalSec': 5,
|
||||||
|
'port': 443,
|
||||||
|
'unhealthyThreshold': 2,
|
||||||
|
'healthyThreshold': 2,
|
||||||
|
'host': '',
|
||||||
|
'timeoutSec': 5,
|
||||||
|
'requestPath': '/'}
|
||||||
|
|
||||||
|
actual = GCPUtils.filter_gcp_fields(input_data)
|
||||||
|
self.assertEquals(expected, actual)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue