1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

GCP Bug Fixes (#49458)

* Bug fixes

* fixes as of 12/5/2018

* changes as of 12/06/2018
This commit is contained in:
Alex Stephen 2018-12-21 08:41:25 -08:00 committed by ansibot
parent b9c630f1b1
commit f73539284b
47 changed files with 239 additions and 102 deletions

View file

@ -283,7 +283,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -224,7 +224,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -731,7 +731,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -523,7 +523,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -151,7 +151,9 @@ options:
task and then set this network field to "{{ name-of-resource }}" Alternatively, task and then set this network field to "{{ name-of-resource }}" Alternatively,
you can set this network to a dictionary with the selfLink key where the value you can set this network to a dictionary with the selfLink key where the value
is the selfLink of your Network' is the selfLink of your Network'
required: true required: false
default:
selfLink: global/networks/default
priority: priority:
description: description:
- Priority for this rule. This is an integer between 0 and 65535, both inclusive. - Priority for this rule. This is an integer between 0 and 65535, both inclusive.
@ -412,6 +414,7 @@ targetTags:
from ansible.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, GcpRequest, remove_nones_from_dict, replace_resource_dict from ansible.module_utils.gcp_utils import navigate_hash, GcpSession, GcpModule, GcpRequest, remove_nones_from_dict, replace_resource_dict
import json import json
import re
import time import time
################################################################################ ################################################################################
@ -438,14 +441,21 @@ def main():
direction=dict(type='str', choices=['INGRESS', 'EGRESS']), direction=dict(type='str', choices=['INGRESS', 'EGRESS']),
disabled=dict(type='bool'), disabled=dict(type='bool'),
name=dict(required=True, type='str'), name=dict(required=True, type='str'),
network=dict(required=True, type='dict'), network=dict(default={'selfLink': 'global/networks/default'}, type='dict'),
priority=dict(default=1000, type='int'), priority=dict(default=1000, type='int'),
source_ranges=dict(type='list', elements='str'), source_ranges=dict(type='list', elements='str'),
source_service_accounts=dict(type='list', elements='str'), source_service_accounts=dict(type='list', elements='str'),
source_tags=dict(type='list', elements='str'), source_tags=dict(type='list', elements='str'),
target_service_accounts=dict(type='list', elements='str'), target_service_accounts=dict(type='list', elements='str'),
target_tags=dict(type='list', elements='str') target_tags=dict(type='list', elements='str')
) ),
mutually_exclusive=[['allowed', 'denied'],
['destination_ranges', 'source_ranges', 'source_tags'],
['destination_ranges', 'source_ranges'],
['source_service_accounts', 'source_tags', 'target_tags'],
['destination_ranges', 'source_service_accounts', 'source_tags', 'target_service_accounts'],
['source_tags', 'target_service_accounts', 'target_tags'],
['source_service_accounts', 'target_service_accounts', 'target_tags']]
) )
if not module.params['scopes']: if not module.params['scopes']:
@ -512,9 +522,10 @@ def resource_to_request(module):
u'targetServiceAccounts': module.params.get('target_service_accounts'), u'targetServiceAccounts': module.params.get('target_service_accounts'),
u'targetTags': module.params.get('target_tags') u'targetTags': module.params.get('target_tags')
} }
request = encode_request(request, module)
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals
@ -630,6 +641,15 @@ def raise_if_errors(response, err_path, module):
module.fail_json(msg=errors) module.fail_json(msg=errors)
def encode_request(request, module):
if 'network' in request and request['network'] is not None:
if not re.match(r'https://www.googleapis.com/compute/v1/projects/.*', request['network']):
request['network'] = 'https://www.googleapis.com/compute/v1/projects/{project}/{network}'.format(project=module.params['project'],
network=request['network'])
return request
class FirewallAllowedArray(object): class FirewallAllowedArray(object):
def __init__(self, request, module): def __init__(self, request, module):
self.module = module self.module = module

View file

