Add labels, update to Pubsub Subscription/Topic (#191)

Signed-off-by: Modular Magician <magic-modules@google.com>
This commit is contained in:
The Magician 2019-02-19 15:11:18 -08:00 committed by Alex Stephen
parent e08e0e6f2b
commit 4abaee1bc6
4 changed files with 108 additions and 18 deletions

View file

@ -51,7 +51,7 @@ options:
name: name:
description: description:
- Name of the subscription. - Name of the subscription.
required: false required: true
topic: topic:
description: description:
- A reference to a Topic resource. - A reference to a Topic resource.
@ -59,7 +59,12 @@ options:
in two ways. First, you can place in the name of the resource here as a string in two ways. First, you can place in the name of the resource here as a string
Alternatively, you can add `register: name-of-resource` to a gcp_pubsub_topic Alternatively, you can add `register: name-of-resource` to a gcp_pubsub_topic
task and then set this topic field to "{{ name-of-resource }}"' task and then set this topic field to "{{ name-of-resource }}"'
required: true
labels:
description:
- A set of key/value label pairs to assign to this Subscription.
required: false required: false
version_added: 2.8
push_config: push_config:
description: description:
- If push delivery is used with this subscription, this field is used to configure - If push delivery is used with this subscription, this field is used to configure
@ -71,6 +76,25 @@ options:
description: description:
- A URL locating the endpoint to which messages should be pushed. - A URL locating the endpoint to which messages should be pushed.
- For example, a Webhook endpoint might use "U(https://example.com/push".) - For example, a Webhook endpoint might use "U(https://example.com/push".)
required: true
attributes:
description:
- Endpoint configuration attributes.
- Every endpoint has a set of API supported attributes that can be used to
control different aspects of the message delivery.
- The currently supported attribute is x-goog-version, which you can use to
change the format of the pushed message. This attribute indicates the version
of the data expected by the endpoint. This controls the shape of the pushed
message (i.e., its fields and metadata). The endpoint version is based on
the version of the Pub/Sub API.
- If not present during the subscriptions.create call, it will default to
the version of the API used to make such call. If not present during a subscriptions.modifyPushConfig
call, its value will not be changed. subscriptions.get calls will always
return a valid version, even if the subscription was created without this
attribute.
- 'The possible values for this attribute are: - v1beta1: uses the push format
defined in the v1beta1 Pub/Sub API.'
- "- v1 or v1beta2: uses the push format defined in the v1 Pub/Sub API."
required: false required: false
ack_deadline_seconds: ack_deadline_seconds:
description: description:
@ -127,6 +151,11 @@ topic:
- A reference to a Topic resource. - A reference to a Topic resource.
returned: success returned: success
type: str type: str
labels:
description:
- A set of key/value label pairs to assign to this Subscription.
returned: success
type: dict
pushConfig: pushConfig:
description: description:
- If push delivery is used with this subscription, this field is used to configure - If push delivery is used with this subscription, this field is used to configure
@ -141,6 +170,25 @@ pushConfig:
- For example, a Webhook endpoint might use "U(https://example.com/push".) - For example, a Webhook endpoint might use "U(https://example.com/push".)
returned: success returned: success
type: str type: str
attributes:
description:
- Endpoint configuration attributes.
- Every endpoint has a set of API supported attributes that can be used to control
different aspects of the message delivery.
- The currently supported attribute is x-goog-version, which you can use to
change the format of the pushed message. This attribute indicates the version
of the data expected by the endpoint. This controls the shape of the pushed
message (i.e., its fields and metadata). The endpoint version is based on
the version of the Pub/Sub API.
- If not present during the subscriptions.create call, it will default to the
version of the API used to make such call. If not present during a subscriptions.modifyPushConfig
call, its value will not be changed. subscriptions.get calls will always return
a valid version, even if the subscription was created without this attribute.
- 'The possible values for this attribute are: - v1beta1: uses the push format
defined in the v1beta1 Pub/Sub API.'
- "- v1 or v1beta2: uses the push format defined in the v1 Pub/Sub API."
returned: success
type: dict
ackDeadlineSeconds: ackDeadlineSeconds:
description: description:
- This value is the maximum time after a subscriber receives a message before the - This value is the maximum time after a subscriber receives a message before the
@ -179,9 +227,10 @@ 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'),
name=dict(type='str'), name=dict(required=True, type='str'),
topic=dict(), topic=dict(required=True),
push_config=dict(type='dict', options=dict(push_endpoint=dict(type='str'))), labels=dict(type='dict'),
push_config=dict(type='dict', options=dict(push_endpoint=dict(required=True, type='str'), attributes=dict(type='dict'))),
ack_deadline_seconds=dict(type='int'), ack_deadline_seconds=dict(type='int'),
) )
) )
@ -197,7 +246,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)) update(module, self_link(module), fetch)
fetch = fetch_resource(module, self_link(module)) fetch = fetch_resource(module, self_link(module))
changed = True changed = True
else: else:
@ -237,10 +286,6 @@ def updateMask(request, response):
update_mask.append('pushConfig') update_mask.append('pushConfig')
if request.get('ackDeadlineSeconds') != response.get('ackDeadlineSeconds'): if request.get('ackDeadlineSeconds') != response.get('ackDeadlineSeconds'):
update_mask.append('ackDeadlineSeconds') update_mask.append('ackDeadlineSeconds')
if request.get('messageRetentionDuration') != response.get('messageRetentionDuration'):
update_mask.append('messageRetentionDuration')
if request.get('retainAckedMessages') != response.get('retainAckedMessages'):
update_mask.append('retainAckedMessages')
return ','.join(update_mask) return ','.join(update_mask)
@ -253,6 +298,7 @@ def resource_to_request(module):
request = { request = {
u'name': module.params.get('name'), u'name': module.params.get('name'),
u'topic': replace_resource_dict(module.params.get(u'topic', {}), 'name'), u'topic': replace_resource_dict(module.params.get(u'topic', {}), 'name'),
u'labels': module.params.get('labels'),
u'pushConfig': SubscriptionPushconfig(module.params.get('push_config', {}), module).to_request(), u'pushConfig': SubscriptionPushconfig(module.params.get('push_config', {}), module).to_request(),
u'ackDeadlineSeconds': module.params.get('ack_deadline_seconds'), u'ackDeadlineSeconds': module.params.get('ack_deadline_seconds'),
} }
@ -324,8 +370,9 @@ def is_different(module, response):
# This is for doing comparisons with Ansible's current parameters. # This is for doing comparisons with Ansible's current parameters.
def response_to_hash(module, response): def response_to_hash(module, response):
return { return {
u'name': response.get(u'name'), u'name': module.params.get('name'),
u'topic': response.get(u'topic'), u'topic': replace_resource_dict(module.params.get(u'topic', {}), 'name'),
u'labels': response.get(u'labels'),
u'pushConfig': SubscriptionPushconfig(response.get(u'pushConfig', {}), module).from_response(), u'pushConfig': SubscriptionPushconfig(response.get(u'pushConfig', {}), module).from_response(),
u'ackDeadlineSeconds': response.get(u'ackDeadlineSeconds'), u'ackDeadlineSeconds': response.get(u'ackDeadlineSeconds'),
} }
@ -357,10 +404,10 @@ class SubscriptionPushconfig(object):
self.request = {} self.request = {}
def to_request(self): def to_request(self):
return remove_nones_from_dict({u'pushEndpoint': self.request.get('push_endpoint')}) return remove_nones_from_dict({u'pushEndpoint': self.request.get('push_endpoint'), u'attributes': self.request.get('attributes')})
def from_response(self): def from_response(self):
return remove_nones_from_dict({u'pushEndpoint': self.request.get(u'pushEndpoint')}) return remove_nones_from_dict({u'pushEndpoint': self.request.get(u'pushEndpoint'), u'attributes': self.request.get(u'attributes')})
if __name__ == '__main__': if __name__ == '__main__':

