diff options
Diffstat (limited to 'lib/ansible/modules/cloud/azure/azure_rm_cdnendpoint.py')
-rw-r--r-- | lib/ansible/modules/cloud/azure/azure_rm_cdnendpoint.py | 666 |
1 files changed, 0 insertions, 666 deletions
diff --git a/lib/ansible/modules/cloud/azure/azure_rm_cdnendpoint.py b/lib/ansible/modules/cloud/azure/azure_rm_cdnendpoint.py deleted file mode 100644 index a2db425d61..0000000000 --- a/lib/ansible/modules/cloud/azure/azure_rm_cdnendpoint.py +++ /dev/null @@ -1,666 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2018 Hai Cao, <t-haicao@microsoft.com>, Yunge Zhu <yungez@microsoft.com> -# -# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - -ANSIBLE_METADATA = {'metadata_version': '1.1', - 'status': ['preview'], - 'supported_by': 'community'} - -DOCUMENTATION = ''' ---- -module: azure_rm_cdnendpoint -version_added: "2.8" -short_description: Manage a Azure CDN endpoint -description: - - Create, update, start, stop and delete a Azure CDN endpoint. - -options: - resource_group: - description: - - Name of a resource group where the Azure CDN endpoint exists or will be created. - required: true - name: - description: - - Name of the Azure CDN endpoint. - required: true - location: - description: - - Valid azure location. Defaults to location of the resource group. - started: - description: - - Use with I(state=present) to start the endpoint. - type: bool - purge: - description: - - Use with I(state=present) to purge the endpoint. - type: bool - default: false - purge_content_paths: - description: - - Use with I(state=present) and I(purge=true) to specify content paths to be purged. - type: list - default: ['/'] - profile_name: - description: - - Name of the CDN profile where the endpoint attached to. - required: true - origins: - description: - - Set of source of the content being delivered via CDN. - suboptions: - name: - description: - - Origin name. - required: true - host_name: - description: - - The address of the origin. - - It can be a domain name, IPv4 address, or IPv6 address. - required: true - http_port: - description: - - The value of the HTTP port. Must be between C(1) and C(65535). - type: int - https_port: - description: - - The value of the HTTPS port. Must be between C(1) and C(65535). - type: int - required: true - origin_host_header: - description: - - The host header value sent to the origin with each request. - type: str - origin_path: - description: - - A directory path on the origin that CDN can use to retrieve content from. - - E.g. contoso.cloudapp.net/originpath. - type: str - content_types_to_compress: - description: - - List of content types on which compression applies. - - This value should be a valid MIME type. - type: list - is_compression_enabled: - description: - - Indicates whether content compression is enabled on CDN. - type: bool - default: false - is_http_allowed: - description: - - Indicates whether HTTP traffic is allowed on the endpoint. - type: bool - default: true - is_https_allowed: - description: - - Indicates whether HTTPS traffic is allowed on the endpoint. - type: bool - default: true - query_string_caching_behavior: - description: - - Defines how CDN caches requests that include query strings. - type: str - choices: - - ignore_query_string - - bypass_caching - - use_query_string - - not_set - default: ignore_query_string - state: - description: - - Assert the state of the Azure CDN endpoint. Use C(present) to create or update a Azure CDN endpoint and C(absent) to delete it. - default: present - choices: - - absent - - present - -extends_documentation_fragment: - - azure - - azure_tags - -author: - - Yunge Zhu (@yungezz) -''' - -EXAMPLES = ''' - - name: Create a Azure CDN endpoint - azure_rm_cdnendpoint: - resource_group: myResourceGroup - profile_name: myProfile - name: myEndpoint - origins: - - name: TestOrig - host_name: "www.example.com" - tags: - testing: testing - delete: on-exit - foo: bar - - name: Delete a Azure CDN endpoint - azure_rm_cdnendpoint: - resource_group: myResourceGroup - profile_name: myProfile - name: myEndpoint - state: absent -''' -RETURN = ''' -state: - description: Current state of the Azure CDN endpoint. - returned: always - type: str -id: - description: - - Id of the CDN endpoint. - returned: always - type: str - sample: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.Cdn/profiles/myProfile/endpoints/ - myEndpoint" -host_name: - description: - - Host name of the CDN endpoint. - returned: always - type: str - sample: "myendpoint.azureedge.net" -''' - -from ansible.module_utils.azure_rm_common import AzureRMModuleBase -from ansible.module_utils.common.dict_transformations import _snake_to_camel - -try: - from azure.mgmt.cdn.models import Endpoint, DeepCreatedOrigin, EndpointUpdateParameters, QueryStringCachingBehavior, ErrorResponseException - from azure.mgmt.cdn import CdnManagementClient -except ImportError: - # This is handled in azure_rm_common - pass - - -def cdnendpoint_to_dict(cdnendpoint): - return dict( - id=cdnendpoint.id, - name=cdnendpoint.name, - type=cdnendpoint.type, - location=cdnendpoint.location, - tags=cdnendpoint.tags, - origin_host_header=cdnendpoint.origin_host_header, - origin_path=cdnendpoint.origin_path, - content_types_to_compress=cdnendpoint.content_types_to_compress, - is_compression_enabled=cdnendpoint.is_compression_enabled, - is_http_allowed=cdnendpoint.is_http_allowed, - is_https_allowed=cdnendpoint.is_https_allowed, - query_string_caching_behavior=cdnendpoint.query_string_caching_behavior, - optimization_type=cdnendpoint.optimization_type, - probe_path=cdnendpoint.probe_path, - geo_filters=[geo_filter_to_dict(geo_filter) for geo_filter in cdnendpoint.geo_filters] if cdnendpoint.geo_filters else None, - host_name=cdnendpoint.host_name, - origins=[deep_created_origin_to_dict(origin) for origin in cdnendpoint.origins] if cdnendpoint.origins else None, - resource_state=cdnendpoint.resource_state, - provisioning_state=cdnendpoint.provisioning_state - ) - - -def deep_created_origin_to_dict(origin): - return dict( - name=origin.name, - host_name=origin.host_name, - http_port=origin.http_port, - https_port=origin.https_port, - ) - - -def geo_filter_to_dict(geo_filter): - return dict( - relative_path=geo_filter.relative_path, - action=geo_filter.action, - country_codes=geo_filter.country_codes, - ) - - -def default_content_types(): - return ["text/plain", - "text/html", - "text/css", - "text/javascript", - "application/x-javascript", - "application/javascript", - "application/json", - "application/xml"] - - -origin_spec = dict( - name=dict( - type='str', - required=True - ), - host_name=dict( - type='str', - required=True - ), - http_port=dict( - type='int' - ), - https_port=dict( - type='int' - ) -) - - -class AzureRMCdnendpoint(AzureRMModuleBase): - - def __init__(self): - self.module_arg_spec = dict( - resource_group=dict( - type='str', - required=True - ), - name=dict( - type='str', - required=True - ), - location=dict( - type='str' - ), - state=dict( - type='str', - default='present', - choices=['present', 'absent'] - ), - started=dict( - type='bool' - ), - purge=dict( - type='bool' - ), - purge_content_paths=dict( - type='list', - elements='str', - default=['/'] - ), - profile_name=dict( - type='str', - required=True - ), - origins=dict( - type='list', - elements='dict', - options=origin_spec - ), - origin_host_header=dict( - type='str', - ), - origin_path=dict( - type='str', - ), - content_types_to_compress=dict( - type='list', - elements='str', - ), - is_compression_enabled=dict( - type='bool', - default=False - ), - is_http_allowed=dict( - type='bool', - default=True - ), - is_https_allowed=dict( - type='bool', - default=True - ), - query_string_caching_behavior=dict( - type='str', - choices=[ - 'ignore_query_string', - 'bypass_caching', - 'use_query_string', - 'not_set' - ], - default='ignore_query_string' - ), - ) - - self.resource_group = None - self.name = None - self.state = None - self.started = None - self.purge = None - self.purge_content_paths = None - self.location = None - self.profile_name = None - self.origins = None - self.tags = None - self.origin_host_header = None - self.origin_path = None - self.content_types_to_compress = None - self.is_compression_enabled = None - self.is_http_allowed = None - self.is_https_allowed = None - self.query_string_caching_behavior = None - - self.cdn_client = None - - self.results = dict(changed=False) - - super(AzureRMCdnendpoint, self).__init__(derived_arg_spec=self.module_arg_spec, - supports_check_mode=True, - supports_tags=True) - - def exec_module(self, **kwargs): - """Main module execution method""" - - for key in list(self.module_arg_spec.keys()) + ['tags']: - setattr(self, key, kwargs[key]) - - self.cdn_client = self.get_cdn_client() - - to_be_updated = False - - resource_group = self.get_resource_group(self.resource_group) - if not self.location: - self.location = resource_group.location - - if self.query_string_caching_behavior: - self.query_string_caching_behavior = _snake_to_camel(self.query_string_caching_behavior) - - response = self.get_cdnendpoint() - - if self.state == 'present': - - if not response: - - if self.started is None: - # If endpoint doesn't exist and no start/stop operation specified, create endpoint. - if self.origins is None: - self.fail("Origins is not provided when trying to create endpoint") - self.log("Need to create the Azure CDN endpoint") - - if not self.check_mode: - result = self.create_cdnendpoint() - self.results['id'] = result['id'] - self.results['host_name'] = result['host_name'] - self.log("Creation done") - - self.results['changed'] = True - return self.results - - else: - # Fail the module when user try to start/stop a non-existed endpoint - self.log("Can't stop/stop a non-existed endpoint") - self.fail("This endpoint is not found, stop/start is forbidden") - - else: - self.log('Results : {0}'.format(response)) - self.results['id'] = response['id'] - self.results['host_name'] = response['host_name'] - - update_tags, response['tags'] = self.update_tags(response['tags']) - - if update_tags: - to_be_updated = True - - if response['provisioning_state'] == "Succeeded": - if self.started is False and response['resource_state'] == 'Running': - self.log("Need to stop the Azure CDN endpoint") - - if not self.check_mode: - result = self.stop_cdnendpoint() - self.log("Endpoint stopped") - - self.results['changed'] = True - - elif self.started and response['resource_state'] == 'Stopped': - self.log("Need to start the Azure CDN endpoint") - - if not self.check_mode: - result = self.start_cdnendpoint() - self.log("Endpoint started") - - self.results['changed'] = True - - elif self.started is not None: - self.module.warn("Start/Stop not performed due to current resource state {0}".format(response['resource_state'])) - self.results['changed'] = False - - if self.purge: - self.log("Need to purge endpoint") - - if not self.check_mode: - result = self.purge_cdnendpoint() - self.log("Endpoint purged") - - self.results['changed'] = True - - to_be_updated = to_be_updated or self.check_update(response) - - if to_be_updated: - self.log("Need to update the Azure CDN endpoint") - self.results['changed'] = True - - if not self.check_mode: - result = self.update_cdnendpoint() - self.results['host_name'] = result['host_name'] - self.log("Update done") - - elif self.started is not None: - self.module.warn("Start/Stop not performed due to current provisioning state {0}".format(response['provisioning_state'])) - self.results['changed'] = False - - elif self.state == 'absent' and response: - self.log("Need to delete the Azure CDN endpoint") - self.results['changed'] = True - - if not self.check_mode: - self.delete_cdnendpoint() - self.log("Azure CDN endpoint deleted") - - return self.results - - def create_cdnendpoint(self): - ''' - Creates a Azure CDN endpoint. - - :return: deserialized Azure CDN endpoint instance state dictionary - ''' - self.log("Creating the Azure CDN endpoint instance {0}".format(self.name)) - - origins = [] - for item in self.origins: - origins.append( - DeepCreatedOrigin(name=item['name'], - host_name=item['host_name'], - http_port=item['http_port'] if 'http_port' in item else None, - https_port=item['https_port'] if 'https_port' in item else None) - ) - - parameters = Endpoint( - origins=origins, - location=self.location, - tags=self.tags, - origin_host_header=self.origin_host_header, - origin_path=self.origin_path, - content_types_to_compress=default_content_types() if self.is_compression_enabled and not self.content_types_to_compress - else self.content_types_to_compress, - is_compression_enabled=self.is_compression_enabled if self.is_compression_enabled is not None else False, - is_http_allowed=self.is_http_allowed if self.is_http_allowed is not None else True, - is_https_allowed=self.is_https_allowed if self.is_https_allowed is not None else True, - query_string_caching_behavior=self.query_string_caching_behavior if self.query_string_caching_behavior - else QueryStringCachingBehavior.ignore_query_string - ) - - try: - poller = self.cdn_client.endpoints.create(self.resource_group, self.profile_name, self.name, parameters) - response = self.get_poller_result(poller) - return cdnendpoint_to_dict(response) - except ErrorResponseException as exc: - self.log('Error attempting to create Azure CDN endpoint instance.') - self.fail("Error creating Azure CDN endpoint instance: {0}".format(exc.message)) - - def update_cdnendpoint(self): - ''' - Updates a Azure CDN endpoint. - - :return: deserialized Azure CDN endpoint instance state dictionary - ''' - self.log("Updating the Azure CDN endpoint instance {0}".format(self.name)) - - endpoint_update_properties = EndpointUpdateParameters( - tags=self.tags, - origin_host_header=self.origin_host_header, - origin_path=self.origin_path, - content_types_to_compress=default_content_types() if self.is_compression_enabled and not self.content_types_to_compress - else self.content_types_to_compress, - is_compression_enabled=self.is_compression_enabled, - is_http_allowed=self.is_http_allowed, - is_https_allowed=self.is_https_allowed, - query_string_caching_behavior=self.query_string_caching_behavior, - ) - - try: - poller = self.cdn_client.endpoints.update(self.resource_group, self.profile_name, self.name, endpoint_update_properties) - response = self.get_poller_result(poller) - return cdnendpoint_to_dict(response) - except ErrorResponseException as exc: - self.log('Error attempting to update Azure CDN endpoint instance.') - self.fail("Error updating Azure CDN endpoint instance: {0}".format(exc.message)) - - def delete_cdnendpoint(self): - ''' - Deletes the specified Azure CDN endpoint in the specified subscription and resource group. - - :return: True - ''' - self.log("Deleting the Azure CDN endpoint {0}".format(self.name)) - try: - poller = self.cdn_client.endpoints.delete( - self.resource_group, self.profile_name, self.name) - self.get_poller_result(poller) - return True - except ErrorResponseException as e: - self.log('Error attempting to delete the Azure CDN endpoint.') - self.fail("Error deleting the Azure CDN endpoint: {0}".format(e.message)) - return False - - def get_cdnendpoint(self): - ''' - Gets the properties of the specified Azure CDN endpoint. - - :return: deserialized Azure CDN endpoint state dictionary - ''' - self.log( - "Checking if the Azure CDN endpoint {0} is present".format(self.name)) - try: - response = self.cdn_client.endpoints.get(self.resource_group, self.profile_name, self.name) - self.log("Response : {0}".format(response)) - self.log("Azure CDN endpoint : {0} found".format(response.name)) - return cdnendpoint_to_dict(response) - except ErrorResponseException: - self.log('Did not find the Azure CDN endpoint.') - return False - - def start_cdnendpoint(self): - ''' - Starts an existing Azure CDN endpoint that is on a stopped state. - - :return: deserialized Azure CDN endpoint state dictionary - ''' - self.log( - "Starting the Azure CDN endpoint {0}".format(self.name)) - try: - poller = self.cdn_client.endpoints.start(self.resource_group, self.profile_name, self.name) - response = self.get_poller_result(poller) - self.log("Response : {0}".format(response)) - self.log("Azure CDN endpoint : {0} started".format(response.name)) - return self.get_cdnendpoint() - except ErrorResponseException: - self.log('Fail to start the Azure CDN endpoint.') - return False - - def purge_cdnendpoint(self): - ''' - Purges an existing Azure CDN endpoint. - - :return: deserialized Azure CDN endpoint state dictionary - ''' - self.log( - "Purging the Azure CDN endpoint {0}".format(self.name)) - try: - poller = self.cdn_client.endpoints.purge_content(self.resource_group, - self.profile_name, - self.name, - content_paths=self.purge_content_paths) - response = self.get_poller_result(poller) - self.log("Response : {0}".format(response)) - return self.get_cdnendpoint() - except ErrorResponseException as e: - self.log('Fail to purge the Azure CDN endpoint.') - return False - - def stop_cdnendpoint(self): - ''' - Stops an existing Azure CDN endpoint that is on a running state. - - :return: deserialized Azure CDN endpoint state dictionary - ''' - self.log( - "Stopping the Azure CDN endpoint {0}".format(self.name)) - try: - poller = self.cdn_client.endpoints.stop(self.resource_group, self.profile_name, self.name) - response = self.get_poller_result(poller) - self.log("Response : {0}".format(response)) - self.log("Azure CDN endpoint : {0} stopped".format(response.name)) - return self.get_cdnendpoint() - except ErrorResponseException: - self.log('Fail to stop the Azure CDN endpoint.') - return False - - def check_update(self, response): - - if self.origin_host_header and response['origin_host_header'] != self.origin_host_header: - self.log("Origin host header Diff - Origin {0} / Update {1}".format(response['origin_host_header'], self.origin_host_header)) - return True - - if self.origin_path and response['origin_path'] != self.origin_path: - self.log("Origin path Diff - Origin {0} / Update {1}".format(response['origin_path'], self.origin_path)) - return True - - if self.content_types_to_compress and response['content_types_to_compress'] != self.content_types_to_compress: - self.log("Content types to compress Diff - Origin {0} / Update {1}".format(response['content_types_to_compress'], self.content_types_to_compress)) - return True - - if self.is_compression_enabled is not None and response['is_compression_enabled'] != self.is_compression_enabled: - self.log("is_compression_enabled Diff - Origin {0} / Update {1}".format(response['is_compression_enabled'], self.is_compression_enabled)) - return True - - if self.is_http_allowed is not None and response['is_http_allowed'] != self.is_http_allowed: - self.log("is_http_allowed Diff - Origin {0} / Update {1}".format(response['is_http_allowed'], self.is_http_allowed)) - return True - - if self.is_https_allowed is not None and response['is_https_allowed'] != self.is_https_allowed: - self.log("is_https_allowed Diff - Origin {0} / Update {1}".format(response['is_https_allowed'], self.is_https_allowed)) - return True - - if self.query_string_caching_behavior and \ - _snake_to_camel(response['query_string_caching_behavior']).lower() != _snake_to_camel(self.query_string_caching_behavior).lower(): - self.log("query_string_caching_behavior Diff - Origin {0} / Update {1}".format(response['query_string_caching_behavior'], - self.query_string_caching_behavior)) - return True - - return False - - def get_cdn_client(self): - if not self.cdn_client: - self.cdn_client = self.get_mgmt_svc_client(CdnManagementClient, - base_url=self._cloud_environment.endpoints.resource_manager, - api_version='2017-04-02') - return self.cdn_client - - -def main(): - """Main execution""" - AzureRMCdnendpoint() - - -if __name__ == '__main__': - main() |