From c2a7a1a3081f0a0c2f34357e0ad958cc3dd09025 Mon Sep 17 00:00:00 2001 From: saurabh3796 <44325563+saurabh3796@users.noreply.github.com> Date: Fri, 28 May 2021 10:50:28 +0530 Subject: [PATCH] New module: azure_rm_eventhub (#519) * Eventhub CRUD operations * Update azure_rm_common.py * Update azure_rm_eventhub.py * Update azure_rm_eventhub_info.py * Update ignore-2.10.txt * Update ignore-2.11.txt * Update ignore-2.12.txt * Update ignore-2.9.txt * Update main.yml * Update azure_rm_eventhub.py * Update azure_rm_eventhub_info.py * Update azure_rm_eventhub_info.py * Update azure_rm_eventhub.py * Update main.yml * Update main.yml * Update azure_rm_eventhub.py * Update azure_rm_eventhub_info.py * Update ignore-2.9.txt * Update ignore-2.12.txt * Update ignore-2.11.txt * Update ignore-2.10.txt * Update azure_rm_eventhub.py * Update azure_rm_eventhub.py * Update azure_rm_eventhub_info.py * Update azure_rm_eventhub_info.py * Update azure_rm_eventhub.py * Update azure_rm_eventhub_info.py * Update azure_rm_eventhub.py * Update azure_rm_eventhub.py * Update main.yml * Update azure_rm_eventhub.py * Update main.yml * Update azure_rm_eventhub.py * Update azure_rm_eventhub.py * Update azure_rm_eventhub.py * Update main.yml * Update main.yml * Update azure_rm_eventhub.py * Update azure_rm_eventhub.py Co-authored-by: smalpani --- plugins/module_utils/azure_rm_common.py | 20 +- plugins/modules/azure_rm_eventhub.py | 438 ++++++++++++++++++ plugins/modules/azure_rm_eventhub_info.py | 241 ++++++++++ pr-pipelines.yml | 1 + requirements-azure.txt | 1 + .../targets/azure_rm_eventhub/aliases | 3 + .../targets/azure_rm_eventhub/meta/main.yml | 2 + .../targets/azure_rm_eventhub/tasks/main.yml | 145 ++++++ 8 files changed, 850 insertions(+), 1 deletion(-) create mode 100644 plugins/modules/azure_rm_eventhub.py create mode 100644 plugins/modules/azure_rm_eventhub_info.py create mode 100644 tests/integration/targets/azure_rm_eventhub/aliases create mode 100644 tests/integration/targets/azure_rm_eventhub/meta/main.yml create mode 100644 tests/integration/targets/azure_rm_eventhub/tasks/main.yml diff --git a/plugins/module_utils/azure_rm_common.py b/plugins/module_utils/azure_rm_common.py index 5e8463078..cf807b845 100644 --- a/plugins/module_utils/azure_rm_common.py +++ b/plugins/module_utils/azure_rm_common.py @@ -108,7 +108,8 @@ def default_api_version(self): 'MySQLManagementClient': '2017-12-01', 'MariaDBManagementClient': '2019-03-01', 'ManagementLockClient': '2016-09-01', - 'DataLakeStoreAccountManagementClient': '2016-11-01' + 'DataLakeStoreAccountManagementClient': '2016-11-01', + 'EventHubManagementClient': '2018-05-04' }, '2019-03-01-hybrid': { 'StorageManagementClient': '2017-10-01', @@ -122,6 +123,7 @@ def default_api_version(self): 'ManagementLockClient': '2016-09-01', 'PolicyClient': '2016-12-01', 'ResourceManagementClient': '2018-05-01', + 'EventHubManagementClient': '2018-05-04', 'SubscriptionClient': '2016-06-01', 'DnsManagementClient': '2016-04-01', 'KeyVaultManagementClient': '2016-10-01', @@ -277,6 +279,7 @@ def default_api_version(self): from azure.mgmt.search import SearchManagementClient from azure.mgmt.datalake.store import DataLakeStoreAccountManagementClient import azure.mgmt.datalake.store.models as DataLakeStoreAccountModel + from azure.mgmt.eventhub import EventHubManagementClient except ImportError as exc: Authentication = object @@ -364,6 +367,10 @@ def normalize_location_name(name): 'package_name': 'trafficmanager', 'expected_version': '0.50.0' }, + 'EventHubManagementClient': { + 'package_name': 'azure-mgmt-eventhub', + 'expected_version': '2.0.0' + }, } if HAS_AZURE else {} @@ -441,6 +448,7 @@ def __init__(self, derived_arg_spec, bypass_checks=False, no_log=False, self._recovery_services_backup_client = None self._search_client = None self._datalake_store_client = None + self._event_hub_client = None self.check_mode = self.module.check_mode self.api_profile = self.module.params.get('api_profile') @@ -1327,6 +1335,16 @@ def datalake_store_client(self): def datalake_store_models(self): return DataLakeStoreAccountModel + @property + def event_hub_client(self): + self.log('Getting event hub client') + if not self._event_hub_client: + self._event_hub_client = self.get_mgmt_svc_client( + EventHubManagementClient, + base_url=self._cloud_environment.endpoints.resource_manager, + api_version='2018-05-04') + return self._event_hub_client + class AzureSASAuthentication(Authentication): """Simple SAS Authentication. diff --git a/plugins/modules/azure_rm_eventhub.py b/plugins/modules/azure_rm_eventhub.py new file mode 100644 index 000000000..dd94c554a --- /dev/null +++ b/plugins/modules/azure_rm_eventhub.py @@ -0,0 +1,438 @@ +#!/usr/bin/python +# +# Copyright (c) 2021 Praveen Ghuge(@praveenghuge) Karl Dasan(@karldas30) Saurabh Malpani (@saurabh3796) +# +# 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 + +DOCUMENTATION = ''' +--- +module: azure_rm_eventhub +version_added: "1.6.0" +short_description: Manage Event Hub +description: + - Create, update and delete instance of Event Hub. +options: + resource_group: + description: + - Name of the resource group to which the resource belongs. + required: True + type: str + namespace_name: + description: + - Name of the namespace in which to create event hub. + required: True + type: str + name: + description: + - Unique name of the Event Hub. + required: False + type: str + message_retention_in_days: + description: + - Number of days to retain the events for this Event Hub. + required: False + type: int + partition_count: + description: + - Number of partitions created for the Event Hub. + - Range from 1 to 32. + required: False + type: int + status: + description: + - Enumerates the possible values for the status of the Event hub. + default: Active + required: False + type: str + choices: + - Active + - Disabled + - Restoring + - SendDisabled + - ReceiveDisabled + - Creating + - Deleting + - Renaming + - Unknown + location: + description: + - Resource location. If not set, location from the resource group will be used as default. + required: False + type: str + sku: + description: + - The name of the SKU. + - Please see L(https://azure.microsoft.com/en-in/pricing/details/event-hubs/). + default: Basic + choices: + - Basic + - Standard + type: str + state: + description: + - Assert the state of the Event Hub. + - Use C(present) to create or update an event hub and C(absent) to delete it. + default: present + choices: + - absent + - present + type: str + +extends_documentation_fragment: + - azure.azcollection.azure + - azure.azcollection.azure_tags + +author: + - Praveen Ghuge (@praveenghuge) + - Karl Dasan (@karldas30) + - Saurabh Malpani(@saurabh3796) +''' +EXAMPLES = ''' + +- name: "Create Event Hub" + azure_rm_eventhub: + resource_group: testgroupans + location: eastus + namespace_name: myNamespace + name: myhub + tags: + - a: b + sku: free + +- name: Delete Event Hub + azure_rm_eventhub: + resource_group: testgroupans + name: myNamespace + state: absent + +- name: "Create Event Hub Namespace" + azure_rm_eventhub: + resource_group: testgroupans + location: eastus + namespace_name: myNamespace + tags: + a: b + sku: free + +- name: Delete Event Hub Namespace + azure_rm_eventhub: + resource_group: testgroupans + namespace_name: myNamespace + state: absent + +''' + +RETURN = ''' +state: + description: + - Current state of the Event Hub namesapce or Event Hub. + returned: always + type: dict + sample: { + "additional_properties": {"location": "East US"}, + "critical": false, + "enabled": true, + "metric_id": null, + "name": "testnaedd3d22d3w", + "namespace_type": "eventHub", + "status": "Active", + "region": null, + "scale_unit": null, + "service_bus_endpoint": "https://testnaedd3d22d3w.servicebus.windows.net:443/", + "sku": "Basic", + "tags": { + "a": "b" + }, + "message_retention_in_days": 7, + "partition_count": 4, + "partition_ids": ["0", "1", "2", "3"], + "updated_at": "2021-04-29T10:05:24.000Z", + "created_at": "2021-04-29T10:05:20.377Z", + "type": "Microsoft.eventHubs/namespaces" + } + +''' + +try: + from msrestazure.azure_exceptions import CloudError + from azure.mgmt.eventhub.models import Eventhub, EHNamespace + from azure.mgmt.eventhub.models.sku import Sku +except ImportError: + # This is handled in azure_rm_common + pass +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase +import time + + +class AzureRMEventHub(AzureRMModuleBase): + + def __init__(self): + # define user inputs from playbook + + self.authorizations_spec = dict( + name=dict(type='str', required=True) + ) + + self.module_arg_spec = dict( + message_retention_in_days=dict(type='int'), + name=dict(type='str'), + namespace_name=dict(type='str', required=True), + partition_count=dict(type='int'), + resource_group=dict(type='str', required=True), + sku=dict(type='str', choices=[ + 'Basic', 'Standard'], default='Basic'), + status=dict(choices=["Active", "Disabled", "Restoring", "SendDisabled", "ReceiveDisabled", "Creating", "Deleting", "Renaming", "Unknown"], + default='Active', type='str'), + state=dict(choices=['present', 'absent'], + default='present', type='str'), + location=dict(type='str') + ) + required_if = [ + ('state', 'present', [ + 'partition_count', 'message_retention_in_days']) + ] + self.sku = None + self.resource_group = None + self.namespace_name = None + self.message_retention_in_days = None + self.name = None + self.location = None + self.authorizations = None + self.tags = None + self.status = None + self.partition_count = None + self.results = dict( + changed=False, + state=dict() + ) + self.state = None + + super(AzureRMEventHub, self).__init__(derived_arg_spec=self.module_arg_spec, + supports_check_mode=True, + supports_tags=True) + + def exec_module(self, **kwargs): + for key in list(self.module_arg_spec.keys()) + ['tags']: + setattr(self, key, kwargs[key]) + + # retrieve resource group to make sure it exists + resource_group = self.get_resource_group(self.resource_group) + if not self.location: + # Set default location + self.location = resource_group.location + + results = dict() + changed = False + + try: + self.log( + 'Fetching Event Hub Namespace {0}'.format(self.name)) + namespace = self.event_hub_client.namespaces.get( + self.resource_group, self.namespace_name) + + results = namespace_to_dict(namespace) + event_hub_results = None + if self.name: + self.log('Fetching event Hub {0}'.format(self.name)) + event_hub = self.event_hub_client.event_hubs.get( + self.resource_group, self.namespace_name, self.name) + event_hub_results = event_hub_to_dict( + event_hub) + # don't change anything if creating an existing namespace, but change if deleting it + if self.state == 'present': + changed = False + + update_tags, results['tags'] = self.update_tags( + results['tags']) + + if update_tags: + changed = True + elif self.namespace_name and not self.name: + if self.sku != results['sku']: + changed = True + elif self.namespace_name and self.name and event_hub_results: + if results['sku'] != 'Basic' and self.message_retention_in_days != event_hub_results['message_retention_in_days']: + self.sku = results['sku'] + changed = True + elif self.state == 'absent': + changed = True + + except Exception: + # the event hub does not exist so create it + if self.state == 'present': + changed = True + else: + # you can't delete what is not there + changed = False + + self.results['changed'] = changed + + if self.name and not changed: + self.results['state'] = event_hub_results + else: + self.results['state'] = results + + # return the results if your only gathering information + if self.check_mode: + return self.results + + if changed: + if self.state == "present": + if self.name is None: + self.results['state'] = self.create_or_update_namespaces() + elif self.namespace_name and self.name: + self.results['state'] = self.create_or_update_event_hub() + elif self.state == "absent": + # delete Event Hub + if self.name is None: + self.delete_namespace() + elif self.namespace_name and self.name: + self.delete_event_hub() + self.results['state']['status'] = 'Deleted' + return self.results + + def create_or_update_namespaces(self): + ''' + create or update namespaces + ''' + try: + namespace_params = EHNamespace( + location=self.location, + sku=Sku(name=self.sku), + tags=self.tags + ) + result = self.event_hub_client.namespaces.create_or_update( + self.resource_group, + self.namespace_name, + namespace_params) + + namespace = self.event_hub_client.namespaces.get( + self.resource_group, + self.namespace_name) + while namespace.provisioning_state == "Created": + time.sleep(30) + namespace = self.event_hub_client.namespaces.get( + self.resource_group, + self.namespace_name, + ) + except CloudError as ex: + self.fail("Failed to create namespace {0} in resource group {1}: {2}".format( + self.namespace_name, self.resource_group, str(ex))) + return namespace_to_dict(namespace) + + def create_or_update_event_hub(self): + ''' + Create or update Event Hub. + :return: create or update Event Hub instance state dictionary + ''' + try: + if self.sku == 'Basic': + self.message_retention_in_days = 1 + params = Eventhub( + message_retention_in_days=self.message_retention_in_days, + partition_count=self.partition_count, + status=self.status + ) + result = self.event_hub_client.event_hubs.create_or_update( + self.resource_group, + self.namespace_name, + self.name, + params) + + self.log("Response : {0}".format(result)) + except Exception as ex: + self.fail("Failed to create event hub {0} in resource group {1}: {2}".format( + self.name, self.resource_group, str(ex))) + return event_hub_to_dict(result) + + def delete_event_hub(self): + ''' + Deletes specified event hub + :return True + ''' + self.log("Deleting the event hub {0}".format(self.name)) + try: + result = self.event_hub_client.event_hubs.delete( + self.resource_group, self.namespace_name, self.name) + except CloudError as e: + self.log('Error attempting to delete event hub.') + self.fail( + "Error deleting the event hub : {0}".format(str(e))) + return True + + def delete_namespace(self): + ''' + Deletes specified namespace + :return True + ''' + self.log("Deleting the namespace {0}".format(self.namespace_name)) + try: + result = self.event_hub_client.namespaces.delete( + self.resource_group, self.namespace_name) + except CloudError as e: + self.log('Error attempting to delete namespace.') + self.fail( + "Error deleting the namespace : {0}".format(str(e))) + return True + + +def event_hub_to_dict(item): + # turn event hub object into a dictionary (serialization) + event_hub = item.as_dict() + result = dict() + if item.additional_properties: + result['additional_properties'] = item.additional_properties + result['name'] = event_hub.get('name', None) + result['partition_ids'] = event_hub.get('partition_ids', None) + result['created_at'] = event_hub.get('created_at', None) + result['updated_at'] = event_hub.get('updated_at', None) + result['message_retention_in_days'] = event_hub.get( + 'message_retention_in_days', None) + result['partition_count'] = event_hub.get('partition_count', None) + result['status'] = event_hub.get('status', None) + result['tags'] = event_hub.get('tags', None) + return result + + +def namespace_to_dict(item): + # turn event hub namespace object into a dictionary (serialization) + namespace = item.as_dict() + result = dict( + additional_properties=namespace.get( + 'additional_properties', {}), + name=namespace.get('name', None), + type=namespace.get('type', None), + location=namespace.get( + 'location', '').replace(' ', '').lower(), + sku=namespace.get("sku").get("name"), + tags=namespace.get('tags', None), + provisioning_state=namespace.get( + 'provisioning_state', None), + region=namespace.get('region', None), + metric_id=namespace.get('metric_id', None), + service_bus_endpoint=namespace.get( + 'service_bus_endpoint', None), + scale_unit=namespace.get('scale_unit', None), + enabled=namespace.get('enabled', None), + critical=namespace.get('critical', None), + data_center=namespace.get('data_center', None), + namespace_type=namespace.get('namespace_type', None), + updated_at=namespace.get('updated_at', None), + created_at=namespace.get('created_at', None), + is_auto_inflate_enabled=namespace.get( + 'is_auto_inflate_enabled', None), + maximum_throughput_units=namespace.get( + 'maximum_throughput_units', None) + ) + return result + + +def main(): + AzureRMEventHub() + + +if __name__ == '__main__': + main() diff --git a/plugins/modules/azure_rm_eventhub_info.py b/plugins/modules/azure_rm_eventhub_info.py new file mode 100644 index 000000000..1e8cd4765 --- /dev/null +++ b/plugins/modules/azure_rm_eventhub_info.py @@ -0,0 +1,241 @@ +#!/usr/bin/python +# +# Copyright (c) 2021 Praveen Ghuge(@praveenghuge) Karl Dasan(@karldas30) Saurabh Malpani (@saurabh3796) +# +# 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 + + +DOCUMENTATION = ''' +--- +module: azure_rm_eventhub_info +version_added: "1.6.0" +short_description: Get Azure Event Hub +description: + - Get facts of Azure Event Hub. +options: + resource_group: + description: + - The name of the resource group. + required: True + type: str + namespace_name: + description: + - The name of the namspace. + required: False + type: str + name: + description: + - The name of the Event hub. + type: str +extends_documentation_fragment: + - azure.azcollection.azure +author: + - Saurabh Malpani (@saurabh3796) +''' + + +EXAMPLES = ''' + - name: Get facts of specific Event hub + community.azure.azure_rm_eventhub_info: + resource_group: myResourceGroup + name: myEventHub +''' + +RETURN = ''' +state: + description: + - Current state of the Event Hub namesapce or Event Hub. + returned: always + type: dict + sample: { + "additional_properties": {}, + "created_at": "2021-04-19T12:49:46.597Z", + "critical": null, + "data_center": null, + "status": "Active", + "location": "eastus", + "metric_id": "149f0952-6f3d-48ba-9e98-57011575cbbd:eventhubtestns1753", + "name": "eventhubtestns1753", + "namespace_type": null, + "provisioning_state": "Succeeded", + "region": null, + "scale_unit": null, + "service_bus_endpoint": "https://eventhubtestns1753.servicebus.windows.net:443/", + "sku": "Basic", + "tags": {}, + "type": "Microsoft.EventHub/Namespaces", + "updated_at": "2021-04-19T12:54:33.397Z" + } +''' + +try: + from msrestazure.azure_exceptions import CloudError +except ImportError: + # This is handled in azure_rm_common + pass +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase + + +class AzureRMEventHubInfo(AzureRMModuleBase): + def __init__(self): + + self.module_arg_spec = dict( + resource_group=dict( + type='str', + required=True + ), + namespace_name=dict( + type='str', + required=False + ), + name=dict( + type='str', + required=False + ) + ) + + # store the results of the module operation + self.results = dict( + changed=False) + self.resource_group = None + self.namespace_name = None + self.name = None + self.tags = None + + super(AzureRMEventHubInfo, self).__init__( + self.module_arg_spec, supports_tags=False) + + def exec_module(self, **kwargs): + + for key in self.module_arg_spec: + setattr(self, key, kwargs[key]) + + if self.name and self.namespace_name and self.resource_group: + results = self.get_event_hub() + self.results['eventhub'] = [ + self.event_hub_to_dict(x) for x in results] + elif self.namespace_name: + results = self.get_namespace() + self.results['namespace'] = [ + self.namespace_to_dict(x) for x in results] + elif self.name is None and self.namespace_name is None: + results = self.list_all_namespace() + self.results['namespaces'] = [ + self.namespace_to_dict(x) for x in results] + return self.results + + def get_namespace(self): + ''' + Get the namespace using resource group and namespace name + ''' + response = None + results = [] + try: + response = self.event_hub_client.namespaces.get( + self.resource_group, self.namespace_name) + self.log("Response : {0}".format(response)) + + except CloudError as e: + self.fail('Could not get info for namespace. {0}').format( + str(e)) + + if response: + results = [response] + return results + + def get_event_hub(self): + ''' + get event hub using resource_group, namespace_name and name. + ''' + response = None + results = [] + + try: + response = self.event_hub_client.event_hubs.get( + self.resource_group, self.namespace_name, self.name) + + except CloudError as e: + self.fail('Could not get info for event hub. {0}').format( + str(e)) + + if response: + results = [response] + return results + + def list_all_namespace(self): + ''' + List all namespaces in particular resource_group + ''' + self.log('List items for resource group') + try: + response = self.event_hub_client.namespaces.list_by_resource_group( + self.resource_group) + + except CloudError as exc: + self.fail( + "Failed to list for resource group {0} - {1}".format(self.resource_group, str(exc))) + + results = [] + for item in response: + results.append(item) + return results + + def namespace_to_dict(self, item): + # turn event hub object into a dictionary (serialization) + namespace = item.as_dict() + result = dict( + additional_properties=namespace.get( + 'additional_properties', {}), + name=namespace.get('name', None), + type=namespace.get('type', None), + location=namespace.get( + 'location', '').replace(' ', '').lower(), + sku=namespace.get("sku").get("name"), + tags=namespace.get('tags', None), + provisioning_state=namespace.get( + 'provisioning_state', None), + region=namespace.get('region', None), + metric_id=namespace.get('metric_id', None), + service_bus_endpoint=namespace.get( + 'service_bus_endpoint', None), + scale_unit=namespace.get('scale_unit', None), + enabled=namespace.get('enabled', None), + critical=namespace.get('critical', None), + data_center=namespace.get('data_center', None), + namespace_type=namespace.get('namespace_type', None), + updated_at=namespace.get('updated_at', None), + created_at=namespace.get('created_at', None), + is_auto_inflate_enabled=namespace.get( + 'is_auto_inflate_enabled', None), + maximum_throughput_units=namespace.get( + 'maximum_throughput_units', None) + ) + return result + + def event_hub_to_dict(self, item): + # turn event hub object into a dictionary (serialization) + event_hub = item.as_dict() + result = dict() + if item.additional_properties: + result['additional_properties'] = item.additional_properties + result['name'] = event_hub.get('name', None) + result['partition_ids'] = event_hub.get('partition_ids', None) + result['created_at'] = event_hub.get('created_at', None) + result['updated_at'] = event_hub.get('updated_at', None) + result['message_retention_in_days'] = event_hub.get( + 'message_retention_in_days', None) + result['partition_count'] = event_hub.get('partition_count', None) + result['status'] = event_hub.get('status', None) + result['tags'] = event_hub.get('tags', None) + return result + + +def main(): + AzureRMEventHubInfo() + + +if __name__ == '__main__': + main() diff --git a/pr-pipelines.yml b/pr-pipelines.yml index f5fe04c77..7d28c47dc 100644 --- a/pr-pipelines.yml +++ b/pr-pipelines.yml @@ -46,6 +46,7 @@ parameters: - "azure_rm_deployment" - "azure_rm_dnsrecordset" - "azure_rm_dnszone" + - "azure_rm_eventhub" - "azure_rm_functionapp" - "azure_rm_gallery" - "azure_rm_hdinsightcluster" diff --git a/requirements-azure.txt b/requirements-azure.txt index 8356e6dbd..95a8af157 100644 --- a/requirements-azure.txt +++ b/requirements-azure.txt @@ -45,3 +45,4 @@ azure-mgmt-automation==0.1.1 azure-mgmt-iothub==0.7.0 azure-mgmt-recoveryservices==0.4.0 azure-mgmt-recoveryservicesbackup==0.6.0 +azure-mgmt-eventhub==2.0.0 diff --git a/tests/integration/targets/azure_rm_eventhub/aliases b/tests/integration/targets/azure_rm_eventhub/aliases new file mode 100644 index 000000000..5cf25760d --- /dev/null +++ b/tests/integration/targets/azure_rm_eventhub/aliases @@ -0,0 +1,3 @@ +cloud/azure +shippable/azure/group10 +destructive \ No newline at end of file diff --git a/tests/integration/targets/azure_rm_eventhub/meta/main.yml b/tests/integration/targets/azure_rm_eventhub/meta/main.yml new file mode 100644 index 000000000..95e1952f9 --- /dev/null +++ b/tests/integration/targets/azure_rm_eventhub/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - setup_azure diff --git a/tests/integration/targets/azure_rm_eventhub/tasks/main.yml b/tests/integration/targets/azure_rm_eventhub/tasks/main.yml new file mode 100644 index 000000000..484f0146d --- /dev/null +++ b/tests/integration/targets/azure_rm_eventhub/tasks/main.yml @@ -0,0 +1,145 @@ +- name: Create random event hub and namespace + set_fact: + namespace_name: "test{{ resource_group | hash('md5') | truncate(16, True, '') + (65535 | random | string) }}" + name: "test{{ resource_group | hash('md5') | truncate(16, True, '') + (65535 | random | string) }}" + +- name: Create Event Hub Namespace (check mode) + azure_rm_eventhub: + location: eastus2 + namespace_name: "{{ namespace_name }}" + resource_group: "{{ resource_group }}" + sku: "Basic" + check_mode: yes + register: results + +- assert: + that: results.changed + +- name: Create Event Hub (check mode) + azure_rm_eventhub: + location: eastus2 + namespace_name: "{{ namespace_name }}" + name: "{{ name }}" + resource_group: "{{ resource_group }}" + sku: "Basic" + check_mode: yes + register: results + +- assert: + that: results.changed + +- name: Create Event Hub Namespace + azure_rm_eventhub: + location: eastus2 + namespace_name: "{{ namespace_name }}" + resource_group: "{{ resource_group }}" + sku: "Basic" + register: results + +- assert: + that: results.changed + +- name: Create Event Hub + azure_rm_eventhub: + location: eastus2 + namespace_name: "{{ namespace_name }}" + name: "{{ name }}" + resource_group: "{{ resource_group }}" + register: results + +- assert: + that: results.changed + +- name: Update Namespace + azure_rm_eventhub: + location: eastus2 + namespace_name: "{{ namespace_name }}" + resource_group: "{{ resource_group }}" + sku: "Standard" + tags: + test: modified + register: results + +- assert: + that: + - results.changed + - results.state.tags.test == 'modified' + +- name: Update Event Hub + azure_rm_eventhub: + location: eastus2 + namespace_name: "{{ namespace_name }}" + name: "{{ name }}" + resource_group: "{{ resource_group }}" + message_retention_in_days: 4 + state: present + tags: + test: modified + register: results + +- assert: + that: + - results.changed + +- name: Retrieve Namespace + azure_rm_eventhub_info: + namespace_name: "{{ namespace_name }}" + resource_group: "{{ resource_group }}" + register: results + +- name: Test idempotent + azure_rm_eventhub: + location: eastus2 + namespace_name: "{{ namespace_name }}" + resource_group: "{{ resource_group }}" + sku: "Standard" + tags: + test: modified + register: results + +- assert: + that: + - not results.changed + +#cleanup +- name: Delete Event Hub + azure_rm_eventhub: + location: eastus2 + namespace_name: "{{ namespace_name }}" + name: "{{ name }}" + resource_group: "{{ resource_group }}" + state: absent + +- name: Delete Event Hub (idempotent) + azure_rm_eventhub: + location: eastus2 + namespace_name: "{{ namespace_name }}" + name: "{{ name }}" + resource_group: "{{ resource_group }}" + state: absent + register: results + +- assert: + that: not results.changed + +- name: Delete Namespace + azure_rm_eventhub: + location: eastus2 + namespace_name: "{{ namespace_name }}" + resource_group: "{{ resource_group }}" + state: absent + +- name: Pause for 1 minutes to check namespace deleted + pause: + minutes: 1 + +- name: Delete Namespace (idempotent) + azure_rm_eventhub: + location: eastus2 + namespace_name: "{{ namespace_name }}" + resource_group: "{{ resource_group }}" + state: absent + register: results + +- assert: + that: not results.changed