View file

@ -67,6 +67,11 @@ items:
- A reference to a Topic resource. - A reference to a Topic resource.
returned: success returned: success
type: str type: str
labels:
description:
- A set of key/value label pairs to assign to this Subscription.
returned: success
type: dict
pushConfig: pushConfig:
description: description:
- If push delivery is used with this subscription, this field is used to configure - If push delivery is used with this subscription, this field is used to configure
@ -81,6 +86,26 @@ items:
- For example, a Webhook endpoint might use "U(https://example.com/push".) - For example, a Webhook endpoint might use "U(https://example.com/push".)
returned: success returned: success
type: str type: str
attributes:
description:
- Endpoint configuration attributes.
- Every endpoint has a set of API supported attributes that can be used
to control different aspects of the message delivery.
- The currently supported attribute is x-goog-version, which you can use
to change the format of the pushed message. This attribute indicates the
version of the data expected by the endpoint. This controls the shape
of the pushed message (i.e., its fields and metadata). The endpoint version
is based on the version of the Pub/Sub API.
- If not present during the subscriptions.create call, it will default to
the version of the API used to make such call. If not present during a
subscriptions.modifyPushConfig call, its value will not be changed. subscriptions.get
calls will always return a valid version, even if the subscription was
created without this attribute.
- 'The possible values for this attribute are: - v1beta1: uses the push
format defined in the v1beta1 Pub/Sub API.'
- "- v1 or v1beta2: uses the push format defined in the v1 Pub/Sub API."
returned: success
type: dict
ackDeadlineSeconds: ackDeadlineSeconds:
description: description:
- This value is the maximum time after a subscriber receives a message before - This value is the maximum time after a subscriber receives a message before