@ -513,7 +513,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -232,7 +232,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -501,7 +501,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -124,6 +124,12 @@ options:
- The default value is /. - The default value is /.
required: false required: false
default: "/" default: "/"
response:
description:
- The bytes to match against the beginning of the response data. If left empty
(the default value), any response will indicate health. The response data
can only be ASCII.
required: false
port: port:
description: description:
- The TCP port number for the HTTP health check request. - The TCP port number for the HTTP health check request.
@ -160,6 +166,12 @@ options:
- The default value is /. - The default value is /.
required: false required: false
default: "/" default: "/"
response:
description:
- The bytes to match against the beginning of the response data. If left empty
(the default value), any response will indicate health. The response data
can only be ASCII.
required: false
port: port:
description: description:
- The TCP port number for the HTTPS health check request. - The TCP port number for the HTTPS health check request.
@ -352,6 +364,13 @@ httpHealthCheck:
- The default value is /. - The default value is /.
returned: success returned: success
type: str type: str
response:
description:
- The bytes to match against the beginning of the response data. If left empty
(the default value), any response will indicate health. The response data
can only be ASCII.
returned: success
type: str
port: port:
description: description:
- The TCP port number for the HTTP health check request. - The TCP port number for the HTTP health check request.
@ -389,6 +408,13 @@ httpsHealthCheck:
- The default value is /. - The default value is /.
returned: success returned: success
type: str type: str
response:
description:
- The bytes to match against the beginning of the response data. If left empty
(the default value), any response will indicate health. The response data
can only be ASCII.
returned: success
type: str
port: port:
description: description:
- The TCP port number for the HTTPS health check request. - The TCP port number for the HTTPS health check request.
@ -514,6 +540,7 @@ def main():
http_health_check=dict(type='dict', options=dict( http_health_check=dict(type='dict', options=dict(
host=dict(type='str'), host=dict(type='str'),
request_path=dict(default='/', type='str'), request_path=dict(default='/', type='str'),
response=dict(type='str'),
port=dict(type='int'), port=dict(type='int'),
port_name=dict(type='str'), port_name=dict(type='str'),
proxy_header=dict(default='NONE', type='str', choices=['NONE', 'PROXY_V1']) proxy_header=dict(default='NONE', type='str', choices=['NONE', 'PROXY_V1'])
@ -521,6 +548,7 @@ def main():
https_health_check=dict(type='dict', options=dict( https_health_check=dict(type='dict', options=dict(
host=dict(type='str'), host=dict(type='str'),
request_path=dict(default='/', type='str'), request_path=dict(default='/', type='str'),
response=dict(type='str'),
port=dict(type='int'), port=dict(type='int'),
port_name=dict(type='str'), port_name=dict(type='str'),
proxy_header=dict(default='NONE', type='str', choices=['NONE', 'PROXY_V1']) proxy_header=dict(default='NONE', type='str', choices=['NONE', 'PROXY_V1'])
@ -539,7 +567,8 @@ def main():
port_name=dict(type='str'), port_name=dict(type='str'),
proxy_header=dict(default='NONE', type='str', choices=['NONE', 'PROXY_V1']) proxy_header=dict(default='NONE', type='str', choices=['NONE', 'PROXY_V1'])
)) ))
) ),
mutually_exclusive=[['http_health_check', 'https_health_check', 'ssl_health_check', 'tcp_health_check']]
) )
if not module.params['scopes']: if not module.params['scopes']:
@ -605,7 +634,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals
@ -730,6 +759,7 @@ class HealthCheckHttphealthcheck(object):
return remove_nones_from_dict({ return remove_nones_from_dict({
u'host': self.request.get('host'), u'host': self.request.get('host'),
u'requestPath': self.request.get('request_path'), u'requestPath': self.request.get('request_path'),
u'response': self.request.get('response'),
u'port': self.request.get('port'), u'port': self.request.get('port'),
u'portName': self.request.get('port_name'), u'portName': self.request.get('port_name'),
u'proxyHeader': self.request.get('proxy_header') u'proxyHeader': self.request.get('proxy_header')
@ -739,6 +769,7 @@ class HealthCheckHttphealthcheck(object):
return remove_nones_from_dict({ return remove_nones_from_dict({
u'host': self.request.get(u'host'), u'host': self.request.get(u'host'),
u'requestPath': self.request.get(u'requestPath'), u'requestPath': self.request.get(u'requestPath'),
u'response': self.request.get(u'response'),
u'port': self.request.get(u'port'), u'port': self.request.get(u'port'),
u'portName': self.request.get(u'portName'), u'portName': self.request.get(u'portName'),
u'proxyHeader': self.request.get(u'proxyHeader') u'proxyHeader': self.request.get(u'proxyHeader')
@ -757,6 +788,7 @@ class HealthCheckHttpshealthcheck(object):
return remove_nones_from_dict({ return remove_nones_from_dict({
u'host': self.request.get('host'), u'host': self.request.get('host'),
u'requestPath': self.request.get('request_path'), u'requestPath': self.request.get('request_path'),
u'response': self.request.get('response'),
u'port': self.request.get('port'), u'port': self.request.get('port'),
u'portName': self.request.get('port_name'), u'portName': self.request.get('port_name'),
u'proxyHeader': self.request.get('proxy_header') u'proxyHeader': self.request.get('proxy_header')
@ -766,6 +798,7 @@ class HealthCheckHttpshealthcheck(object):
return remove_nones_from_dict({ return remove_nones_from_dict({
u'host': self.request.get(u'host'), u'host': self.request.get(u'host'),
u'requestPath': self.request.get(u'requestPath'), u'requestPath': self.request.get(u'requestPath'),
u'response': self.request.get(u'response'),
u'port': self.request.get(u'port'), u'port': self.request.get(u'port'),
u'portName': self.request.get(u'portName'), u'portName': self.request.get(u'portName'),
u'proxyHeader': self.request.get(u'proxyHeader') u'proxyHeader': self.request.get(u'proxyHeader')

View file

@ -142,6 +142,13 @@ items:
- The default value is /. - The default value is /.
returned: success returned: success
type: str type: str
response:
description:
- The bytes to match against the beginning of the response data. If left
empty (the default value), any response will indicate health. The response
data can only be ASCII.
returned: success
type: str
port: port:
description: description:
- The TCP port number for the HTTP health check request. - The TCP port number for the HTTP health check request.
@ -179,6 +186,13 @@ items:
- The default value is /. - The default value is /.
returned: success returned: success
type: str type: str
response:
description:
- The bytes to match against the beginning of the response data. If left
empty (the default value), any response will indicate health. The response
data can only be ASCII.
returned: success
type: str
port: port:
description: description:
- The TCP port number for the HTTPS health check request. - The TCP port number for the HTTPS health check request.

View file

@ -288,7 +288,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -285,7 +285,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -520,7 +520,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -375,6 +375,22 @@ options:
description: description:
- The list of scopes to be made available for this service account. - The list of scopes to be made available for this service account.
required: false required: false
status:
description:
- 'The status of the instance. One of the following values: PROVISIONING, STAGING,
RUNNING, STOPPING, SUSPENDING, SUSPENDED, and TERMINATED.'
- As a user, use RUNNING to keep a machine "on" and TERMINATED to turn a machine
off .
required: false
version_added: 2.8
choices:
- PROVISIONING
- STAGING
- RUNNING
- STOPPING
- SUSPENDING
- SUSPENDED
- TERMINATED
tags: tags:
description: description:
- A list of tags to apply to this instance. Tags are used to identify valid sources - A list of tags to apply to this instance. Tags are used to identify valid sources
@ -817,6 +833,8 @@ status:
description: description:
- 'The status of the instance. One of the following values: PROVISIONING, STAGING, - 'The status of the instance. One of the following values: PROVISIONING, STAGING,
RUNNING, STOPPING, SUSPENDING, SUSPENDED, and TERMINATED.' RUNNING, STOPPING, SUSPENDING, SUSPENDED, and TERMINATED.'
- As a user, use RUNNING to keep a machine "on" and TERMINATED to turn a machine
off .
returned: success returned: success
type: str type: str
statusMessage: statusMessage:
@ -933,6 +951,7 @@ def main():
email=dict(type='str'), email=dict(type='str'),
scopes=dict(type='list', elements='str') scopes=dict(type='list', elements='str')
)), )),
status=dict(type='str', choices=['PROVISIONING', 'STAGING', 'RUNNING', 'STOPPING', 'SUSPENDING', 'SUSPENDED', 'TERMINATED']),
tags=dict(type='dict', options=dict( tags=dict(type='dict', options=dict(
fingerprint=dict(type='str'), fingerprint=dict(type='str'),
items=dict(type='list', elements='str') items=dict(type='list', elements='str')
@ -967,6 +986,11 @@ def main():
else: else:
fetch = {} fetch = {}
if fetch:
instance = InstancePower(module, fetch.get('status'))
instance.run()
if module.params.get('status'):
fetch.update({'status': module.params['status']})
fetch.update({'changed': changed}) fetch.update({'changed': changed})
module.exit_json(**fetch) module.exit_json(**fetch)
@ -993,7 +1017,7 @@ def machine_type_update(module, request, response):
auth.post( auth.post(
''.join([ ''.join([
"https://www.googleapis.com/compute/v1/", "https://www.googleapis.com/compute/v1/",
"projdcts/{project}/zones/{zone}/instances/{name}/setMachineType" "projects/{project}/zones/{zone}/instances/{name}/setMachineType"
]).format(**module.params), ]).format(**module.params),
{ {
u'machineType': machine_type_selflink(module.params.get('machine_type'), module.params) u'machineType': machine_type_selflink(module.params.get('machine_type'), module.params)
@ -1020,12 +1044,13 @@ def resource_to_request(module):
u'networkInterfaces': InstanceNetworkinterfacesArray(module.params.get('network_interfaces', []), module).to_request(), u'networkInterfaces': InstanceNetworkinterfacesArray(module.params.get('network_interfaces', []), module).to_request(),
u'scheduling': InstanceScheduling(module.params.get('scheduling', {}), module).to_request(), u'scheduling': InstanceScheduling(module.params.get('scheduling', {}), module).to_request(),
u'serviceAccounts': InstanceServiceaccountsArray(module.params.get('service_accounts', []), module).to_request(), u'serviceAccounts': InstanceServiceaccountsArray(module.params.get('service_accounts', []), module).to_request(),
u'status': module.params.get('status'),
u'tags': InstanceTags(module.params.get('tags', {}), module).to_request() u'tags': InstanceTags(module.params.get('tags', {}), module).to_request()
} }
request = encode_request(request, module) request = encode_request(request, module)
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals
@ -1214,6 +1239,38 @@ def metadata_decoder(metadata):
return items return items
class InstancePower(object):
def __init__(self, module, current_status):
self.module = module
self.current_status = current_status
self.desired_status = self.module.params.get('status')
def run(self):
# GcpRequest handles unicode text handling
if GcpRequest({'status': self.current_status}) == GcpRequest({'status': self.desired_status}):
return
elif self.desired_status == 'RUNNING':
self.start()
elif self.desired_status == 'TERMINATED':
self.stop()
elif self.desired_status == 'SUSPENDED':
self.module.fail_json(msg="Instances cannot be suspended using Ansible")
def start(self):
auth = GcpSession(self.module, 'compute')
wait_for_operation(self.module, auth.post(self._start_url()))
def stop(self):
auth = GcpSession(self.module, 'compute')
wait_for_operation(self.module, auth.post(self._stop_url()))
def _start_url(self):
return "https://www.googleapis.com/compute/v1/projects/{project}/zones/{zone}/instances/{name}/start".format(**self.module.params)
def _stop_url(self):
return "https://www.googleapis.com/compute/v1/projects/{project}/zones/{zone}/instances/{name}/stop".format(**self.module.params)
class InstanceDisksArray(object): class InstanceDisksArray(object):
def __init__(self, request, module): def __init__(self, request, module):
self.module = module self.module = module

View file

@ -432,6 +432,8 @@ items:
description: description:
- 'The status of the instance. One of the following values: PROVISIONING, STAGING, - 'The status of the instance. One of the following values: PROVISIONING, STAGING,
RUNNING, STOPPING, SUSPENDING, SUSPENDED, and TERMINATED.' RUNNING, STOPPING, SUSPENDING, SUSPENDED, and TERMINATED.'
- As a user, use RUNNING to keep a machine "on" and TERMINATED to turn a machine
off .
returned: success returned: success
type: str type: str
statusMessage: statusMessage:

View file

@ -314,7 +314,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -411,7 +411,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -991,7 +991,7 @@ def resource_to_request(module):
request = encode_request(request, module) request = encode_request(request, module)
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -216,10 +216,11 @@ def main():
ipv4_range=dict(type='str'), ipv4_range=dict(type='str'),
name=dict(required=True, type='str'), name=dict(required=True, type='str'),
auto_create_subnetworks=dict(type='bool'), auto_create_subnetworks=dict(type='bool'),
routing_config=dict(type='list', elements='dict', options=dict( routing_config=dict(type='dict', options=dict(
routing_mode=dict(required=True, type='str', choices=['REGIONAL', 'GLOBAL']) routing_mode=dict(required=True, type='str', choices=['REGIONAL', 'GLOBAL'])
)) ))
) ),
mutually_exclusive=[['auto_create_subnetworks', 'ipv4_range']]
) )
if not module.params['scopes']: if not module.params['scopes']:
@ -234,7 +235,7 @@ def main():
if fetch: if fetch:
if state == 'present': if state == 'present':
if is_different(module, fetch): if is_different(module, fetch):
update(module, self_link(module), kind, fetch) update(module, self_link(module), kind)
fetch = fetch_resource(module, self_link(module), kind) fetch = fetch_resource(module, self_link(module), kind)
changed = True changed = True
else: else:
@ -258,31 +259,11 @@ def create(module, link, kind):
return wait_for_operation(module, auth.post(link, resource_to_request(module))) return wait_for_operation(module, auth.post(link, resource_to_request(module)))
def update(module, link, kind, fetch): def update(module, link, kind):
update_fields(module, resource_to_request(module),
response_to_hash(module, fetch))
auth = GcpSession(module, 'compute') auth = GcpSession(module, 'compute')
return wait_for_operation(module, auth.patch(link, resource_to_request(module))) return wait_for_operation(module, auth.patch(link, resource_to_request(module)))
def update_fields(module, request, response):
if response.get('routingConfig') != request.get('routingConfig'):
routing_config_update(module, request, response)
def routing_config_update(module, request, response):
auth = GcpSession(module, 'compute')
auth.patch(
''.join([
"https://www.googleapis.com/compute/v1/",
"projects/{project}/regions/{region}/subnetworks/{name}"
]).format(**module.params),
{
u'routingConfig': NetworkRoutingconfigArray(module.params.get('routing_config', []), module).to_request()
}
)
def delete(module, link, kind): def delete(module, link, kind):
auth = GcpSession(module, 'compute') auth = GcpSession(module, 'compute')
return wait_for_operation(module, auth.delete(link)) return wait_for_operation(module, auth.delete(link))
@ -295,11 +276,11 @@ def resource_to_request(module):
u'IPv4Range': module.params.get('ipv4_range'), u'IPv4Range': module.params.get('ipv4_range'),
u'name': module.params.get('name'), u'name': module.params.get('name'),
u'autoCreateSubnetworks': module.params.get('auto_create_subnetworks'), u'autoCreateSubnetworks': module.params.get('auto_create_subnetworks'),
u'routingConfig': NetworkRoutingconfigArray(module.params.get('routing_config', []), module).to_request() u'routingConfig': NetworkRoutingconfig(module.params.get('routing_config', {}), module).to_request()
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals
@ -369,7 +350,7 @@ def response_to_hash(module, response):
u'subnetworks': response.get(u'subnetworks'), u'subnetworks': response.get(u'subnetworks'),
u'autoCreateSubnetworks': module.params.get('auto_create_subnetworks'), u'autoCreateSubnetworks': module.params.get('auto_create_subnetworks'),
u'creationTimestamp': response.get(u'creationTimestamp'), u'creationTimestamp': response.get(u'creationTimestamp'),
u'routingConfig': NetworkRoutingconfigArray(response.get(u'routingConfig', []), module).from_response() u'routingConfig': NetworkRoutingconfig(response.get(u'routingConfig', {}), module).from_response()
} }
@ -408,34 +389,22 @@ def raise_if_errors(response, err_path, module):
module.fail_json(msg=errors) module.fail_json(msg=errors)
class NetworkRoutingconfigArray(object): class NetworkRoutingconfig(object):
def __init__(self, request, module): def __init__(self, request, module):
self.module = module self.module = module
if request: if request:
self.request = request self.request = request
else: else:
self.request = [] self.request = {}
def to_request(self): def to_request(self):
items = []
for item in self.request:
items.append(self._request_for_item(item))
return items
def from_response(self):
items = []
for item in self.request:
items.append(self._response_from_item(item))
return items
def _request_for_item(self, item):
return remove_nones_from_dict({ return remove_nones_from_dict({
u'routingMode': item.get('routing_mode') u'routingMode': self.request.get('routing_mode')
}) })
def _response_from_item(self, item): def from_response(self):
return remove_nones_from_dict({ return remove_nones_from_dict({
u'routingMode': item.get(u'routingMode') u'routingMode': self.request.get(u'routingMode')
}) })

View file

@ -455,7 +455,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -327,7 +327,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -331,7 +331,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -235,7 +235,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -273,7 +273,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -400,7 +400,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -268,7 +268,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -372,7 +372,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -322,7 +322,7 @@ def resource_to_request(module):
request = encode_request(request, module) request = encode_request(request, module)
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -357,7 +357,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -293,7 +293,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -239,7 +239,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -455,7 +455,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -377,7 +377,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -701,7 +701,7 @@ def resource_to_request(module):
request = encode_request(request, module) request = encode_request(request, module)
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -531,7 +531,7 @@ def resource_to_request(module):
request = encode_request(request, module) request = encode_request(request, module)
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -53,11 +53,11 @@ options:
description: description:
- A mutable string of at most 1024 characters associated with this resource for - A mutable string of at most 1024 characters associated with this resource for
the user's convenience. Has no effect on the managed zone's function. the user's convenience. Has no effect on the managed zone's function.
required: false required: true
dns_name: dns_name:
description: description:
- The DNS name of this managed zone, for instance "example.com.". - The DNS name of this managed zone, for instance "example.com.".
required: false required: true
name: name:
description: description:
- User assigned name for this resource. - User assigned name for this resource.
@ -69,7 +69,15 @@ options:
is a set of DNS name servers that all host the same ManagedZones. Most users is a set of DNS name servers that all host the same ManagedZones. Most users
will leave this field unset. will leave this field unset.
required: false required: false
labels:
description:
- A set of key/value label pairs to assign to this ManagedZone.
required: false
version_added: 2.8
extends_documentation_fragment: gcp extends_documentation_fragment: gcp
notes:
- 'API Reference: U(https://cloud.google.com/dns/api/v1/managedZones)'
- 'Managing Zones: U(https://cloud.google.com/dns/zones/)'
''' '''
EXAMPLES = ''' EXAMPLES = '''
@ -126,6 +134,11 @@ creationTime:
- This is in RFC3339 text format. - This is in RFC3339 text format.
returned: success returned: success
type: str type: str
labels:
description:
- A set of key/value label pairs to assign to this ManagedZone.
returned: success
type: dict
''' '''
################################################################################ ################################################################################
@ -146,10 +159,11 @@ def main():
module = GcpModule( module = GcpModule(
argument_spec=dict( argument_spec=dict(
state=dict(default='present', choices=['present', 'absent'], type='str'), state=dict(default='present', choices=['present', 'absent'], type='str'),
description=dict(type='str'), description=dict(required=True, type='str'),
dns_name=dict(type='str'), dns_name=dict(required=True, type='str'),
name=dict(required=True, type='str'), name=dict(required=True, type='str'),
name_server_set=dict(type='list', elements='str') name_server_set=dict(type='list', elements='str'),
labels=dict(type='dict')
) )
) )
@ -165,7 +179,7 @@ def main():
if fetch: if fetch:
if state == 'present': if state == 'present':
if is_different(module, fetch): if is_different(module, fetch):
update(module, self_link(module), kind) update(module, self_link(module), kind, fetch)
fetch = fetch_resource(module, self_link(module), kind) fetch = fetch_resource(module, self_link(module), kind)
changed = True changed = True
else: else:
@ -189,8 +203,29 @@ def create(module, link, kind):
return return_if_object(module, auth.post(link, resource_to_request(module)), kind) return return_if_object(module, auth.post(link, resource_to_request(module)), kind)
def update(module, link, kind): def update(module, link, kind, fetch):
module.fail_json(msg="ManagedZone cannot be edited") update_fields(module, resource_to_request(module),
response_to_hash(module, fetch))
return fetch_resource(module, self_link(module), kind)
def update_fields(module, request, response):
if response.get('description') != request.get('description') or response.get('labels') != request.get('labels'):
description_update(module, request, response)
def description_update(module, request, response):
auth = GcpSession(module, 'dns')
auth.patch(
''.join([
"https://www.googleapis.com/dns/v1/",
"projects/{project}/managedZones/{name}"
]).format(**module.params),
{
u'description': module.params.get('description'),
u'labels': module.params.get('labels')
}
)
def delete(module, link, kind): def delete(module, link, kind):
@ -204,11 +239,12 @@ def resource_to_request(module):
u'description': module.params.get('description'), u'description': module.params.get('description'),
u'dnsName': module.params.get('dns_name'), u'dnsName': module.params.get('dns_name'),
u'name': module.params.get('name'), u'name': module.params.get('name'),
u'nameServerSet': module.params.get('name_server_set') u'nameServerSet': module.params.get('name_server_set'),
u'labels': module.params.get('labels')
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals
@ -276,7 +312,8 @@ def response_to_hash(module, response):
u'name': response.get(u'name'), u'name': response.get(u'name'),
u'nameServers': response.get(u'nameServers'), u'nameServers': response.get(u'nameServers'),
u'nameServerSet': response.get(u'nameServerSet'), u'nameServerSet': response.get(u'nameServerSet'),
u'creationTime': response.get(u'creationTime') u'creationTime': response.get(u'creationTime'),
u'labels': response.get(u'labels')
} }

View file

@ -103,6 +103,11 @@ items:
- This is in RFC3339 text format. - This is in RFC3339 text format.
returned: success returned: success
type: str type: str
labels:
description:
- A set of key/value label pairs to assign to this ManagedZone.
returned: success
type: dict
''' '''
################################################################################ ################################################################################

View file

@ -252,7 +252,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -243,7 +243,7 @@ def resource_to_request(module):
request = encode_request(request, module) request = encode_request(request, module)
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -147,7 +147,7 @@ def resource_to_request(module):
request = encode_request(request, module) request = encode_request(request, module)
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -198,7 +198,7 @@ def resource_to_request(module):
request = encode_request(request, module) request = encode_request(request, module)
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -235,7 +235,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -206,7 +206,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -678,7 +678,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -211,7 +211,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -936,7 +936,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals

View file

@ -273,7 +273,7 @@ def resource_to_request(module):
} }
return_vals = {} return_vals = {}
for k, v in request.items(): for k, v in request.items():
if v: if v or v is False:
return_vals[k] = v return_vals[k] = v
return return_vals return return_vals