View file

@ -50,7 +50,12 @@ options:
name: name:
description: description:
- Name of the topic. - Name of the topic.
required: true
labels:
description:
- A set of key/value label pairs to assign to this Topic.
required: false required: false
version_added: 2.8
extends_documentation_fragment: gcp extends_documentation_fragment: gcp
notes: notes:
- 'API Reference: U(https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.topics)' - 'API Reference: U(https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.topics)'
@ -73,6 +78,11 @@ name:
- Name of the topic. - Name of the topic.
returned: success returned: success
type: str type: str
labels:
description:
- A set of key/value label pairs to assign to this Topic.
returned: success
type: dict
''' '''
################################################################################ ################################################################################
@ -90,7 +100,11 @@ import json
def main(): def main():
"""Main function""" """Main function"""
module = GcpModule(argument_spec=dict(state=dict(default='present', choices=['present', 'absent'], type='str'), name=dict(type='str'))) module = GcpModule(
argument_spec=dict(
state=dict(default='present', choices=['present', 'absent'], type='str'), name=dict(required=True, type='str'), labels=dict(type='dict')
)
)
if not module.params['scopes']: if not module.params['scopes']:
module.params['scopes'] = ['https://www.googleapis.com/auth/pubsub'] module.params['scopes'] = ['https://www.googleapis.com/auth/pubsub']
@ -128,8 +142,7 @@ def create(module, link):
def update(module, link): def update(module, link):
delete(module, self_link(module)) module.fail_json(msg="Topic cannot be edited")
create(module, self_link(module))
def delete(module, link): def delete(module, link):
@ -138,7 +151,7 @@ def delete(module, link):
def resource_to_request(module): def resource_to_request(module):
request = {u'name': module.params.get('name')} request = {u'name': module.params.get('name'), u'labels': module.params.get('labels')}
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():
@ -206,7 +219,7 @@ def is_different(module, response):
# Remove unnecessary properties from the response. # Remove unnecessary properties from the response.
# This is for doing comparisons with Ansible's current parameters. # This is for doing comparisons with Ansible's current parameters.
def response_to_hash(module, response): def response_to_hash(module, response):
return {u'name': response.get(u'name')} return {u'name': response.get(u'name'), u'labels': response.get(u'labels')}
def decode_request(response, module): def decode_request(response, module):

View file

@ -62,6 +62,11 @@ items:
- Name of the topic. - Name of the topic.
returned: success returned: success
type: str type: str
labels:
description:
- A set of key/value label pairs to assign to this Topic.
returned: success
type: dict
''' '''
################################################################################ ################################################################################