diff --git a/CHANGELOG.md b/CHANGELOG.md index c5b4761da7..287dffde21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,66 @@ # Change Log +## v1.1.0 (2020-09-03) + +### FEATURE ENHANCEMENT + - azure_rm_storageaccount: allow blob public access parameter ([#219](https://github.com/ansible-collections/azure/pull/219)) + - azure_rm_virtualmachine: update boot diganostics config ([#208](https://github.com/ansible-collections/azure/pull/208)) + - azure_rm_aks: add load_balancer_sku option ([#199](https://github.com/ansible-collections/azure/pull/199)) + - azure_rm: improve OS detection when VM has no osProfile ([#197](https://github.com/ansible-collections/azure/pull/197)) + - azure_rm_subnet: support IPv6 address ([#240](https://github.com/ansible-collections/azure/pull/240)) + - azure_rm_networkinterface: add new module parameter address_prefixes ([#239](https://github.com/ansible-collections/azure/pull/239)) + - azure_rm_common: support azure-cli credentials with multiple subscriptions ([#195](https://github.com/ansible-collections/azure/pull/195)) + - azure_rm_mariadbserver: support version 10.3 ([#244](https://github.com/ansible-collections/azure/pull/244)) + +### BUG FIXING + - azure_rm_manageddisk: fix increments LUN on disks already attached error ([#237](https://github.com/ansible-collections/azure/pull/237)) + - azure_rm_appgateway: fix rule type reference error ([#99](https://github.com/ansible-collections/azure/pull/99)) + + +## v1.0.0 (2020-08-12) + +### FEATURE ENHANCEMENT + - azure_rm_appgateway: support version 2 SKUS ([#198](https://github.com/ansible-collections/azure/pull/198)) + - azure_rm_storageaccount: support minimum tls version ([#207](https://github.com/ansible-collections/azure/pull/207)) + +### BUG FIXING + - azure_rm_roledefinition: fails when `description` is set ([#214](https://github.com/ansible-collections/azure/pull/214)) + - azure_rm_virtualmachine: boot diagnostics related error ([#200](https://github.com/ansible-collections/azure/pull/200)) + + +## v0.3.0 (2020-07-24) + +### FEATURE ENHANCEMENT + - azure_rm_storageblob: add batch upload feature ([#203](https://github.com/ansible-collections/azure/pull/203)) + +### BUG FIXING + - azure_rm_deployment_info: getting the template_link when it does not exist ([#180](https://github.com/ansible-collections/azure/pull/180)) + - azure_rm_virtualmachine: protect against no diskSizeGB ([#185](https://github.com/ansible-collections/azure/pull/185)) + - azure_rm_deployment: misleading status code in module failure message ([#204](https://github.com/ansible-collections/azure/pull/204)) + - azure_rm_adserviceprincipal: invalid update check logic ([#205](https://github.com/ansible-collections/azure/pull/205)) + + +## v0.2.0 (2020-07-03) + +### NEW MODULES + - azure_rm_privatezone module ([#122](https://github.com/ansible-collections/azure/pull/122)) + - azure_rm_adserviceprincipal module ([#179](https://github.com/ansible-collections/azure/pull/179)) + - azure_rm_adserviceprincipal_info module ([#179](https://github.com/ansible-collections/azure/pull/179)) + - azure_rm_adpassword module ([#179](https://github.com/ansible-collections/azure/pull/179)) + - azure_rm_adpassword_info module ([#179](https://github.com/ansible-collections/azure/pull/179)) + +### FEATURE ENHANCEMENT + - add ability to remove all subnet service endpoints ([#148](https://github.com/ansible-collections/azure/pull/148)) + - update network client api version ([#157](https://github.com/ansible-collections/azure/pull/157)) + - add ephemeral os disk support for azure_rm_virualmachinescaleset ([#128](https://github.com/ansible-collections/azure/pull/128)) + - add ephemeral os disk support for azure_rm_virtualmachine ([#124](https://github.com/ansible-collections/azure/pull/124)) + - add FileEndpoint to azure_rm_storageaccount_info ([#102](https://github.com/ansible-collections/azure/pull/102)) + - add support for managing the 'Firewall and virtual networks' settings in azure_rm_storageaccount ([#108](https://github.com/ansible-collections/azure/pull/108)) + +### BUG FIXING + - bug fixing in azure_rm_aks ([#170](https://github.com/ansible-collections/azure/pull/170)) + - migrate missing doc_fragments that went missing ([#115](https://github.com/ansible-collections/azure/pull/115)) + ## v0.1.3 (2020-05-13) - add new parameter in azure_rm_aks diff --git a/galaxy.yml b/galaxy.yml index 02bad7c4cd..3b3b1cafce 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -9,7 +9,7 @@ namespace: azure name: azcollection # The version of the collection. Must be compatible with semantic versioning -version: 0.1.3 +version: 1.1.0 # The path to the Markdown (.md) readme file. This path is relative to the root of the collection readme: README.md @@ -18,7 +18,6 @@ readme: README.md # @nicks:irc/im.site#channel' authors: - Microsoft -- Microsoft ### OPTIONAL but strongly recommended diff --git a/meta/execution-environment.yml b/meta/execution-environment.yml new file mode 100644 index 0000000000..08fbf66a3e --- /dev/null +++ b/meta/execution-environment.yml @@ -0,0 +1,3 @@ +dependencies: + python: requirements-azure.txt +version: 1 diff --git a/plugins/doc_fragments/azure.py b/plugins/doc_fragments/azure.py index 5acdde2e5b..ddeda5b93f 100644 --- a/plugins/doc_fragments/azure.py +++ b/plugins/doc_fragments/azure.py @@ -51,12 +51,12 @@ class ModuleDocFragment(object): the C(AZURE_CLOUD_ENVIRONMENT) environment variable. type: str default: AzureCloud - version_added: '2.4' + version_added: '0.0.1' adfs_authority_url: description: - Azure AD authority url. Use when authenticating with Username/password, and has your own ADFS authority. type: str - version_added: '2.6' + version_added: '0.0.1' cert_validation_mode: description: - Controls the certificate validation behavior for Azure endpoints. By default, all modules will validate the server certificate, but @@ -64,34 +64,37 @@ class ModuleDocFragment(object): set via credential file profile or the C(AZURE_CERT_VALIDATION) environment variable. type: str choices: [ ignore, validate ] - version_added: '2.5' + version_added: '0.0.1' auth_source: description: - Controls the source of the credentials to use for authentication. - - If not specified, ANSIBLE_AZURE_AUTH_SOURCE environment variable will be used and default to C(auto) if variable is not defined. - - C(auto) will follow the default precedence of module parameters -> environment variables -> default profile in credential file - C(~/.azure/credentials). - - When set to C(cli), the credentials will be sources from the default Azure CLI profile. - Can also be set via the C(ANSIBLE_AZURE_AUTH_SOURCE) environment variable. + - When set to C(auto) (the default) the precedence is module parameters -> C(env) -> C(credential_file) -> C(cli). + - When set to C(env), the credentials will be read from the environment variables + - When set to C(credential_file), it will read the profile from C(~/.azure/credentials). + - When set to C(cli), the credentials will be sources from the Azure CLI profile. C(subscription_id) or the environment variable + C(AZURE_SUBSCRIPTION_ID) can be used to identify the subscription ID if more than one is present otherwise the default + az cli subscription is used. - When set to C(msi), the host machine must be an azure resource with an enabled MSI extension. C(subscription_id) or the environment variable C(AZURE_SUBSCRIPTION_ID) can be used to identify the subscription ID if the resource is granted access to more than one subscription, otherwise the first subscription is chosen. - The C(msi) was added in Ansible 2.6. type: str + default: auto choices: - auto - cli - credential_file - env - msi - version_added: '2.5' + version_added: '0.0.1' api_profile: description: - Selects an API profile to use when communicating with Azure services. Default value of C(latest) is appropriate for public clouds; future values will allow use with Azure Stack. type: str default: latest - version_added: '2.5' + version_added: '0.0.1' requirements: - python >= 2.7 - azure >= 2.0.0 diff --git a/plugins/inventory/azure_rm.py b/plugins/inventory/azure_rm.py index 9e4050a379..e2e66a1da7 100644 --- a/plugins/inventory/azure_rm.py +++ b/plugins/inventory/azure_rm.py @@ -573,6 +573,12 @@ def hostvars(self): system = 'linux' if 'windowsConfiguration' in self._vm_model['properties']['osProfile']: system = 'windows' + else: + osType = self._vm_model['properties']['storageProfile']['osDisk']['osType'] + if osType == 'Linux': + system = 'linux' + if osType == 'Windows': + system = 'windows' new_hostvars = dict( public_ipv4_addresses=[], diff --git a/plugins/module_utils/azure_rm_common.py b/plugins/module_utils/azure_rm_common.py index fdf35001a6..0724f12488 100644 --- a/plugins/module_utils/azure_rm_common.py +++ b/plugins/module_utils/azure_rm_common.py @@ -3,6 +3,10 @@ # # 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 + + import os import re import types @@ -11,9 +15,15 @@ import traceback import json +try: + from azure.graphrbac import GraphRbacManagementClient +except Exception: + pass from os.path import expanduser -from ansible.module_utils.basic import AnsibleModule, missing_required_lib +from ansible.module_utils.basic import \ + AnsibleModule, missing_required_lib, env_fallback + try: from ansible.module_utils.ansible_release import __version__ as ANSIBLE_VERSION except Exception: @@ -24,7 +34,9 @@ AZURE_COMMON_ARGS = dict( auth_source=dict( type='str', - choices=['auto', 'cli', 'env', 'credential_file', 'msi'] + choices=['auto', 'cli', 'env', 'credential_file', 'msi'], + fallback=(env_fallback, ['ANSIBLE_AZURE_AUTH_SOURCE']), + default="auto" ), profile=dict(type='str'), subscription_id=dict(type='str'), @@ -82,9 +94,9 @@ def default_api_version(self): snapshots='2018-10-01', virtual_machine_run_commands='2018-10-01' ), - 'NetworkManagementClient': '2018-08-01', + 'NetworkManagementClient': '2019-06-01', 'ResourceManagementClient': '2017-05-10', - 'StorageManagementClient': '2017-10-01', + 'StorageManagementClient': '2019-06-01', 'WebSiteManagementClient': '2018-02-01', 'PostgreSQLManagementClient': '2017-12-01', 'MySQLManagementClient': '2017-12-01', @@ -223,6 +235,8 @@ def default_api_version(self): from azure.mgmt.storage import StorageManagementClient from azure.mgmt.compute import ComputeManagementClient from azure.mgmt.dns import DnsManagementClient + from azure.mgmt.privatedns import PrivateDnsManagementClient + import azure.mgmt.privatedns.models as PrivateDnsModels from azure.mgmt.monitor import MonitorManagementClient from azure.mgmt.web import WebSiteManagementClient from azure.mgmt.containerservice import ContainerServiceClient @@ -266,7 +280,7 @@ def default_api_version(self): try: from azure.cli.core.util import CLIError - from azure.common.credentials import get_azure_cli_credentials, get_cli_profile + from azure.common.credentials import get_cli_profile from azure.common.cloud import get_cli_active_cloud except ImportError: HAS_AZURE_CLI_CORE = False @@ -301,7 +315,7 @@ def normalize_location_name(name): AZURE_PKG_VERSIONS = { 'StorageManagementClient': { 'package_name': 'storage', - 'expected_version': '3.1.0' + 'expected_version': '11.1.0' }, 'ComputeManagementClient': { 'package_name': 'compute', @@ -323,6 +337,10 @@ def normalize_location_name(name): 'package_name': 'dns', 'expected_version': '2.1.0' }, + 'PrivateDnsManagementClient': { + 'package_name': 'privatedns', + 'expected_version': '0.1.0' + }, 'WebSiteManagementClient': { 'package_name': 'web', 'expected_version': '0.41.0' @@ -341,7 +359,7 @@ class AzureRMModuleBase(object): def __init__(self, derived_arg_spec, bypass_checks=False, no_log=False, check_invalid_arguments=None, mutually_exclusive=None, required_together=None, required_one_of=None, add_file_common_args=False, supports_check_mode=False, - required_if=None, supports_tags=True, facts_module=False, skip_exec=False): + required_if=None, supports_tags=True, facts_module=False, skip_exec=False, is_ad_resource=False): merged_arg_spec = dict() merged_arg_spec.update(AZURE_COMMON_ARGS) @@ -358,7 +376,6 @@ def __init__(self, derived_arg_spec, bypass_checks=False, no_log=False, self.module = AnsibleModule(argument_spec=merged_arg_spec, bypass_checks=bypass_checks, no_log=no_log, - check_invalid_arguments=check_invalid_arguments, mutually_exclusive=mutually_exclusive, required_together=required_together, required_one_of=required_one_of, @@ -383,6 +400,7 @@ def __init__(self, derived_arg_spec, bypass_checks=False, no_log=False, self._resource_client = None self._compute_client = None self._dns_client = None + self._private_dns_client = None self._web_client = None self._marketplace_client = None self._sql_client = None @@ -408,7 +426,7 @@ def __init__(self, derived_arg_spec, bypass_checks=False, no_log=False, # self.debug = self.module.params.get('debug') # delegate auth to AzureRMAuth class (shared with all plugin types) - self.azure_auth = AzureRMAuth(fail_impl=self.fail, **self.module.params) + self.azure_auth = AzureRMAuth(fail_impl=self.fail, is_ad_resource=is_ad_resource, **self.module.params) # common parameter validation if self.module.params.get('tags'): @@ -817,6 +835,13 @@ def get_api_profile(self, client_type_name, api_profile_name): # wrap basic strings in a dict that just defines the default return dict(default_api_version=profile_raw) + def get_graphrbac_client(self, tenant_id): + cred = self.azure_auth.azure_credentials + base_url = self.azure_auth._cloud_environment.endpoints.active_directory_graph_resource_id + client = GraphRbacManagementClient(cred, tenant_id, base_url) + + return client + def get_mgmt_svc_client(self, client_type, base_url=None, api_version=None): self.log('Getting management service client {0}'.format(client_type.__name__)) self.check_client_version(client_type) @@ -923,12 +948,12 @@ def storage_client(self): if not self._storage_client: self._storage_client = self.get_mgmt_svc_client(StorageManagementClient, base_url=self._cloud_environment.endpoints.resource_manager, - api_version='2018-07-01') + api_version='2019-06-01') return self._storage_client @property def storage_models(self): - return StorageManagementClient.models("2018-07-01") + return StorageManagementClient.models("2019-06-01") @property def network_client(self): @@ -986,6 +1011,20 @@ def dns_models(self): self.log("Getting dns models...") return DnsManagementClient.models('2018-05-01') + @property + def private_dns_client(self): + self.log('Getting private dns client') + if not self._private_dns_client: + self._private_dns_client = self.get_mgmt_svc_client( + PrivateDnsManagementClient, + base_url=self._cloud_environment.endpoints.resource_manager) + return self._private_dns_client + + @property + def private_dns_models(self): + self.log('Getting private dns models') + return PrivateDnsModels + @property def web_client(self): self.log('Getting web client') @@ -1199,23 +1238,33 @@ class AzureRMAuthException(Exception): class AzureRMAuth(object): - def __init__(self, auth_source='auto', profile=None, subscription_id=None, client_id=None, secret=None, + _cloud_environment = None + _adfs_authority_url = None + + def __init__(self, auth_source=None, profile=None, subscription_id=None, client_id=None, secret=None, tenant=None, ad_user=None, password=None, cloud_environment='AzureCloud', cert_validation_mode='validate', - api_profile='latest', adfs_authority_url=None, fail_impl=None, **kwargs): + api_profile='latest', adfs_authority_url=None, fail_impl=None, is_ad_resource=False, **kwargs): if fail_impl: self._fail_impl = fail_impl else: self._fail_impl = self._default_fail_impl - - self._cloud_environment = None - self._adfs_authority_url = None + self.is_ad_resource = is_ad_resource # authenticate self.credentials = self._get_credentials( - dict(auth_source=auth_source, profile=profile, subscription_id=subscription_id, client_id=client_id, secret=secret, - tenant=tenant, ad_user=ad_user, password=password, cloud_environment=cloud_environment, - cert_validation_mode=cert_validation_mode, api_profile=api_profile, adfs_authority_url=adfs_authority_url)) + auth_source=auth_source, + profile=profile, + subscription_id=subscription_id, + client_id=client_id, + secret=secret, + tenant=tenant, + ad_user=ad_user, + password=password, + cloud_environment=cloud_environment, + cert_validation_mode=cert_validation_mode, + api_profile=api_profile, + adfs_authority_url=adfs_authority_url) if not self.credentials: if HAS_AZURE_CLI_CORE: @@ -1226,8 +1275,10 @@ def __init__(self, auth_source='auto', profile=None, subscription_id=None, clien "define a profile in ~/.azure/credentials, or install Azure CLI and log in (`az login`).") # cert validation mode precedence: module-arg, credential profile, env, "validate" - self._cert_validation_mode = cert_validation_mode or self.credentials.get('cert_validation_mode') or \ - os.environ.get('AZURE_CERT_VALIDATION_MODE') or 'validate' + self._cert_validation_mode = cert_validation_mode or \ + self.credentials.get('cert_validation_mode') or \ + self._get_env('cert_validation_mode') or \ + 'validate' if self._cert_validation_mode not in ['validate', 'ignore']: self.fail('invalid cert_validation_mode: {0}'.format(self._cert_validation_mode)) @@ -1317,6 +1368,10 @@ def fail(self, msg, exception=None, **kwargs): def _default_fail_impl(self, msg, exception=None, **kwargs): raise AzureRMAuthException(msg) + def _get_env(self, module_key, default=None): + "Read envvar matching module parameter" + return os.environ.get(AZURE_CREDENTIAL_ENV_MAPPING[module_key], default) + def _get_profile(self, profile="default"): path = expanduser("~/.azure/credentials") try: @@ -1337,10 +1392,9 @@ def _get_profile(self, profile="default"): return None - def _get_msi_credentials(self, subscription_id_param=None, **kwargs): - client_id = kwargs.get('client_id', None) + def _get_msi_credentials(self, subscription_id=None, client_id=None, **kwargs): credentials = MSIAuthentication(client_id=client_id) - subscription_id = subscription_id_param or os.environ.get(AZURE_CREDENTIAL_ENV_MAPPING['subscription_id'], None) + subscription_id = subscription_id or self._get_env('subscription_id') if not subscription_id: try: # use the first subscription of the MSI @@ -1355,8 +1409,13 @@ def _get_msi_credentials(self, subscription_id_param=None, **kwargs): 'subscription_id': subscription_id } - def _get_azure_cli_credentials(self): - credentials, subscription_id = get_azure_cli_credentials() + def _get_azure_cli_credentials(self, subscription_id=None, resource=None): + if self.is_ad_resource: + resource = 'https://graph.windows.net/' + subscription_id = subscription_id or self._get_env('subscription_id') + profile = get_cli_profile() + credentials, subscription_id, tenant = profile.get_login_credentials( + subscription_id=subscription_id, resource=resource) cloud_environment = get_cli_active_cloud() cli_credentials = { @@ -1380,8 +1439,7 @@ def _get_env_credentials(self): return None - # TODO: use explicit kwargs instead of intermediate dict - def _get_credentials(self, params): + def _get_credentials(self, auth_source=None, **params): # Get authentication credentials. self.log('Getting credentials') @@ -1389,13 +1447,9 @@ def _get_credentials(self, params): for attribute, env_variable in AZURE_CREDENTIAL_ENV_MAPPING.items(): arg_credentials[attribute] = params.get(attribute, None) - auth_source = params.get('auth_source', None) - if not auth_source: - auth_source = os.environ.get('ANSIBLE_AZURE_AUTH_SOURCE', 'auto') - if auth_source == 'msi': - self.log('Retrieving credenitals from MSI') - return self._get_msi_credentials(arg_credentials['subscription_id'], client_id=params.get('client_id', None)) + self.log('Retrieving credentials from MSI') + return self._get_msi_credentials(subscription_id=params.get('subscription_id'), client_id=params.get('client_id')) if auth_source == 'cli': if not HAS_AZURE_CLI_CORE: @@ -1403,7 +1457,7 @@ def _get_credentials(self, params): exception=HAS_AZURE_CLI_CORE_EXC) try: self.log('Retrieving credentials from Azure CLI profile') - cli_credentials = self._get_azure_cli_credentials() + cli_credentials = self._get_azure_cli_credentials(subscription_id=params.get('subscription_id')) return cli_credentials except CLIError as err: self.fail("Azure CLI profile cannot be loaded - {0}".format(err)) @@ -1419,14 +1473,14 @@ def _get_credentials(self, params): default_credentials = self._get_profile(profile) return default_credentials - # auto, precedence: module parameters -> environment variables -> default profile in ~/.azure/credentials + # auto, precedence: module parameters -> environment variables -> default profile in ~/.azure/credentials -> azure cli # try module params if arg_credentials['profile'] is not None: self.log('Retrieving credentials with profile parameter.') credentials = self._get_profile(arg_credentials['profile']) return credentials - if arg_credentials['subscription_id']: + if arg_credentials['client_id'] or arg_credentials['ad_user']: self.log('Received credentials from parameters.') return arg_credentials @@ -1445,7 +1499,7 @@ def _get_credentials(self, params): try: if HAS_AZURE_CLI_CORE: self.log('Retrieving credentials from AzureCLI profile') - cli_credentials = self._get_azure_cli_credentials() + cli_credentials = self._get_azure_cli_credentials(subscription_id=params.get('subscription_id')) return cli_credentials except CLIError as ce: self.log('Error getting AzureCLI profile credentials - {0}'.format(ce)) diff --git a/plugins/module_utils/azure_rm_common_ext.py b/plugins/module_utils/azure_rm_common_ext.py index b16404f008..48060898ab 100644 --- a/plugins/module_utils/azure_rm_common_ext.py +++ b/plugins/module_utils/azure_rm_common_ext.py @@ -2,6 +2,10 @@ # # 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 + + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase import re from ansible.module_utils.common.dict_transformations import _camel_to_snake, _snake_to_camel diff --git a/plugins/module_utils/azure_rm_common_rest.py b/plugins/module_utils/azure_rm_common_rest.py index bc625d144e..30908be531 100644 --- a/plugins/module_utils/azure_rm_common_rest.py +++ b/plugins/module_utils/azure_rm_common_rest.py @@ -2,6 +2,10 @@ # # 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 + + try: from ansible.module_utils.ansible_release import __version__ as ANSIBLE_VERSION except Exception: diff --git a/plugins/modules/azure_rm_adpassword.py b/plugins/modules/azure_rm_adpassword.py new file mode 100644 index 0000000000..2a0989d87c --- /dev/null +++ b/plugins/modules/azure_rm_adpassword.py @@ -0,0 +1,292 @@ +#!/usr/bin/python +# +# Copyright (c) 2020 Haiyuan Zhang, +# +# 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 +import datetime + +__metaclass__ = type + + +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'community'} + +DOCUMENTATION = ''' +--- +module: azure_rm_adpassword + +version_added: "0.2.0" + +short_description: Manage application password + +description: + - Manage application password. + +options: + app_id: + description: + - The application ID. + type: str + service_principal_object_id: + description: + - The service principal object ID. + type: str + key_id: + description: + - The password key ID. + type: str + tenant: + description: + - The tenant ID. + type: str + required: True + end_date: + description: + - Date or datemtime after which credentials expire. + - Default value is one year after current time. + type: str + value: + description: + - The application password value. + - Length greater than 18 characters. + type: str + app_object_id: + description: + - The application object ID. + type: str + state: + description: + - Assert the state of Active Dirctory Password. + - Use C(present) to create or update a Password and use C(absent) to delete. + - Update is not supported, if I(state=absent) and I(key_id=None), then all passwords of the application will be deleted. + default: present + choices: + - absent + - present + type: str + +extends_documentation_fragment: + - azure.azcollection.azure + - azure.azcollection.azure_tags + +author: + haiyuan_zhang (@haiyuazhang) + Fred-sun (@Fred-sun) + +''' + +EXAMPLES = ''' + - name: create ad password + azure_rm_adpassword: + app_id: "{{ app_id }}" + state: present + value: "$abc12345678" + tenant: "{{ tenant_id }}" +''' + +RETURN = ''' +end_date: + description: + - Date or datemtime after which credentials expire. + - Default value is one year after current time. + type: str + returned: always + sample: 2021-06-28T06:00:32.637070+00:00 +key_id: + description: + - The password key ID + type: str + returned: always + sample: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +start_date: + description: + - Date or datetime at which credentials become valid. + - Default value is current time. + type: str + returned: always + sample: 2020-06-28T06:00:32.637070+00:00 + +''' + +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase +import uuid + +try: + from msrestazure.azure_exceptions import CloudError + from azure.graphrbac.models import GraphErrorException + from azure.graphrbac.models import PasswordCredential + from azure.graphrbac.models import ApplicationUpdateParameters + from dateutil.relativedelta import relativedelta +except ImportError: + # This is handled in azure_rm_common + pass + + +class AzureRMADPassword(AzureRMModuleBase): + def __init__(self): + + self.module_arg_spec = dict( + app_id=dict(type='str'), + service_principal_object_id=dict(type='str'), + app_object_id=dict(type='str'), + key_id=dict(type='str'), + tenant=dict(type='str', required=True), + value=dict(type='str'), + end_date=dict(type='str'), + state=dict(type='str', default='present', choices=['present', 'absent']), + ) + + self.state = None + self.tenant = None + self.app_id = None + self.service_principal_object_id = None + self.app_object_id = None + self.key_id = None + self.value = None + self.end_date = None + self.results = dict(changed=False) + + self.client = None + + super(AzureRMADPassword, self).__init__(derived_arg_spec=self.module_arg_spec, + supports_check_mode=False, + supports_tags=False, + is_ad_resource=True) + + def exec_module(self, **kwargs): + for key in list(self.module_arg_spec.keys()): + setattr(self, key, kwargs[key]) + + self.client = self.get_graphrbac_client(self.tenant) + self.resolve_app_obj_id() + passwords = self.get_all_passwords() + + if self.state == 'present': + if self.key_id and self.key_exists(passwords): + self.update(passwords) + else: + self.create_password(passwords) + else: + if self.key_id is None: + self.delete_all_passwords(passwords) + else: + self.delete_password(passwords) + + return self.results + + def key_exists(self, old_passwords): + for pd in old_passwords: + if pd.key_id == self.key_id: + return True + return False + + def resolve_app_obj_id(self): + try: + if self.app_object_id is not None: + return + elif self.app_id or self.service_principal_object_id: + if not self.app_id: + sp = self.client.service_principals.get(self.service_principal_object_id) + self.app_id = sp.app_id + if not self.app_id: + self.fail("can't resolve app via service principal object id {0}".format(self.service_principal_object_id)) + + result = list(self.client.applications.list(filter="appId eq '{0}'".format(self.app_id))) + if result: + self.app_object_id = result[0].object_id + else: + self.fail("can't resolve app via app id {0}".format(self.app_id)) + else: + self.fail("one of the [app_id, app_object_id, service_principal_id] must be set") + + except GraphErrorException as ge: + self.fail("error in resolve app_object_id {0}".format(str(ge))) + + def get_all_passwords(self): + + try: + return list(self.client.applications.list_password_credentials(self.app_object_id)) + except GraphErrorException as ge: + self.fail("failed to fetch passwords for app {0}: {1}".format(self.app_object_id, str(ge))) + + def delete_all_passwords(self, old_passwords): + + if len(old_passwords) == 0: + self.results['changed'] = False + return + try: + self.client.applications.patch(self.app_object_id, ApplicationUpdateParameters(password_credentials=[])) + self.results['changed'] = True + except GraphErrorException as ge: + self.fail("fail to purge all passwords for app: {0} - {1}".format(self.app_object_id, str(ge))) + + def delete_password(self, old_passwords): + if not self.key_exists(old_passwords): + self.results['changed'] = False + return + + num_of_passwords_before_delete = len(old_passwords) + + for pd in old_passwords: + if pd.key_id == self.key_id: + old_passwords.remove(pd) + break + try: + self.client.applications.patch(self.app_object_id, ApplicationUpdateParameters(password_credentials=old_passwords)) + num_of_passwords_after_delete = len(self.get_all_passwords()) + if num_of_passwords_after_delete != num_of_passwords_before_delete: + self.results['changed'] = True + + except GraphErrorException as ge: + self.fail("failed to delete password with key id {0} - {1}".format(self.app_id, str(ge))) + + def create_password(self, old_passwords): + + def gen_guid(): + return uuid.uuid4() + + if self.value is None: + self.fail("when creating a new password, module parameter value can't be None") + + start_date = datetime.datetime.now(datetime.timezone.utc) + end_date = self.end_date or start_date + relativedelta(years=1) + value = self.value + key_id = self.key_id or str(gen_guid()) + + new_password = PasswordCredential(start_date=start_date, end_date=end_date, key_id=key_id, + value=value, custom_key_identifier=None) + old_passwords.append(new_password) + + try: + client = self.get_graphrbac_client(self.tenant) + app_patch_parameters = ApplicationUpdateParameters(password_credentials=old_passwords) + client.applications.patch(self.app_object_id, app_patch_parameters) + + new_passwords = self.get_all_passwords() + for pd in new_passwords: + if pd.key_id == key_id: + self.results['changed'] = True + self.results.update(self.to_dict(pd)) + except GraphErrorException as ge: + self.fail("failed to create new password: {0}".format(str(ge))) + + def update_password(self, old_passwords): + self.fail("update existing password is not supported") + + def to_dict(self, pd): + return dict( + end_date=pd.end_date, + start_date=pd.start_date, + key_id=pd.key_id + ) + + +def main(): + AzureRMADPassword() + + +if __name__ == '__main__': + main() diff --git a/plugins/modules/azure_rm_adpassword_info.py b/plugins/modules/azure_rm_adpassword_info.py new file mode 100644 index 0000000000..0b68b689bf --- /dev/null +++ b/plugins/modules/azure_rm_adpassword_info.py @@ -0,0 +1,214 @@ +#!/usr/bin/python +# +# Copyright (c) 2020 Haiyuan Zhang, +# +# 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 +import datetime + +__metaclass__ = type + + +ANSIBLE_METADATA = {'metadata_version': '1.1', + 'status': ['preview'], + 'supported_by': 'community'} + +DOCUMENTATION = ''' +module: azure_rm_adpassword_info + +version_added: "0.2.0" + +short_description: Get application password info + +description: + - Get application password info. + +options: + app_id: + description: + - The application ID. + type: str + service_principal_object_id: + description: + - The service principal object ID. + type: str + key_id: + description: + - The password key ID. + type: str + tenant: + description: + - The tenant ID. + type: str + required: True + end_date: + description: + - Date or datemtime after which credentials expire. + - Default value is one year after current time. + type: str + value: + description: + - The application password value. + - Length greater than 18 characters. + type: str + app_object_id: + description: + - The application object ID. + type: str + +extends_documentation_fragment: + - azure.azcollection.azure + - azure.azcollection.azure_tags + +author: + haiyuan_zhang (@haiyuazhang) + Fred-sun (@Fred-sun) +''' + +EXAMPLES = ''' + - name: get ad password info + azure_rm_adpassword_info: + app_id: "{{ app_id }}" + tenant: "{{ tenant_id }}" + key_id: "{{ key_id }}" +''' + +RETURN = ''' +passwords: + description: + - The password info. + returned: success + type: dict + contains: + custom_key_identifier: + description: + - Custom key identifier. + type: str + returned: always + sample: None + end_date: + description: + - Date or datemtime after which credentials expire. + - Default value is one year after current time. + type: datetime + returned: always + sample: 2021-06-18T06:51:25.508304+00:00 + key_id: + description: + - The password key ID. + type: str + returned: always + sample: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + start_date: + description: + - Date or datetime at which credentials become valid. + - Default value is current time + type: datetime + returned: always + sample: 2020-06-18T06:51:25.508304+00:00 + +''' + +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase + +try: + from msrestazure.azure_exceptions import CloudError + from azure.graphrbac.models import GraphErrorException + from azure.graphrbac.models import PasswordCredential + from azure.graphrbac.models import ApplicationUpdateParameters +except ImportError: + # This is handled in azure_rm_common + pass + + +class AzureRMADPasswordInfo(AzureRMModuleBase): + def __init__(self): + + self.module_arg_spec = dict( + app_id=dict(type='str'), + app_object_id=dict(type='str'), + service_principal_object_id=dict(type='str'), + key_id=dict(type='str'), + tenant=dict(type='str', required=True), + value=dict(type='str'), + end_date=dict(type='str'), + ) + + self.tenant = None + self.app_id = None + self.service_principal_object_id = None + self.app_object_id = None + self.key_id = None + self.value = None + self.end_date = None + self.results = dict(changed=False) + + self.client = None + + super(AzureRMADPasswordInfo, self).__init__(derived_arg_spec=self.module_arg_spec, + supports_check_mode=False, + supports_tags=False, + is_ad_resource=True) + + def exec_module(self, **kwargs): + + for key in list(self.module_arg_spec.keys()): + setattr(self, key, kwargs[key]) + + self.client = self.get_graphrbac_client(self.tenant) + self.resolve_app_obj_id() + passwords = self.get_all_passwords() + + if self.key_id: + filtered = [pd for pd in passwords if pd.key_id == self.key_id] + self.results['passwords'] = [self.to_dict(pd) for pd in filtered] + else: + self.results['passwords'] = [self.to_dict(pd) for pd in passwords] + + return self.results + + def resolve_app_obj_id(self): + try: + if self.app_object_id is not None: + return + elif self.app_id or self.service_principal_object_id: + if not self.app_id: + sp = self.client.service_principals.get(self.service_principal_id) + self.app_id = sp.app_id + if not self.app_id: + self.fail("can't resolve app via service principal object id {0}".format(self.service_principal_object_id)) + + result = list(self.client.applications.list(filter="appId eq '{0}'".format(self.app_id))) + if result: + self.app_object_id = result[0].object_id + else: + self.fail("can't resolve app via app id {0}".format(self.app_id)) + else: + self.fail("one of the [app_id, app_object_id, service_principal_id] must be set") + + except GraphErrorException as ge: + self.fail("error in resolve app_object_id {0}".format(str(ge))) + + def get_all_passwords(self): + + try: + return list(self.client.applications.list_password_credentials(self.app_object_id)) + except GraphErrorException as ge: + self.fail("failed to fetch passwords for app {0}: {1}".format(self.app_object_id, str(ge))) + + def to_dict(self, pd): + return dict( + end_date=pd.end_date, + start_date=pd.start_date, + key_id=pd.key_id, + custom_key_identifier=str(pd.custom_key_identifier) + ) + + +def main(): + AzureRMADPasswordInfo() + + +if __name__ == '__main__': + main() diff --git a/plugins/modules/azure_rm_adserviceprincipal.py b/plugins/modules/azure_rm_adserviceprincipal.py new file mode 100644 index 0000000000..213db573ca --- /dev/null +++ b/plugins/modules/azure_rm_adserviceprincipal.py @@ -0,0 +1,219 @@ +#!/usr/bin/python +# +# Copyright (c) 2020 Haiyuan Zhang, +# +# 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_adserviceprincipal + +version_added: "0.2.0" + +short_description: Manage Azure Active Directory service principal + +description: + - Manage Azure Active Directory service principal. + +options: + app_id: + description: + - The application ID. + type: str + required: True + tenant: + description: + - The tenant ID. + type: str + required: True + app_role_assignment_required: + description: + - Whether the Role of the Service Principal is set. + type: bool + state: + description: + - Assert the state of Active Dirctory service principal. + - Use C(present) to create or update a Password and use C(absent) to delete. + default: present + choices: + - absent + - present + type: str + +extends_documentation_fragment: + - azure.azcollection.azure + - azure.azcollection.azure_tags + +author: + haiyuan_zhang (@haiyuazhang) + Fred-sun (@Fred-sun) +''' + +EXAMPLES = ''' + - name: create ad sp + azure_ad_serviceprincipal: + app_id: "{{ app_id }}" + state: present + tenant: "{{ tenant_id }}" +''' + +RETURN = ''' +app_display_name: + description: + - Object's display name or its prefix. + type: str + returned: always + sample: fredAKSCluster +app_id: + description: + - The application ID. + returned: always + type: str + sample: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +app_role_assignment_required: + description: + - Whether the Role of the Service Principal is set. + returned: always + type: bool + sample: false +object_id: + description: + - Object ID of the associated service principal. + returned: always + type: str + sample: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + +''' + +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common_ext import AzureRMModuleBaseExt +try: + from azure.graphrbac.models import ServicePrincipalCreateParameters + from azure.graphrbac.models import ServicePrincipalUpdateParameters +except Exception: + pass + +try: + from msrestazure.azure_exceptions import CloudError + from azure.graphrbac.models import GraphErrorException +except ImportError: + # This is handled in azure_rm_common + pass + + +class AzureRMADServicePrincipal(AzureRMModuleBaseExt): + def __init__(self): + + self.module_arg_spec = dict( + app_id=dict(type='str', required=True), + tenant=dict(type='str', required=True), + state=dict(type='str', default='present', choices=['present', 'absent']), + app_role_assignment_required=dict(type='bool') + ) + + self.state = None + self.tenant = None + self.app_id = None + self.app_role_assignment_required = None + self.object_id = None + self.results = dict(changed=False) + + super(AzureRMADServicePrincipal, self).__init__(derived_arg_spec=self.module_arg_spec, + supports_check_mode=False, + supports_tags=False, + is_ad_resource=True) + + def exec_module(self, **kwargs): + + for key in list(self.module_arg_spec.keys()): + setattr(self, key, kwargs[key]) + + response = self.get_resource() + + if response: + if self.state == 'present': + if self.check_update(response): + self.update_resource(response) + elif self.state == 'absent': + self.delete_resource(response) + else: + if self.state == 'present': + self.create_resource() + elif self.state == 'absent': + self.log("try to delete non exist resource") + + return self.results + + def create_resource(self): + try: + client = self.get_graphrbac_client(self.tenant) + response = client.service_principals.create(ServicePrincipalCreateParameters(app_id=self.app_id, account_enabled=True)) + self.results['changed'] = True + self.results.update(self.to_dict(response)) + return response + except GraphErrorException as ge: + self.fail("Error creating service principle, app id {0} - {1}".format(self.app_id, str(ge))) + + def update_resource(self, old_response): + try: + client = self.get_graphrbac_client(self.tenant) + to_update = {} + if self.app_role_assignment_required is not None: + to_update['app_role_assignment_required'] = self.app_role_assignment_required + + client.service_principals.update(old_response['object_id'], to_update) + self.results['changed'] = True + self.results.update(self.get_resource()) + + except GraphErrorException as ge: + self.fail("Error updating the service principal app_id {0} - {1}".format(self.app_id, str(ge))) + + def delete_resource(self, response): + try: + client = self.get_graphrbac_client(self.tenant) + client.service_principals.delete(response.get('object_id')) + self.results['changed'] = True + return True + except GraphErrorException as ge: + self.fail("Error deleting service principal app_id {0} - {1}".format(self.app_id, str(ge))) + + def get_resource(self): + try: + client = self.get_graphrbac_client(self.tenant) + result = list(client.service_principals.list(filter="servicePrincipalNames/any(c:c eq '{0}')".format(self.app_id))) + if not result: + return False + result = result[0] + return self.to_dict(result) + except GraphErrorException as ge: + self.log("Did not find the graph instance instance {0} - {1}".format(self.app_id, str(ge))) + return False + + def check_update(self, response): + app_assignment_changed = self.app_role_assignment_required is not None and \ + self.app_role_assignment_required != response.get('app_role_assignment_required', None) + + return app_assignment_changed + + def to_dict(self, object): + return dict( + app_id=object.app_id, + object_id=object.object_id, + app_display_name=object.display_name, + app_role_assignment_required=object.app_role_assignment_required + ) + + +def main(): + AzureRMADServicePrincipal() + + +if __name__ == '__main__': + main() diff --git a/plugins/modules/azure_rm_adserviceprincipal_info.py b/plugins/modules/azure_rm_adserviceprincipal_info.py new file mode 100644 index 0000000000..854c9088cf --- /dev/null +++ b/plugins/modules/azure_rm_adserviceprincipal_info.py @@ -0,0 +1,149 @@ +#!/usr/bin/python +# +# Copyright (c) 2020 Haiyuan Zhang, +# +# 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_adserviceprincipal_info + +version_added: "0.2.0" + +short_description: Get Azure Active Directory service principal info + +description: + - Get Azure Active Directory service principal info. + +options: + app_id: + description: + - The application ID. + type: str + tenant: + description: + - The tenant ID. + type: str + required: True + object_id: + description: + - It's service principal's object ID. + type: str + +extends_documentation_fragment: + - azure.azcollection.azure + - azure.azcollection.azure_tags + +author: + haiyuan_zhang (@haiyuazhang) + Fred-sun (@Fred-sun) +''' + +EXAMPLES = ''' + - name: get ad sp info + azure_rm_adserviceprincipal_info: + app_id: "{{ app_id }}" + tenant: "{{ tenant_id }}" + +''' + +RETURN = ''' +app_display_name: + description: + - Object's display name or its prefix. + type: str + returned: always + sample: sp +app_id: + description: + - The application ID. + returned: always + type: str + sample: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +app_role_assignment_required: + description: + - Whether the Role of the Service Principal is set. + type: bool + returned: always + sample: false +object_id: + description: + - It's service principal's object ID. + returned: always + type: str + sample: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + + +''' + +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common_ext import AzureRMModuleBase + +try: + from msrestazure.azure_exceptions import CloudError + from azure.graphrbac.models import GraphErrorException +except ImportError: + # This is handled in azure_rm_common + pass + + +class AzureRMADServicePrincipalInfo(AzureRMModuleBase): + def __init__(self): + + self.module_arg_spec = dict( + app_id=dict(type='str'), + object_id=dict(type='str'), + tenant=dict(type='str', required=True), + ) + + self.tenant = None + self.app_id = None + self.object_id = None + self.results = dict(changed=False) + + super(AzureRMADServicePrincipalInfo, self).__init__(derived_arg_spec=self.module_arg_spec, + supports_check_mode=False, + supports_tags=False, + is_ad_resource=True) + + def exec_module(self, **kwargs): + + for key in list(self.module_arg_spec.keys()): + setattr(self, key, kwargs[key]) + + service_principals = [] + + try: + client = self.get_graphrbac_client(self.tenant) + if self.object_id is None: + service_principals = list(client.service_principals.list(filter="servicePrincipalNames/any(c:c eq '{0}')".format(self.app_id))) + else: + service_principals = [client.service_principals.get(self.object_id)] + + self.results['service_principals'] = [self.to_dict(sp) for sp in service_principals] + except GraphErrorException as ge: + self.fail("failed to get service principal info {0}".format(str(ge))) + + return self.results + + def to_dict(self, object): + return dict( + app_id=object.app_id, + object_id=object.object_id, + app_display_name=object.display_name, + app_role_assignment_required=object.app_role_assignment_required + ) + + +def main(): + AzureRMADServicePrincipalInfo() + + +if __name__ == '__main__': + main() diff --git a/plugins/modules/azure_rm_aks.py b/plugins/modules/azure_rm_aks.py index 97e5feeaee..a40b2ae4e0 100644 --- a/plugins/modules/azure_rm_aks.py +++ b/plugins/modules/azure_rm_aks.py @@ -15,7 +15,7 @@ DOCUMENTATION = ''' --- module: azure_rm_aks -version_added: "2.6" +version_added: "0.1.2" short_description: Manage a managed Azure Container Service (AKS) instance description: - Create, update and delete a managed Azure Container Service (AKS) instance. @@ -110,14 +110,12 @@ client_secret: description: - The secret password associated with the service principal. - required: true enable_rbac: description: - Enable RBAC. - Existing non-RBAC enabled AKS clusters cannot currently be updated for RBAC use. type: bool default: no - version_added: "2.8" network_profile: description: - Profile of network configuration. @@ -160,7 +158,12 @@ - A CIDR notation IP range assigned to the Docker bridge network. - It must not overlap with any Subnet IP ranges or the Kubernetes service address range. default: "172.17.0.1/16" - version_added: "2.8" + load_balancer_sku: + description: + - The load balancer sku for the managed cluster. + choices: + - standard + - basic aad_profile: description: - Profile of Azure Active Directory configuration. @@ -175,7 +178,6 @@ description: - The AAD tenant ID to use for authentication. - If not specified, will use the tenant of the deployment subscription. - version_added: "2.8" addon: description: - Profile of managed cluster add-on. @@ -205,6 +207,7 @@ log_analytics_workspace_resource_id: description: - Where to store the container metrics. + required: true virtual_node: description: - With virtual nodes, you have quick provisioning of pods, and only pay per second for their execution time. @@ -218,7 +221,7 @@ subnet_resource_id: description: - Subnet associated to the cluster. - version_added: "2.8" + required: true node_resource_group: description: - Name of the resource group containing agent pool nodes. @@ -364,7 +367,8 @@ def create_network_profiles_dict(network): pod_cidr=network.pod_cidr, service_cidr=network.service_cidr, dns_service_ip=network.dns_service_ip, - docker_bridge_cidr=network.docker_bridge_cidr + docker_bridge_cidr=network.docker_bridge_cidr, + load_balancer_sku=network.load_balancer_sku ) if network else dict() @@ -487,7 +491,8 @@ def create_addon_profiles_spec(): pod_cidr=dict(type='str'), service_cidr=dict(type='str'), dns_service_ip=dict(type='str'), - docker_bridge_cidr=dict(type='str') + docker_bridge_cidr=dict(type='str'), + load_balancer_sku=dict(type='str') ) @@ -684,7 +689,7 @@ def compare_addon(origin, patch, config): if self.addon: for key in ADDONS.keys(): addon_name = ADDONS[key]['name'] - if not compare_addon(response['addon'].get(addon_name), self.addon.get(key), ADDONS[key].get('config')): + if not compare_addon(response['addon'].get(addon_name.lower()), self.addon.get(key), ADDONS[key].get('config')): to_be_updated = True for profile_result in response['agent_pool_profiles']: diff --git a/plugins/modules/azure_rm_aks_info.py b/plugins/modules/azure_rm_aks_info.py index 3e78be7fc9..9ff6493ded 100644 --- a/plugins/modules/azure_rm_aks_info.py +++ b/plugins/modules/azure_rm_aks_info.py @@ -16,7 +16,7 @@ --- module: azure_rm_aks_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Kubernetes Service facts @@ -37,7 +37,6 @@ description: - Show kubeconfig of the AKS cluster. - Note the operation will cost more network overhead, not recommended when listing AKS. - version_added: "2.8" choices: - user - admin @@ -116,7 +115,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_aks_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_aks_facts' module has been renamed to 'azure_rm_aks_info'", version='2.13') + self.module.deprecate("The 'azure_rm_aks_facts' module has been renamed to 'azure_rm_aks_info'", version=(2.9, )) for key in self.module_args: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_aksversion_info.py b/plugins/modules/azure_rm_aksversion_info.py index 4bd9ab2100..4b74f64478 100644 --- a/plugins/modules/azure_rm_aksversion_info.py +++ b/plugins/modules/azure_rm_aksversion_info.py @@ -16,7 +16,7 @@ --- module: azure_rm_aksversion_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get available kubernetes versions supported by Azure Kubernetes Service @@ -93,7 +93,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_aksversion_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_aksversion_facts' module has been renamed to 'azure_rm_aksversion_info'", version='2.13') + self.module.deprecate("The 'azure_rm_aksversion_facts' module has been renamed to 'azure_rm_aksversion_info'", version=(2.9, )) for key in self.module_args: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_appgateway.py b/plugins/modules/azure_rm_appgateway.py index 1488eab4f4..19ad43d93e 100644 --- a/plugins/modules/azure_rm_appgateway.py +++ b/plugins/modules/azure_rm_appgateway.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_appgateway -version_added: "2.7" +version_added: "0.1.2" short_description: Manage Application Gateway instance description: - Create, update and delete instance of Application Gateway. @@ -44,14 +44,18 @@ - 'standard_small' - 'standard_medium' - 'standard_large' + - 'standard_v2' - 'waf_medium' - 'waf_large' + - 'waf_v2' tier: description: - Tier of an application gateway. choices: - 'standard' + - 'standard_v2' - 'waf' + - 'waf_v2' capacity: description: - Capacity (instance count) of an application gateway. @@ -139,7 +143,6 @@ description: - Name of the resource that is unique within a resource group. This name can be used to access the resource. redirect_configurations: - version_added: "2.8" description: - Redirect configurations of the application gateway resource. suboptions: @@ -228,7 +231,6 @@ description: - Resource that is unique within a resource group. This name can be used to access the resource. probes: - version_added: "2.8" description: - Probes available to the application gateway resource. suboptions: @@ -439,10 +441,9 @@ import time from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from copy import deepcopy -from ansible.module_utils.network.common.utils import dict_merge from ansible.module_utils.common.dict_transformations import ( camel_dict_to_snake_dict, snake_dict_to_camel_dict, - _camel_to_snake, _snake_to_camel, + _camel_to_snake, _snake_to_camel, dict_merge, ) try: @@ -588,15 +589,23 @@ def exec_module(self, **kwargs): ev['name'] = 'Standard_Medium' elif ev['name'] == 'standard_large': ev['name'] = 'Standard_Large' + elif ev['name'] == 'standard_v2': + ev['name'] = 'Standard_v2' elif ev['name'] == 'waf_medium': ev['name'] = 'WAF_Medium' elif ev['name'] == 'waf_large': ev['name'] = 'WAF_Large' + elif ev['name'] == 'waf_v2': + ev['name'] = 'WAF_v2' if 'tier' in ev: if ev['tier'] == 'standard': ev['tier'] = 'Standard' + if ev['tier'] == 'standard_v2': + ev['tier'] = 'Standard_v2' elif ev['tier'] == 'waf': ev['tier'] = 'WAF' + elif ev['tier'] == 'waf_v2': + ev['tier'] = 'WAF_v2' self.parameters["sku"] = ev elif key == "ssl_policy": ev = kwargs[key] @@ -739,7 +748,7 @@ def exec_module(self, **kwargs): item['http_listener'] = {'id': id} if 'protocol' in item: item['protocol'] = _snake_to_camel(item['protocol'], True) - if 'rule_type' in ev: + if 'rule_type' in item: item['rule_type'] = _snake_to_camel(item['rule_type'], True) if 'redirect_configuration' in item: id = redirect_configuration_id(self.subscription_id, diff --git a/plugins/modules/azure_rm_applicationsecuritygroup.py b/plugins/modules/azure_rm_applicationsecuritygroup.py index b80f73bc6a..7830fcbc34 100644 --- a/plugins/modules/azure_rm_applicationsecuritygroup.py +++ b/plugins/modules/azure_rm_applicationsecuritygroup.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_applicationsecuritygroup -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Application Security Group description: - Create, update and delete instance of Azure Application Security Group. diff --git a/plugins/modules/azure_rm_applicationsecuritygroup_info.py b/plugins/modules/azure_rm_applicationsecuritygroup_info.py index 784553302d..7439e7fd82 100644 --- a/plugins/modules/azure_rm_applicationsecuritygroup_info.py +++ b/plugins/modules/azure_rm_applicationsecuritygroup_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_applicationsecuritygroup_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Application Security Group facts description: - Get facts of Azure Application Security Group. @@ -139,7 +139,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_applicationsecuritygroup_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_applicationsecuritygroup_facts' module has been renamed to 'azure_rm_applicationsecuritygroup_info'", - version='2.13') + version=(2.9, )) for key in list(self.module_arg_spec.keys()) + ['tags']: if hasattr(self, key): diff --git a/plugins/modules/azure_rm_appserviceplan.py b/plugins/modules/azure_rm_appserviceplan.py index e623694f13..ce98145f91 100644 --- a/plugins/modules/azure_rm_appserviceplan.py +++ b/plugins/modules/azure_rm_appserviceplan.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_appserviceplan -version_added: "2.7" +version_added: "0.1.2" short_description: Manage App Service Plan description: - Create, update and delete instance of App Service Plan. diff --git a/plugins/modules/azure_rm_appserviceplan_info.py b/plugins/modules/azure_rm_appserviceplan_info.py index ab4c9231c9..a75a7001f2 100644 --- a/plugins/modules/azure_rm_appserviceplan_info.py +++ b/plugins/modules/azure_rm_appserviceplan_info.py @@ -17,7 +17,7 @@ --- module: azure_rm_appserviceplan_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get azure app service plan facts @@ -156,7 +156,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_appserviceplan_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_appserviceplan_facts' module has been renamed to 'azure_rm_appserviceplan_info'", version='2.13') + self.module.deprecate("The 'azure_rm_appserviceplan_facts' module has been renamed to 'azure_rm_appserviceplan_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_automationaccount.py b/plugins/modules/azure_rm_automationaccount.py index 790222bd9e..bb304831f4 100644 --- a/plugins/modules/azure_rm_automationaccount.py +++ b/plugins/modules/azure_rm_automationaccount.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_automationaccount -version_added: "2.9" +version_added: "0.1.2" short_description: Manage Azure Automation account description: - Create, delete an Azure Automation account. diff --git a/plugins/modules/azure_rm_automationaccount_info.py b/plugins/modules/azure_rm_automationaccount_info.py index 0726df520e..603f9eafb4 100644 --- a/plugins/modules/azure_rm_automationaccount_info.py +++ b/plugins/modules/azure_rm_automationaccount_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_automationaccount_info -version_added: '2.9' +version_added: '0.1.2' short_description: Get Azure automation account facts description: - Get facts of automation account. @@ -285,7 +285,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_automationaccount_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_automationaccount_facts' module has been renamed to 'azure_rm_automationaccount_info'", version='2.13') + self.module.deprecate("The 'azure_rm_automationaccount_facts' module has been renamed to 'azure_rm_automationaccount_info'", version=(2.9, )) for key in list(self.module_arg_spec): setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_autoscale.py b/plugins/modules/azure_rm_autoscale.py index b601383655..15e89f81f2 100644 --- a/plugins/modules/azure_rm_autoscale.py +++ b/plugins/modules/azure_rm_autoscale.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_autoscale -version_added: "2.7" +version_added: "0.1.2" short_description: Manage Azure autoscale setting description: - Create, delete an autoscale setting. @@ -373,7 +373,7 @@ def timedelta_to_minutes(time): def get_enum_value(item): - if 'value' in dir(item): + if hasattr(item, 'value'): return to_native(item.value) return to_native(item) @@ -443,7 +443,7 @@ def notification_to_dict(notification): return dict(send_to_subscription_administrator=notification.email.send_to_subscription_administrator if notification.email else False, send_to_subscription_co_administrators=notification.email.send_to_subscription_co_administrators if notification.email else False, custom_emails=[to_native(e) for e in notification.email.custom_emails or []], - webhooks=[to_native(w.service_url) for w in notification.webhooks or []]) + webhooks=[to_native(w.service_uri) for w in notification.webhooks or []]) rule_spec = dict( diff --git a/plugins/modules/azure_rm_autoscale_info.py b/plugins/modules/azure_rm_autoscale_info.py index 1105cecf24..6021bdbb5d 100644 --- a/plugins/modules/azure_rm_autoscale_info.py +++ b/plugins/modules/azure_rm_autoscale_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_autoscale_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Auto Scale Setting facts description: - Get facts of Auto Scale Setting. @@ -133,7 +133,7 @@ def timedelta_to_minutes(time): def get_enum_value(item): - if 'value' in dir(item): + if hasattr(item, 'value'): return to_native(item.value) return to_native(item) @@ -233,7 +233,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_autoscale_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_autoscale_facts' module has been renamed to 'azure_rm_autoscale_info'", version='2.13') + self.module.deprecate("The 'azure_rm_autoscale_facts' module has been renamed to 'azure_rm_autoscale_info'", version=(2.9, )) for key in list(self.module_arg_spec): setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_availabilityset.py b/plugins/modules/azure_rm_availabilityset.py index e1dd1e1f73..e6cc213c47 100644 --- a/plugins/modules/azure_rm_availabilityset.py +++ b/plugins/modules/azure_rm_availabilityset.py @@ -16,7 +16,7 @@ --- module: azure_rm_availabilityset -version_added: "2.4" +version_added: "0.1.2" short_description: Manage Azure Availability Set diff --git a/plugins/modules/azure_rm_availabilityset_info.py b/plugins/modules/azure_rm_availabilityset_info.py index 7b3293a683..ad379f8d5b 100644 --- a/plugins/modules/azure_rm_availabilityset_info.py +++ b/plugins/modules/azure_rm_availabilityset_info.py @@ -15,7 +15,7 @@ --- module: azure_rm_availabilityset_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Availability Set facts @@ -148,7 +148,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_availabilityset_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_availabilityset_facts' module has been renamed to 'azure_rm_availabilityset_info'", version='2.13') + self.module.deprecate("The 'azure_rm_availabilityset_facts' module has been renamed to 'azure_rm_availabilityset_info'", version=(2.9, )) for key in self.module_args: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_azurefirewall.py b/plugins/modules/azure_rm_azurefirewall.py index c7204c8efb..0c6c7de947 100644 --- a/plugins/modules/azure_rm_azurefirewall.py +++ b/plugins/modules/azure_rm_azurefirewall.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_azurefirewall -version_added: '2.9' +version_added: '0.1.2' short_description: Manage Azure Firewall instance description: - Create, update and delete instance of Azure Firewall. diff --git a/plugins/modules/azure_rm_azurefirewall_info.py b/plugins/modules/azure_rm_azurefirewall_info.py index 625de1751c..4d85d9c8a1 100644 --- a/plugins/modules/azure_rm_azurefirewall_info.py +++ b/plugins/modules/azure_rm_azurefirewall_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_azurefirewall_info -version_added: '2.9' +version_added: '0.1.2' short_description: Get AzureFirewall info description: - Get info of AzureFirewall. diff --git a/plugins/modules/azure_rm_backupazurevm.py b/plugins/modules/azure_rm_backupazurevm.py new file mode 100644 index 0000000000..9420a45f4b --- /dev/null +++ b/plugins/modules/azure_rm_backupazurevm.py @@ -0,0 +1,382 @@ +#!/usr/bin/python +# +# Copyright (c) 2020 Suyeb Ansari (@suyeb786), Pallavi Chaudhari(@PallaviC2510) +# +# 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_backupazurevm +version_added: '1.1.0' +short_description: Back up an Azure Virtual Machine using Azure Backup +description: + - Back up an Azure VM using Azure Backup. + - Enabling/Updating protection for the Azure VM. + - Trigger an on-demand backup for a protected Azure VM. + - Stop protection but retain existing data. + - Stop protection and delete data. +options: + resource_group: + description: + - The name of the resource group. + required: true + type: str + recovery_vault_name: + description: + - The name of the Azure Recovery Service Vault. + required: true + type: str + resource_id: + description: + - Azure Virtual Machine Resource ID. + required: true + type: str + backup_policy_id: + description: + - Backup Policy ID present under Recovery Service Vault mentioned in recovery_vault_name field. + required: true + type: str + state: + description: + - Assert the state of the protection item. + - Use C(create) for enabling protection for the Azure VM. + - Use C(update) for changing the policy of protection. + - Use C(stop) for stop protection but retain existing data. + - Use C(delete) for stop protection and delete data. + - Use C(backup) for on-demand backup. + default: create + type: str + choices: + - create + - update + - delete + - stop + - backup +extends_documentation_fragment: + - azure.azcollection.azure + - azure.azcollection.azure_tags +author: + - Suyeb Ansari (@suyeb786) + - Pallavi Chaudhari (@PallaviC2510) + +''' + +EXAMPLES = \ + ''' + - name: Enabling/Updating protection for the Azure VM + azure_rm_backupazurevm: + resource_group: 'myResourceGroup' + recovery_vault_name: 'testVault' + resource_id: '/subscriptions/00000000-0000-0000-0000-000000000000/ \ + resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/testVM' + backup_policy_id: '/subscriptions/00000000-0000-0000-0000-000000000000/ \ + resourceGroups/myResourceGroup/providers/microsoft.recoveryservices/vaults/testVault/backupPolicies/ProdPolicy' + state: 'create' + - name: Stop protection but retain existing data + azure_rm_backupazurevm: + resource_group: 'myResourceGroup' + recovery_vault_name: 'testVault' + resource_id: '/subscriptions/00000000-0000-0000-0000-000000000000/ \ + resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/testVM' + state: 'stop' + - name: Stop protection and delete data + azure_rm_backupazurevm: + resource_group: 'myResourceGroup' + recovery_vault_name: 'testVault' + resource_id: '/subscriptions/00000000-0000-0000-0000-000000000000/ \ + resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/testVM' + state: 'delete' + - name: Trigger an on-demand backup for a protected Azure VM + azure_rm_backupazurevm: + resource_group: 'myResourceGroup' + recovery_vault_name: 'testVault' + resource_id: '/subscriptions/00000000-0000-0000-0000-000000000000/ \ + resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/testVM' + backup_policy_id: '/subscriptions/00000000-0000-0000-0000-000000000000/ \ + resourceGroups/myResourceGroup/providers/microsoft.recoveryservices/vaults/testVault/backupPolicies/ProdPolicy' + state: 'backup' + ''' + +RETURN = \ + ''' +id: + description: + - VM backup protection details. + returned: always + type: str + sample: '{"response":{"id":"protection_id","name":"protection_item_name","properties":{}}}' +''' + +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common_rest import GenericRestClient +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common_ext import AzureRMModuleBaseExt +import re +import json +import time +try: + from msrestazure.azure_exceptions import CloudError +except ImportError: + # This is handled in azure_rm_common + pass + + +class Actions: + (NoAction, Create, Update, Delete) = range(4) + + +class BackupAzureVM(AzureRMModuleBaseExt): + def __init__(self): + self.module_arg_spec = dict( + resource_group=dict( + type='str', + required=True + ), + recovery_vault_name=dict( + type='str', + required=True + ), + resource_id=dict( + type='str', + required=True + ), + backup_policy_id=dict( + type='str', + required=True + ), + state=dict( + type='str', + default='create', + choices=['create', 'update', 'delete', 'stop', 'backup'] + ) + ) + + self.resource_group = None + self.recovery_vault_name = None + self.resource_id = None + self.backup_policy_id = None + self.state = None + + self.results = dict(changed=False) + self.mgmt_client = None + self.url = None + self.status_code = [200, 201, 202, 204] + self.to_do = Actions.NoAction + + self.body = {} + self.query_parameters = {} + self.query_parameters['api-version'] = None + self.header_parameters = {} + self.header_parameters['Content-Type'] = 'application/json; charset=utf-8' + + super(BackupAzureVM, self).__init__(derived_arg_spec=self.module_arg_spec, + supports_check_mode=True, + supports_tags=True) + + def get_api_version(self): + return '2019-05-13' if self.state == 'create' or self.state == 'update' or self.state == 'delete' or self.state == 'stop' else '2016-12-01' + + def get_url(self): + if self.state == 'create' or self.state == 'update' or self.state == 'delete' or self.state == 'stop': + return '/subscriptions' + '/' + self.subscription_id \ + + '/resourceGroups' + '/' + self.resource_group + '/providers' \ + + '/Microsoft.RecoveryServices' + '/vaults' + '/' \ + + self.recovery_vault_name \ + + '/backupFabrics/Azure/protectionContainers/' \ + + 'iaasvmcontainer;iaasvmcontainerv2;' + self.resource_group \ + + ';' + self.resource_id.split('/')[-1] + '/protectedItems/' \ + + 'vm;iaasvmcontainerv2;' + self.resource_group + ';' \ + + self.resource_id.split('/')[-1] + if self.state == 'backup': + return '/subscriptions' + '/' + self.subscription_id \ + + '/resourceGroups' + '/' + self.resource_group + '/providers' \ + + '/Microsoft.RecoveryServices' + '/vaults' + '/' \ + + self.recovery_vault_name \ + + '/backupFabrics/Azure/protectionContainers/' \ + + 'iaasvmcontainer;iaasvmcontainerv2;' + self.resource_group \ + + ';' + self.resource_id.split('/')[-1] + '/protectedItems/' \ + + 'vm;iaasvmcontainerv2;' + self.resource_group + ';' \ + + self.resource_id.split('/')[-1] + '/backup' + + def get_body(self): + if self.state == 'create' or self.state == 'update': + return { + 'properties': + { + 'protectedItemType': 'Microsoft.Compute/virtualMachines', + 'sourceResourceId': self.resource_id, + 'policyId': self.backup_policy_id + } + } + elif self.state == 'backup': + return { + "properties": { + "objectType": "IaasVMBackupRequest", + "recoveryPointExpiryTimeInUTC": "" + } + } + elif self.state == 'stop': + return { + "properties": { + "protectedItemType": "Microsoft.Compute/virtualMachines", + "sourceResourceId": self.resource_id, + "protectionState": "ProtectionStopped" + } + } + else: + return {} + + def exec_module(self, **kwargs): + for key in list(self.module_arg_spec.keys()): + if hasattr(self, key): + setattr(self, key, kwargs[key]) + elif kwargs[key] is not None: + self.body[key] = kwargs[key] + + self.inflate_parameters(self.module_arg_spec, self.body, 0) + + self.query_parameters['api-version'] = self.get_api_version() + self.url = self.get_url() + self.body = self.get_body() + old_response = None + response = None + + self.mgmt_client = self.get_mgmt_svc_client(GenericRestClient, + base_url=self._cloud_environment.endpoints.resource_manager) + + changed = False + if self.state == 'create' or self.state == 'update': + changed = True + response = self.enable_update_protection_for_azure_vm() + if self.state == 'delete': + changed = True + response = self.stop_protection_and_delete_data() + if self.state == 'stop': + changed = True + response = self.stop_protection_but_retain_existing_data() + if self.state == 'backup': + changed = True + response = self.trigger_on_demand_backup() + self.results['response'] = response + self.results['changed'] = changed + + return self.results + + def enable_update_protection_for_azure_vm(self): + + # self.log('Enabling/Updating protection for the Azure Virtual Machine {0}'.format(self.)) + + try: + response = self.mgmt_client.query( + self.url, + 'PUT', + self.query_parameters, + self.header_parameters, + self.body, + self.status_code, + 600, + 30, + ) + except CloudError as e: + self.log('Error in enabling/updating protection for Azure VM.') + self.fail( + 'Error in creating/updating protection for Azure VM {0}'.format(str(e))) + + try: + response = json.loads(response.text) + except Exception: + response = {'text': response.text} + + return response + + def stop_protection_but_retain_existing_data(self): + + # self.log('Stop protection and retain existing data{0}'.format(self.)) + + try: + response = self.mgmt_client.query( + self.url, + 'PUT', + self.query_parameters, + self.header_parameters, + self.body, + self.status_code, + 600, + 30, + ) + except CloudError as e: + self.log('Error attempting to stop protection.') + self.fail('Error in disabling the protection: {0}'.format(str(e))) + + try: + response = json.loads(response.text) + except Exception: + response = {'text': response.text} + + return response + + def stop_protection_and_delete_data(self): + + # self.log('Stop protection and delete data{0}'.format(self.)) + + try: + response = self.mgmt_client.query( + self.url, + 'DELETE', + self.query_parameters, + self.header_parameters, + None, + self.status_code, + 600, + 30, + ) + except CloudError as e: + self.log('Error attempting to delete backup.') + self.fail('Error deleting the azure backup: {0}'.format(str(e))) + + try: + response = json.loads(response.text) + except Exception: + response = {'text': response.text} + + return response + + def trigger_on_demand_backup(self): + + # self.log('Trigger an on-demand backup for a protected Azure VM{0}'.format(self.)) + + try: + response = self.mgmt_client.query( + self.url, + 'POST', + self.query_parameters, + self.header_parameters, + self.body, + self.status_code, + 600, + 30, + ) + except CloudError as e: + self.log('Error attempting to backup azure vm.') + self.fail( + 'Error while taking on-demand backup: {0}'.format(str(e))) + + try: + response = json.loads(response.text) + except Exception: + response = {'text': response.text} + + return response + + +def main(): + BackupAzureVM() + + +if __name__ == '__main__': + main() diff --git a/plugins/modules/azure_rm_backupazurevm_info.py b/plugins/modules/azure_rm_backupazurevm_info.py new file mode 100644 index 0000000000..32ceb0bc72 --- /dev/null +++ b/plugins/modules/azure_rm_backupazurevm_info.py @@ -0,0 +1,182 @@ +#!/usr/bin/python +# +# Copyright (c) 2020 Suyeb Ansari(@suyeb786), Pallavi Chaudhari(@PallaviC2510) +# +# 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_backupazurevm_info +version_added: '1.1.0' +short_description: Back up an Azure Virtual Machine using Azure Backup Information +description: + - Get Recovery point details for protected items. +options: + resource_group: + description: + - The name of the resource group. + required: true + type: str + recovery_vault_name: + description: + - The name of the Azure Recovery Service Vault. + required: true + type: str + resource_id: + description: + - Azure Virtual Machine Resource ID. + required: true + type: str +extends_documentation_fragment: + - azure.azcollection.azure + - azure.azcollection.azure_tags +author: + - Suyeb Ansari (@suyeb786) + - Pallavi Chaudhari (@PallaviC2510) + +''' + +EXAMPLES = \ + ''' + - name: Get Recovery Point Details + azure_rm_backupazurevm_info: + resource_group: 'myResourceGroup' + recovery_vault_name: 'testVault' + resource_id: '/subscriptions/00000000-0000-0000-0000-000000000000/ \ + resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/testVM' + ''' + +RETURN = \ + ''' +id: + description: + - VM Protection details. + returned: always + type: str + sample: '{"response":{"id":"protection_id","name":"protection_item_name","properties":{}}}' +''' + +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common_rest import GenericRestClient +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common_ext import AzureRMModuleBaseExt +import re +import json +import time + +try: + from msrestazure.azure_exceptions import CloudError +except ImportError: + # This is handled in azure_rm_common + pass + + +class Actions: + (NoAction, Create, Update, Delete) = range(4) + + +class BackupAzureVMInfo(AzureRMModuleBaseExt): + def __init__(self): + self.module_arg_spec = dict( + resource_group=dict( + type='str', + required=True + ), + recovery_vault_name=dict( + type='str', + required=True + ), + resource_id=dict( + type='str', + required=True + ) + ) + + self.resource_group = None + self.recovery_vault_name = None + self.resource_id = None + + self.results = dict(changed=False) + self.mgmt_client = None + self.url = None + self.status_code = [200, 201, 202, 204] + self.to_do = Actions.NoAction + + self.body = {} + self.query_parameters = {} + self.query_parameters['api-version'] = '2019-05-13' + self.header_parameters = {} + self.header_parameters['Content-Type'] = 'application/json; charset=utf-8' + + super(BackupAzureVMInfo, self).__init__(derived_arg_spec=self.module_arg_spec, + supports_check_mode=True, + supports_tags=True) + + def get_url(self): + return '/subscriptions' + '/' + self.subscription_id \ + + '/resourceGroups' + '/' + self.resource_group + '/providers' \ + + '/Microsoft.RecoveryServices' + '/vaults' + '/' \ + + self.recovery_vault_name \ + + '/backupFabrics/Azure/protectionContainers/' \ + + 'iaasvmcontainer;iaasvmcontainerv2;' + self.resource_group \ + + ';' + self.resource_id.split('/')[-1] + '/protectedItems/' \ + + 'vm;iaasvmcontainerv2;' + self.resource_group + ';' \ + + self.resource_id.split('/')[-1] + + def exec_module(self, **kwargs): + for key in list(self.module_arg_spec.keys()): + if hasattr(self, key): + setattr(self, key, kwargs[key]) + elif kwargs[key] is not None: + self.body[key] = kwargs[key] + + self.inflate_parameters(self.module_arg_spec, self.body, 0) + self.url = self.get_url() + + response = None + + self.mgmt_client = self.get_mgmt_svc_client(GenericRestClient, + base_url=self._cloud_environment.endpoints.resource_manager) + + response = self.get_recovery_point_info() + self.results['response'] = response + return self.results + + def get_recovery_point_info(self): + + # self.log('Fetching protection details for the Azure Virtual Machine {0}'.format(self.)) + + try: + response = self.mgmt_client.query( + self.url, + 'GET', + self.query_parameters, + self.header_parameters, + None, + self.status_code, + 600, + 30, + ) + except CloudError as e: + self.log('Error in fetching recovery point.') + self.fail('Error in fetching recovery point {0}'.format(str(e))) + + try: + response = json.loads(response.text) + except Exception: + response = {'text': response.text} + + return response + + +def main(): + BackupAzureVMInfo() + + +if __name__ == '__main__': + main() diff --git a/plugins/modules/azure_rm_batchaccount.py b/plugins/modules/azure_rm_batchaccount.py index 24cfb31656..163f5112e6 100644 --- a/plugins/modules/azure_rm_batchaccount.py +++ b/plugins/modules/azure_rm_batchaccount.py @@ -27,7 +27,7 @@ DOCUMENTATION = ''' --- module: azure_rm_batchaccount -version_added: "2.9" +version_added: "0.1.2" short_description: Manages a Batch Account on Azure description: - Create, update and delete instance of Azure Batch Account. diff --git a/plugins/modules/azure_rm_cdnendpoint.py b/plugins/modules/azure_rm_cdnendpoint.py index 46b6394fe6..f1f6b351fa 100644 --- a/plugins/modules/azure_rm_cdnendpoint.py +++ b/plugins/modules/azure_rm_cdnendpoint.py @@ -14,7 +14,7 @@ DOCUMENTATION = ''' --- module: azure_rm_cdnendpoint -version_added: "2.8" +version_added: "0.1.2" short_description: Manage a Azure CDN endpoint description: - Create, update, start, stop and delete a Azure CDN endpoint. diff --git a/plugins/modules/azure_rm_cdnendpoint_info.py b/plugins/modules/azure_rm_cdnendpoint_info.py index dabe3bdfc3..c25b592318 100644 --- a/plugins/modules/azure_rm_cdnendpoint_info.py +++ b/plugins/modules/azure_rm_cdnendpoint_info.py @@ -16,7 +16,7 @@ --- module: azure_rm_cdnendpoint_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure CDN endpoint facts @@ -218,7 +218,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_cdnendpoint_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_cdnendpoint_facts' module has been renamed to 'azure_rm_cdnendpoint_info'", version='2.13') + self.module.deprecate("The 'azure_rm_cdnendpoint_facts' module has been renamed to 'azure_rm_cdnendpoint_info'", version=(2.9, )) for key in self.module_args: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_cdnprofile.py b/plugins/modules/azure_rm_cdnprofile.py index 1ce8d45a07..222f513a45 100644 --- a/plugins/modules/azure_rm_cdnprofile.py +++ b/plugins/modules/azure_rm_cdnprofile.py @@ -14,7 +14,7 @@ DOCUMENTATION = ''' --- module: azure_rm_cdnprofile -version_added: "2.8" +version_added: "0.1.2" short_description: Manage a Azure CDN profile description: - Create, update and delete a Azure CDN profile. diff --git a/plugins/modules/azure_rm_cdnprofile_info.py b/plugins/modules/azure_rm_cdnprofile_info.py index bdab83aae7..ef45bade70 100644 --- a/plugins/modules/azure_rm_cdnprofile_info.py +++ b/plugins/modules/azure_rm_cdnprofile_info.py @@ -16,7 +16,7 @@ --- module: azure_rm_cdnprofile_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure CDN profile facts @@ -160,7 +160,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_cdnprofile_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_cdnprofile_facts' module has been renamed to 'azure_rm_cdnprofile_info'", version='2.13') + self.module.deprecate("The 'azure_rm_cdnprofile_facts' module has been renamed to 'azure_rm_cdnprofile_info'", version=(2.9, )) for key in self.module_args: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_containerinstance.py b/plugins/modules/azure_rm_containerinstance.py index 323eabde86..145e0645bb 100644 --- a/plugins/modules/azure_rm_containerinstance.py +++ b/plugins/modules/azure_rm_containerinstance.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_containerinstance -version_added: "2.5" +version_added: "0.1.2" short_description: Manage an Azure Container Instance description: - Create, update and delete an Azure Container Instance. @@ -56,7 +56,6 @@ description: - The Dns name label for the IP. type: str - version_added: "2.8" ports: description: - List of ports exposed within the container group. @@ -119,13 +118,11 @@ description: - Is variable secure. type: bool - version_added: "2.8" commands: description: - List of commands to execute within the container instance in exec form. - When updating existing container all existing commands will be replaced by new ones. type: list - version_added: "2.8" restart_policy: description: - Restart policy for all containers within the container group. @@ -134,7 +131,6 @@ - always - on_failure - never - version_added: "2.8" force_update: description: - Force update of existing container instance. Any update will result in deletion and recreation of existing containers. diff --git a/plugins/modules/azure_rm_containerinstance_info.py b/plugins/modules/azure_rm_containerinstance_info.py index e88e70bb8e..b44e3f2bda 100644 --- a/plugins/modules/azure_rm_containerinstance_info.py +++ b/plugins/modules/azure_rm_containerinstance_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_containerinstance_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Container Instance facts description: - Get facts of Container Instance. @@ -212,7 +212,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_containerinstance_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_containerinstance_facts' module has been renamed to 'azure_rm_containerinstance_info'", version='2.13') + self.module.deprecate("The 'azure_rm_containerinstance_facts' module has been renamed to 'azure_rm_containerinstance_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_containerregistry.py b/plugins/modules/azure_rm_containerregistry.py index 08d7c09c1f..fecbf1f03e 100644 --- a/plugins/modules/azure_rm_containerregistry.py +++ b/plugins/modules/azure_rm_containerregistry.py @@ -14,7 +14,7 @@ DOCUMENTATION = ''' --- module: azure_rm_containerregistry -version_added: "2.5" +version_added: "0.1.2" short_description: Manage an Azure Container Registry description: - Create, update and delete an Azure Container Registry. diff --git a/plugins/modules/azure_rm_containerregistry_info.py b/plugins/modules/azure_rm_containerregistry_info.py index a8421a7d8e..1f14ec9a8d 100644 --- a/plugins/modules/azure_rm_containerregistry_info.py +++ b/plugins/modules/azure_rm_containerregistry_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_containerregistry_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Container Registry facts description: - Get facts for Container Registry. @@ -183,7 +183,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_containerregistry_info' if is_old_facts: - self.module.deprecate("The 'azure_rm_containerregistry_facts' module has been renamed to 'azure_rm_containerregistry_info'", version='2.13') + self.module.deprecate("The 'azure_rm_containerregistry_facts' module has been renamed to 'azure_rm_containerregistry_info'", version=(2.9, )) for key in list(self.module_arg_spec) + ['tags']: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_containerregistryreplication.py b/plugins/modules/azure_rm_containerregistryreplication.py index 03ceda730f..dfca7b4b2b 100644 --- a/plugins/modules/azure_rm_containerregistryreplication.py +++ b/plugins/modules/azure_rm_containerregistryreplication.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_containerregistryreplication -version_added: "2.5" +version_added: "0.1.2" short_description: Manage Replication instance. description: - Create, update and delete instance of Replication. @@ -71,9 +71,8 @@ description: - The status of the replication at the time the operation was called. returned: always - type: complex - sample: status - contains: + type: str + sample: Ready ''' import time @@ -144,7 +143,6 @@ def __init__(self): self.location = None self.results = dict(changed=False) - self.mgmt_client = None self.state = None self.to_do = Actions.NoAction diff --git a/plugins/modules/azure_rm_containerregistryreplication_facts.py b/plugins/modules/azure_rm_containerregistryreplication_info.py similarity index 98% rename from plugins/modules/azure_rm_containerregistryreplication_facts.py rename to plugins/modules/azure_rm_containerregistryreplication_info.py index 0696806ae6..9c21314c37 100644 --- a/plugins/modules/azure_rm_containerregistryreplication_facts.py +++ b/plugins/modules/azure_rm_containerregistryreplication_info.py @@ -15,8 +15,8 @@ DOCUMENTATION = ''' --- -module: azure_rm_containerregistryreplication_facts -version_added: "2.5" +module: azure_rm_containerregistryreplication_info +version_added: "0.0.1" short_description: Get Replication facts. description: - Get facts of Replication. @@ -45,7 +45,7 @@ EXAMPLES = ''' - name: Get instance of Replication - azure_rm_containerregistryreplication_facts: + azure_rm_containerregistryreplication_info: resource_group: resource_group_name registry_name: registry_name replication_name: replication_name diff --git a/plugins/modules/azure_rm_containerregistrywebhook.py b/plugins/modules/azure_rm_containerregistrywebhook.py index 97a747f83b..e14e8b875d 100644 --- a/plugins/modules/azure_rm_containerregistrywebhook.py +++ b/plugins/modules/azure_rm_containerregistrywebhook.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_containerregistrywebhook -version_added: "2.5" +version_added: "0.1.2" short_description: Manage Webhook instance. description: - Create, update and delete instance of Webhook. diff --git a/plugins/modules/azure_rm_containerregistrywebhook_facts.py b/plugins/modules/azure_rm_containerregistrywebhook_info.py similarity index 98% rename from plugins/modules/azure_rm_containerregistrywebhook_facts.py rename to plugins/modules/azure_rm_containerregistrywebhook_info.py index 81cadcaea5..2494d58bce 100644 --- a/plugins/modules/azure_rm_containerregistrywebhook_facts.py +++ b/plugins/modules/azure_rm_containerregistrywebhook_info.py @@ -15,8 +15,8 @@ DOCUMENTATION = ''' --- -module: azure_rm_containerregistrywebhook_facts -version_added: "2.5" +module: azure_rm_containerregistrywebhook_info +version_added: "0.1.2" short_description: Get Webhook facts. description: - Get facts of Webhook. @@ -45,7 +45,7 @@ EXAMPLES = ''' - name: Get instance of Webhook - azure_rm_containerregistrywebhook_facts: + azure_rm_containerregistrywebhook_info: resource_group: resource_group_name registry_name: registry_name webhook_name: webhook_name diff --git a/plugins/modules/azure_rm_cosmosdbaccount.py b/plugins/modules/azure_rm_cosmosdbaccount.py index 38b904eb59..797415b9dc 100644 --- a/plugins/modules/azure_rm_cosmosdbaccount.py +++ b/plugins/modules/azure_rm_cosmosdbaccount.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_cosmosdbaccount -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Database Account instance description: - Create, update and delete instance of Azure Database Account. diff --git a/plugins/modules/azure_rm_cosmosdbaccount_info.py b/plugins/modules/azure_rm_cosmosdbaccount_info.py index 311fa9be06..f01134207b 100644 --- a/plugins/modules/azure_rm_cosmosdbaccount_info.py +++ b/plugins/modules/azure_rm_cosmosdbaccount_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_cosmosdbaccount_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Cosmos DB Account facts description: - Get facts of Azure Cosmos DB Account. @@ -394,7 +394,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_cosmosdbaccount_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_cosmosdbaccount_facts' module has been renamed to 'azure_rm_cosmosdbaccount_info'", version='2.13') + self.module.deprecate("The 'azure_rm_cosmosdbaccount_facts' module has been renamed to 'azure_rm_cosmosdbaccount_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_deployment.py b/plugins/modules/azure_rm_deployment.py index 7df7d96246..9ce5938bd4 100644 --- a/plugins/modules/azure_rm_deployment.py +++ b/plugins/modules/azure_rm_deployment.py @@ -16,9 +16,9 @@ --- module: azure_rm_deployment -short_description: Create or destroy Azure Resource Manager template deployments +version_added: "0.1.0" -version_added: "2.1" +short_description: Create or destroy Azure Resource Manager template deployments description: - Create or destroy Azure Resource Manager template deployments via the Azure SDK for Python. @@ -118,7 +118,7 @@ # Create or update a template deployment based on a uri to the template and parameters specified inline. # This deploys a VM with SSH support for a given public key, then stores the result in 'azure_vms'. The result is then # used to create a new host group. This host group is then used to wait for each instance to respond to the public IP SSH. ---- + - name: Create Azure Deploy azure_rm_deployment: resource_group: myResourceGroup @@ -564,8 +564,8 @@ def deploy_template(self): except CloudError as exc: failed_deployment_operations = self._get_failed_deployment_operations(self.name) self.log("Deployment failed %s: %s" % (exc.status_code, exc.message)) - self.fail("Deployment failed with status code: %s and message: %s" % (exc.status_code, exc.message), - failed_deployment_operations=failed_deployment_operations) + error_msg = self._error_msg_from_cloud_error(exc) + self.fail(error_msg, failed_deployment_operations=failed_deployment_operations) if self.wait_for_deployment_completion and deployment_result.properties.provisioning_state != 'Succeeded': self.log("provisioning state: %s" % deployment_result.properties.provisioning_state) @@ -694,6 +694,15 @@ def _nic_to_public_ips_instance(self, nics): for ip_conf_instance in nic_obj.ip_configurations if ip_conf_instance.public_ip_address]] + def _error_msg_from_cloud_error(self, exc): + msg = '' + status_code = str(exc.status_code) + if status_code.startswith('2'): + msg = 'Deployment failed: {0}'.format(exc.message) + else: + msg = 'Deployment failed with status code: {0} and message: {1}'.format(status_code, exc.message) + return msg + def main(): AzureRMDeploymentManager() diff --git a/plugins/modules/azure_rm_deployment_info.py b/plugins/modules/azure_rm_deployment_info.py index f46cb49e14..42fd204ef3 100644 --- a/plugins/modules/azure_rm_deployment_info.py +++ b/plugins/modules/azure_rm_deployment_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_deployment_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Deployment facts description: - Get facts of Azure Deployment. @@ -157,7 +157,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_deployment_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_deployment_facts' module has been renamed to 'azure_rm_deployment_info'", version='2.13') + self.module.deprecate("The 'azure_rm_deployment_facts' module has been renamed to 'azure_rm_deployment_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) @@ -236,7 +236,8 @@ def format_response(self, item): 'parameters': d.get('properties', {}).get('parameters'), 'outputs': d.get('properties', {}).get('outputs'), 'output_resources': output_resources_list, - 'template_link': d.get('properties', {}).get('template_link').get('uri') + 'template_link': d.get('properties', {}).get('template_link', {}).get('uri'), + 'correlation_id': d.get('properties', {}).get('correlation_id') } return d diff --git a/plugins/modules/azure_rm_devtestlab.py b/plugins/modules/azure_rm_devtestlab.py index 165eb9512d..d66d3ed3d6 100644 --- a/plugins/modules/azure_rm_devtestlab.py +++ b/plugins/modules/azure_rm_devtestlab.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlab -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure DevTest Lab instance description: - Create, update and delete instance of Azure DevTest Lab. diff --git a/plugins/modules/azure_rm_devtestlab_info.py b/plugins/modules/azure_rm_devtestlab_info.py index 12af529b5e..b0503a4ccb 100644 --- a/plugins/modules/azure_rm_devtestlab_info.py +++ b/plugins/modules/azure_rm_devtestlab_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlab_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure DevTest Lab facts description: - Get facts of Azure DevTest Lab. @@ -181,7 +181,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_devtestlab_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_devtestlab_facts' module has been renamed to 'azure_rm_devtestlab_info'", version='2.13') + self.module.deprecate("The 'azure_rm_devtestlab_facts' module has been renamed to 'azure_rm_devtestlab_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_devtestlabarmtemplate_info.py b/plugins/modules/azure_rm_devtestlabarmtemplate_info.py index 2cac07dc42..f6abf9b926 100644 --- a/plugins/modules/azure_rm_devtestlabarmtemplate_info.py +++ b/plugins/modules/azure_rm_devtestlabarmtemplate_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabarmtemplate_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure DevTest Lab ARM Template facts description: - Get facts of Azure DevTest Lab ARM Template. @@ -155,7 +155,8 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_devtestlabarmtemplate_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_devtestlabarmtemplate_facts' module has been renamed to 'azure_rm_devtestlabarmtemplate_info'", version='2.13') + self.module.deprecate("The 'azure_rm_devtestlabarmtemplate_facts' module has been renamed to 'azure_rm_devtestlabarmtemplate_info'", + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_devtestlabartifact_info.py b/plugins/modules/azure_rm_devtestlabartifact_info.py index f31c6ad735..ceb2c8f1ca 100644 --- a/plugins/modules/azure_rm_devtestlabartifact_info.py +++ b/plugins/modules/azure_rm_devtestlabartifact_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabartifact_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure DevTest Lab Artifact facts description: - Get facts of Azure DevTest Lab Artifact. diff --git a/plugins/modules/azure_rm_devtestlabartifactsource.py b/plugins/modules/azure_rm_devtestlabartifactsource.py index d0a73922d5..4e86419bb8 100644 --- a/plugins/modules/azure_rm_devtestlabartifactsource.py +++ b/plugins/modules/azure_rm_devtestlabartifactsource.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabartifactsource -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure DevTest Labs Artifacts Source instance description: - Create, update and delete instance of Azure DevTest Labs Artifacts Source. diff --git a/plugins/modules/azure_rm_devtestlabartifactsource_info.py b/plugins/modules/azure_rm_devtestlabartifactsource_info.py index 1c25d3baa6..a1b2c75027 100644 --- a/plugins/modules/azure_rm_devtestlabartifactsource_info.py +++ b/plugins/modules/azure_rm_devtestlabartifactsource_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabartifactsource_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure DevTest Lab Artifact Source facts description: - Get facts of Azure DevTest Lab Artifact Source. @@ -184,7 +184,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_devtestlabartifactsource_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_devtestlabartifactsource_facts' module has been renamed to 'azure_rm_devtestlabartifactsource_info'", - version='2.13') + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_devtestlabcustomimage.py b/plugins/modules/azure_rm_devtestlabcustomimage.py index bf8e3fdafc..427c9a008d 100644 --- a/plugins/modules/azure_rm_devtestlabcustomimage.py +++ b/plugins/modules/azure_rm_devtestlabcustomimage.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabcustomimage -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure DevTest Lab Custom Image instance description: - Create, update and delete instance of Azure DevTest Lab Custom Image. diff --git a/plugins/modules/azure_rm_devtestlabcustomimage_info.py b/plugins/modules/azure_rm_devtestlabcustomimage_info.py index a5a0c8a108..2b01d24b54 100644 --- a/plugins/modules/azure_rm_devtestlabcustomimage_info.py +++ b/plugins/modules/azure_rm_devtestlabcustomimage_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabcustomimage_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure DevTest Lab Custom Image facts description: - Get facts of Azure Azure DevTest Lab Custom Image. @@ -161,7 +161,8 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_devtestlabcustomimage_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_devtestlabcustomimage_facts' module has been renamed to 'azure_rm_devtestlabcustomimage_info'", version='2.13') + self.module.deprecate("The 'azure_rm_devtestlabcustomimage_facts' module has been renamed to 'azure_rm_devtestlabcustomimage_info'", + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_devtestlabenvironment.py b/plugins/modules/azure_rm_devtestlabenvironment.py index 143e0225df..70a8b39b08 100644 --- a/plugins/modules/azure_rm_devtestlabenvironment.py +++ b/plugins/modules/azure_rm_devtestlabenvironment.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabenvironment -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure DevTest Lab Environment instance description: - Create, update and delete instance of Azure DevTest Lab Environment. @@ -26,24 +26,30 @@ description: - The name of the resource group. required: True + type: str lab_name: description: - The name of the lab. required: True + type: str user_name: description: - The name of the user profile. required: True + type: str name: description: - The name of the environment. required: True + type: str location: description: - The location of the resource. + type: str deployment_template: description: - The Azure Resource Manager template's identifier. + type: raw deployment_parameters: description: - The parameters of the Azure Resource Manager template. @@ -52,14 +58,17 @@ name: description: - The name of the template parameter. + type: str value: description: - The value of the template parameter. + type: str state: description: - Assert the state of the Environment. - Use C((present) to create or update an Environment and C(absent) to delete it. default: present + type: str choices: - absent - present diff --git a/plugins/modules/azure_rm_devtestlabenvironment_info.py b/plugins/modules/azure_rm_devtestlabenvironment_info.py index 29cb5a1c98..8d6a79ad89 100644 --- a/plugins/modules/azure_rm_devtestlabenvironment_info.py +++ b/plugins/modules/azure_rm_devtestlabenvironment_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabenvironment_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Environment facts description: - Get facts of Azure Environment. @@ -171,7 +171,8 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_devtestlabenvironment_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_devtestlabenvironment_facts' module has been renamed to 'azure_rm_devtestlabenvironment_info'", version='2.13') + self.module.deprecate("The 'azure_rm_devtestlabenvironment_facts' module has been renamed to 'azure_rm_devtestlabenvironment_info'", + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_devtestlabpolicy.py b/plugins/modules/azure_rm_devtestlabpolicy.py index 61fee4ec68..6e128b352d 100644 --- a/plugins/modules/azure_rm_devtestlabpolicy.py +++ b/plugins/modules/azure_rm_devtestlabpolicy.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabpolicy -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Policy instance description: - Create, update and delete instance of Azure Policy. diff --git a/plugins/modules/azure_rm_devtestlabpolicy_info.py b/plugins/modules/azure_rm_devtestlabpolicy_info.py index 8928c59101..1e9da09fb9 100644 --- a/plugins/modules/azure_rm_devtestlabpolicy_info.py +++ b/plugins/modules/azure_rm_devtestlabpolicy_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabpolicy_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure DTL Policy facts description: - Get facts of Azure DTL Policy. @@ -170,7 +170,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_devtestlabpolicy_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_devtestlabpolicy_facts' module has been renamed to 'azure_rm_devtestlabpolicy_info'", version='2.13') + self.module.deprecate("The 'azure_rm_devtestlabpolicy_facts' module has been renamed to 'azure_rm_devtestlabpolicy_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_devtestlabschedule.py b/plugins/modules/azure_rm_devtestlabschedule.py index d6e46639b1..99148e208f 100644 --- a/plugins/modules/azure_rm_devtestlabschedule.py +++ b/plugins/modules/azure_rm_devtestlabschedule.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabschedule -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure DevTest Lab Schedule instance description: - Create, update and delete instance of Azure DecTest Lab Schedule. diff --git a/plugins/modules/azure_rm_devtestlabschedule_info.py b/plugins/modules/azure_rm_devtestlabschedule_info.py index 7b2f6d9fa7..e77ce491a7 100644 --- a/plugins/modules/azure_rm_devtestlabschedule_info.py +++ b/plugins/modules/azure_rm_devtestlabschedule_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabschedule_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Schedule facts description: - Get facts of Azure Schedule. @@ -154,7 +154,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_devtestlabschedule_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_devtestlabschedule_facts' module has been renamed to 'azure_rm_devtestlabschedule_info'", version='2.13') + self.module.deprecate("The 'azure_rm_devtestlabschedule_facts' module has been renamed to 'azure_rm_devtestlabschedule_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_devtestlabvirtualmachine.py b/plugins/modules/azure_rm_devtestlabvirtualmachine.py index 8d788490b2..59ae80c9d6 100644 --- a/plugins/modules/azure_rm_devtestlabvirtualmachine.py +++ b/plugins/modules/azure_rm_devtestlabvirtualmachine.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabvirtualmachine -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure DevTest Lab Virtual Machine instance description: - Create, update and delete instance of Azure DevTest Lab Virtual Machine. diff --git a/plugins/modules/azure_rm_devtestlabvirtualmachine_info.py b/plugins/modules/azure_rm_devtestlabvirtualmachine_info.py index f9ce1c5a3d..6f3c8917cb 100644 --- a/plugins/modules/azure_rm_devtestlabvirtualmachine_info.py +++ b/plugins/modules/azure_rm_devtestlabvirtualmachine_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabvirtualmachine_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure DevTest Lab Virtual Machine facts description: - Get facts of Azure DevTest Lab Virtual Machine. @@ -250,7 +250,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_devtestlabvirtualmachine_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_devtestlabvirtualmachine_facts' module has been renamed to 'azure_rm_devtestlabvirtualmachine_info'", - version='2.13') + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_devtestlabvirtualnetwork.py b/plugins/modules/azure_rm_devtestlabvirtualnetwork.py index ddb75c5eb2..1dbb129ba8 100644 --- a/plugins/modules/azure_rm_devtestlabvirtualnetwork.py +++ b/plugins/modules/azure_rm_devtestlabvirtualnetwork.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabvirtualnetwork -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure DevTest Lab Virtual Network instance description: - Create, update and delete instance of Azure DevTest Lab Virtual Network. diff --git a/plugins/modules/azure_rm_devtestlabvirtualnetwork_info.py b/plugins/modules/azure_rm_devtestlabvirtualnetwork_info.py index fc64152668..eccb7a54fd 100644 --- a/plugins/modules/azure_rm_devtestlabvirtualnetwork_info.py +++ b/plugins/modules/azure_rm_devtestlabvirtualnetwork_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_devtestlabvirtualnetwork_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure DevTest Lab Virtual Network facts description: - Get facts of Azure DevTest Lab Virtual Network. @@ -153,7 +153,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_devtestlabvirtualnetwork_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_devtestlabvirtualnetwork_facts' module has been renamed to 'azure_rm_devtestlabvirtualnetwork_info'", - version='2.13') + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_dnsrecordset.py b/plugins/modules/azure_rm_dnsrecordset.py index 5803fc567b..1aa4e5a9f3 100644 --- a/plugins/modules/azure_rm_dnsrecordset.py +++ b/plugins/modules/azure_rm_dnsrecordset.py @@ -16,7 +16,7 @@ --- module: azure_rm_dnsrecordset -version_added: "2.4" +version_added: "0.1.0" short_description: Create, delete and update DNS record sets and records diff --git a/plugins/modules/azure_rm_dnsrecordset_info.py b/plugins/modules/azure_rm_dnsrecordset_info.py index a804e669bc..ecae5b8b32 100644 --- a/plugins/modules/azure_rm_dnsrecordset_info.py +++ b/plugins/modules/azure_rm_dnsrecordset_info.py @@ -15,7 +15,7 @@ --- module: azure_rm_dnsrecordset_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get DNS Record Set facts @@ -193,7 +193,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_dnsrecordset_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_dnsrecordset_facts' module has been renamed to 'azure_rm_dnsrecordset_info'", version='2.13') + self.module.deprecate("The 'azure_rm_dnsrecordset_facts' module has been renamed to 'azure_rm_dnsrecordset_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_dnszone.py b/plugins/modules/azure_rm_dnszone.py index 8bafb7828d..0386f10549 100644 --- a/plugins/modules/azure_rm_dnszone.py +++ b/plugins/modules/azure_rm_dnszone.py @@ -29,7 +29,7 @@ --- module: azure_rm_dnszone -version_added: "2.4" +version_added: "0.1.0" short_description: Manage Azure DNS zones @@ -58,20 +58,17 @@ choices: - public - private - version_added: 2.8 registration_virtual_networks: description: - A list of references to virtual networks that register hostnames in this DNS zone. - This is a only when I(type=private). - Each element can be the name or resource id, or a dict contains C(name), C(resource_group) information of the virtual network. - version_added: 2.8 type: list resolution_virtual_networks: description: - A list of references to virtual networks that resolve records in this DNS zone. - This is a only when I(type=private). - Each element can be the name or resource id, or a dict contains C(name), C(resource_group) information of the virtual network. - version_added: '2.8' type: list extends_documentation_fragment: diff --git a/plugins/modules/azure_rm_dnszone_info.py b/plugins/modules/azure_rm_dnszone_info.py index 45596d4f01..6ac17ef7ba 100644 --- a/plugins/modules/azure_rm_dnszone_info.py +++ b/plugins/modules/azure_rm_dnszone_info.py @@ -16,7 +16,7 @@ --- module: azure_rm_dnszone_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get DNS zone facts @@ -164,7 +164,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_dnszone_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_dnszone_facts' module has been renamed to 'azure_rm_dnszone_info'", version='2.13') + self.module.deprecate("The 'azure_rm_dnszone_facts' module has been renamed to 'azure_rm_dnszone_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_functionapp.py b/plugins/modules/azure_rm_functionapp.py index 4acdb94138..3c3fd681e6 100644 --- a/plugins/modules/azure_rm_functionapp.py +++ b/plugins/modules/azure_rm_functionapp.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_functionapp -version_added: "2.4" +version_added: "0.1.2" short_description: Manage Azure Function Apps description: - Create, update or delete an Azure Function App. @@ -43,7 +43,6 @@ - It can be a dict which contains C(name), C(resource_group). - C(name). Name of app service plan. - C(resource_group). Resource group name of app service plan. - version_added: "2.8" container_settings: description: Web app container settings. suboptions: @@ -59,7 +58,6 @@ registry_server_password: description: - The container registry server password. - version_added: "2.8" storage_account: description: - Name of the storage account to use. diff --git a/plugins/modules/azure_rm_functionapp_info.py b/plugins/modules/azure_rm_functionapp_info.py index ed48e0dda4..f1e02bece6 100644 --- a/plugins/modules/azure_rm_functionapp_info.py +++ b/plugins/modules/azure_rm_functionapp_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_functionapp_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Function App facts description: - Get facts for one Azure Function App or all Function Apps within a resource group. @@ -136,7 +136,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_functionapp_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_functionapp_facts' module has been renamed to 'azure_rm_functionapp_info'", version='2.13') + self.module.deprecate("The 'azure_rm_functionapp_facts' module has been renamed to 'azure_rm_functionapp_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_gallery.py b/plugins/modules/azure_rm_gallery.py index 590924773d..d1430651a7 100644 --- a/plugins/modules/azure_rm_gallery.py +++ b/plugins/modules/azure_rm_gallery.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_gallery -version_added: '2.9' +version_added: "0.1.2" short_description: Manage Azure Shared Image Gallery instance description: - Create, update and delete instance of Azure Shared Image Gallery (SIG). diff --git a/plugins/modules/azure_rm_gallery_info.py b/plugins/modules/azure_rm_gallery_info.py index 5015f5c4c0..c8bf9f623b 100644 --- a/plugins/modules/azure_rm_gallery_info.py +++ b/plugins/modules/azure_rm_gallery_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_gallery_info -version_added: '2.9' +version_added: "0.1.2" short_description: Get Azure Shared Image Gallery info description: - Get info of Azure Shared Image Gallery. diff --git a/plugins/modules/azure_rm_galleryimage.py b/plugins/modules/azure_rm_galleryimage.py index 34ae4652f8..dc0e5b367c 100644 --- a/plugins/modules/azure_rm_galleryimage.py +++ b/plugins/modules/azure_rm_galleryimage.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_galleryimage -version_added: '2.9' +version_added: "0.1.2" short_description: Manage Azure SIG Image instance description: - Create, update and delete instance of Azure SIG Image. diff --git a/plugins/modules/azure_rm_galleryimage_info.py b/plugins/modules/azure_rm_galleryimage_info.py index d589de76d8..2d9040a258 100644 --- a/plugins/modules/azure_rm_galleryimage_info.py +++ b/plugins/modules/azure_rm_galleryimage_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_galleryimage_info -version_added: '2.9' +version_added: "0.1.2" short_description: Get Azure SIG Image info description: - Get info of Azure SIG Image. diff --git a/plugins/modules/azure_rm_galleryimageversion.py b/plugins/modules/azure_rm_galleryimageversion.py index 20d9b43d3b..7a6e73c1ee 100644 --- a/plugins/modules/azure_rm_galleryimageversion.py +++ b/plugins/modules/azure_rm_galleryimageversion.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_galleryimageversion -version_added: '2.9' +version_added: "0.1.2" short_description: Manage Azure SIG Image Version instance description: - Create, update and delete instance of Azure SIG Image Version. @@ -51,7 +51,6 @@ description: - Storage profile required: true - version_added: "2.10" type: dict suboptions: source_image: diff --git a/plugins/modules/azure_rm_galleryimageversion_info.py b/plugins/modules/azure_rm_galleryimageversion_info.py index ab8a0b3af5..65b1059e0e 100644 --- a/plugins/modules/azure_rm_galleryimageversion_info.py +++ b/plugins/modules/azure_rm_galleryimageversion_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_galleryimageversion_info -version_added: '2.9' +version_added: "0.1.2" short_description: Get Azure SIG Image Version info description: - Get info of Azure SIG Image Version. diff --git a/plugins/modules/azure_rm_hdinsightcluster.py b/plugins/modules/azure_rm_hdinsightcluster.py index 3ca24c865b..8c044a48a6 100644 --- a/plugins/modules/azure_rm_hdinsightcluster.py +++ b/plugins/modules/azure_rm_hdinsightcluster.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_hdinsightcluster -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure HDInsight Cluster instance description: - Create, update and delete instance of Azure HDInsight Cluster. diff --git a/plugins/modules/azure_rm_hdinsightcluster_info.py b/plugins/modules/azure_rm_hdinsightcluster_info.py index 1ca3dc1926..98825ae38f 100644 --- a/plugins/modules/azure_rm_hdinsightcluster_info.py +++ b/plugins/modules/azure_rm_hdinsightcluster_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_hdinsightcluster_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure HDInsight Cluster facts description: - Get facts of Azure HDInsight Cluster. @@ -222,7 +222,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_hdinsightcluster_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_hdinsightcluster_facts' module has been renamed to 'azure_rm_hdinsightcluster_info'", - version='2.13') + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_image.py b/plugins/modules/azure_rm_image.py index 67f9ae9eaa..b32ffefd39 100644 --- a/plugins/modules/azure_rm_image.py +++ b/plugins/modules/azure_rm_image.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_image -version_added: "2.5" +version_added: "0.0.1" short_description: Manage Azure image description: - Create, delete an image from virtual machine, blob uri, managed disk or snapshot. diff --git a/plugins/modules/azure_rm_image_info.py b/plugins/modules/azure_rm_image_info.py index d9a6c694b3..8c9dd47de2 100644 --- a/plugins/modules/azure_rm_image_info.py +++ b/plugins/modules/azure_rm_image_info.py @@ -14,7 +14,7 @@ --- module: azure_rm_image_info -version_added: "2.9" +version_added: "0.0.1" short_description: Get facts about azure custom images @@ -208,7 +208,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_image_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_image_facts' module has been renamed to 'azure_rm_image_info'", version='2.13') + self.module.deprecate("The 'azure_rm_image_facts' module has been renamed to 'azure_rm_image_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_iotdevice.py b/plugins/modules/azure_rm_iotdevice.py index 0fb733d8a8..00c86d7885 100644 --- a/plugins/modules/azure_rm_iotdevice.py +++ b/plugins/modules/azure_rm_iotdevice.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_iotdevice -version_added: "2.9" +version_added: "0.1.2" short_description: Manage Azure IoT hub device description: - Create, delete an Azure IoT hub device. diff --git a/plugins/modules/azure_rm_iotdevice_info.py b/plugins/modules/azure_rm_iotdevice_info.py index 120873a8b0..5a5a721951 100644 --- a/plugins/modules/azure_rm_iotdevice_info.py +++ b/plugins/modules/azure_rm_iotdevice_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_iotdevice_info -version_added: "2.9" +version_added: "0.1.2" short_description: Facts of Azure IoT hub device description: - Query, get Azure IoT hub device. diff --git a/plugins/modules/azure_rm_iotdevicemodule.py b/plugins/modules/azure_rm_iotdevicemodule.py index cbb0456f27..f8f153d60f 100644 --- a/plugins/modules/azure_rm_iotdevicemodule.py +++ b/plugins/modules/azure_rm_iotdevicemodule.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_iotdevicemodule -version_added: "2.9" +version_added: "0.1.2" short_description: Manage Azure IoT hub device module description: - Create, delete an Azure IoT hub device module. diff --git a/plugins/modules/azure_rm_iothub.py b/plugins/modules/azure_rm_iothub.py index 6a2adc963b..0b506e9516 100644 --- a/plugins/modules/azure_rm_iothub.py +++ b/plugins/modules/azure_rm_iothub.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_iothub -version_added: "2.9" +version_added: "0.1.2" short_description: Manage Azure IoT hub description: - Create, delete an Azure IoT hub. diff --git a/plugins/modules/azure_rm_iothub_info.py b/plugins/modules/azure_rm_iothub_info.py index fc5172191c..64767a1ad9 100644 --- a/plugins/modules/azure_rm_iothub_info.py +++ b/plugins/modules/azure_rm_iothub_info.py @@ -17,7 +17,7 @@ --- module: azure_rm_iothub_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get IoT Hub facts diff --git a/plugins/modules/azure_rm_iothubconsumergroup.py b/plugins/modules/azure_rm_iothubconsumergroup.py index eddf2e22ed..e775c8c311 100644 --- a/plugins/modules/azure_rm_iothubconsumergroup.py +++ b/plugins/modules/azure_rm_iothubconsumergroup.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_iothubconsumergroup -version_added: "2.9" +version_added: "0.1.2" short_description: Manage Azure IoT hub description: - Create, delete an Azure IoT hub. diff --git a/plugins/modules/azure_rm_keyvault.py b/plugins/modules/azure_rm_keyvault.py index 328fc4a3dd..a72f95bf0c 100644 --- a/plugins/modules/azure_rm_keyvault.py +++ b/plugins/modules/azure_rm_keyvault.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_keyvault -version_added: "2.5" +version_added: "0.1.2" short_description: Manage Key Vault instance description: - Create, update and delete instance of Key Vault. diff --git a/plugins/modules/azure_rm_keyvault_info.py b/plugins/modules/azure_rm_keyvault_info.py index 9fff468ac0..9f58432f59 100644 --- a/plugins/modules/azure_rm_keyvault_info.py +++ b/plugins/modules/azure_rm_keyvault_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_keyvault_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Key Vault facts description: - Get facts of Azure Key Vault. @@ -25,12 +25,15 @@ resource_group: description: - The name of the resource group to which the key vault belongs. + type: str name: description: - The name of the key vault. + type: str tags: description: - Limit results by providing a list of tags. Format tags as 'key' or 'key:value'. + type: list extends_documentation_fragment: - azure.azcollection.azure diff --git a/plugins/modules/azure_rm_keyvaultkey.py b/plugins/modules/azure_rm_keyvaultkey.py index c7a9e8b960..15abb5a2a8 100644 --- a/plugins/modules/azure_rm_keyvaultkey.py +++ b/plugins/modules/azure_rm_keyvaultkey.py @@ -14,7 +14,7 @@ DOCUMENTATION = ''' --- module: azure_rm_keyvaultkey -version_added: 2.5 +version_added: "0.1.2" short_description: Use Azure KeyVault keys description: - Create or delete a key within a given keyvault. diff --git a/plugins/modules/azure_rm_keyvaultkey_info.py b/plugins/modules/azure_rm_keyvaultkey_info.py index e4527d4ecd..f3bbd50e46 100644 --- a/plugins/modules/azure_rm_keyvaultkey_info.py +++ b/plugins/modules/azure_rm_keyvaultkey_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_keyvaultkey_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Key Vault key facts description: - Get facts of Azure Key Vault key. diff --git a/plugins/modules/azure_rm_keyvaultsecret.py b/plugins/modules/azure_rm_keyvaultsecret.py index 0d38231520..8910838632 100644 --- a/plugins/modules/azure_rm_keyvaultsecret.py +++ b/plugins/modules/azure_rm_keyvaultsecret.py @@ -14,7 +14,7 @@ DOCUMENTATION = ''' --- module: azure_rm_keyvaultsecret -version_added: 2.5 +version_added: "0.1.2" short_description: Use Azure KeyVault Secrets description: - Create or delete a secret within a given keyvault. diff --git a/plugins/modules/azure_rm_keyvaultsecret_info.py b/plugins/modules/azure_rm_keyvaultsecret_info.py index cf59290fc1..438b4d3f0d 100644 --- a/plugins/modules/azure_rm_keyvaultsecret_info.py +++ b/plugins/modules/azure_rm_keyvaultsecret_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_keyvaultsecret_info -version_added: "2.10" +version_added: "0.1.2" short_description: Get Azure Key Vault secret facts description: - Get facts of Azure Key Vault secret. diff --git a/plugins/modules/azure_rm_loadbalancer.py b/plugins/modules/azure_rm_loadbalancer.py index 44eb6fcabd..53874d6529 100644 --- a/plugins/modules/azure_rm_loadbalancer.py +++ b/plugins/modules/azure_rm_loadbalancer.py @@ -17,7 +17,7 @@ --- module: azure_rm_loadbalancer -version_added: "2.4" +version_added: "0.1.2" short_description: Manage Azure load balancers @@ -49,7 +49,6 @@ choices: - Basic - Standard - version_added: '2.6' frontend_ip_configurations: description: - List of frontend IPs to be used. @@ -64,20 +63,16 @@ private_ip_address: description: - The reference of the Public IP resource. - version_added: '2.6' private_ip_allocation_method: description: - The Private IP allocation method. choices: - Static - Dynamic - version_added: '2.6' subnet: description: - The reference of the subnet resource. - Should be an existing subnet's resource id. - version_added: '2.6' - version_added: '2.5' backend_address_pools: description: - List of backend address pools. @@ -86,7 +81,6 @@ description: - Name of the backend address pool. required: True - version_added: '2.5' probes: description: - List of probe definitions used to check endpoint health. @@ -125,7 +119,6 @@ description: - The URI used for requesting health status from the VM. - Path is required if I(protocol=Http) or I(protocol=Https). Otherwise, it is not allowed. - version_added: '2.5' inbound_nat_pools: description: - Defines an external port range for inbound NAT to a single backend port on NICs associated with a load balancer. @@ -164,7 +157,6 @@ description: - The port used for internal connections on the endpoint. - Acceptable values are between 1 and 65535. - version_added: '2.5' load_balancing_rules: description: - Object collection representing the load balancing rules Gets the provisioning. @@ -220,7 +212,6 @@ enable_floating_ip: description: - Configures SNAT for the VMs in the backend pool to use the publicIP address specified in the frontend of the load balancing rule. - version_added: '2.5' inbound_nat_rules: description: - Collection of inbound NAT Rules used by a load balancer. @@ -270,7 +261,6 @@ description: - Receive bidirectional TCP Reset on TCP flow idle timeout or unexpected connection termination. - This element is only used when I(protocol=Tcp). - version_added: '2.8' public_ip_address_name: description: - (deprecated) Name of an existing public IP address object to associate with the security group. @@ -741,7 +731,7 @@ def exec_module(self, **kwargs): is_compatible_param = is_compatible_param or self.public_ip_address_name or self.probe_protocol or self.natpool_protocol or self.protocol if is_compatible_param: self.deprecate('Discrete load balancer config settings are deprecated and will be removed.' - ' Use frontend_ip_configurations, backend_address_pools, probes, inbound_nat_pools lists instead.', version='2.9') + ' Use frontend_ip_configurations, backend_address_pools, probes, inbound_nat_pools lists instead.', version=(2, 9)) frontend_ip_name = 'frontendip0' backend_address_pool_name = 'backendaddrp0' prob_name = 'prob0' diff --git a/plugins/modules/azure_rm_loadbalancer_info.py b/plugins/modules/azure_rm_loadbalancer_info.py index 9b8abfa06c..b273f8a128 100644 --- a/plugins/modules/azure_rm_loadbalancer_info.py +++ b/plugins/modules/azure_rm_loadbalancer_info.py @@ -17,7 +17,7 @@ --- module: azure_rm_loadbalancer_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get load balancer facts @@ -113,7 +113,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_loadbalancer_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_loadbalancer_facts' module has been renamed to 'azure_rm_loadbalancer_info'", version='2.13') + self.module.deprecate("The 'azure_rm_loadbalancer_facts' module has been renamed to 'azure_rm_loadbalancer_info'", version=(2.9, )) for key in self.module_args: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_lock.py b/plugins/modules/azure_rm_lock.py index 361706a7fa..1947b5877a 100644 --- a/plugins/modules/azure_rm_lock.py +++ b/plugins/modules/azure_rm_lock.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_lock -version_added: "2.9" +version_added: "0.1.2" short_description: Manage Azure locks description: - Create, delete an Azure lock. @@ -101,8 +101,7 @@ sample: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Authorization/locks/keep" ''' # NOQA -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase try: from msrestazure.azure_exceptions import CloudError except ImportError: diff --git a/plugins/modules/azure_rm_lock_info.py b/plugins/modules/azure_rm_lock_info.py index e34e75b3ae..759dfaeff7 100644 --- a/plugins/modules/azure_rm_lock_info.py +++ b/plugins/modules/azure_rm_lock_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_lock_info -version_added: "2.9" +version_added: "0.1.2" short_description: Manage Azure locks description: - Create, delete an Azure lock. @@ -116,10 +116,10 @@ import json import re from ansible.module_utils.common.dict_transformations import _camel_to_snake -from ansible.module_utils.azure_rm_common import AzureRMModuleBase -from ansible.module_utils.azure_rm_common_rest import GenericRestClient +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common_rest import GenericRestClient try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError except ImportError: # This is handled in azure_rm_common @@ -156,7 +156,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_lock_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_lock_facts' module has been renamed to 'azure_rm_lock_info'", version='2.13') + self.module.deprecate("The 'azure_rm_lock_facts' module has been renamed to 'azure_rm_lock_info'", version=(2.9, )) for key in self.module_arg_spec.keys(): setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_loganalyticsworkspace.py b/plugins/modules/azure_rm_loganalyticsworkspace.py index 4006a3fb41..a841c67504 100644 --- a/plugins/modules/azure_rm_loganalyticsworkspace.py +++ b/plugins/modules/azure_rm_loganalyticsworkspace.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_loganalyticsworkspace -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Log Analytics workspaces description: - Create, delete Azure Log Analytics workspaces. @@ -151,10 +151,10 @@ } ''' # NOQA -from ansible.module_utils.azure_rm_common import AzureRMModuleBase, format_resource_id from ansible.module_utils.common.dict_transformations import _snake_to_camel, _camel_to_snake try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase, format_resource_id from msrestazure.tools import parse_resource_id from msrestazure.azure_exceptions import CloudError except ImportError: diff --git a/plugins/modules/azure_rm_loganalyticsworkspace_info.py b/plugins/modules/azure_rm_loganalyticsworkspace_info.py index 6c425bcf97..593668f44e 100644 --- a/plugins/modules/azure_rm_loganalyticsworkspace_info.py +++ b/plugins/modules/azure_rm_loganalyticsworkspace_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_loganalyticsworkspace_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get facts of Azure Log Analytics workspaces description: - Get, query Azure Log Analytics workspaces. @@ -137,10 +137,10 @@ } ''' # NOQA -from ansible.module_utils.azure_rm_common import AzureRMModuleBase, format_resource_id from ansible.module_utils.common.dict_transformations import _snake_to_camel, _camel_to_snake try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase, format_resource_id from msrestazure.tools import parse_resource_id from msrestazure.azure_exceptions import CloudError except ImportError: @@ -182,7 +182,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_loganalyticsworkspace_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_loganalyticsworkspace_facts' module has been renamed to 'azure_rm_loganalyticsworkspace_info'", - version='2.13') + version=(2.9, )) for key in list(self.module_arg_spec.keys()): setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_manageddisk.py b/plugins/modules/azure_rm_manageddisk.py index bc48083e9c..1981c4b75c 100644 --- a/plugins/modules/azure_rm_manageddisk.py +++ b/plugins/modules/azure_rm_manageddisk.py @@ -17,7 +17,7 @@ --- module: azure_rm_manageddisk -version_added: "2.4" +version_added: "0.1.2" short_description: Manage Azure Manage Disks @@ -91,7 +91,6 @@ - Name of an existing virtual machine with which the disk is or will be associated, this VM should be in the same resource group. - To detach a disk from a vm, explicitly set to ''. - If this option is unset, the value will not be changed. - version_added: '2.5' attach_caching: description: - Disk caching policy controlled by VM. Will be used when attached to the VM defined by C(managed_by). @@ -100,7 +99,6 @@ - '' - read_only - read_write - version_added: '2.8' tags: description: - Tags to assign to the managed disk. @@ -114,13 +112,11 @@ - 2 - 3 - '' - version_added: "2.8" lun: description: - The logical unit number for data disk. - This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. type: int - version_added: '2.10' extends_documentation_fragment: - azure.azcollection.azure @@ -331,13 +327,15 @@ def exec_module(self, **kwargs): if self.managed_by or self.managed_by == '': vm_name = parse_resource_id(disk_instance.get('managed_by', '')).get('name') if disk_instance else None vm_name = vm_name or '' + vm_old = None if self.managed_by != vm_name or self.is_attach_caching_option_different(vm_name, result): changed = True if not self.check_mode: if vm_name: + vm_old = self._get_vm(vm_name) self.detach(vm_name, result) if self.managed_by: - self.attach(self.managed_by, result) + self.attach(self.managed_by, result, vm_old) result = self.get_managed_disk() if self.state == 'absent' and disk_instance: @@ -350,7 +348,7 @@ def exec_module(self, **kwargs): self.results['state'] = result return self.results - def attach(self, vm_name, disk): + def attach(self, vm_name, disk, vm_old): vm = self._get_vm(vm_name) # find the lun if self.lun: @@ -358,11 +356,20 @@ def attach(self, vm_name, disk): else: luns = ([d.lun for d in vm.storage_profile.data_disks] if vm.storage_profile.data_disks else []) - lun = max(luns) + 1 if luns else 0 + lun = 0 + while True: + if lun not in luns: + break + lun = lun + 1 + if vm_old is not None: + for item in vm_old.storage_profile.data_disks: + if item.name == self.name: + lun = item.lun # prepare the data disk params = self.compute_models.ManagedDiskParameters(id=disk.get('id'), storage_account_type=disk.get('storage_account_type')) caching_options = self.compute_models.CachingTypes[self.attach_caching] if self.attach_caching and self.attach_caching != '' else None + # pylint: disable=missing-kwoa data_disk = self.compute_models.DataDisk(lun=lun, create_option=self.compute_models.DiskCreateOptionTypes.attach, managed_disk=params, diff --git a/plugins/modules/azure_rm_manageddisk_info.py b/plugins/modules/azure_rm_manageddisk_info.py index e33ea25396..1fc60c6b43 100644 --- a/plugins/modules/azure_rm_manageddisk_info.py +++ b/plugins/modules/azure_rm_manageddisk_info.py @@ -16,7 +16,7 @@ --- module: azure_rm_manageddisk_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get managed disk facts diff --git a/plugins/modules/azure_rm_managementgroup.py b/plugins/modules/azure_rm_managementgroup.py index cd43fd5889..4de569c8d8 100644 --- a/plugins/modules/azure_rm_managementgroup.py +++ b/plugins/modules/azure_rm_managementgroup.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_managementgroup -version_added: '2.10' +version_added: '0.1.1' short_description: Manage Azure ManagementGroup instance description: - Create, update and delete instance of Azure ManagementGroup. @@ -211,8 +211,8 @@ import time import json -from ansible.module_utils.azure_rm_common_ext import AzureRMModuleBaseExt -from ansible.module_utils.azure_rm_common_rest import GenericRestClient +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common_rest import GenericRestClient +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common_ext import AzureRMModuleBaseExt try: from msrestazure.azure_exceptions import CloudError except ImportError: diff --git a/plugins/modules/azure_rm_mariadbconfiguration.py b/plugins/modules/azure_rm_mariadbconfiguration.py index 669a6a063e..77e79e8fd5 100644 --- a/plugins/modules/azure_rm_mariadbconfiguration.py +++ b/plugins/modules/azure_rm_mariadbconfiguration.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mariadbconfiguration -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Configuration instance description: - Create, update and delete instance of Configuration. @@ -27,17 +27,21 @@ description: - The name of the resource group that contains the resource. required: True + type: str server_name: description: - The name of the server. required: True + type: str name: description: - The name of the server configuration. required: True + type: str value: description: - Value of the configuration. + type: str state: description: - Assert the state of the MariaDB configuration. Use C(present) to update setting, or C(absent) to reset to default value. @@ -45,6 +49,7 @@ choices: - absent - present + type: str extends_documentation_fragment: - azure.azcollection.azure @@ -74,7 +79,7 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase try: from msrestazure.azure_exceptions import CloudError diff --git a/plugins/modules/azure_rm_mariadbconfiguration_info.py b/plugins/modules/azure_rm_mariadbconfiguration_info.py index 0e38e934c4..1b918742ec 100644 --- a/plugins/modules/azure_rm_mariadbconfiguration_info.py +++ b/plugins/modules/azure_rm_mariadbconfiguration_info.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mariadbconfiguration_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure MariaDB Configuration facts description: - Get facts of Azure MariaDB Configuration. @@ -100,8 +100,7 @@ sample: system-default ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase try: from msrestazure.azure_exceptions import CloudError from msrestazure.azure_operation import AzureOperationPoller @@ -139,7 +138,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_mariadbconfiguration_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_mariadbconfiguration_facts' module has been renamed to 'azure_rm_mariadbconfiguration_info'", version='2.13') + self.module.deprecate("The 'azure_rm_mariadbconfiguration_facts' module has been renamed to 'azure_rm_mariadbconfiguration_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_mariadbdatabase.py b/plugins/modules/azure_rm_mariadbdatabase.py index 5f6d492ea3..2bdad0a2a3 100644 --- a/plugins/modules/azure_rm_mariadbdatabase.py +++ b/plugins/modules/azure_rm_mariadbdatabase.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mariadbdatabase -version_added: "2.8" +version_added: "0.1.2" short_description: Manage MariaDB Database instance description: - Create, update and delete instance of MariaDB Database. @@ -90,9 +90,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from azure.mgmt.rdbms.mariadb import MariaDBManagementClient from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller diff --git a/plugins/modules/azure_rm_mariadbdatabase_info.py b/plugins/modules/azure_rm_mariadbdatabase_info.py index 43f2dfd801..abfdd5d938 100644 --- a/plugins/modules/azure_rm_mariadbdatabase_info.py +++ b/plugins/modules/azure_rm_mariadbdatabase_info.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mariadbdatabase_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure MariaDB Database facts description: - Get facts of MariaDB Database. @@ -106,9 +106,8 @@ sample: English_United States.1252 ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from azure.mgmt.rdbms.mariadb import MariaDBManagementClient from msrest.serialization import Model @@ -145,7 +144,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_mariadbdatabase_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_mariadbdatabase_facts' module has been renamed to 'azure_rm_mariadbdatabase_info'", version='2.13') + self.module.deprecate("The 'azure_rm_mariadbdatabase_facts' module has been renamed to 'azure_rm_mariadbdatabase_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_mariadbfirewallrule.py b/plugins/modules/azure_rm_mariadbfirewallrule.py index 59e0e77d31..36288bbc20 100644 --- a/plugins/modules/azure_rm_mariadbfirewallrule.py +++ b/plugins/modules/azure_rm_mariadbfirewallrule.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mariadbfirewallrule -version_added: "2.8" +version_added: "0.1.2" short_description: Manage MariaDB firewall rule instance description: - Create, update and delete instance of MariaDB firewall rule. @@ -79,9 +79,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller from azure.mgmt.rdbms.mariadb import MariaDBManagementClient diff --git a/plugins/modules/azure_rm_mariadbfirewallrule_info.py b/plugins/modules/azure_rm_mariadbfirewallrule_info.py index 64ad9653ab..00708e7ef2 100644 --- a/plugins/modules/azure_rm_mariadbfirewallrule_info.py +++ b/plugins/modules/azure_rm_mariadbfirewallrule_info.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mariadbfirewallrule_info -version_added: "2.9" +version_added: "0.0.1" short_description: Get Azure MariaDB Firewall Rule facts description: - Get facts of Azure MariaDB Firewall Rule. @@ -100,9 +100,8 @@ sample: 10.0.0.18 ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrestazure.azure_operation import AzureOperationPoller from azure.mgmt.rdbms.mariadb import MariaDBManagementClient @@ -141,7 +140,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_mariadbfirewallrule_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_mariadbfirewallrule_facts' module has been renamed to 'azure_rm_mariadbfirewallrule_info'", version='2.13') + self.module.deprecate("The 'azure_rm_mariadbfirewallrule_facts' module has been renamed to 'azure_rm_mariadbfirewallrule_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_mariadbserver.py b/plugins/modules/azure_rm_mariadbserver.py index 179a2144e7..c5c6667285 100644 --- a/plugins/modules/azure_rm_mariadbserver.py +++ b/plugins/modules/azure_rm_mariadbserver.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mariadbserver -version_added: "2.8" +version_added: "0.1.2" short_description: Manage MariaDB Server instance description: - Create, update and delete instance of MariaDB Server. @@ -63,6 +63,7 @@ - Server version. choices: - 10.2 + - 10.3 enforce_ssl: description: - Enable SSL enforcement. @@ -121,7 +122,7 @@ sample: /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.DBforMariaDB/servers/mariadbsrv1b6dd89593 version: description: - - Server version. Possible values include C(10.2). + - Server version. Possible values include C(10.2) and C(10.3). returned: always type: str sample: 10.2 @@ -140,9 +141,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from azure.mgmt.rdbms.mariadb import MariaDBManagementClient from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller @@ -180,7 +181,7 @@ def __init__(self): ), version=dict( type='str', - choices=['10.2'] + choices=['10.2', '10.3'] ), enforce_ssl=dict( type='bool', diff --git a/plugins/modules/azure_rm_mariadbserver_info.py b/plugins/modules/azure_rm_mariadbserver_info.py index cb5723c81f..3cc3826304 100644 --- a/plugins/modules/azure_rm_mariadbserver_info.py +++ b/plugins/modules/azure_rm_mariadbserver_info.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mariadbserver_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure MariaDB Server facts description: - Get facts of MariaDB Server. @@ -155,9 +155,8 @@ sample: { tag1: abc } ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from azure.mgmt.rdbms.mariadb import MariaDBManagementClient from msrest.serialization import Model @@ -193,7 +192,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_mariadbserver_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_mariadbserver_facts' module has been renamed to 'azure_rm_mariadbserver_info'", version='2.13') + self.module.deprecate("The 'azure_rm_mariadbserver_facts' module has been renamed to 'azure_rm_mariadbserver_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_monitorlogprofile.py b/plugins/modules/azure_rm_monitorlogprofile.py index df16f1d26a..7c722566e5 100644 --- a/plugins/modules/azure_rm_monitorlogprofile.py +++ b/plugins/modules/azure_rm_monitorlogprofile.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_monitorlogprofile -version_added: "2.9" +version_added: "0.0.1" short_description: Manage Azure Monitor log profile description: - Create, update and delete instance of Azure Monitor log profile. @@ -118,9 +118,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase, format_resource_id try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase, format_resource_id from msrestazure.azure_exceptions import CloudError from msrestazure.azure_operation import AzureOperationPoller from msrestazure.tools import is_valid_resource_id diff --git a/plugins/modules/azure_rm_mysqlconfiguration.py b/plugins/modules/azure_rm_mysqlconfiguration.py index 8741a535f7..25557a7ca5 100644 --- a/plugins/modules/azure_rm_mysqlconfiguration.py +++ b/plugins/modules/azure_rm_mysqlconfiguration.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mysqlconfiguration -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Configuration instance description: - Create, update and delete instance of Configuration. @@ -73,9 +73,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller from azure.mgmt.rdbms.mysql import MySQLManagementClient diff --git a/plugins/modules/azure_rm_mysqlconfiguration_info.py b/plugins/modules/azure_rm_mysqlconfiguration_info.py index 795795f57c..05307dff54 100644 --- a/plugins/modules/azure_rm_mysqlconfiguration_info.py +++ b/plugins/modules/azure_rm_mysqlconfiguration_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mysqlconfiguration_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure MySQL Configuration facts description: - Get facts of Azure MySQL Configuration. @@ -98,9 +98,8 @@ sample: system-default ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrestazure.azure_operation import AzureOperationPoller from azure.mgmt.rdbms.mysql import MySQLManagementClient @@ -137,7 +136,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_mysqlconfiguration_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_mysqlconfiguration_facts' module has been renamed to 'azure_rm_mysqlconfiguration_info'", version='2.13') + self.module.deprecate("The 'azure_rm_mysqlconfiguration_facts' module has been renamed to 'azure_rm_mysqlconfiguration_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_mysqldatabase.py b/plugins/modules/azure_rm_mysqldatabase.py index 9270851f23..ac0632f91a 100644 --- a/plugins/modules/azure_rm_mysqldatabase.py +++ b/plugins/modules/azure_rm_mysqldatabase.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mysqldatabase -version_added: "2.5" +version_added: "0.1.2" short_description: Manage MySQL Database instance description: - Create, update and delete instance of MySQL Database. @@ -88,9 +88,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from azure.mgmt.rdbms.mysql import MySQLManagementClient from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller diff --git a/plugins/modules/azure_rm_mysqldatabase_info.py b/plugins/modules/azure_rm_mysqldatabase_info.py index a779d70cf5..62e33b2e19 100644 --- a/plugins/modules/azure_rm_mysqldatabase_info.py +++ b/plugins/modules/azure_rm_mysqldatabase_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mysqldatabase_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure MySQL Database facts description: - Get facts of MySQL Database. @@ -104,9 +104,8 @@ sample: English_United States.1252 ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from azure.mgmt.rdbms.mysql import MySQLManagementClient from msrest.serialization import Model @@ -143,7 +142,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_mysqldatabase_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_mysqldatabase_facts' module has been renamed to 'azure_rm_mysqldatabase_info'", version='2.13') + self.module.deprecate("The 'azure_rm_mysqldatabase_facts' module has been renamed to 'azure_rm_mysqldatabase_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_mysqlfirewallrule.py b/plugins/modules/azure_rm_mysqlfirewallrule.py index e289b41c1b..d5deba9ad9 100644 --- a/plugins/modules/azure_rm_mysqlfirewallrule.py +++ b/plugins/modules/azure_rm_mysqlfirewallrule.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mysqlfirewallrule -version_added: "2.8" +version_added: "0.1.2" short_description: Manage MySQL firewall rule instance description: - Create, update and delete instance of MySQL firewall rule. @@ -79,9 +79,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller from azure.mgmt.rdbms.mysql import MySQLManagementClient diff --git a/plugins/modules/azure_rm_mysqlfirewallrule_info.py b/plugins/modules/azure_rm_mysqlfirewallrule_info.py index 7d3aa03ebe..682cb77026 100644 --- a/plugins/modules/azure_rm_mysqlfirewallrule_info.py +++ b/plugins/modules/azure_rm_mysqlfirewallrule_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mysqlfirewallrule_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure MySQL Firewall Rule facts description: - Get facts of Azure MySQL Firewall Rule. @@ -98,9 +98,8 @@ sample: 10.0.0.18 ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrestazure.azure_operation import AzureOperationPoller from azure.mgmt.rdbms.mysql import MySQLManagementClient @@ -139,7 +138,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_mysqlfirewallrule_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_mysqlfirewallrule_facts' module has been renamed to 'azure_rm_mysqlfirewallrule_info'", version='2.13') + self.module.deprecate("The 'azure_rm_mysqlfirewallrule_facts' module has been renamed to 'azure_rm_mysqlfirewallrule_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_mysqlserver.py b/plugins/modules/azure_rm_mysqlserver.py index 4e0d6c36d2..a1f3c96143 100644 --- a/plugins/modules/azure_rm_mysqlserver.py +++ b/plugins/modules/azure_rm_mysqlserver.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mysqlserver -version_added: "2.5" +version_added: "0.1.2" short_description: Manage MySQL Server instance description: - Create, update and delete instance of MySQL Server. @@ -138,9 +138,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from azure.mgmt.rdbms.mysql import MySQLManagementClient from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller diff --git a/plugins/modules/azure_rm_mysqlserver_info.py b/plugins/modules/azure_rm_mysqlserver_info.py index b6500649d0..5f3991abd6 100644 --- a/plugins/modules/azure_rm_mysqlserver_info.py +++ b/plugins/modules/azure_rm_mysqlserver_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_mysqlserver_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure MySQL Server facts description: - Get facts of MySQL Server. @@ -153,9 +153,8 @@ sample: { tag1: abc } ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from azure.mgmt.rdbms.mysql import MySQLManagementClient from msrest.serialization import Model @@ -191,7 +190,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_mysqlserver_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_mysqlserver_facts' module has been renamed to 'azure_rm_mysqlserver_info'", version='2.13') + self.module.deprecate("The 'azure_rm_mysqlserver_facts' module has been renamed to 'azure_rm_mysqlserver_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_networkinterface.py b/plugins/modules/azure_rm_networkinterface.py index 86ade419fe..fdeb012ef5 100644 --- a/plugins/modules/azure_rm_networkinterface.py +++ b/plugins/modules/azure_rm_networkinterface.py @@ -19,7 +19,7 @@ --- module: azure_rm_networkinterface -version_added: '2.1' +version_added: "0.1.0" short_description: Manage Azure network interfaces @@ -151,30 +151,26 @@ - List of existing load-balancer backend address pools to associate with the network interface. - Can be written as a resource ID. - Also can be a dict of I(name) and I(load_balancer). - version_added: '2.6' primary: description: - Whether the IP configuration is the primary one in the list. + - The first IP configuration default set to I(primary=True). type: bool - default: 'no' + default: False application_security_groups: description: - List of application security groups in which the IP configuration is included. - Element of the list could be a resource id of application security group, or dict of I(resource_group) and I(name). - version_added: '2.8' - version_added: '2.5' enable_accelerated_networking: description: - Whether the network interface should be created with the accelerated networking feature or not. type: bool - version_added: '2.7' default: False create_with_security_group: description: - Whether a security group should be be created with the NIC. - If this flag set to C(True) and no I(security_group) set, a default security group will be created. type: bool - version_added: '2.6' default: True security_group: description: @@ -198,13 +194,11 @@ - ip_forwarding type: bool default: False - version_added: '2.7' dns_servers: description: - Which DNS servers should the NIC lookup. - List of IP addresses. type: list - version_added: '2.7' extends_documentation_fragment: - azure.azcollection.azure - azure.azcollection.azure_tags @@ -462,7 +456,11 @@ # This is handled in azure_rm_common pass -from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase, azure_id_to_dict, normalize_location_name, format_resource_id +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import (AzureRMModuleBase, + azure_id_to_dict, + normalize_location_name, + format_resource_id + ) from ansible.module_utils._text import to_native @@ -638,7 +636,7 @@ def exec_module(self, **kwargs): if self.state == 'present' and not self.ip_configurations: # construct the ip_configurations array for compatible self.deprecate('Setting ip_configuration flatten is deprecated and will be removed.' - ' Using ip_configurations list to define the ip configuration', version='2.9') + ' Using ip_configurations list to define the ip configuration', version=(2, 9)) self.ip_configurations = [ dict( private_ip_address=self.private_ip_address, diff --git a/plugins/modules/azure_rm_networkinterface_info.py b/plugins/modules/azure_rm_networkinterface_info.py index 9a6f10c6b2..e33b4139f3 100644 --- a/plugins/modules/azure_rm_networkinterface_info.py +++ b/plugins/modules/azure_rm_networkinterface_info.py @@ -18,7 +18,7 @@ --- module: azure_rm_networkinterface_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get network interface facts @@ -289,7 +289,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_networkinterface_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_networkinterface_facts' module has been renamed to 'azure_rm_networkinterface_info'", - version='2.13') + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_postgresqlconfiguration.py b/plugins/modules/azure_rm_postgresqlconfiguration.py index 23b734e873..0fb4da64c8 100644 --- a/plugins/modules/azure_rm_postgresqlconfiguration.py +++ b/plugins/modules/azure_rm_postgresqlconfiguration.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_postgresqlconfiguration -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure PostgreSQL Configuration description: - Update or reset Azure PostgreSQL Configuration setting. @@ -73,9 +73,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller from azure.mgmt.rdbms.postgresql import MySQLManagementClient diff --git a/plugins/modules/azure_rm_postgresqlconfiguration_info.py b/plugins/modules/azure_rm_postgresqlconfiguration_info.py index 7313ebe4f4..fb75ecd659 100644 --- a/plugins/modules/azure_rm_postgresqlconfiguration_info.py +++ b/plugins/modules/azure_rm_postgresqlconfiguration_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_postgresqlconfiguration_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure PostgreSQL Configuration facts description: - Get facts of Azure PostgreSQL Configuration. @@ -98,9 +98,8 @@ sample: system-default ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrestazure.azure_operation import AzureOperationPoller from azure.mgmt.rdbms.postgresql import PostgreSQLManagementClient @@ -140,7 +139,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_postgresqlconfiguration_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_postgresqlconfiguration_facts' module has been renamed to 'azure_rm_postgresqlconfiguration_info'", - version='2.13') + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_postgresqldatabase.py b/plugins/modules/azure_rm_postgresqldatabase.py index 672a2b2a20..f0c59e1216 100644 --- a/plugins/modules/azure_rm_postgresqldatabase.py +++ b/plugins/modules/azure_rm_postgresqldatabase.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_postgresqldatabase -version_added: "2.5" +version_added: "0.1.2" short_description: Manage PostgreSQL Database instance description: - Create, update and delete instance of PostgreSQL Database. @@ -89,9 +89,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from azure.mgmt.rdbms.postgresql import PostgreSQLManagementClient from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller diff --git a/plugins/modules/azure_rm_postgresqldatabase_info.py b/plugins/modules/azure_rm_postgresqldatabase_info.py index 0f6e58e255..78f5b07d23 100644 --- a/plugins/modules/azure_rm_postgresqldatabase_info.py +++ b/plugins/modules/azure_rm_postgresqldatabase_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_postgresqldatabase_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure PostgreSQL Database facts description: - Get facts of PostgreSQL Database. @@ -104,9 +104,8 @@ sample: English_United States.1252 ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from azure.mgmt.rdbms.postgresql import PostgreSQLManagementClient from msrest.serialization import Model @@ -143,7 +142,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_postgresqldatabase_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_postgresqldatabase_facts' module has been renamed to 'azure_rm_postgresqldatabase_info'", version='2.13') + self.module.deprecate("The 'azure_rm_postgresqldatabase_facts' module has been renamed to 'azure_rm_postgresqldatabase_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_postgresqlfirewallrule.py b/plugins/modules/azure_rm_postgresqlfirewallrule.py index 7482dbfa83..cc08e63ee9 100644 --- a/plugins/modules/azure_rm_postgresqlfirewallrule.py +++ b/plugins/modules/azure_rm_postgresqlfirewallrule.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_postgresqlfirewallrule -version_added: "2.8" +version_added: "0.1.2" short_description: Manage PostgreSQL firewall rule instance description: - Create, update and delete instance of PostgreSQL firewall rule. @@ -77,9 +77,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller from azure.mgmt.rdbms.postgresql import PostgreSQLManagementClient diff --git a/plugins/modules/azure_rm_postgresqlfirewallrule_info.py b/plugins/modules/azure_rm_postgresqlfirewallrule_info.py index 96ae0bbca3..f37ddedb91 100644 --- a/plugins/modules/azure_rm_postgresqlfirewallrule_info.py +++ b/plugins/modules/azure_rm_postgresqlfirewallrule_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_postgresqlfirewallrule_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure PostgreSQL Firewall Rule facts description: - Get facts of Azure PostgreSQL Firewall Rule. @@ -98,9 +98,8 @@ sample: 10.0.0.18 ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from azure.mgmt.rdbms.postgresql import PostgreSQLManagementClient from msrest.serialization import Model @@ -139,7 +138,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_postgresqlfirewallrule_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_postgresqlfirewallrule_facts' module has been renamed to 'azure_rm_postgresqlfirewallrule_info'", - version='2.13') + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_postgresqlserver.py b/plugins/modules/azure_rm_postgresqlserver.py index 3906418f75..0f48153df8 100644 --- a/plugins/modules/azure_rm_postgresqlserver.py +++ b/plugins/modules/azure_rm_postgresqlserver.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_postgresqlserver -version_added: "2.5" +version_added: "0.1.2" short_description: Manage PostgreSQL Server instance description: - Create, update and delete instance of PostgreSQL Server. @@ -139,9 +139,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from azure.mgmt.rdbms.postgresql import PostgreSQLManagementClient from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller diff --git a/plugins/modules/azure_rm_postgresqlserver_info.py b/plugins/modules/azure_rm_postgresqlserver_info.py index 69f6e03e23..f553a2a39e 100644 --- a/plugins/modules/azure_rm_postgresqlserver_info.py +++ b/plugins/modules/azure_rm_postgresqlserver_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_postgresqlserver_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure PostgreSQL Server facts description: - Get facts of PostgreSQL Server. @@ -154,9 +154,9 @@ sample: { tag1: abc } ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from azure.mgmt.rdbms.postgresql import PostgreSQLManagementClient from msrest.serialization import Model @@ -192,7 +192,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_postgresqlserver_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_postgresqlserver_facts' module has been renamed to 'azure_rm_postgresqlserver_info'", version='2.13') + self.module.deprecate("The 'azure_rm_postgresqlserver_facts' module has been renamed to 'azure_rm_postgresqlserver_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_privatednszone.py b/plugins/modules/azure_rm_privatednszone.py new file mode 100644 index 0000000000..5495124cec --- /dev/null +++ b/plugins/modules/azure_rm_privatednszone.py @@ -0,0 +1,231 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2020 Jose Angel Munoz, +# +# +# 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_privatednszone + +version_added: "0.0.1" + +short_description: Manage Azure private DNS zones + +description: + - Creates and deletes Azure private DNS zones. + +options: + resource_group: + description: + - Name of resource group. + type: str + required: true + name: + description: + - Name of the private DNS zone. + type: str + required: true + state: + description: + - Assert the state of the zone. Use C(present) to create or update and C(absent) to delete. + default: present + type: str + choices: + - absent + - present + +extends_documentation_fragment: + - azure.azcollection.azure + - azure.azcollection.azure_tags + +author: + - Jose Angel Munoz (@imjoseangel) +''' + +EXAMPLES = ''' + +- name: Create a private DNS zone + azure_rm_privatednszone: + resource_group: myResourceGroup + name: example.com + +- name: Delete a private DNS zone + azure_rm_privatednszone: + resource_group: myResourceGroup + name: example.com + state: absent + +''' + +RETURN = ''' +state: + description: + - Current state of the zone. + returned: always + type: dict + sample: { + "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroup/myResourceGroup", + "location": "global", + "name": "Testing", + "number_of_record_sets": 2, + "number_of_virtual_network_links": 0, + "number_of_virtual_network_links_with_registration": 0 + } + +''' + +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase, format_resource_id +from ansible.module_utils._text import to_native + +try: + from msrestazure.azure_exceptions import CloudError + from msrest.polling import LROPoller +except ImportError: + # This is handled in azure_rm_common + pass + + +class AzureRMPrivateDNSZone(AzureRMModuleBase): + def __init__(self): + + # define user inputs from playbook + self.module_arg_spec = dict(resource_group=dict(type='str', + required=True), + name=dict(type='str', required=True), + state=dict(choices=['present', 'absent'], + default='present', + type='str')) + + # store the results of the module operation + self.results = dict(changed=False, state=dict()) + + self.resource_group = None + self.name = None + self.state = None + self.tags = None + + super(AzureRMPrivateDNSZone, self).__init__(self.module_arg_spec, + supports_check_mode=True, + supports_tags=True) + + def exec_module(self, **kwargs): + + # create a new zone variable in case the 'try' doesn't find a zone + zone = None + for key in list(self.module_arg_spec.keys()) + ['tags']: + setattr(self, key, kwargs[key]) + + self.results['check_mode'] = self.check_mode + + # retrieve resource group to make sure it exists + self.get_resource_group(self.resource_group) + + changed = False + results = dict() + + try: + self.log('Fetching private DNS zone {0}'.format(self.name)) + zone = self.private_dns_client.private_zones.get( + self.resource_group, self.name) + + # serialize object into a dictionary + results = zone_to_dict(zone) + + # don't change anything if creating an existing zone, 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.state == 'absent': + changed = True + + except CloudError: + # the zone 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 + 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': + zone = self.private_dns_models.PrivateZone(tags=self.tags, + location='global') + self.results['state'] = self.create_or_update_zone(zone) + elif self.state == 'absent': + # delete zone + self.delete_zone() + # the delete does not actually return anything. if no exception, then we'll assume + # it worked. + self.results['state']['status'] = 'Deleted' + + return self.results + + def create_or_update_zone(self, zone): + try: + # create or update the new Zone object we created + new_zone = self.private_dns_client.private_zones.create_or_update( + self.resource_group, self.name, zone) + + if isinstance(new_zone, LROPoller): + new_zone = self.get_poller_result(new_zone) + + except Exception as exc: + self.fail("Error creating or updating zone {0} - {1}".format( + self.name, exc.message or str(exc))) + return zone_to_dict(new_zone) + + def delete_zone(self): + try: + # delete the Zone + poller = self.private_dns_client.private_zones.delete( + self.resource_group, self.name) + result = self.get_poller_result(poller) + except Exception as exc: + self.fail("Error deleting zone {0} - {1}".format( + self.name, exc.message or str(exc))) + return result + + +def zone_to_dict(zone): + # turn Zone object into a dictionary (serialization) + result = dict( + id=zone.id, + name=zone.name, + number_of_record_sets=zone.number_of_record_sets, + number_of_virtual_network_links=zone.number_of_virtual_network_links, + number_of_virtual_network_links_with_registration=zone. + number_of_virtual_network_links_with_registration, + tags=zone.tags) + return result + + +def main(): + AzureRMPrivateDNSZone() + + +if __name__ == '__main__': + main() diff --git a/plugins/modules/azure_rm_privatednszone_info.py b/plugins/modules/azure_rm_privatednszone_info.py new file mode 100644 index 0000000000..f6636c17eb --- /dev/null +++ b/plugins/modules/azure_rm_privatednszone_info.py @@ -0,0 +1,251 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2020 Jose Angel Munoz, +# +# +# 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_privatednszone_info + +version_added: "0.0.1" + +short_description: Get private DNS zone facts + +description: + - Get facts for a specific private DNS zone or all private DNS zones within a resource group. + +options: + resource_group: + description: + - Limit results by resource group. Required when filtering by name. + type: str + name: + description: + - Only show results for a specific zone. + type: str + tags: + description: + - Limit results by providing a list of tags. Format tags as 'key' or 'key:value'. + type: list + +extends_documentation_fragment: + - azure.azcollection.azure + - azure.azcollection.azure_tags + +author: + - Jose Angel Munoz (@imjoseangel) + +''' + +EXAMPLES = ''' +- name: Get facts for one zone + azure_rm_privatednszone_info: + resource_group: myResourceGroup + name: foobar22 + +- name: Get facts for all zones in a resource group + azure_rm_privatednszone_info: + resource_group: myResourceGroup + +- name: Get facts for privatednszone with tags + azure_rm_privatednszone_info: + tags: + - testing + - foo:bar +''' + +RETURN = ''' +azure_privatednszones: + description: + - List of private zone dicts. + returned: always + type: list + example: [{ + "etag": "00000002-0000-0000-0dcb-df5776efd201", + "location": "global", + "properties": { + "maxNumberOfRecordSets": 5000, + "number_of_virtual_network_links": 0, + "number_of_virtual_network_links_with_registration": 0 + }, + "tags": {} + }] +privatednszones: + description: + - List of private zone dicts, which share the same layout as azure_rm_privatednszone module parameter. + returned: always + type: list + contains: + id: + description: + - id of the private DNS Zone. + sample: "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Network/privatednszones/azure.com" + type: str + name: + description: + - name of the private DNS zone. + sample: azure.com + type: str + number_of_record_sets: + description: + - The current number of record sets in this private DNS zone. + type: int + sample: 2 + number_of_virtual_network_links: + description: + - The current number of network links in this private DNS zone. + type: int + sample: 0 + number_of_virtual_network_links_with_registration: + description: + - The current number of network links with registration in this private DNS zone. + type: int + sample: 0 +''' + +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase +from ansible.module_utils._text import to_native + +try: + from msrestazure.azure_exceptions import CloudError + from azure.common import AzureMissingResourceHttpError, AzureHttpError +except Exception: + # This is handled in azure_rm_common + pass + +AZURE_OBJECT_CLASS = 'PrivateDnsZone' + + +class AzurePrivateRMDNSZoneInfo(AzureRMModuleBase): + def __init__(self): + + # define user inputs into argument + self.module_arg_spec = dict(name=dict(type='str'), + resource_group=dict(type='str'), + tags=dict(type='list')) + + # store the results of the module operation + self.results = dict(changed=False, + ansible_info=dict(azure_privatednszones=[])) + + self.name = None + self.resource_group = None + self.tags = None + + super(AzurePrivateRMDNSZoneInfo, self).__init__(self.module_arg_spec) + + def exec_module(self, **kwargs): + + is_old_facts = self.module._name == 'azure_rm_privatednszone_facts' + if is_old_facts: + self.module.deprecate( + "The 'azure_rm_privatednszone_facts' module has been renamed to 'azure_rm_privatednszone_info'", + version=(2.9, )) + + for key in self.module_arg_spec: + setattr(self, key, kwargs[key]) + + if self.name and not self.resource_group: + self.fail( + "Parameter error: resource group required when filtering by name." + ) + + results = [] + # list the conditions and what to return based on user input + if self.name is not None: + # if there is a name, facts about that specific zone + results = self.get_item() + elif self.resource_group: + # all the zones listed in that specific resource group + results = self.list_resource_group() + else: + # all the zones in a subscription + results = self.list_items() + + self.results['ansible_info'][ + 'azure_privatednszones'] = self.serialize_items(results) + self.results['privatednszones'] = self.curated_items(results) + + return self.results + + def get_item(self): + self.log('Get properties for {0}'.format(self.name)) + item = None + results = [] + # get specific zone + try: + item = self.private_dns_client.private_zones.get( + self.resource_group, self.name) + except CloudError: + pass + + # serialize result + if item and self.has_tags(item.tags, self.tags): + results = [item] + return results + + def list_resource_group(self): + self.log('List items for resource group') + try: + response = self.private_dns_client.private_zones.list_by_resource_group( + self.resource_group) + except AzureHttpError as exc: + self.fail("Failed to list for resource group {0} - {1}".format( + self.resource_group, str(exc))) + + results = [] + for item in response: + if self.has_tags(item.tags, self.tags): + results.append(item) + return results + + def list_items(self): + self.log('List all items') + try: + response = self.private_dns_client.private_zones.list() + except AzureHttpError as exc: + self.fail("Failed to list all items - {0}".format(str(exc))) + + results = [] + for item in response: + if self.has_tags(item.tags, self.tags): + results.append(item) + return results + + def serialize_items(self, raws): + return [self.serialize_obj(item, AZURE_OBJECT_CLASS) + for item in raws] if raws else [] + + def curated_items(self, raws): + return [self.zone_to_dict(item) for item in raws] if raws else [] + + def zone_to_dict(self, zone): + return dict(id=zone.id, + name=zone.name, + number_of_record_sets=zone.number_of_record_sets, + number_of_virtual_network_links=zone. + number_of_virtual_network_links, + number_of_virtual_network_links_with_registration=zone. + number_of_virtual_network_links_with_registration, + tags=zone.tags) + + +def main(): + AzurePrivateRMDNSZoneInfo() + + +if __name__ == '__main__': + main() diff --git a/plugins/modules/azure_rm_publicipaddress.py b/plugins/modules/azure_rm_publicipaddress.py index 567029b187..0c450851c5 100644 --- a/plugins/modules/azure_rm_publicipaddress.py +++ b/plugins/modules/azure_rm_publicipaddress.py @@ -18,7 +18,7 @@ --- module: azure_rm_publicipaddress -version_added: "2.1" +version_added: "0.1.0" short_description: Manage Azure Public IP Addresses @@ -65,12 +65,13 @@ sku: description: - The public IP address SKU. + - When I(version=ipv6), if I(sku=standard) then set I(allocation_method=static). + - When I(version=ipv4), if I(sku=standard) then set I(allocation_method=static). choices: - basic - standard - Basic - Standard - version_added: "2.6" ip_tags: description: - List of IpTag associated with the public IP address. @@ -82,12 +83,10 @@ value: description: - Sets the ip_tags value. - version_added: "2.8" idle_timeout: description: - Idle timeout in minutes. type: int - version_added: "2.8" version: description: - The public IP address version. @@ -95,7 +94,6 @@ - ipv4 - ipv6 default: ipv4 - version_added: "2.8" extends_documentation_fragment: - azure.azcollection.azure @@ -369,7 +367,7 @@ def exec_module(self, **kwargs): pip = self.network_models.PublicIPAddress( location=self.location, public_ip_address_version=self.version, - public_ip_allocation_method=self.allocation_method if self.version == 'IPv4' else None, + public_ip_allocation_method=self.allocation_method, sku=self.network_models.PublicIPAddressSku(name=self.sku) if self.sku else None, idle_timeout_in_minutes=self.idle_timeout if self.idle_timeout and self.idle_timeout > 0 else None ) diff --git a/plugins/modules/azure_rm_publicipaddress_info.py b/plugins/modules/azure_rm_publicipaddress_info.py index 16bd1bcd51..bc3561e612 100644 --- a/plugins/modules/azure_rm_publicipaddress_info.py +++ b/plugins/modules/azure_rm_publicipaddress_info.py @@ -18,7 +18,7 @@ --- module: azure_rm_publicipaddress_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get public IP facts @@ -220,7 +220,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_publicipaddress_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_publicipaddress_facts' module has been renamed to 'azure_rm_publicipaddress_info'", version='2.13') + self.module.deprecate("The 'azure_rm_publicipaddress_facts' module has been renamed to 'azure_rm_publicipaddress_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_rediscache.py b/plugins/modules/azure_rm_rediscache.py index 96dd3a81d5..f1bf074529 100644 --- a/plugins/modules/azure_rm_rediscache.py +++ b/plugins/modules/azure_rm_rediscache.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_rediscache -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Cache for Redis instance description: - Create, update and delete instance of Azure Cache for Redis. @@ -219,9 +219,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrestazure.azure_operation import AzureOperationPoller from msrest.polling import LROPoller diff --git a/plugins/modules/azure_rm_rediscache_info.py b/plugins/modules/azure_rm_rediscache_info.py index 84c2a7ac7f..c18008870d 100644 --- a/plugins/modules/azure_rm_rediscache_info.py +++ b/plugins/modules/azure_rm_rediscache_info.py @@ -16,7 +16,7 @@ --- module: azure_rm_rediscache_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Cache for Redis instance facts @@ -189,9 +189,8 @@ sample: X2xXXxx7xxxxxx5xxxx0xxxxx75xxxxxxxxXXXxxxxx= ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase - try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from azure.common import AzureHttpError from azure.mgmt.redis import RedisManagementClient from msrestazure.azure_exceptions import CloudError @@ -241,7 +240,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_rediscache_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_rediscache_facts' module has been renamed to 'azure_rm_rediscache_info'", version='2.13') + self.module.deprecate("The 'azure_rm_rediscache_facts' module has been renamed to 'azure_rm_rediscache_info'", version=(2.9, )) for key in self.module_args: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_rediscachefirewallrule.py b/plugins/modules/azure_rm_rediscachefirewallrule.py index fba6bc9036..db4c2833cc 100644 --- a/plugins/modules/azure_rm_rediscachefirewallrule.py +++ b/plugins/modules/azure_rm_rediscachefirewallrule.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_rediscachefirewallrule -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Cache for Redis Firewall rules description: - Create, update and delete Azure Cache for Redis Firewall rules. @@ -86,9 +86,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrest.polling import LROPoller from msrestazure.azure_operation import AzureOperationPoller diff --git a/plugins/modules/azure_rm_resource.py b/plugins/modules/azure_rm_resource.py index ae5117af6d..5094c30919 100644 --- a/plugins/modules/azure_rm_resource.py +++ b/plugins/modules/azure_rm_resource.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_resource -version_added: "2.6" +version_added: "0.1.2" short_description: Create any Azure resource description: - Create, update or delete any Azure resource using Azure REST API. @@ -89,13 +89,11 @@ - If enabled, idempotency check will be done by using I(method=GET) first and then comparing with I(body). default: 0 type: int - version_added: "2.8" polling_interval: description: - If enabled, idempotency check will be done by using I(method=GET) first and then comparing with I(body). default: 60 type: int - version_added: "2.8" state: description: - Assert the state of the resource. Use C(present) to create or update resource or C(absent) to delete resource. diff --git a/plugins/modules/azure_rm_resource_info.py b/plugins/modules/azure_rm_resource_info.py index 34b9420689..4983471d58 100644 --- a/plugins/modules/azure_rm_resource_info.py +++ b/plugins/modules/azure_rm_resource_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_resource_info -version_added: "2.9" +version_added: "0.1.2" short_description: Generic facts of Azure resources description: - Obtain facts of any resource using Azure REST API. @@ -336,7 +336,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_resource_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_resource_facts' module has been renamed to 'azure_rm_resource_info'", version='2.13') + self.module.deprecate("The 'azure_rm_resource_facts' module has been renamed to 'azure_rm_resource_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_resourcegroup.py b/plugins/modules/azure_rm_resourcegroup.py index 456d48a73c..baac1abe48 100644 --- a/plugins/modules/azure_rm_resourcegroup.py +++ b/plugins/modules/azure_rm_resourcegroup.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_resourcegroup -version_added: "2.1" +version_added: "0.1.2" short_description: Manage Azure resource groups description: - Create, update and delete a resource group. diff --git a/plugins/modules/azure_rm_resourcegroup_info.py b/plugins/modules/azure_rm_resourcegroup_info.py index 94669a2bf5..949493b040 100644 --- a/plugins/modules/azure_rm_resourcegroup_info.py +++ b/plugins/modules/azure_rm_resourcegroup_info.py @@ -18,7 +18,7 @@ --- module: azure_rm_resourcegroup_info -version_added: "2.1" +version_added: "0.1.2" short_description: Get resource group facts @@ -36,7 +36,6 @@ description: - List all resources under the resource group. - Note this will cost network overhead for each resource group. Suggest use this when I(name) set. - version_added: "2.8" extends_documentation_fragment: - azure.azcollection.azure @@ -168,7 +167,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_resourcegroup_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_resourcegroup_facts' module has been renamed to 'azure_rm_resourcegroup_info'", version='2.13') + self.module.deprecate("The 'azure_rm_resourcegroup_facts' module has been renamed to 'azure_rm_resourcegroup_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_roleassignment.py b/plugins/modules/azure_rm_roleassignment.py index a70d09e688..24cb5ff2d7 100644 --- a/plugins/modules/azure_rm_roleassignment.py +++ b/plugins/modules/azure_rm_roleassignment.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_roleassignment -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Role Assignment description: - Create and delete instance of Azure Role Assignment. @@ -83,9 +83,9 @@ ''' import uuid -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrestazure.azure_operation import AzureOperationPoller from msrest.serialization import Model @@ -225,6 +225,7 @@ def create_roleassignment(self): self.log("Creating role assignment {0}".format(self.name)) try: + # pylint: disable=missing-kwoa parameters = RoleAssignmentCreateParameters(role_definition_id=self.role_definition_id, principal_id=self.assignee_object_id) response = self._client.role_assignments.create(scope=self.scope, role_assignment_name=self.name, diff --git a/plugins/modules/azure_rm_roleassignment_info.py b/plugins/modules/azure_rm_roleassignment_info.py index a87784a743..e99414e827 100644 --- a/plugins/modules/azure_rm_roleassignment_info.py +++ b/plugins/modules/azure_rm_roleassignment_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_roleassignment_info -version_added: "2.9" +version_added: "0.1.2" short_description: Gets Azure Role Assignment facts description: - Gets facts of Azure Role Assignment. @@ -104,9 +104,9 @@ ''' import time -from ansible.module_utils.azure_rm_common import AzureRMModuleBase try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrest.serialization import Model from azure.mgmt.authorization import AuthorizationManagementClient @@ -166,7 +166,7 @@ def exec_module(self, **kwargs): """Main module execution method""" is_old_facts = self.module._name == 'azure_rm_roleassignment_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_roleassignment_facts' module has been renamed to 'azure_rm_roleassignment_info'", version='2.13') + self.module.deprecate("The 'azure_rm_roleassignment_facts' module has been renamed to 'azure_rm_roleassignment_info'", version=(2.9, )) for key in list(self.module_arg_spec.keys()): if hasattr(self, key): diff --git a/plugins/modules/azure_rm_roledefinition.py b/plugins/modules/azure_rm_roledefinition.py index a49e510ea0..e5bb3eade3 100644 --- a/plugins/modules/azure_rm_roledefinition.py +++ b/plugins/modules/azure_rm_roledefinition.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_roledefinition -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Role Definition description: - Create, update and delete instance of Azure Role Definition. @@ -97,10 +97,10 @@ ''' import uuid -from ansible.module_utils.azure_rm_common import AzureRMModuleBase from ansible.module_utils._text import to_native try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrestazure.azure_operation import AzureOperationPoller from msrest.polling import LROPoller @@ -284,7 +284,7 @@ def build_scope(self): # check update def check_update(self, old_definition): - if self.description and self.description != old_definition['properties']['description']: + if self.description and self.description != old_definition['description']: return True if self.permissions: if len(self.permissions) != len(old_definition['permissions']): diff --git a/plugins/modules/azure_rm_roledefinition_info.py b/plugins/modules/azure_rm_roledefinition_info.py index 1aee269c40..948854f924 100644 --- a/plugins/modules/azure_rm_roledefinition_info.py +++ b/plugins/modules/azure_rm_roledefinition_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_roledefinition_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Role Definition facts description: - Get facts of Azure Role Definition. @@ -120,10 +120,10 @@ sample: [ 'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write' ] ''' -from ansible.module_utils.azure_rm_common import AzureRMModuleBase from ansible.module_utils._text import to_native try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError from msrest.serialization import Model from azure.mgmt.authorization import AuthorizationManagementClient @@ -184,7 +184,7 @@ def exec_module(self, **kwargs): """Main module execution method""" is_old_facts = self.module._name == 'azure_rm_roledefinition_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_roledefinition_facts' module has been renamed to 'azure_rm_roledefinition_info'", version='2.13') + self.module.deprecate("The 'azure_rm_roledefinition_facts' module has been renamed to 'azure_rm_roledefinition_info'", version=(2.9, )) for key in list(self.module_arg_spec.keys()): if hasattr(self, key): diff --git a/plugins/modules/azure_rm_route.py b/plugins/modules/azure_rm_route.py index 5d4d125e65..60d687f0e0 100644 --- a/plugins/modules/azure_rm_route.py +++ b/plugins/modules/azure_rm_route.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_route -version_added: "2.7" +version_added: "0.1.2" short_description: Manage Azure route resource description: - Create, update or delete a route. @@ -94,12 +94,12 @@ ''' try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError except ImportError: # This is handled in azure_rm_common pass -from ansible.module_utils.azure_rm_common import AzureRMModuleBase from ansible.module_utils.common.dict_transformations import _snake_to_camel diff --git a/plugins/modules/azure_rm_routetable.py b/plugins/modules/azure_rm_routetable.py index 3705494784..5f0722d267 100644 --- a/plugins/modules/azure_rm_routetable.py +++ b/plugins/modules/azure_rm_routetable.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_routetable -version_added: "2.7" +version_added: "0.1.2" short_description: Manage Azure route table resource description: - Create, update or delete a route table. diff --git a/plugins/modules/azure_rm_routetable_info.py b/plugins/modules/azure_rm_routetable_info.py index 3722a7ebdd..2586a0eeab 100644 --- a/plugins/modules/azure_rm_routetable_info.py +++ b/plugins/modules/azure_rm_routetable_info.py @@ -17,7 +17,7 @@ --- module: azure_rm_routetable_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get route table facts @@ -169,7 +169,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_routetable_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_routetable_facts' module has been renamed to 'azure_rm_routetable_info'", version='2.13') + self.module.deprecate("The 'azure_rm_routetable_facts' module has been renamed to 'azure_rm_routetable_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_securitygroup.py b/plugins/modules/azure_rm_securitygroup.py index b2a1b4be41..4ab492e264 100644 --- a/plugins/modules/azure_rm_securitygroup.py +++ b/plugins/modules/azure_rm_securitygroup.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_securitygroup -version_added: "2.1" +version_added: "0.1.0" short_description: Manage Azure network security groups description: - Create, update or delete a network security group. diff --git a/plugins/modules/azure_rm_securitygroup_info.py b/plugins/modules/azure_rm_securitygroup_info.py index 55944f802a..ca73992aa7 100644 --- a/plugins/modules/azure_rm_securitygroup_info.py +++ b/plugins/modules/azure_rm_securitygroup_info.py @@ -18,7 +18,7 @@ --- module: azure_rm_securitygroup_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get security group facts @@ -261,7 +261,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_securitygroup_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_securitygroup_facts' module has been renamed to 'azure_rm_securitygroup_info'", version='2.13') + self.module.deprecate("The 'azure_rm_securitygroup_facts' module has been renamed to 'azure_rm_securitygroup_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_servicebus.py b/plugins/modules/azure_rm_servicebus.py index 828691b378..a310da2ae7 100644 --- a/plugins/modules/azure_rm_servicebus.py +++ b/plugins/modules/azure_rm_servicebus.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_servicebus -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Service Bus description: - Create, update or delete an Azure Service Bus namespaces. @@ -73,12 +73,12 @@ ''' try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError except ImportError: # This is handled in azure_rm_common pass -from ansible.module_utils.azure_rm_common import AzureRMModuleBase from ansible.module_utils.common.dict_transformations import _snake_to_camel, _camel_to_snake from ansible.module_utils._text import to_native from datetime import datetime, timedelta diff --git a/plugins/modules/azure_rm_servicebus_info.py b/plugins/modules/azure_rm_servicebus_info.py index d7670f4fcf..3a39a81514 100644 --- a/plugins/modules/azure_rm_servicebus_info.py +++ b/plugins/modules/azure_rm_servicebus_info.py @@ -17,7 +17,7 @@ --- module: azure_rm_servicebus_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get servicebus facts @@ -378,12 +378,12 @@ ''' try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase, azure_id_to_dict from msrestazure.azure_exceptions import CloudError except Exception: # This is handled in azure_rm_common pass -from ansible.module_utils.azure_rm_common import AzureRMModuleBase, azure_id_to_dict from ansible.module_utils.common.dict_transformations import _camel_to_snake from ansible.module_utils._text import to_native from datetime import datetime, timedelta @@ -443,7 +443,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_servicebus_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_servicebus_facts' module has been renamed to 'azure_rm_servicebus_info'", version='2.13') + self.module.deprecate("The 'azure_rm_servicebus_facts' module has been renamed to 'azure_rm_servicebus_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_servicebusqueue.py b/plugins/modules/azure_rm_servicebusqueue.py index 2283aa5ef0..390d4de37d 100644 --- a/plugins/modules/azure_rm_servicebusqueue.py +++ b/plugins/modules/azure_rm_servicebusqueue.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_servicebusqueue -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Service Bus queue description: - Create, update or delete an Azure Service Bus queue. @@ -138,12 +138,12 @@ ''' try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError except ImportError: # This is handled in azure_rm_common pass -from ansible.module_utils.azure_rm_common import AzureRMModuleBase from ansible.module_utils.common.dict_transformations import _snake_to_camel, _camel_to_snake from ansible.module_utils._text import to_native from datetime import datetime, timedelta diff --git a/plugins/modules/azure_rm_servicebussaspolicy.py b/plugins/modules/azure_rm_servicebussaspolicy.py index 46d7fe8ffe..618c230bf1 100644 --- a/plugins/modules/azure_rm_servicebussaspolicy.py +++ b/plugins/modules/azure_rm_servicebussaspolicy.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_servicebussaspolicy -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Service Bus SAS policy description: - Create, update or delete an Azure Service Bus SAS policy. @@ -154,12 +154,12 @@ ''' try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError except ImportError: # This is handled in azure_rm_common pass -from ansible.module_utils.azure_rm_common import AzureRMModuleBase from ansible.module_utils.common.dict_transformations import _snake_to_camel, _camel_to_snake from ansible.module_utils._text import to_native from datetime import datetime, timedelta diff --git a/plugins/modules/azure_rm_servicebustopic.py b/plugins/modules/azure_rm_servicebustopic.py index ecf99cd2eb..2c6aa30e70 100644 --- a/plugins/modules/azure_rm_servicebustopic.py +++ b/plugins/modules/azure_rm_servicebustopic.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_servicebustopic -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Service Bus description: - Create, update or delete an Azure Service Bus topics. @@ -118,12 +118,12 @@ ''' try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError except ImportError: # This is handled in azure_rm_common pass -from ansible.module_utils.azure_rm_common import AzureRMModuleBase from ansible.module_utils.common.dict_transformations import _snake_to_camel, _camel_to_snake from ansible.module_utils._text import to_native from datetime import datetime, timedelta diff --git a/plugins/modules/azure_rm_servicebustopicsubscription.py b/plugins/modules/azure_rm_servicebustopicsubscription.py index 3b8480eaad..81b798894f 100644 --- a/plugins/modules/azure_rm_servicebustopicsubscription.py +++ b/plugins/modules/azure_rm_servicebustopicsubscription.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_servicebustopicsubscription -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Service Bus subscription description: - Create, update or delete an Azure Service Bus subscriptions. @@ -131,12 +131,12 @@ ''' try: + from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase from msrestazure.azure_exceptions import CloudError except ImportError: # This is handled in azure_rm_common pass -from ansible.module_utils.azure_rm_common import AzureRMModuleBase from ansible.module_utils.common.dict_transformations import _snake_to_camel, _camel_to_snake from ansible.module_utils._text import to_native from datetime import datetime, timedelta diff --git a/plugins/modules/azure_rm_snapshot.py b/plugins/modules/azure_rm_snapshot.py index 0c8d0f2421..4a4ed531ef 100644 --- a/plugins/modules/azure_rm_snapshot.py +++ b/plugins/modules/azure_rm_snapshot.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_snapshot -version_added: '2.9' +version_added: "0.1.2" short_description: Manage Azure Snapshot instance. description: - Create, update and delete instance of Azure Snapshot. diff --git a/plugins/modules/azure_rm_sqldatabase.py b/plugins/modules/azure_rm_sqldatabase.py index 5e51bf12eb..4a5520635c 100644 --- a/plugins/modules/azure_rm_sqldatabase.py +++ b/plugins/modules/azure_rm_sqldatabase.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_sqldatabase -version_added: "2.5" +version_added: "0.1.2" short_description: Manage SQL Database instance description: - Create, update and delete instance of SQL Database. diff --git a/plugins/modules/azure_rm_sqldatabase_info.py b/plugins/modules/azure_rm_sqldatabase_info.py index 4d03a05ddc..7a8ad89270 100644 --- a/plugins/modules/azure_rm_sqldatabase_info.py +++ b/plugins/modules/azure_rm_sqldatabase_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_sqldatabase_info -version_added: "2.8" +version_added: "0.1.2" short_description: Get Azure SQL Database facts description: - Get facts of Azure SQL Database. @@ -195,7 +195,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_sqldatabase_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_sqldatabase_facts' module has been renamed to 'azure_rm_sqldatabase_info'", version='2.13') + self.module.deprecate("The 'azure_rm_sqldatabase_facts' module has been renamed to 'azure_rm_sqldatabase_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_sqlfirewallrule.py b/plugins/modules/azure_rm_sqlfirewallrule.py index 6031059487..2d875befe4 100644 --- a/plugins/modules/azure_rm_sqlfirewallrule.py +++ b/plugins/modules/azure_rm_sqlfirewallrule.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_sqlfirewallrule -version_added: "2.7" +version_added: "0.1.2" short_description: Manage Firewall Rule instance description: - Create, update and delete instance of Firewall Rule. diff --git a/plugins/modules/azure_rm_sqlfirewallrule_info.py b/plugins/modules/azure_rm_sqlfirewallrule_info.py index 569264dd77..1202eb0be5 100644 --- a/plugins/modules/azure_rm_sqlfirewallrule_info.py +++ b/plugins/modules/azure_rm_sqlfirewallrule_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_sqlfirewallrule_info -version_added: "2.8" +version_added: "0.1.2" short_description: Get Azure SQL Firewall Rule facts description: - Get facts of SQL Firewall Rule. @@ -141,7 +141,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_sqlfirewallrule_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_sqlfirewallrule_facts' module has been renamed to 'azure_rm_sqlfirewallrule_info'", version='2.13') + self.module.deprecate("The 'azure_rm_sqlfirewallrule_facts' module has been renamed to 'azure_rm_sqlfirewallrule_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_sqlserver.py b/plugins/modules/azure_rm_sqlserver.py index 43295d67a5..4d0111fffe 100644 --- a/plugins/modules/azure_rm_sqlserver.py +++ b/plugins/modules/azure_rm_sqlserver.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_sqlserver -version_added: "2.5" +version_added: "0.1.2" short_description: Manage SQL Server instance description: - Create, update and delete instance of SQL Server. diff --git a/plugins/modules/azure_rm_sqlserver_info.py b/plugins/modules/azure_rm_sqlserver_info.py index 686d3436ba..236a95cdad 100644 --- a/plugins/modules/azure_rm_sqlserver_info.py +++ b/plugins/modules/azure_rm_sqlserver_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_sqlserver_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get SQL Server facts description: - Get facts of SQL Server. @@ -146,7 +146,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_sqlserver_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_sqlserver_facts' module has been renamed to 'azure_rm_sqlserver_info'", version='2.13') + self.module.deprecate("The 'azure_rm_sqlserver_facts' module has been renamed to 'azure_rm_sqlserver_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_storageaccount.py b/plugins/modules/azure_rm_storageaccount.py index 1ad2411453..aff5bd18da 100644 --- a/plugins/modules/azure_rm_storageaccount.py +++ b/plugins/modules/azure_rm_storageaccount.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_storageaccount -version_added: "2.1" +version_added: "0.1.0" short_description: Manage Azure storage accounts description: - Create, update or delete a storage account. @@ -75,14 +75,12 @@ - BlobStorage - BlockBlobStorage - FileStorage - version_added: "2.2" access_tier: description: - The access tier for this storage account. Required when I(kind=BlobStorage). choices: - Hot - Cool - version_added: "2.4" force_delete_nonempty: description: - Attempt deletion if resource already exists and cannot be updated. @@ -91,14 +89,30 @@ - force https_only: description: - - Allows https traffic only to storage service when set to C(true). + - Allows https traffic only to storage service when set to C(true). + - Allows update storage account property when set to C(False). + - Default value is C(False). type: bool - version_added: "2.8" + minimum_tls_version: + description: + - The minimum required version of Transport Layer Security (TLS) for requests to a storage account. + - Default value is C(TLS1_0). + choices: + - TLS1_0 + - TLS1_1 + - TLS1_2 + version_added: "1.0.0" + allow_blob_public_access: + description: + - Allows blob containers in account to be set for anonymous public access. + - If set to false, no containers in this account will be able to allow anonymous public access. + - Default value is C(True). + type: bool + version_added: "1.1.0" network_acls: description: - Manages the Firewall and virtual networks settings of the storage account. type: dict - version_added: "2.10" suboptions: default_action: description: @@ -145,7 +159,6 @@ - If no blob_cors elements are included in the argument list, nothing about CORS will be changed. - If you want to delete all CORS rules and disable CORS for the Blob service, explicitly set I(blob_cors=[]). type: list - version_added: "2.8" suboptions: allowed_origins: description: @@ -448,7 +461,9 @@ def __init__(self): tags=dict(type='dict'), kind=dict(type='str', default='Storage', choices=['Storage', 'StorageV2', 'BlobStorage', 'FileStorage', 'BlockBlobStorage']), access_tier=dict(type='str', choices=['Hot', 'Cool']), - https_only=dict(type='bool', default=False), + https_only=dict(type='bool'), + minimum_tls_version=dict(type='str', choices=['TLS1_0', 'TLS1_1', 'TLS1_2']), + allow_blob_public_access=dict(type='bool'), network_acls=dict(type='dict'), blob_cors=dict(type='list', options=cors_rule_spec, elements='dict') ) @@ -470,6 +485,8 @@ def __init__(self): self.kind = None self.access_tier = None self.https_only = None + self.minimum_tls_version = None + self.allow_blob_public_access = None self.network_acls = None self.blob_cors = None @@ -558,8 +575,8 @@ def account_obj_to_dict(self, account_obj, blob_service_props=None): type=account_obj.type, access_tier=(account_obj.access_tier.value if account_obj.access_tier is not None else None), - sku_tier=account_obj.sku.tier.value, - sku_name=account_obj.sku.name.value, + sku_tier=account_obj.sku.tier, + sku_name=account_obj.sku.name, provisioning_state=account_obj.provisioning_state.value, secondary_location=account_obj.secondary_location, status_of_primary=(account_obj.status_of_primary.value @@ -568,6 +585,8 @@ def account_obj_to_dict(self, account_obj, blob_service_props=None): if account_obj.status_of_secondary is not None else None), primary_location=account_obj.primary_location, https_only=account_obj.enable_https_traffic_only, + minimum_tls_version=account_obj.minimum_tls_version, + allow_blob_public_access=account_obj.allow_blob_public_access, network_acls=account_obj.network_rule_set ) account_dict['custom_domain'] = None @@ -643,8 +662,7 @@ def update_account(self): self.update_network_rule_set() if self.network_acls.get('default_action', 'Allow') == 'Deny': - if sorted(self.network_acls['bypass'].replace(" ',' ").split(',')) != \ - sorted(self.account_dict['network_acls']['bypass'].replace(" ',' ").split(',')): + if self.network_acls['bypass'] != self.account_dict['network_acls']['bypass']: self.results['changed'] = True self.account_dict['network_acls']['bypass'] = self.network_acls['bypass'] self.update_network_rule_set() @@ -669,7 +687,7 @@ def update_account(self): self.results['changed'] = True self.update_network_rule_set() - if bool(self.https_only) != bool(self.account_dict.get('https_only')): + if self.https_only is not None and bool(self.https_only) != bool(self.account_dict.get('https_only')): self.results['changed'] = True self.account_dict['https_only'] = self.https_only if not self.check_mode: @@ -681,6 +699,31 @@ def update_account(self): except Exception as exc: self.fail("Failed to update account type: {0}".format(str(exc))) + if self.minimum_tls_version is not None and self.minimum_tls_version != self.account_dict.get('minimum_tls_version'): + self.results['changed'] = True + self.account_dict['minimum_tls_version'] = self.minimum_tls_version + if not self.check_mode: + try: + parameters = self.storage_models.StorageAccountUpdateParameters(minimum_tls_version=self.minimum_tls_version) + self.storage_client.storage_accounts.update(self.resource_group, + self.name, + parameters) + except Exception as exc: + self.fail("Failed to update account type: {0}".format(str(exc))) + + if self.allow_blob_public_access is not None: + if bool(self.allow_blob_public_access) != bool(self.account_dict.get('allow_blob_public_access')): + self.results['changed'] = True + self.account_dict['allow_blob_public_access'] = self.allow_blob_public_access + if not self.check_mode: + try: + parameters = self.storage_models.StorageAccountUpdateParameters(allow_blob_public_access=self.allow_blob_public_access) + self.storage_client.storage_accounts.update(self.resource_group, + self.name, + parameters) + except Exception as exc: + self.fail("Failed to update account type: {0}".format(str(exc))) + if self.account_type: if self.account_type != self.account_dict['sku_name']: # change the account type @@ -772,6 +815,8 @@ def create_account(self): name=self.name, resource_group=self.resource_group, enable_https_traffic_only=self.https_only, + minimum_tls_version=self.minimum_tls_version, + allow_blob_public_access=self.allow_blob_public_access, networks_acls=dict(), tags=dict() ) @@ -782,14 +827,23 @@ def create_account(self): if self.blob_cors: account_dict['blob_cors'] = self.blob_cors return account_dict + if bool(self.https_only): + self.https_only = False + if bool(self.minimum_tls_version): + self.minimum_tls_version = 'TLS1_0' + if bool(self.allow_blob_public_access): + self.allow_blob_public_access = True sku = self.storage_models.Sku(name=self.storage_models.SkuName(self.account_type)) sku.tier = self.storage_models.SkuTier.standard if 'Standard' in self.account_type else \ self.storage_models.SkuTier.premium + # pylint: disable=missing-kwoa parameters = self.storage_models.StorageAccountCreateParameters(sku=sku, kind=self.kind, location=self.location, tags=self.tags, enable_https_traffic_only=self.https_only, + minimum_tls_version=self.minimum_tls_version, + allow_blob_public_access=self.allow_blob_public_access, access_tier=self.access_tier) self.log(str(parameters)) try: diff --git a/plugins/modules/azure_rm_storageaccount_info.py b/plugins/modules/azure_rm_storageaccount_info.py index f85f6a9541..c1e83b0946 100644 --- a/plugins/modules/azure_rm_storageaccount_info.py +++ b/plugins/modules/azure_rm_storageaccount_info.py @@ -18,7 +18,7 @@ --- module: azure_rm_storageaccount_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get storage account facts @@ -43,13 +43,11 @@ - For convenient usage, C(show_connection_string) will also show the access keys for each of the storageaccount's endpoints. - Note that it will cost a lot of time when list all storageaccount rather than query a single one. type: bool - version_added: "2.8" show_blob_cors: description: - Show the blob CORS settings for each blob related to the storage account. - Querying all storage accounts will take a long time. type: bool - version_added: "2.8" extends_documentation_fragment: - azure.azcollection.azure @@ -233,7 +231,7 @@ sample: eastus primary_endpoints: description: - - URLs to retrieve a public I(blob), I(queue), or I(table) object. + - URLs to retrieve a public I(blob), I(file), I(queue), or I(table) object. - Note that C(Standard_ZRS) and C(Premium_LRS) accounts only return the blob endpoint. returned: always type: complex @@ -256,6 +254,24 @@ returned: always type: str sample: "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=X;AccountKey=X;BlobEndpoint=X" + file: + description: + - The primary file endpoint and connection string. + returned: always + type: complex + contains: + endpoint: + description: + - The primary file endpoint. + returned: always + type: str + sample: "https://testaccount001.file.core.windows.net/" + connectionstring: + description: + - Connectionstring of the file endpoint. + returned: always + type: str + sample: "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=X;AccountKey=X;FileEndpoint=X" queue: description: - The primary queue endpoint and connection string. @@ -300,7 +316,7 @@ sample: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx secondary_endpoints: description: - - The URLs to retrieve a public I(blob), I(queue), or I(table) object from the secondary location. + - The URLs to retrieve a public I(blob), I(file), I(queue), or I(table) object from the secondary location. - Only available if the SKU I(name=Standard_RAGRS). returned: always type: complex @@ -323,6 +339,24 @@ returned: always type: str sample: "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=X;AccountKey=X;BlobEndpoint=X" + file: + description: + - The secondary file endpoint and connection string. + returned: always + type: complex + contains: + endpoint: + description: + - The secondary file endpoint. + returned: always + type: str + sample: "https://testaccount001.file.core.windows.net/" + connectionstring: + description: + - Connectionstring of the file endpoint. + returned: always + type: str + sample: "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=X;AccountKey=X;FileEndpoint=X" queue: description: - The secondary queue endpoint and connection string. @@ -413,7 +447,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_storageaccount_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_storageaccount_facts' module has been renamed to 'azure_rm_storageaccount_info'", version='2.13') + self.module.deprecate("The 'azure_rm_storageaccount_facts' module has been renamed to 'azure_rm_storageaccount_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) @@ -481,18 +515,20 @@ def account_obj_to_dict(self, account_obj, blob_service_props=None): id=account_obj.id, name=account_obj.name, location=account_obj.location, - access_tier=(account_obj.access_tier.value + access_tier=(account_obj.access_tier if account_obj.access_tier is not None else None), - account_type=account_obj.sku.name.value, - kind=account_obj.kind.value if account_obj.kind else None, - provisioning_state=account_obj.provisioning_state.value, + account_type=account_obj.sku.name, + kind=account_obj.kind if account_obj.kind else None, + provisioning_state=account_obj.provisioning_state, secondary_location=account_obj.secondary_location, - status_of_primary=(account_obj.status_of_primary.value + status_of_primary=(account_obj.status_of_primary if account_obj.status_of_primary is not None else None), - status_of_secondary=(account_obj.status_of_secondary.value + status_of_secondary=(account_obj.status_of_secondary if account_obj.status_of_secondary is not None else None), primary_location=account_obj.primary_location, - https_only=account_obj.enable_https_traffic_only + https_only=account_obj.enable_https_traffic_only, + minimum_tls_version=account_obj.minimum_tls_version, + allow_blob_public_access=account_obj.allow_blob_public_access ) id_dict = self.parse_resource_to_dict(account_obj.id) @@ -526,6 +562,7 @@ def account_obj_to_dict(self, account_obj, blob_service_props=None): if account_obj.primary_endpoints: account_dict['primary_endpoints'] = dict( blob=self.format_endpoint_dict(account_dict['name'], account_key[0], account_obj.primary_endpoints.blob, 'blob'), + file=self.format_endpoint_dict(account_dict['name'], account_key[0], account_obj.primary_endpoints.file, 'file'), queue=self.format_endpoint_dict(account_dict['name'], account_key[0], account_obj.primary_endpoints.queue, 'queue'), table=self.format_endpoint_dict(account_dict['name'], account_key[0], account_obj.primary_endpoints.table, 'table') ) @@ -535,6 +572,7 @@ def account_obj_to_dict(self, account_obj, blob_service_props=None): if account_obj.secondary_endpoints: account_dict['secondary_endpoints'] = dict( blob=self.format_endpoint_dict(account_dict['name'], account_key[1], account_obj.primary_endpoints.blob, 'blob'), + file=self.format_endpoint_dict(account_dict['name'], account_key[1], account_obj.primary_endpoints.file, 'file'), queue=self.format_endpoint_dict(account_dict['name'], account_key[1], account_obj.primary_endpoints.queue, 'queue'), table=self.format_endpoint_dict(account_dict['name'], account_key[1], account_obj.primary_endpoints.table, 'table'), ) diff --git a/plugins/modules/azure_rm_storageblob.py b/plugins/modules/azure_rm_storageblob.py index e59b91d3c5..6ad1852a49 100644 --- a/plugins/modules/azure_rm_storageblob.py +++ b/plugins/modules/azure_rm_storageblob.py @@ -18,10 +18,14 @@ --- module: azure_rm_storageblob short_description: Manage blob containers and blob objects -version_added: "2.1" +version_added: "0.0.1" description: - Create, update and delete blob containers and blob objects. - - Use to upload a file and store it as a blob object, or download a blob object to a file. + - Use to upload a file and store it as a blob object, or download a blob object to a file(upload and download mode) + - Use to upload a batch of files under a given directory(batch upload mode) + - In the batch upload mode, the existing blob object will be overwritten if a blob object with the same name is to be created. + - the module can work exclusively in three modes, when C(batch_upload_src) is set, it is working in batch upload mode; + when C(src) is set, it is working in upload mode and when C(dst) is set, it is working in dowload mode. options: storage_account_name: description: @@ -42,7 +46,7 @@ choices: - block - page - version_added: "2.5" + version_added: "0.0.1" container: description: - Name of a blob container within the storage account. @@ -88,6 +92,12 @@ - Source file path. Use with state C(present) to upload a blob. aliases: - source + batch_upload_src: + description: + - Batch upload source directory. Use with state C(present) to upload batch of files under the directory. + batch_upload_dst: + description: + - Base directory in container when upload batch of files. state: description: - State of a container or blob. @@ -182,6 +192,7 @@ ''' import os +import mimetypes try: from azure.storage.blob.models import ContentSettings @@ -206,6 +217,8 @@ def __init__(self): force=dict(type='bool', default=False), resource_group=dict(required=True, type='str', aliases=['resource_group_name']), src=dict(type='str', aliases=['source']), + batch_upload_src=dict(type='path'), + batch_upload_dst=dict(type='path'), state=dict(type='str', default='present', choices=['absent', 'present']), public_access=dict(type='str', choices=['container', 'blob']), content_type=dict(type='str'), @@ -216,7 +229,7 @@ def __init__(self): content_md5=dict(type='str'), ) - mutually_exclusive = [('src', 'dest')] + mutually_exclusive = [('src', 'dest'), ('src', 'batch_upload_src'), ('dest', 'batch_upload_src')] self.blob_client = None self.blob_details = None @@ -230,6 +243,8 @@ def __init__(self): self.force = None self.resource_group = None self.src = None + self.batch_upload_src = None + self.batch_upload_dst = None self.state = None self.tags = None self.public_access = None @@ -257,9 +272,6 @@ def exec_module(self, **kwargs): self.blob_client = self.get_blob_client(self.resource_group, self.storage_account_name, self.blob_type) self.container_obj = self.get_container() - if self.blob is not None: - self.blob_obj = self.get_blob() - if self.state == 'present': if not self.container_obj: # create the container @@ -270,8 +282,13 @@ def exec_module(self, **kwargs): if update_tags: self.update_container_tags(self.container_obj['tags']) + if self.batch_upload_src: + self.batch_upload() + return self.results + if self.blob: # create, update or download blob + self.blob_obj = self.get_blob() if self.src and self.src_is_valid(): if self.blob_obj and not self.force: self.log("Cannot upload to {0}. Blob with that name already exists. " @@ -307,6 +324,69 @@ def exec_module(self, **kwargs): del self.results['actions'] return self.results + def batch_upload(self): + + def _glob_files_locally(folder_path): + + len_folder_path = len(folder_path) + 1 + + for root, v, files in os.walk(folder_path): + for f in files: + full_path = os.path.join(root, f) + yield full_path, full_path[len_folder_path:] + + def _normalize_blob_file_path(path, name): + path_sep = '/' + if path: + name = path_sep.join((path, name)) + + return path_sep.join(os.path.normpath(name).split(os.path.sep)).strip(path_sep) + + def _guess_content_type(file_path, original): + if original.content_encoding or original.content_type: + return original + + mimetypes.add_type('application/json', '.json') + mimetypes.add_type('application/javascript', '.js') + mimetypes.add_type('application/wasm', '.wasm') + + content_type, v = mimetypes.guess_type(file_path) + return ContentSettings(content_type=content_type, + content_disposition=original.content_disposition, + content_language=original.content_language, + content_md5=original.content_md5, + cache_control=original.cache_control) + + if not os.path.exists(self.batch_upload_src): + self.fail("batch upload source source directory {0} does not exist".format(self.batch_upload_src)) + + if not os.path.isdir(self.batch_upload_src): + self.fail("incorrect usage: {0} is not a directory".format(self.batch_upload_src)) + + source_dir = os.path.realpath(self.batch_upload_src) + source_files = list(_glob_files_locally(source_dir)) + + content_settings = ContentSettings(content_type=self.content_type, + content_encoding=self.content_encoding, + content_language=self.content_language, + content_disposition=self.content_disposition, + cache_control=self.cache_control, + content_md5=None) + + for src, blob_path in source_files: + if self.batch_upload_dst: + blob_path = _normalize_blob_file_path(self.batch_upload_dst, blob_path) + if not self.check_mode: + try: + self.blob_client.create_blob_from_path(self.container, blob_path, src, + metadata=self.tags, content_settings=_guess_content_type(src, content_settings)) + except AzureHttpError as exc: + self.fail("Error creating blob {0} - {1}".format(src, str(exc))) + self.results['actions'].append('created blob from {0}'.format(src)) + + self.results['changed'] = True + self.results['container'] = self.container_obj + def get_container(self): result = {} container = None diff --git a/plugins/modules/azure_rm_subnet.py b/plugins/modules/azure_rm_subnet.py index 2ed2215b9c..042d2955f0 100644 --- a/plugins/modules/azure_rm_subnet.py +++ b/plugins/modules/azure_rm_subnet.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_subnet -version_added: "2.1" +version_added: "0.1.0" short_description: Manage Azure subnets description: - Create, update or delete a subnet within a given virtual network. @@ -37,6 +37,14 @@ - CIDR defining the IPv4 address space of the subnet. Must be valid within the context of the virtual network. aliases: - address_prefix + address_prefixes_cidr: + description: + - CIDR defining the IPv4 and IPv6 address space of the subnet. Must be valid within the context of the virtual network. + - If set I(address_prefix), It will not set. + aliases: + - address_prefixes + type: list + version_added: "1.0.1" security_group: description: - Existing security group with which to associate the subnet. @@ -63,7 +71,6 @@ - The reference of the RouteTable resource. - Can be the name or resource ID of the route table. - Can be a dict containing the I(name) and I(resource_group) of the route table. - version_added: "2.7" service_endpoints: description: - An array of service endpoints. @@ -77,7 +84,6 @@ description: - A list of locations. type: list - version_added: "2.8" extends_documentation_fragment: - azure.azcollection.azure @@ -128,6 +134,12 @@ returned: always type: str sample: "10.1.0.0/16" + address_prefixes: + description: + - IP address for IPv4 and IPv6 CIDR. + returned: always + type: list + sample: ["10.2.0.0/24", "fdda:e69b:1587:495e::/64"] id: description: - Subnet resource path. @@ -181,6 +193,7 @@ def subnet_to_dict(subnet): name=subnet.name, provisioning_state=subnet.provisioning_state, address_prefix=subnet.address_prefix, + address_prefixes=subnet.address_prefixes, network_security_group=dict(), route_table=dict() ) @@ -209,6 +222,7 @@ def __init__(self): state=dict(type='str', default='present', choices=['present', 'absent']), virtual_network_name=dict(type='str', required=True, aliases=['virtual_network']), address_prefix_cidr=dict(type='str', aliases=['address_prefix']), + address_prefixes_cidr=dict(type='list', aliases=['address_prefixes']), security_group=dict(type='raw', aliases=['security_group_name']), route_table=dict(type='raw'), service_endpoints=dict( @@ -216,6 +230,8 @@ def __init__(self): ) ) + mutually_exclusive = [['address_prefix_cidr', 'address_prefixes_cidr']] + self.results = dict( changed=False, state=dict() @@ -226,6 +242,7 @@ def __init__(self): self.state = None self.virtual_network_name = None self.address_prefix_cidr = None + self.address_prefixes_cidr = None self.security_group = None self.route_table = None self.service_endpoints = None @@ -274,6 +291,10 @@ def exec_module(self, **kwargs): self.log("CHANGED: subnet {0} address_prefix_cidr".format(self.name)) changed = True results['address_prefix'] = self.address_prefix_cidr + if self.address_prefixes_cidr and results['address_prefixes'] != self.address_prefixes_cidr: + self.log("CHANGED: subnet {0} address_prefixes_cidr".format(self.name)) + changed = True + results['address_prefixes'] = self.address_prefixes_cidr if self.security_group is not None and results['network_security_group'].get('id') != nsg.get('id'): self.log("CHANGED: subnet {0} network security group".format(self.name)) @@ -285,7 +306,7 @@ def exec_module(self, **kwargs): results['route_table']['id'] = self.route_table self.log("CHANGED: subnet {0} route_table to {1}".format(self.name, route_table.get('name'))) - if self.service_endpoints: + if self.service_endpoints or self.service_endpoints == []: oldd = {} for item in self.service_endpoints: name = item['service'] @@ -316,11 +337,12 @@ def exec_module(self, **kwargs): if self.state == 'present' and changed: if not subnet: # create new subnet - if not self.address_prefix_cidr: - self.fail('address_prefix_cidr is not set') + if not self.address_prefix_cidr and not self.address_prefixes_cidr: + self.fail('address_prefix_cidr or address_prefixes_cidr is not set') self.log('Creating subnet {0}'.format(self.name)) subnet = self.network_models.Subnet( - address_prefix=self.address_prefix_cidr + address_prefix=self.address_prefix_cidr, + address_prefixes=self.address_prefixes_cidr ) if nsg: subnet.network_security_group = self.network_models.NetworkSecurityGroup(id=nsg.get('id')) @@ -332,7 +354,8 @@ def exec_module(self, **kwargs): # update subnet self.log('Updating subnet {0}'.format(self.name)) subnet = self.network_models.Subnet( - address_prefix=results['address_prefix'] + address_prefix=results['address_prefix'], + address_prefixes=results['address_prefixes'] ) if results['network_security_group'].get('id') is not None: subnet.network_security_group = self.network_models.NetworkSecurityGroup(id=results['network_security_group'].get('id')) diff --git a/plugins/modules/azure_rm_subnet_info.py b/plugins/modules/azure_rm_subnet_info.py index 57bc791404..23cca86a67 100644 --- a/plugins/modules/azure_rm_subnet_info.py +++ b/plugins/modules/azure_rm_subnet_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_subnet_info -version_added: "2.8" +version_added: "0.1.2" short_description: Get Azure Subnet facts description: - Get facts of Azure Subnet. @@ -94,6 +94,12 @@ returned: always type: str sample: "10.1.0.0/16" + address_prefixes_cidr: + description: + - CIDR defining the IPv4 and IPv6 address space of the subnet. + returned: always + type: list + sample: ["10.2.0.0/24", "fdda:e69b:1587:495e::/64"] route_table: description: - Associated route table ID. @@ -178,7 +184,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_subnet_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_subnet_facts' module has been renamed to 'azure_rm_subnet_info'", version='2.13') + self.module.deprecate("The 'azure_rm_subnet_facts' module has been renamed to 'azure_rm_subnet_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) @@ -230,6 +236,7 @@ def format_response(self, item): 'name': d.get('name'), 'id': d.get('id'), 'address_prefix_cidr': d.get('address_prefix'), + 'address_prefixes_cidr': d.get('address_prefixes'), 'route_table': d.get('route_table', {}).get('id'), 'security_group': d.get('network_security_group', {}).get('id'), 'provisioning_state': d.get('provisioning_state'), diff --git a/plugins/modules/azure_rm_trafficmanager.py b/plugins/modules/azure_rm_trafficmanager.py index f1d992d561..4adedef3e3 100644 --- a/plugins/modules/azure_rm_trafficmanager.py +++ b/plugins/modules/azure_rm_trafficmanager.py @@ -14,7 +14,7 @@ DOCUMENTATION = ''' --- module: azure_rm_trafficmanager -version_added: "2.7" +version_added: "0.1.2" short_description: Manage a Traffic Manager profile. description: - Create, update and delete a Traffic Manager profile. diff --git a/plugins/modules/azure_rm_trafficmanagerendpoint.py b/plugins/modules/azure_rm_trafficmanagerendpoint.py index dcfeb555d8..5165d1c2b5 100644 --- a/plugins/modules/azure_rm_trafficmanagerendpoint.py +++ b/plugins/modules/azure_rm_trafficmanagerendpoint.py @@ -14,7 +14,7 @@ DOCUMENTATION = ''' --- module: azure_rm_trafficmanagerendpoint -version_added: "2.7" +version_added: "0.1.2" short_description: Manage Azure Traffic Manager endpoint description: - Create, update and delete Azure Traffic Manager endpoint. diff --git a/plugins/modules/azure_rm_trafficmanagerendpoint_info.py b/plugins/modules/azure_rm_trafficmanagerendpoint_info.py index 26c9ced30e..049836ad0d 100644 --- a/plugins/modules/azure_rm_trafficmanagerendpoint_info.py +++ b/plugins/modules/azure_rm_trafficmanagerendpoint_info.py @@ -16,7 +16,7 @@ --- module: azure_rm_trafficmanagerendpoint_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Traffic Manager endpoint facts @@ -227,7 +227,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_trafficmanagerendpoint_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_trafficmanagerendpoint_facts' module has been renamed to 'azure_rm_trafficmanagerendpoint_info'", - version='2.13') + version=(2.9, )) for key in self.module_args: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_trafficmanagerprofile.py b/plugins/modules/azure_rm_trafficmanagerprofile.py index 0ac4e43a51..265be8cc33 100644 --- a/plugins/modules/azure_rm_trafficmanagerprofile.py +++ b/plugins/modules/azure_rm_trafficmanagerprofile.py @@ -14,7 +14,7 @@ DOCUMENTATION = ''' --- module: azure_rm_trafficmanagerprofile -version_added: "2.7" +version_added: "0.1.2" short_description: Manage Azure Traffic Manager profile description: - Create, update and delete a Traffic Manager profile. diff --git a/plugins/modules/azure_rm_trafficmanagerprofile_info.py b/plugins/modules/azure_rm_trafficmanagerprofile_info.py index b0e9be7b4f..9139a5e19d 100644 --- a/plugins/modules/azure_rm_trafficmanagerprofile_info.py +++ b/plugins/modules/azure_rm_trafficmanagerprofile_info.py @@ -16,7 +16,7 @@ --- module: azure_rm_trafficmanagerprofile_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Traffic Manager profile facts @@ -309,7 +309,8 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_trafficmanagerprofile_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_trafficmanagerprofile_facts' module has been renamed to 'azure_rm_trafficmanagerprofile_info'", version='2.13') + self.module.deprecate("The 'azure_rm_trafficmanagerprofile_facts' module has been renamed to 'azure_rm_trafficmanagerprofile_info'", + version=(2.9, )) for key in self.module_args: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_virtualmachine.py b/plugins/modules/azure_rm_virtualmachine.py index 1583051295..b99ea346a1 100644 --- a/plugins/modules/azure_rm_virtualmachine.py +++ b/plugins/modules/azure_rm_virtualmachine.py @@ -19,7 +19,7 @@ --- module: azure_rm_virtualmachine -version_added: "2.1" +version_added: "0.1.2" short_description: Manage Azure virtual machines @@ -45,7 +45,6 @@ - Only used on Linux images with C(cloud-init) enabled. - Consult U(https://docs.microsoft.com/en-us/azure/virtual-machines/linux/using-cloud-init#cloud-init-overview) for cloud-init ready images. - To enable cloud-init on a Linux image, follow U(https://docs.microsoft.com/en-us/azure/virtual-machines/linux/cloudinit-prepare-custom-image). - version_added: "2.5" state: description: - State of the VM. @@ -74,7 +73,6 @@ - Set to C(true) with I(state=present) to generalize the VM. - Generalizing a VM is irreversible. type: bool - version_added: "2.8" restarted: description: - Set to C(true) with I(state=present) to restart a running VM. @@ -121,7 +119,6 @@ availability_set: description: - Name or ID of an existing availability set to add the VM to. The I(availability_set) should be in the same resource group as VM. - version_added: "2.5" storage_account_name: description: - Name of a storage account that supports creation of VHD blobs. @@ -151,11 +148,9 @@ - Standard_LRS - StandardSSD_LRS - Premium_LRS - version_added: "2.4" os_disk_name: description: - OS disk name. - version_added: "2.8" os_disk_caching: description: - Type of OS disk caching. @@ -167,7 +162,6 @@ os_disk_size_gb: description: - Type of OS disk size in GB. - version_added: "2.7" os_type: description: - Base type of operating system. @@ -175,25 +169,28 @@ - Windows - Linux default: Linux + ephemeral_os_disk: + description: + - Parameters of ephemeral disk settings that can be specified for operating system disk. + - Ephemeral OS disk is only supported for VMS Instances using Managed Disk. + type: bool + default: False data_disks: description: - Describes list of data disks. - Use M(azure_rm_mangeddisk) to manage the specific disk. - version_added: "2.4" suboptions: lun: description: - The logical unit number for data disk. - This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. required: true - version_added: "2.4" disk_size_gb: description: - The initial disk size in GB for blank data disks. - This value cannot be larger than C(1023) GB. - Size can be changed only when the virtual machine is deallocated. - Not sure when I(managed_disk_id) defined. - version_added: "2.4" managed_disk_type: description: - Managed data disk type. @@ -202,7 +199,6 @@ - Standard_LRS - StandardSSD_LRS - Premium_LRS - version_added: "2.4" storage_account_name: description: - Name of an existing storage account that supports creation of VHD blobs. @@ -210,7 +206,6 @@ - Only used when OS disk created with virtual hard disk (VHD). - Used when I(managed_disk_type) not defined. - Cannot be updated unless I(lun) updated. - version_added: "2.4" storage_container_name: description: - Name of the container to use within the storage account to store VHD blobs. @@ -219,7 +214,6 @@ - Used when I(managed_disk_type) not defined. - Cannot be updated unless I(lun) updated. default: vhds - version_added: "2.4" storage_blob_name: description: - Name of the storage blob used to hold the OS disk image of the VM. @@ -228,7 +222,6 @@ - Only used when OS disk created with virtual hard disk (VHD). - Used when I(managed_disk_type) not defined. - Cannot be updated unless I(lun) updated. - version_added: "2.4" caching: description: - Type of data disk caching. @@ -236,7 +229,6 @@ - ReadOnly - ReadWrite default: ReadOnly - version_added: "2.4" public_ip_allocation_method: description: - Allocation method for the public IP of the VM. @@ -268,7 +260,6 @@ virtual_network_resource_group: description: - The resource group to use when creating a VM with another resource group's virtual network. - version_added: "2.4" virtual_network_name: description: - The virtual network to use when creating a VM. @@ -295,7 +286,6 @@ plan: description: - Third-party billing plan for the VM. - version_added: "2.5" type: dict suboptions: name: @@ -320,31 +310,26 @@ - Only valid when a I(plan) is specified. type: bool default: false - version_added: "2.7" zones: description: - A list of Availability Zones for your VM. type: list - version_added: "2.8" license_type: description: - On-premise license for the image or disk. - Only used for images that contain the Windows Server operating system. - To remove all license type settings, set to the string C(None). - version_added: "2.8" choices: - Windows_Server - Windows_Client vm_identity: description: - Identity for the VM. - version_added: "2.8" choices: - SystemAssigned winrm: description: - List of Windows Remote Management configurations of the VM. - version_added: "2.8" suboptions: protocol: description: @@ -367,7 +352,6 @@ description: - Manage boot diagnostics settings for a VM. - Boot diagnostics includes a serial console and remote console screenshots. - version_added: '2.9' suboptions: enabled: description: @@ -380,6 +364,10 @@ - If not specified, uses I(storage_account_name) defined one level up. - If storage account is not specified anywhere, and C(enabled) is C(true), a default storage account is created for boot diagnostics data. required: false + resource_group: + description: + - Resource group where the storage account is located. + type: str extends_documentation_fragment: - azure.azcollection.azure @@ -779,7 +767,11 @@ pass from ansible.module_utils.basic import to_native, to_bytes -from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase, azure_id_to_dict, normalize_location_name, format_resource_id +from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import (AzureRMModuleBase, + azure_id_to_dict, + normalize_location_name, + format_resource_id + ) AZURE_OBJECT_CLASS = 'VirtualMachine' @@ -843,6 +835,7 @@ def __init__(self): vm_identity=dict(type='str', choices=['SystemAssigned']), winrm=dict(type='list'), boot_diagnostics=dict(type='dict'), + ephemeral_os_disk=dict(type='bool'), ) self.resource_group = None @@ -887,6 +880,7 @@ def __init__(self): self.license_type = None self.vm_identity = None self.boot_diagnostics = None + self.ephemeral_os_disk = None self.results = dict( changed=False, @@ -926,11 +920,14 @@ def get_boot_diagnostics_storage_account(self, limited=False, vm_dict=None): """ bsa = None if 'storage_account' in self.boot_diagnostics: - bsa = self.get_storage_account(self.boot_diagnostics['storage_account']) + if 'resource_group' in self.boot_diagnostics: + bsa = self.get_storage_account(self.boot_diagnostics['resource_group'], self.boot_diagnostics['storage_account']) + else: + bsa = self.get_storage_account(self.resource_group, self.boot_diagnostics['storage_account']) elif limited: return None elif self.storage_account_name: - bsa = self.get_storage_account(self.storage_account_name) + bsa = self.get_storage_account(self.resource_group, self.storage_account_name) else: bsa = self.create_default_storage_account(vm_dict=vm_dict) self.log("boot diagnostics storage account:") @@ -1031,7 +1028,7 @@ def exec_module(self, **kwargs): self.storage_blob_name = self.name if self.storage_account_name and not self.managed_disk_type: - properties = self.get_storage_account(self.storage_account_name) + properties = self.get_storage_account(self.resource_group, self.storage_account_name) requested_storage_uri = properties.primary_endpoints.blob requested_vhd_uri = '{0}{1}/{2}'.format(requested_storage_uri, @@ -1050,6 +1047,13 @@ def exec_module(self, **kwargs): differences = [] current_nics = [] results = vm_dict + current_osdisk = vm_dict['properties']['storageProfile']['osDisk'] + current_ephemeral = current_osdisk.get('diffDiskSettings', None) + + if self.ephemeral_os_disk and current_ephemeral is None: + self.fail('Ephemeral OS disk not updatable: virtual machine ephemeral OS disk is {0}'.format(self.ephemeral_os_disk)) + elif not self.ephemeral_os_disk and current_ephemeral is not None: + self.fail('Ephemeral OS disk not updatable: virtual machine ephemeral OS disk is {0}'.format(self.ephemeral_os_disk)) # Try to determine if the VM needs to be updated if self.network_interface_names: @@ -1155,7 +1159,7 @@ def exec_module(self, **kwargs): boot_diagnostics_storage_account = self.get_boot_diagnostics_storage_account( limited=not self.boot_diagnostics['enabled'], vm_dict=vm_dict) boot_diagnostics_blob = boot_diagnostics_storage_account.primary_endpoints.blob if boot_diagnostics_storage_account else None - if current_boot_diagnostics['storageUri'] != boot_diagnostics_blob: + if current_boot_diagnostics.get('storageUri') != boot_diagnostics_blob: current_boot_diagnostics['storageUri'] = boot_diagnostics_blob boot_diagnostics_changed = True @@ -1290,7 +1294,8 @@ def exec_module(self, **kwargs): managed_disk=managed_disk, create_option=self.compute_models.DiskCreateOptionTypes.from_image, caching=self.os_disk_caching, - disk_size_gb=self.os_disk_size_gb + disk_size_gb=self.os_disk_size_gb, + diff_disk_settings=self.compute_models.DiffDiskSettings(option='Local') if self.ephemeral_os_disk else None ), image_reference=image_reference, ), @@ -1343,10 +1348,14 @@ def exec_module(self, **kwargs): vm_resource.os_profile.windows_configuration.win_rm = winrm if self.boot_diagnostics_present: + if self.boot_diagnostics['enabled']: + storage_uri = boot_diag_storage_account.primary_endpoints.blob + else: + storage_uri = None vm_resource.diagnostics_profile = self.compute_models.DiagnosticsProfile( boot_diagnostics=self.compute_models.BootDiagnostics( enabled=self.boot_diagnostics['enabled'], - storage_uri=boot_diag_storage_account.primary_endpoints.blob)) + storage_uri=storage_uri)) if self.admin_password: vm_resource.os_profile.admin_password = self.admin_password @@ -1377,7 +1386,7 @@ def exec_module(self, **kwargs): count += 1 if data_disk.get('storage_account_name'): - data_disk_storage_account = self.get_storage_account(data_disk['storage_account_name']) + data_disk_storage_account = self.get_storage_account(self.resource_group, data_disk['storage_account_name']) else: data_disk_storage_account = self.create_default_storage_account() self.log("data disk storage account:") @@ -1573,7 +1582,7 @@ def exec_module(self, **kwargs): vhd=data_disk_vhd, caching=data_disk.get('caching'), create_option=data_disk.get('createOption'), - disk_size_gb=int(data_disk['diskSizeGB']), + disk_size_gb=int(data_disk.get('diskSizeGB', 0)) or None, managed_disk=data_disk_managed_disk, )) vm_resource.storage_profile.data_disks = data_disks @@ -1953,9 +1962,9 @@ def get_availability_set(self, resource_group, name): except Exception as exc: self.fail("Error fetching availability set {0} - {1}".format(name, str(exc))) - def get_storage_account(self, name): + def get_storage_account(self, resource_group, name): try: - account = self.storage_client.storage_accounts.get_properties(self.resource_group, + account = self.storage_client.storage_accounts.get_properties(resource_group, name) return account except Exception as exc: @@ -2004,12 +2013,12 @@ def create_default_storage_account(self, vm_dict=None): if self.tags.get('_own_sa_', None): # We previously created one in the same invocation - return self.get_storage_account(self.tags['_own_sa_']) + return self.get_storage_account(self.resource_group, self.tags['_own_sa_']) if vm_dict and vm_dict.get('tags', {}).get('_own_sa_', None): # We previously created one in a previous invocation # We must be updating, like adding boot diagnostics - return self.get_storage_account(vm_dict['tags']['_own_sa_']) + return self.get_storage_account(self.resource_group, vm_dict['tags']['_own_sa_']) # Attempt to find a valid storage account name storage_account_name_base = re.sub('[^a-zA-Z0-9]', '', self.name[:20].lower()) @@ -2036,6 +2045,7 @@ def create_default_storage_account(self, vm_dict=None): sku = self.storage_models.Sku(name=self.storage_models.SkuName.standard_lrs) sku.tier = self.storage_models.SkuTier.standard kind = self.storage_models.Kind.storage + # pylint: disable=missing-kwoa parameters = self.storage_models.StorageAccountCreateParameters(sku=sku, kind=kind, location=self.location) self.log("Creating storage account {0} in location {1}".format(storage_account_name, self.location)) self.results['actions'].append("Created storage account {0}".format(storage_account_name)) @@ -2045,7 +2055,7 @@ def create_default_storage_account(self, vm_dict=None): except Exception as exc: self.fail("Failed to create storage account: {0} - {1}".format(storage_account_name, str(exc))) self.tags['_own_sa_'] = storage_account_name - return self.get_storage_account(storage_account_name) + return self.get_storage_account(self.resource_group, storage_account_name) def check_storage_account_name(self, name): self.log("Checking storage account name availability for {0}".format(name)) diff --git a/plugins/modules/azure_rm_virtualmachine_info.py b/plugins/modules/azure_rm_virtualmachine_info.py index 20454b961f..4232bdc6a4 100644 --- a/plugins/modules/azure_rm_virtualmachine_info.py +++ b/plugins/modules/azure_rm_virtualmachine_info.py @@ -19,7 +19,7 @@ --- module: azure_rm_virtualmachine_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get virtual machine facts @@ -290,7 +290,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_virtualmachine_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_virtualmachine_facts' module has been renamed to 'azure_rm_virtualmachine_info'", version='2.13') + self.module.deprecate("The 'azure_rm_virtualmachine_facts' module has been renamed to 'azure_rm_virtualmachine_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) @@ -414,7 +414,7 @@ def serialize_vm(self, vm): result['properties']['diagnosticsProfile']['bootDiagnostics']['enabled'] or False, 'storage_uri': 'diagnosticsProfile' in result['properties'] and 'bootDiagnostics' in result['properties']['diagnosticsProfile'] and - result['properties']['diagnosticsProfile']['bootDiagnostics']['storageUri'] or None + result['properties']['diagnosticsProfile']['bootDiagnostics'].get('storageUri', None) } if new_result['boot_diagnostics']['enabled']: new_result['boot_diagnostics']['console_screenshot_uri'] = result['properties']['instanceView']['bootDiagnostics']['consoleScreenshotBlobUri'] diff --git a/plugins/modules/azure_rm_virtualmachineextension.py b/plugins/modules/azure_rm_virtualmachineextension.py index dc09de385a..dd70abb2c7 100644 --- a/plugins/modules/azure_rm_virtualmachineextension.py +++ b/plugins/modules/azure_rm_virtualmachineextension.py @@ -17,7 +17,7 @@ --- module: azure_rm_virtualmachineextension -version_added: "2.4" +version_added: "0.1.2" short_description: Managed Azure Virtual Machine extension @@ -214,7 +214,7 @@ def exec_module(self, **kwargs): setattr(self, key, kwargs[key]) if self.module._name == 'azure_rm_virtualmachine_extension': - self.module.deprecate("The 'azure_rm_virtualmachine_extension' module has been renamed to 'azure_rm_virtualmachineextension'", version='2.12') + self.module.deprecate("The 'azure_rm_virtualmachine_extension' module has been renamed to 'azure_rm_virtualmachineextension'", version=(2, 9)) resource_group = None response = None diff --git a/plugins/modules/azure_rm_virtualmachineextension_info.py b/plugins/modules/azure_rm_virtualmachineextension_info.py index c39b52e136..0ca14833c5 100644 --- a/plugins/modules/azure_rm_virtualmachineextension_info.py +++ b/plugins/modules/azure_rm_virtualmachineextension_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_virtualmachineextension_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Virtual Machine Extension facts description: - Get facts of Azure Virtual Machine Extension. @@ -177,7 +177,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_virtualmachineextension_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_virtualmachineextension_facts' module has been renamed to 'azure_rm_virtualmachineextension_info'", - version='2.13') + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_virtualmachineimage_info.py b/plugins/modules/azure_rm_virtualmachineimage_info.py index b35567d125..418abd2518 100644 --- a/plugins/modules/azure_rm_virtualmachineimage_info.py +++ b/plugins/modules/azure_rm_virtualmachineimage_info.py @@ -18,7 +18,7 @@ --- module: azure_rm_virtualmachineimage_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get virtual machine image facts @@ -152,7 +152,7 @@ def __init__(self, **kwargs): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_virtualmachineimage_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_virtualmachineimage_facts' module has been renamed to 'azure_rm_virtualmachineimage_info'", version='2.13') + self.module.deprecate("The 'azure_rm_virtualmachineimage_facts' module has been renamed to 'azure_rm_virtualmachineimage_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_virtualmachinescaleset.py b/plugins/modules/azure_rm_virtualmachinescaleset.py index 2ff31dc6e8..395d7c79b8 100644 --- a/plugins/modules/azure_rm_virtualmachinescaleset.py +++ b/plugins/modules/azure_rm_virtualmachinescaleset.py @@ -17,7 +17,7 @@ --- module: azure_rm_virtualmachinescaleset -version_added: "2.4" +version_added: "0.1.2" short_description: Manage Azure virtual machine scale sets @@ -116,6 +116,12 @@ - Windows - Linux default: Linux + ephemeral_os_disk: + description: + - Parameters of ephemeral disk settings that can be specified for operating system disk. + - Ephemeral OS disk is only supported for VMS Instances using Managed Disk. + type: bool + default: False managed_disk_type: description: - Managed disk type. @@ -125,24 +131,20 @@ data_disks: description: - Describes list of data disks. - version_added: "2.4" suboptions: lun: description: - The logical unit number for data disk. default: 0 - version_added: "2.4" disk_size_gb: description: - The initial disk size in GB for blank data disks. - version_added: "2.4" managed_disk_type: description: - Managed data disk type. choices: - Standard_LRS - Premium_LRS - version_added: "2.4" caching: description: - Type of data disk caching. @@ -150,13 +152,11 @@ - ReadOnly - ReadWrite default: ReadOnly - version_added: "2.4" virtual_network_resource_group: description: - When creating a virtual machine, if a specific virtual network from another resource group should be used. - Use this parameter to specify the resource group to use. - version_added: "2.5" virtual_network_name: description: - Virtual Network name. @@ -172,15 +172,12 @@ - Assign a public IP to each virtual machine of the scale set type: bool default: False - version_added: "2.10" load_balancer: description: - Load balancer name. - version_added: "2.5" application_gateway: description: - Application gateway name. - version_added: "2.8" remove_on_absent: description: - When removing a VM using I(state=absent), also remove associated resources. @@ -190,7 +187,6 @@ enable_accelerated_networking: description: - Indicates whether user wants to allow accelerated networking for virtual machines in scaleset being created. - version_added: "2.7" type: bool security_group: description: @@ -198,7 +194,6 @@ - It can be the security group name which is in the same resource group. - It can be the resource ID. - It can be a dict which contains I(name) and I(resource_group) of the security group. - version_added: "2.7" aliases: - security_group_name overprovision: @@ -206,17 +201,14 @@ - Specifies whether the Virtual Machine Scale Set should be overprovisioned. type: bool default: True - version_added: "2.8" single_placement_group: description: - When true this limits the scale set to a single placement group, of max size 100 virtual machines. type: bool default: True - version_added: "2.9" plan: description: - Third-party billing plan for the VM. - version_added: "2.10" type: dict suboptions: name: @@ -238,7 +230,6 @@ description: - A list of Availability Zones for your virtual machine scale set. type: list - version_added: "2.8" custom_data: description: - Data which is made available to the virtual machine and used by e.g., C(cloud-init). @@ -246,7 +237,6 @@ - If the image you are attempting to use is not listed in U(https://docs.microsoft.com/en-us/azure/virtual-machines/linux/using-cloud-init#cloud-init-overview), follow these steps U(https://docs.microsoft.com/en-us/azure/virtual-machines/linux/cloudinit-prepare-custom-image). - version_added: "2.8" scale_in_policy: description: - define the order in which vmss instances are scaled-in @@ -254,12 +244,10 @@ - Default - NewestVM - OldestVM - version_added: "2.10" terminate_event_timeout_minutes: description: - timeout time for termination notification event - in range between 5 and 15 - version_added: "2.10" extends_documentation_fragment: - azure.azcollection.azure @@ -540,7 +528,8 @@ def __init__(self): product=dict(type='str', required=True), name=dict(type='str', required=True), promotion_code=dict(type='str'))), scale_in_policy=dict(type='str', choices=['Default', 'OldestVM', 'NewestVM']), - terminate_event_timeout_minutes=dict(type='int') + terminate_event_timeout_minutes=dict(type='int'), + ephemeral_os_disk=dict(type='bool') ) self.resource_group = None @@ -578,6 +567,7 @@ def __init__(self): self.plan = None self.scale_in_policy = None self.terminate_event_timeout_minutes = None + self.ephemeral_os_disk = None mutually_exclusive = [('load_balancer', 'application_gateway')] self.results = dict( @@ -597,7 +587,7 @@ def exec_module(self, **kwargs): setattr(self, key, kwargs[key]) if self.module._name == 'azure_rm_virtualmachine_scaleset': - self.module.deprecate("The 'azure_rm_virtualmachine_scaleset' module has been renamed to 'azure_rm_virtualmachinescaleset'", version='2.12') + self.module.deprecate("The 'azure_rm_virtualmachine_scaleset' module has been renamed to 'azure_rm_virtualmachinescaleset'", version=(2, 9)) # make sure options are lower case self.remove_on_absent = set([resource.lower() for resource in self.remove_on_absent]) @@ -711,6 +701,13 @@ def exec_module(self, **kwargs): if self.state == 'present': differences = [] results = vmss_dict + current_osdisk = vmss_dict['properties']['virtualMachineProfile']['storageProfile']['osDisk'] + current_ephemeral = current_osdisk.get('diffDiskSettings', None) + + if self.ephemeral_os_disk and current_ephemeral is None: + self.fail('Ephemeral OS disk not updatable: virtual machine scale set ephemeral OS disk is {0}'.format(self.ephemeral_os_disk)) + elif not self.ephemeral_os_disk and current_ephemeral is not None: + self.fail('Ephemeral OS disk not updatable: virtual machine scale set ephemeral OS disk is {0}'.format(self.ephemeral_os_disk)) if self.os_disk_caching and \ self.os_disk_caching != vmss_dict['properties']['virtualMachineProfile']['storageProfile']['osDisk']['caching']: @@ -894,11 +891,13 @@ def exec_module(self, **kwargs): plan=plan, virtual_machine_profile=self.compute_models.VirtualMachineScaleSetVMProfile( os_profile=os_profile, + # pylint: disable=missing-kwoa storage_profile=self.compute_models.VirtualMachineScaleSetStorageProfile( os_disk=self.compute_models.VirtualMachineScaleSetOSDisk( managed_disk=managed_disk, create_option=self.compute_models.DiskCreateOptionTypes.from_image, caching=self.os_disk_caching, + diff_disk_settings=self.compute_models.DiffDiskSettings(option='Local') if self.ephemeral_os_disk else None, ), image_reference=image_reference, ), diff --git a/plugins/modules/azure_rm_virtualmachinescaleset_info.py b/plugins/modules/azure_rm_virtualmachinescaleset_info.py index 312d232ec6..9fb6737661 100644 --- a/plugins/modules/azure_rm_virtualmachinescaleset_info.py +++ b/plugins/modules/azure_rm_virtualmachinescaleset_info.py @@ -15,7 +15,7 @@ --- module: azure_rm_virtualmachinescaleset_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Virtual Machine Scale Set facts @@ -44,7 +44,6 @@ choices: - 'curated' - 'raw' - version_added: "2.6" extends_documentation_fragment: - azure.azcollection.azure @@ -297,7 +296,7 @@ def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_virtualmachinescaleset_facts' if is_old_facts: self.module.deprecate("The 'azure_rm_virtualmachinescaleset_facts' module has been renamed to 'azure_rm_virtualmachinescaleset_info'", - version='2.13') + version=(2.9, )) for key in self.module_args: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_virtualmachinescalesetextension.py b/plugins/modules/azure_rm_virtualmachinescalesetextension.py index b53c63dabf..7df59315b2 100644 --- a/plugins/modules/azure_rm_virtualmachinescalesetextension.py +++ b/plugins/modules/azure_rm_virtualmachinescalesetextension.py @@ -17,7 +17,7 @@ --- module: azure_rm_virtualmachinescalesetextension -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Virtual Machine Scale Set (VMSS) extensions diff --git a/plugins/modules/azure_rm_virtualmachinescalesetextension_info.py b/plugins/modules/azure_rm_virtualmachinescalesetextension_info.py index 84e0aff579..861da37cde 100644 --- a/plugins/modules/azure_rm_virtualmachinescalesetextension_info.py +++ b/plugins/modules/azure_rm_virtualmachinescalesetextension_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_virtualmachinescalesetextension_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Virtual Machine Scale Set Extension facts description: - Get facts of Azure Virtual Machine Scale Set Extension. @@ -159,7 +159,7 @@ def exec_module(self, **kwargs): if is_old_facts: self.module.deprecate("The 'azure_rm_virtualmachinescalesetextension_facts' module has been renamed to" + " 'azure_rm_virtualmachinescalesetextension_info'", - version='2.13') + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_virtualmachinescalesetinstance.py b/plugins/modules/azure_rm_virtualmachinescalesetinstance.py index 0ea7637377..adcaf1018b 100644 --- a/plugins/modules/azure_rm_virtualmachinescalesetinstance.py +++ b/plugins/modules/azure_rm_virtualmachinescalesetinstance.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_virtualmachinescalesetinstance -version_added: "2.8" +version_added: "0.1.2" short_description: Get Azure Virtual Machine Scale Set Instance facts description: - Get facts of Azure Virtual Machine Scale Set VMs. @@ -49,12 +49,10 @@ type: bool description: - turn on/off instance protection from scale in - version_added: "2.10" protect_from_scale_set_actions: type: bool description: - tun on/off instance protection from scale set actions - version_added: "2.10" state: description: - State of the VMSS instance. Use C(present) to update an instance and C(absent) to delete an instance. diff --git a/plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py b/plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py index 4536b5e92c..7445535398 100644 --- a/plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py +++ b/plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_virtualmachinescalesetinstance_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure Virtual Machine Scale Set Instance facts description: - Get facts of Azure Virtual Machine Scale Set VMs. @@ -163,7 +163,7 @@ def exec_module(self, **kwargs): if is_old_facts: self.module.deprecate("The 'azure_rm_virtualmachinescalesetinstance_facts' module has been renamed to" + " 'azure_rm_virtualmachinescalesetinstance_info'", - version='2.13') + version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_virtualnetwork.py b/plugins/modules/azure_rm_virtualnetwork.py index e35f81861d..62b3301877 100644 --- a/plugins/modules/azure_rm_virtualnetwork.py +++ b/plugins/modules/azure_rm_virtualnetwork.py @@ -17,7 +17,7 @@ DOCUMENTATION = ''' --- module: azure_rm_virtualnetwork -version_added: "2.1" +version_added: "0.1.0" short_description: Manage Azure virtual networks description: - Create, update or delete a virtual networks. Allows setting and updating the available IPv4 address ranges @@ -100,7 +100,7 @@ RETURN = ''' state: description: - - Current state of the virtual network. + - Current state of the virtual network. returned: always type: complex contains: @@ -155,12 +155,12 @@ sample: Succeeded tags: description: - - Resource tags, such as { 'tags1':'value1' } + - Resource tags, such as { 'tags1':'value1' }. returned: always type: dict sample: { 'key1':'value1' } type: - descriptioin: + description: - Resource type. returned: always type: str diff --git a/plugins/modules/azure_rm_virtualnetwork_info.py b/plugins/modules/azure_rm_virtualnetwork_info.py index 7aa9d0c459..a1368784cd 100644 --- a/plugins/modules/azure_rm_virtualnetwork_info.py +++ b/plugins/modules/azure_rm_virtualnetwork_info.py @@ -18,7 +18,7 @@ --- module: azure_rm_virtualnetwork_info -version_added: "2.9" +version_added: "0.0.1" short_description: Get virtual network facts @@ -162,6 +162,12 @@ returned: always type: str sample: '10.1.0.0/16' + address_prefixes: + description: + - Both IPv4 and IPv6 address prefixes for the subnet, will return null if only an IPv4 set. + returned: always + type: list + sample: ["10.1.0.0/16", "fdda:e69b:2547:485e::/64"] network_security_group: description: - Existing security group ID with which to associate the subnet. @@ -228,7 +234,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_virtualnetwork_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_virtualnetwork_facts' module has been renamed to 'azure_rm_virtualnetwork_info'", version='2.13') + self.module.deprecate("The 'azure_rm_virtualnetwork_facts' module has been renamed to 'azure_rm_virtualnetwork_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) @@ -322,6 +328,7 @@ def subnet_to_dict(self, subnet): name=subnet.name, provisioning_state=subnet.provisioning_state, address_prefix=subnet.address_prefix, + address_prefixes=subnet.address_prefixes if subnet.address_prefixes else None, network_security_group=subnet.network_security_group.id if subnet.network_security_group else None, route_table=subnet.route_table.id if subnet.route_table else None ) diff --git a/plugins/modules/azure_rm_virtualnetworkgateway.py b/plugins/modules/azure_rm_virtualnetworkgateway.py index 15fd10618b..046aabde0f 100644 --- a/plugins/modules/azure_rm_virtualnetworkgateway.py +++ b/plugins/modules/azure_rm_virtualnetworkgateway.py @@ -13,7 +13,7 @@ --- module: azure_rm_virtualnetworkgateway -version_added: "2.8" +version_added: "0.0.1" short_description: Manage Azure virtual network gateways diff --git a/plugins/modules/azure_rm_virtualnetworkpeering.py b/plugins/modules/azure_rm_virtualnetworkpeering.py index d3b642dc14..2615b7b94e 100644 --- a/plugins/modules/azure_rm_virtualnetworkpeering.py +++ b/plugins/modules/azure_rm_virtualnetworkpeering.py @@ -14,7 +14,7 @@ DOCUMENTATION = ''' --- module: azure_rm_virtualnetworkpeering -version_added: "2.8" +version_added: "0.0.1" short_description: Manage Azure Virtual Network Peering description: - Create, update and delete Azure Virtual Network Peering. diff --git a/plugins/modules/azure_rm_virtualnetworkpeering_info.py b/plugins/modules/azure_rm_virtualnetworkpeering_info.py index 75ae2ed31f..7bdb28bdd4 100644 --- a/plugins/modules/azure_rm_virtualnetworkpeering_info.py +++ b/plugins/modules/azure_rm_virtualnetworkpeering_info.py @@ -14,7 +14,7 @@ DOCUMENTATION = ''' --- module: azure_rm_virtualnetworkpeering_info -version_added: "2.9" +version_added: "0.0.1" short_description: Get facts of Azure Virtual Network Peering description: - Get facts of Azure Virtual Network Peering. @@ -188,7 +188,8 @@ def exec_module(self, **kwargs): """Main module execution method""" is_old_facts = self.module._name == 'azure_rm_virtualnetworkpeering_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_virtualnetworkpeering_facts' module has been renamed to 'azure_rm_virtualnetworkpeering_info'", version='2.13') + self.module.deprecate("The 'azure_rm_virtualnetworkpeering_facts' module has been renamed to 'azure_rm_virtualnetworkpeering_info'", + version=(2.9, )) for key in list(self.module_arg_spec.keys()): setattr(self, key, kwargs[key]) diff --git a/plugins/modules/azure_rm_webapp.py b/plugins/modules/azure_rm_webapp.py index 5449bbacf2..b7f76e9780 100644 --- a/plugins/modules/azure_rm_webapp.py +++ b/plugins/modules/azure_rm_webapp.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_webapp -version_added: "2.7" +version_added: "0.1.2" short_description: Manage Web App instances description: - Create, update and delete instance of Web App. diff --git a/plugins/modules/azure_rm_webapp_info.py b/plugins/modules/azure_rm_webapp_info.py index 7777947713..8a43137481 100644 --- a/plugins/modules/azure_rm_webapp_info.py +++ b/plugins/modules/azure_rm_webapp_info.py @@ -17,7 +17,7 @@ --- module: azure_rm_webapp_info -version_added: "2.9" +version_added: "0.1.2" short_description: Get Azure web app facts @@ -231,6 +231,10 @@ pass from ansible_collections.azure.azcollection.plugins.module_utils.azure_rm_common import AzureRMModuleBase +try: + import xmltodict +except Exception: + pass AZURE_OBJECT_CLASS = 'WebApp' @@ -265,7 +269,7 @@ def __init__(self): def exec_module(self, **kwargs): is_old_facts = self.module._name == 'azure_rm_webapp_facts' if is_old_facts: - self.module.deprecate("The 'azure_rm_webapp_facts' module has been renamed to 'azure_rm_webapp_info'", version='2.13') + self.module.deprecate("The 'azure_rm_webapp_facts' module has been renamed to 'azure_rm_webapp_info'", version=(2.9, )) for key in self.module_arg_spec: setattr(self, key, kwargs[key]) @@ -363,7 +367,6 @@ def get_publish_credentials(self, resource_group, name): return response def get_webapp_ftp_publish_url(self, resource_group, name): - import xmltodict self.log('Get web app {0} app publish profile'.format(name)) diff --git a/plugins/modules/azure_rm_webappslot.py b/plugins/modules/azure_rm_webappslot.py index d8609be308..6b46ce5c54 100644 --- a/plugins/modules/azure_rm_webappslot.py +++ b/plugins/modules/azure_rm_webappslot.py @@ -16,7 +16,7 @@ DOCUMENTATION = ''' --- module: azure_rm_webappslot -version_added: "2.8" +version_added: "0.1.2" short_description: Manage Azure Web App slot description: - Create, update and delete Azure Web App slot. diff --git a/pr-pipelines.yml b/pr-pipelines.yml index a9eee9306a..ef48d112ca 100644 --- a/pr-pipelines.yml +++ b/pr-pipelines.yml @@ -2,17 +2,19 @@ parameters: - name: PYTHON_VER displayName: 'Python Version' type: string - default: "2.7" + default: "3.6" values: - "2.7" - "3.6" + - "3.8" - name: ANSIBLE_VER displayName: 'Ansible Version' type: string - default: "2.9.0" + default: "2.10" values: - - "2.9.0" - - "2.9.9" + - "2.9" + - "2.10" + - "devel" - name: MODULE_NAME displayName: 'Test Module' type: string @@ -50,6 +52,7 @@ parameters: - "azure_rm_mysqlserver" - "azure_rm_networkinterface" - "azure_rm_postgresqlserver" + - "azure_rm_privatednszone" - "azure_rm_publicipaddress" - "azure_rm_rediscache" - "azure_rm_resource" @@ -69,6 +72,7 @@ parameters: - "azure_rm_virtualnetwork" - "azure_rm_virtualnetworkgateway" - "azure_rm_virtualnetworkeepring" + - "azure_rm_backupazurevm" - "azure_rm_webapp" - "azure_rm_workspace" - "inventory_azure" @@ -156,7 +160,7 @@ jobs: inputs: versionSpec: '$(python.version)' - - script: tests/utils/ado/ado.sh $(test.key) ${{ parameters.PYTHON_VER }} ${{ parameters.ANSIBLE_VER }} + - script: tests/utils/ado/ado.sh $(test.key) ${{ parameters.PYTHON_VER }} ${{ parameters.ANSIBLE_VER }} ${{ parameters.MODULE_NAME }} env: SHIPPABLE_BUILD_DIR: $(Build.Repository.LocalPath) AZURE_CLIENT_ID: $(AZURE_CLIENT_ID) diff --git a/requirements-azure.txt b/requirements-azure.txt index 88f4ce389a..6e1d3026d8 100644 --- a/requirements-azure.txt +++ b/requirements-azure.txt @@ -1,7 +1,7 @@ packaging requests[security] xmltodict -azure-cli-core==2.0.35 +azure-cli-core==2.11.1 azure-cli-nspkg==3.0.2 azure-common==1.1.11 azure-mgmt-authorization==0.51.1 @@ -15,22 +15,23 @@ azure-mgmt-dns==2.1.0 azure-mgmt-keyvault==1.1.0 azure-mgmt-marketplaceordering==0.1.0 azure-mgmt-monitor==0.5.2 -azure-mgmt-network==4.0.0 +azure-mgmt-network==10.2.0 azure-mgmt-nspkg==2.0.0 +azure-mgmt-privatedns==0.1.0 azure-mgmt-redis==5.0.0 -azure-mgmt-resource==2.1.0 +azure-mgmt-resource==10.2.0 azure-mgmt-rdbms==1.4.1 azure-mgmt-servicebus==0.5.3 azure-mgmt-sql==0.10.0 -azure-mgmt-storage==3.1.0 +azure-mgmt-storage==11.1.0 azure-mgmt-trafficmanager==0.50.0 azure-mgmt-web==0.41.0 azure-nspkg==2.0.0 azure-storage==0.35.1 msrest==0.6.10 -msrestazure==0.6.2 +msrestazure==0.6.4 azure-keyvault==1.0.0a1 -azure-graphrbac==0.40.0 +azure-graphrbac==0.61.1 azure-mgmt-cosmosdb==0.5.2 azure-mgmt-hdinsight==0.1.0 azure-mgmt-devtestlabs==3.0.0 diff --git a/sanity-requirements-azure.txt b/sanity-requirements-azure.txt new file mode 100644 index 0000000000..ab8a4d43c9 --- /dev/null +++ b/sanity-requirements-azure.txt @@ -0,0 +1,5 @@ +voluptuous==0.11.7 +pycodestyle==2.6.0 +yamllint==1.24.2 +pylint==2.5.3 +cryptography==3.0 diff --git a/tests/integration/targets/azure_rm_adpassword/aliases b/tests/integration/targets/azure_rm_adpassword/aliases new file mode 100644 index 0000000000..fc8bf1e71d --- /dev/null +++ b/tests/integration/targets/azure_rm_adpassword/aliases @@ -0,0 +1,4 @@ +cloud/azure +shippable/azure/group10 +disabled +destructive diff --git a/tests/integration/targets/azure_rm_adpassword/meta/main.yml b/tests/integration/targets/azure_rm_adpassword/meta/main.yml new file mode 100644 index 0000000000..95e1952f98 --- /dev/null +++ b/tests/integration/targets/azure_rm_adpassword/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - setup_azure diff --git a/tests/integration/targets/azure_rm_adpassword/tasks/main.yml b/tests/integration/targets/azure_rm_adpassword/tasks/main.yml new file mode 100644 index 0000000000..7c3782f174 --- /dev/null +++ b/tests/integration/targets/azure_rm_adpassword/tasks/main.yml @@ -0,0 +1,103 @@ +- set_fact: + app_id: "e0a62513-1d81-480e-a6dc-5c99cdd58d9a" + tenant_id: "72f988bf-86f1-41af-91ab-2d7cd011db47" + app_object_id: "b52e8275-a1ee-4c4a-86ff-15992e0920ed" + +- name: create first ad password by app_id + azure_rm_adpassword: + app_id: "{{ app_id }}" + value: "Password@032900001" + tenant: "{{ tenant_id }}" + state: present + register: ad_fact + +- assert: + that: + - ad_fact.changed + +- name: create second ad password by app_object_id + azure_rm_adpassword: + value: "Password@032900002" + tenant: "{{ tenant_id }}" + app_object_id: "{{ app_object_id }}" + state: present + register: ad_fact02 + +- assert: + that: + - ad_fact02.changed + +- name: create ad service principal + azure_rm_adserviceprincipal: + app_id: "{{ app_id }}" + tenant: "{{ tenant_id }}" + state: present + +- name: Get ad service principal info + azure_rm_adserviceprincipal_info: + tenant: "{{ tenant_id }}" + app_id: "{{ app_id }}" + register: sp_info +- debug: + var: sp_info + +- name: create third ad password by service_principal_object_id + azure_rm_adpassword: + value: "Password@032900003" + tenant: "{{ tenant_id }}" + service_principal_object_id: "{{ sp_info.service_principals[0].object_id }}" + state: present + register: ad_fact03 + +- assert: + that: + - ad_fact03.changed + +- name: can't update ad password + azure_rm_adpassword: + app_id: "{{ app_id }}" + value: "Password@032900003" + tenant: "{{ tenant_id }}" + key_id: "{{ ad_fact.key_id }}" + app_object_id: "{{ app_object_id }}" + state: present + register: output + ignore_errors: True + +- name: Get ad password info + azure_rm_adpassword_info: + app_id: "{{ app_id }}" + tenant: "{{ tenant_id }}" + key_id: "{{ ad_fact.key_id }}" + app_object_id: "{{ app_object_id }}" + register: ad_info + +- assert: + that: + - ad_info.passwords[0].start_date == ad_fact.start_date + - ad_info.passwords[0].end_date == ad_fact.end_date + +- name: delete one ad password + azure_rm_adpassword: + app_id: "{{ app_id }}" + key_id: "{{ ad_fact.key_id }}" + tenant: "{{ tenant_id }}" + app_object_id: "{{ app_object_id }}" + state: absent + register: output + +- assert: + that: + - output.changed + +- name: delete all ad password + azure_rm_adpassword: + app_id: "{{ app_id }}" + tenant: "{{ tenant_id }}" + app_object_id: "{{ app_object_id }}" + state: absent + register: output + +- assert: + that: + - output.changed diff --git a/tests/integration/targets/azure_rm_adserviceprincipal/aliases b/tests/integration/targets/azure_rm_adserviceprincipal/aliases new file mode 100644 index 0000000000..6feba04aa4 --- /dev/null +++ b/tests/integration/targets/azure_rm_adserviceprincipal/aliases @@ -0,0 +1,4 @@ +cloud/azure +shippable/azure/group10 +destructive +disabled diff --git a/tests/integration/targets/azure_rm_adserviceprincipal/meta/main.yml b/tests/integration/targets/azure_rm_adserviceprincipal/meta/main.yml new file mode 100644 index 0000000000..95e1952f98 --- /dev/null +++ b/tests/integration/targets/azure_rm_adserviceprincipal/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - setup_azure diff --git a/tests/integration/targets/azure_rm_adserviceprincipal/tasks/main.yml b/tests/integration/targets/azure_rm_adserviceprincipal/tasks/main.yml new file mode 100644 index 0000000000..4e4b501618 --- /dev/null +++ b/tests/integration/targets/azure_rm_adserviceprincipal/tasks/main.yml @@ -0,0 +1,72 @@ +- set_fact: + app_id: "e0a62513-1d81-480e-a6dc-5c99cdd58d9a" + tenant_id: "72f988bf-86f1-41af-91ab-2d7cd011db47" + +- name: delete ad service principal + azure_rm_adserviceprincipal: + app_id: "{{ app_id }}" + tenant: "{{ tenant_id }}" + state: absent + +- name: create ad service principal + azure_rm_adserviceprincipal: + app_id: "{{ app_id }}" + tenant: "{{ tenant_id }}" + state: present + register: ad_fact + +- assert: + that: + - ad_fact.changed + +- name: create ad service principal (idempontent) + azure_rm_adserviceprincipal: + app_id: "{{ app_id }}" + tenant: "{{ tenant_id }}" + state: present + register: output + +- assert: + that: + - not output.changed + +- name: Get ad service principal info by app_id + azure_rm_adserviceprincipal_info: + app_id: "{{ app_id }}" + tenant: "{{ tenant_id }}" + register: ad_info + +- assert: + that: + - ad_info.service_principals[0].app_display_name == ad_fact.app_display_name + - ad_info.service_principals[0].app_role_assignment_required == False + +- name: update ad service principal app_role_assignmentrequired to True + azure_rm_adserviceprincipal: + app_id: "{{ app_id }}" + tenant: "{{ tenant_id }}" + app_role_assignment_required: True + state: present + register: output + +- name: Get ad service principal info by object_id + azure_rm_adserviceprincipal_info: + tenant: "{{ tenant_id }}" + object_id: "{{ ad_info.service_principals[0].object_id }}" + register: ad_info + +- assert: + that: + - ad_info.service_principals[0].app_display_name == ad_fact.app_display_name + - ad_info.service_principals[0].app_role_assignment_required == True + +- name: delete ad service principal + azure_rm_adserviceprincipal: + app_id: "{{ app_id }}" + tenant: "{{ tenant_id }}" + state: absent + register: output + +- assert: + that: + - output.changed diff --git a/tests/integration/targets/azure_rm_aks/aliases b/tests/integration/targets/azure_rm_aks/aliases index 3b050cbc18..7aca0ce4f7 100644 --- a/tests/integration/targets/azure_rm_aks/aliases +++ b/tests/integration/targets/azure_rm_aks/aliases @@ -1,3 +1,3 @@ cloud/azure destructive -shippable/azure/group6 +shippable/azure/group11 diff --git a/tests/integration/targets/azure_rm_aks/tasks/main.yml b/tests/integration/targets/azure_rm_aks/tasks/main.yml index a1a494c961..bd122ecf54 100644 --- a/tests/integration/targets/azure_rm_aks/tasks/main.yml +++ b/tests/integration/targets/azure_rm_aks/tasks/main.yml @@ -30,6 +30,8 @@ min_count: 1 node_resource_group: "node{{ noderpfx }}" enable_rbac: yes + network_profile: + load_balancer_sku: standard check_mode: yes - name: Check there is no AKS created @@ -66,6 +68,8 @@ min_count: 1 node_resource_group: "node{{ noderpfx }}" enable_rbac: yes + network_profile: + load_balancer_sku: standard register: output - name: Assert the AKS instance is well created @@ -108,6 +112,8 @@ min_count: 1 node_resource_group: "node{{ noderpfx }}" enable_rbac: yes + network_profile: + load_balancer_sku: standard register: output - name: Assert idempotent @@ -143,6 +149,7 @@ http_application_routing: {} network_profile: network_plugin: kubenet + load_balancer_sku: standard enable_rbac: yes register: output @@ -151,7 +158,7 @@ that: - output.changed - output.kubernetes_version == version1.azure_aks_versions[0] - - output.addon.httpApplicationRouting.enabled == True + - output.addon.httpapplicationrouting.enabled == true - output.agent_pool_profiles[0].count == 1 - output.network_profile.network_plugin == 'kubenet' @@ -177,6 +184,7 @@ http_application_routing: {} network_profile: network_plugin: kubenet + load_balancer_sku: standard enable_rbac: yes register: output @@ -207,6 +215,8 @@ min_count: 3 node_resource_group: "node{{ noderpfx }}" enable_rbac: yes + network_profile: + load_balancer_sku: standard register: output - name: Assert the AKS instance is well created @@ -238,6 +248,8 @@ min_count: 3 node_resource_group: "node{{ noderpfx }}" enable_rbac: yes + network_profile: + load_balancer_sku: standard register: output - name: Assert the AKS instance is well created diff --git a/tests/integration/targets/azure_rm_automationaccount/tasks/main.yml b/tests/integration/targets/azure_rm_automationaccount/tasks/main.yml index 882693999a..1e00eb9ace 100644 --- a/tests/integration/targets/azure_rm_automationaccount/tasks/main.yml +++ b/tests/integration/targets/azure_rm_automationaccount/tasks/main.yml @@ -37,7 +37,7 @@ - not output.changed - name: Get automation account - azure_rm_automationaccount_facts: + azure_rm_automationaccount_info: name: "{{ name }}" resource_group: "{{ resource_group }}" list_statistics: yes diff --git a/tests/integration/targets/azure_rm_backupazurevm/aliases b/tests/integration/targets/azure_rm_backupazurevm/aliases new file mode 100644 index 0000000000..6c4c0f4ca0 --- /dev/null +++ b/tests/integration/targets/azure_rm_backupazurevm/aliases @@ -0,0 +1,4 @@ +cloud/azure +shippable/azure/group12 +destructive +disabled \ No newline at end of file diff --git a/tests/integration/targets/azure_rm_backupazurevm/meta/main.yml b/tests/integration/targets/azure_rm_backupazurevm/meta/main.yml new file mode 100644 index 0000000000..48f5726d89 --- /dev/null +++ b/tests/integration/targets/azure_rm_backupazurevm/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - setup_azure \ No newline at end of file diff --git a/tests/integration/targets/azure_rm_backupazurevm/tasks/main.yml b/tests/integration/targets/azure_rm_backupazurevm/tasks/main.yml new file mode 100644 index 0000000000..98a1fdfffb --- /dev/null +++ b/tests/integration/targets/azure_rm_backupazurevm/tasks/main.yml @@ -0,0 +1,75 @@ +- name: Fix resource prefix + set_fact: + resource_group: 'MyResourceGroup' + recovery_vault_name: 'MyRecoveryVault' + resource_id: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/MyVM" + backup_policy_id: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/microsoft.recoveryservices/vaults/testVault/backupPolicies/DefaultPolicy" + +- name: Enabling/Updating protection for the Azure VM + azure_rm_backupazurevm: + resource_group: "{{ resource_group }}" + recovery_vault_name: "{{ recovery_vault_name }}" + resource_id: "{{ resource_id }}" + backup_policy_id: "{{ backup_policy_id }}" + state: "create" + register: output + +- name: Assert that output has changed + assert: + that: + - output.changed + +- name: Trigger an on-demand backup for a protected Azure VM + azure_rm_backupazurevm: + resource_group: "{{ resource_group }}" + recovery_vault_name: "{{ recovery_vault_name }}" + resource_id: "{{ resource_id }}" + backup_policy_id: "{{ backup_policy_id }}" + state: "backup" + register: output + +- name: Assert that output has changed + assert: + that: + - output.changed + +- name: Stop protection but retain existing data + azure_rm_backupazurevm: + resource_group: "{{ resource_group }}" + recovery_vault_name: "{{ recovery_vault_name }}" + resource_id: "{{ resource_id }}" + backup_policy_id: "{{ backup_policy_id }}" + state: "stop" + register: output + +- name: Assert that output has changed + assert: + that: + - output.changed + +- name: Get backup azure vm info + azure_rm_backupazurevm_info: + resource_group: "{{ resource_group }}" + recovery_vault_name: "{{ recovery_vault_name }}" + resource_id: "{{ resource_id }}" + register: output + +- name: Assert that output has changed + assert: + that: + - output.response.id != None + - output.response.name != None + +- name: Stop protection and delete data + azure_rm_backupazurevm: + resource_group: "{{ resource_group }}" + recovery_vault_name: "{{ recovery_vault_name }}" + resource_id: "{{ resource_id }}" + backup_policy_id: "{{ backup_policy_id }}" + state: "delete" + register: output + +- name: Assert that output has changed + assert: + that: + - output.changed diff --git a/tests/integration/targets/azure_rm_deployment/tasks/main.yml b/tests/integration/targets/azure_rm_deployment/tasks/main.yml index fb3d195151..bbe5c98ee1 100644 --- a/tests/integration/targets/azure_rm_deployment/tasks/main.yml +++ b/tests/integration/targets/azure_rm_deployment/tasks/main.yml @@ -2,6 +2,24 @@ set_fact: dns_label: "test{{ resource_group | hash('md5') | truncate(16, True, '') + (65535 | random | string) }}" +- name: Error Create Azure Deploy + azure_rm_deployment: + resource_group: "{{ resource_group }}" + location: "eastus" + template_link: 'https://raw.githubusercontent.com/Azure/azure-quickstart-templates/d01a5c06f4f1bc03a049ca17bbbd6e06d62657b3/101-vm-simple-linux/azuredeploy.json' + deployment_name: "{{ dns_label }}" + parameters: + adminUsername: + value: chouseknecht + adminPassword: + value: password123! + dnsLabelPrefix: + value: "{{ dns_label }}" + ubuntuOSVersion: + value: "Never-LTS" + register: output + ignore_errors: yes + - name: Create Azure Deploy azure_rm_deployment: resource_group: "{{ resource_group }}" diff --git a/tests/integration/targets/azure_rm_functionapp/aliases b/tests/integration/targets/azure_rm_functionapp/aliases index aa77c071a8..759eafa2de 100644 --- a/tests/integration/targets/azure_rm_functionapp/aliases +++ b/tests/integration/targets/azure_rm_functionapp/aliases @@ -1,3 +1,3 @@ cloud/azure -shippable/azure/group2 +shippable/azure/group3 destructive diff --git a/tests/integration/targets/azure_rm_keyvault/tasks/main.yml b/tests/integration/targets/azure_rm_keyvault/tasks/main.yml index 88b2cf08cc..7b1bd61ef3 100644 --- a/tests/integration/targets/azure_rm_keyvault/tasks/main.yml +++ b/tests/integration/targets/azure_rm_keyvault/tasks/main.yml @@ -10,7 +10,7 @@ azure_client_id=azure_client_id, azure_secret=azure_secret, azure_tenant=tenant_id) }}" - register: object_id + register: object_id_facts - name: Create instance of Key Vault -- check mode azure_rm_keyvault: diff --git a/tests/integration/targets/azure_rm_keyvaultkey/tasks/main.yml b/tests/integration/targets/azure_rm_keyvaultkey/tasks/main.yml index bf19988a07..4db30c58f7 100644 --- a/tests/integration/targets/azure_rm_keyvaultkey/tasks/main.yml +++ b/tests/integration/targets/azure_rm_keyvaultkey/tasks/main.yml @@ -10,7 +10,7 @@ azure_client_id=azure_client_id, azure_secret=azure_secret, azure_tenant=tenant_id) }}" - register: object_id + register: object_id_facts - name: Create instance of Key Vault azure_rm_keyvault: diff --git a/tests/integration/targets/azure_rm_keyvaultsecret/tasks/main.yml b/tests/integration/targets/azure_rm_keyvaultsecret/tasks/main.yml index cdbf13f0d2..baee99ae77 100644 --- a/tests/integration/targets/azure_rm_keyvaultsecret/tasks/main.yml +++ b/tests/integration/targets/azure_rm_keyvaultsecret/tasks/main.yml @@ -10,7 +10,7 @@ azure_client_id=azure_client_id, azure_secret=azure_secret, azure_tenant=tenant_id) }}" - register: object_id + register: object_id_facts - name: Create instance of Key Vault azure_rm_keyvault: @@ -85,4 +85,4 @@ register: output - assert: - that: output.changed \ No newline at end of file + that: output.changed diff --git a/tests/integration/targets/azure_rm_mariadbserver/tasks/main.yml b/tests/integration/targets/azure_rm_mariadbserver/tasks/main.yml index 74dc88e95c..35df36698b 100644 --- a/tests/integration/targets/azure_rm_mariadbserver/tasks/main.yml +++ b/tests/integration/targets/azure_rm_mariadbserver/tasks/main.yml @@ -86,7 +86,7 @@ var: output - name: Gather facts MariaDB Server - azure_rm_mariadbserver_facts: + azure_rm_mariadbserver_info: resource_group: "{{ resource_group }}" name: mariadbsrv{{ rpfx }} register: output @@ -104,7 +104,7 @@ tier: Basic location: westus2 storage_mb: 51200 - version: 10.2 + version: 10.3 enforce_ssl: True admin_username: zimxyz admin_password: Password123! @@ -120,7 +120,7 @@ tier: Basic location: westus2 storage_mb: 51200 - version: 10.2 + version: 10.3 enforce_ssl: True admin_username: zimxyz admin_password: Password123! @@ -128,7 +128,7 @@ ccc: ddd - name: Gather facts MariaDB Server - azure_rm_mariadbserver_facts: + azure_rm_mariadbserver_info: resource_group: "{{ resource_group }}" name: mariadbsrv{{ rpfx }}second register: output @@ -150,7 +150,7 @@ - output.servers[0]['tags']['ccc'] == 'ddd' - name: Gather facts MariaDB Server - azure_rm_mariadbserver_facts: + azure_rm_mariadbserver_info: resource_group: "{{ resource_group }}" register: output - name: Assert that facts are returned @@ -255,7 +255,7 @@ name: testdatabase2 - name: Gather facts MariaDB Database - azure_rm_mariadbdatabase_facts: + azure_rm_mariadbdatabase_info: resource_group: "{{ resource_group }}" server_name: mariadbsrv{{ rpfx }} name: testdatabase @@ -271,7 +271,7 @@ - output.databases[0]['collation'] != None - name: Gather facts MariaDB Database - azure_rm_mariadbdatabase_facts: + azure_rm_mariadbdatabase_info: resource_group: "{{ resource_group }}" server_name: mariadbsrv{{ rpfx }} register: output @@ -395,7 +395,7 @@ - output.changed - name: Gather facts MariaDB Firewall Rule - azure_rm_mariadbfirewallrule_facts: + azure_rm_mariadbfirewallrule_info: resource_group: "{{ resource_group }}" server_name: mariadbsrv{{ rpfx }} name: firewallrule{{ rpfx }} @@ -412,7 +412,7 @@ - "output.rules | length == 1" - name: Gather facts MariaDB Firewall Rule - azure_rm_mariadbfirewallrule_facts: + azure_rm_mariadbfirewallrule_info: resource_group: "{{ resource_group }}" server_name: mariadbsrv{{ rpfx }} register: output @@ -463,7 +463,7 @@ state: absent - name: Gather facts MariaDB Firewall Rule - azure_rm_mariadbfirewallrule_facts: + azure_rm_mariadbfirewallrule_info: resource_group: "{{ resource_group }}" server_name: mariadbsrv{{ rpfx }} name: firewallrule{{ rpfx }} @@ -491,7 +491,7 @@ - output.changed - name: Try to delete default configuraion - azure_rm_mariadbconfiguration_facts: + azure_rm_mariadbconfiguration_info: resource_group: "{{ resource_group }}" server_name: mariadbsrv{{ rpfx }} name: event_scheduler @@ -561,7 +561,7 @@ - not output.changed - name: Gather facts MariaDB Configuration - azure_rm_mariadbconfiguration_facts: + azure_rm_mariadbconfiguration_info: resource_group: "{{ resource_group }}" server_name: mariadbsrv{{ rpfx }} name: event_scheduler @@ -578,7 +578,7 @@ - output.settings | length == 1 - name: Gather facts MariaDB Configuration - azure_rm_mariadbconfiguration_facts: + azure_rm_mariadbconfiguration_info: resource_group: "{{ resource_group }}" server_name: mariadbsrv{{ rpfx }} register: output diff --git a/tests/integration/targets/azure_rm_mysqlserver/tasks/main.yml b/tests/integration/targets/azure_rm_mysqlserver/tasks/main.yml index 0276fdfeff..123778e972 100644 --- a/tests/integration/targets/azure_rm_mysqlserver/tasks/main.yml +++ b/tests/integration/targets/azure_rm_mysqlserver/tasks/main.yml @@ -86,7 +86,7 @@ var: output - name: Gather facts MySQL Server - azure_rm_mysqlserver_facts: + azure_rm_mysqlserver_info: resource_group: "{{ resource_group }}" name: mysqlsrv{{ rpfx }} register: output @@ -128,7 +128,7 @@ ccc: ddd - name: Gather facts MySQL Server - azure_rm_mysqlserver_facts: + azure_rm_mysqlserver_info: resource_group: "{{ resource_group }}" name: mysqlsrv{{ rpfx }}second register: output @@ -150,7 +150,7 @@ - output.servers[0]['tags']['ccc'] == 'ddd' - name: Gather facts MySQL Server - azure_rm_mysqlserver_facts: + azure_rm_mysqlserver_info: resource_group: "{{ resource_group }}" register: output - name: Assert that facts are returned @@ -255,7 +255,7 @@ name: testdatabase2 - name: Gather facts MySQL Database - azure_rm_mysqldatabase_facts: + azure_rm_mysqldatabase_info: resource_group: "{{ resource_group }}" server_name: mysqlsrv{{ rpfx }} name: testdatabase @@ -271,7 +271,7 @@ - output.databases[0]['collation'] != None - name: Gather facts MySQL Database - azure_rm_mysqldatabase_facts: + azure_rm_mysqldatabase_info: resource_group: "{{ resource_group }}" server_name: mysqlsrv{{ rpfx }} register: output @@ -395,7 +395,7 @@ - output.changed - name: Gather facts MySQL Firewall Rule - azure_rm_mysqlfirewallrule_facts: + azure_rm_mysqlfirewallrule_info: resource_group: "{{ resource_group }}" server_name: mysqlsrv{{ rpfx }} name: firewallrule{{ rpfx }} @@ -412,7 +412,7 @@ - "output.rules | length == 1" - name: Gather facts MySQL Firewall Rule - azure_rm_mysqlfirewallrule_facts: + azure_rm_mysqlfirewallrule_info: resource_group: "{{ resource_group }}" server_name: mysqlsrv{{ rpfx }} register: output @@ -463,7 +463,7 @@ state: absent - name: Gather facts MySQL Firewall Rule - azure_rm_mysqlfirewallrule_facts: + azure_rm_mysqlfirewallrule_info: resource_group: "{{ resource_group }}" server_name: mysqlsrv{{ rpfx }} name: firewallrule{{ rpfx }} @@ -491,7 +491,7 @@ - output.changed - name: Try to delete default configuraion - azure_rm_mysqlconfiguration_facts: + azure_rm_mysqlconfiguration_info: resource_group: "{{ resource_group }}" server_name: mysqlsrv{{ rpfx }} name: event_scheduler @@ -561,7 +561,7 @@ - not output.changed - name: Gather facts MySQL Configuration - azure_rm_mysqlconfiguration_facts: + azure_rm_mysqlconfiguration_info: resource_group: "{{ resource_group }}" server_name: mysqlsrv{{ rpfx }} name: event_scheduler @@ -578,7 +578,7 @@ - output.settings | length == 1 - name: Gather facts MySQL Configuration - azure_rm_mysqlconfiguration_facts: + azure_rm_mysqlconfiguration_info: resource_group: "{{ resource_group }}" server_name: mysqlsrv{{ rpfx }} register: output diff --git a/tests/integration/targets/azure_rm_networkinterface/aliases b/tests/integration/targets/azure_rm_networkinterface/aliases index 67f8675677..88fb706095 100644 --- a/tests/integration/targets/azure_rm_networkinterface/aliases +++ b/tests/integration/targets/azure_rm_networkinterface/aliases @@ -1,4 +1,4 @@ cloud/azure shippable/azure/group5 destructive -azure_rm_applicationsecuritygroup \ No newline at end of file +azure_rm_applicationsecuritygroup diff --git a/tests/integration/targets/azure_rm_networkinterface/tasks/main.yml b/tests/integration/targets/azure_rm_networkinterface/tasks/main.yml index bd7df0a29f..44a27b2b30 100644 --- a/tests/integration/targets/azure_rm_networkinterface/tasks/main.yml +++ b/tests/integration/targets/azure_rm_networkinterface/tasks/main.yml @@ -85,6 +85,7 @@ that: - output.changed - output.state.id + - output.state.ip_configuration.primary - name: Get fact of the new created NIC azure_rm_networkinterface_info: @@ -97,6 +98,7 @@ - "facts.networkinterfaces | length == 1" - facts.networkinterfaces[0].id == output.state.id - "facts.networkinterfaces[0].ip_configurations | length == 1" + - facts.networkinterfaces[0].ip_configurations[0].primary == True - not facts.networkinterfaces[0].security_group - not facts.networkinterfaces[0].ip_configurations[0].public_ip_address - not facts.networkinterfaces[0].enable_ip_forwarding @@ -290,6 +292,8 @@ - 'facts.networkinterfaces[0].security_group.endswith("tn{{ rpfx }}sg")' - facts.networkinterfaces[0].enable_accelerated_networking - facts.networkinterfaces[0].enable_ip_forwarding + - facts.networkinterfaces[0].ip_configurations[0].primary == True + - facts.networkinterfaces[0].ip_configurations[1].primary == False - name: Remove one dns server and ip configuration azure_rm_networkinterface: @@ -551,4 +555,4 @@ resource_group: "{{ resource_group_secondary }}" name: "{{ applicationsecuritygroup_name2 }}" state: absent - register: output \ No newline at end of file + register: output diff --git a/tests/integration/targets/azure_rm_postgresqlserver/tasks/main.yml b/tests/integration/targets/azure_rm_postgresqlserver/tasks/main.yml index 93ec174a8f..8cd59161d3 100644 --- a/tests/integration/targets/azure_rm_postgresqlserver/tasks/main.yml +++ b/tests/integration/targets/azure_rm_postgresqlserver/tasks/main.yml @@ -82,7 +82,7 @@ var: output - name: Gather facts postgresql Server - azure_rm_postgresqlserver_facts: + azure_rm_postgresqlserver_info: resource_group: "{{ resource_group }}" name: postgresqlsrv{{ rpfx }} register: output @@ -122,7 +122,7 @@ ccc: ddd - name: Gather facts PostgreSQL Server - azure_rm_postgresqlserver_facts: + azure_rm_postgresqlserver_info: resource_group: "{{ resource_group }}" name: postgresqlsrv{{ rpfx }}second register: output @@ -144,7 +144,7 @@ - output.servers[0]['tags']['ccc'] == 'ddd' - name: Gather facts PostgreSQL Server - azure_rm_postgresqlserver_facts: + azure_rm_postgresqlserver_info: resource_group: "{{ resource_group }}" register: output - name: Assert that facts are returned @@ -251,7 +251,7 @@ name: testdatabase2 - name: Gather facts PostgreSQL Database - azure_rm_postgresqldatabase_facts: + azure_rm_postgresqldatabase_info: resource_group: "{{ resource_group }}" server_name: postgresqlsrv{{ rpfx }} name: testdatabase @@ -267,7 +267,7 @@ - output.databases[0]['collation'] != None - name: Gather facts PostgreSQL Database - azure_rm_postgresqldatabase_facts: + azure_rm_postgresqldatabase_info: resource_group: "{{ resource_group }}" server_name: postgresqlsrv{{ rpfx }} register: output @@ -374,7 +374,7 @@ end_ip_address: 172.28.10.138 - name: Gather facts PostgreSQL Firewall Rule - azure_rm_postgresqlfirewallrule_facts: + azure_rm_postgresqlfirewallrule_info: resource_group: "{{ resource_group }}" server_name: postgresqlsrv{{ rpfx }} name: firewallrule{{ rpfx }} @@ -391,7 +391,7 @@ - "output.rules | length == 1" - name: Gather facts PostgreSQL Firewall Rule - azure_rm_postgresqlfirewallrule_facts: + azure_rm_postgresqlfirewallrule_info: resource_group: "{{ resource_group }}" server_name: postgresqlsrv{{ rpfx }} register: output @@ -455,7 +455,7 @@ state: absent - name: Gather facts PostgreSQL Firewall Rule - azure_rm_postgresqlfirewallrule_facts: + azure_rm_postgresqlfirewallrule_info: resource_group: "{{ resource_group }}" server_name: postgresqlsrv{{ rpfx }} name: firewallrule{{ rpfx }} @@ -531,7 +531,7 @@ - not output.changed - name: Gather facts PostgreSQL Configuration - azure_rm_postgresqlconfiguration_facts: + azure_rm_postgresqlconfiguration_info: resource_group: "{{ resource_group }}" server_name: postgresqlsrv{{ rpfx }} name: deadlock_timeout @@ -548,7 +548,7 @@ - output.settings | length == 1 - name: Gather facts PostgreSQL Configuration - azure_rm_postgresqlconfiguration_facts: + azure_rm_postgresqlconfiguration_info: resource_group: "{{ resource_group }}" server_name: postgresqlsrv{{ rpfx }} register: output diff --git a/tests/integration/targets/azure_rm_privatednszone/aliases b/tests/integration/targets/azure_rm_privatednszone/aliases new file mode 100644 index 0000000000..90d5921a5c --- /dev/null +++ b/tests/integration/targets/azure_rm_privatednszone/aliases @@ -0,0 +1,4 @@ +cloud/azure +shippable/azure/group2 +destructive +azure_rm_privatednszone_info diff --git a/tests/integration/targets/azure_rm_privatednszone/meta/main.yml b/tests/integration/targets/azure_rm_privatednszone/meta/main.yml new file mode 100644 index 0000000000..95e1952f98 --- /dev/null +++ b/tests/integration/targets/azure_rm_privatednszone/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - setup_azure diff --git a/tests/integration/targets/azure_rm_privatednszone/tasks/main.yml b/tests/integration/targets/azure_rm_privatednszone/tasks/main.yml new file mode 100644 index 0000000000..eba80899d7 --- /dev/null +++ b/tests/integration/targets/azure_rm_privatednszone/tasks/main.yml @@ -0,0 +1,77 @@ +- name: Create random domain name + set_fact: + domain_name: "{{ resource_group | hash('md5') | truncate(16, True, '') + (65535 | random | string) }}" + +- name: Create a private DNS zone (check mode) + azure_rm_privatednszone: + resource_group: "{{ resource_group }}" + name: "{{ domain_name }}.com" + register: results + check_mode: true + +- assert: + that: results.changed + +- name: Create a private DNS zone + azure_rm_privatednszone: + resource_group: "{{ resource_group }}" + name: "{{ domain_name }}.com" + register: results + +- assert: + that: results.changed + +- name: Update private DNS zone with tags + azure_rm_privatednszone: + resource_group: "{{ resource_group }}" + name: "{{ domain_name }}.com" + tags: + test: modified + register: results + +- assert: + that: + - results.changed + - results.state.tags.test == 'modified' + +- name: Test idempotent + azure_rm_privatednszone: + name: "{{ domain_name }}.com" + resource_group: "{{ resource_group }}" + register: results + +- assert: + that: + - not results.changed + +- name: Retrieve DNS Zone Facts + azure_rm_privatednszone_info: + resource_group: "{{ resource_group }}" + name: "{{ domain_name }}.com" + register: zones + +- name: Assert that facts module returned result + assert: + that: + - zones.privatednszones[0].tags.test == 'modified' + - zones.privatednszones[0].number_of_record_sets == 1 + +# +# azure_rm_privatednszone cleanup +# + +- name: Delete private DNS zone + azure_rm_privatednszone: + resource_group: "{{ resource_group }}" + name: "{{ domain_name }}.com" + state: absent + +- name: Delete private DNS zone (idempotent) + azure_rm_privatednszone: + resource_group: "{{ resource_group }}" + name: "{{ domain_name }}.com" + state: absent + register: results + +- assert: + that: not results.changed diff --git a/tests/integration/targets/azure_rm_publicipaddress/tasks/main.yml b/tests/integration/targets/azure_rm_publicipaddress/tasks/main.yml index ffe750564a..2db2753a33 100644 --- a/tests/integration/targets/azure_rm_publicipaddress/tasks/main.yml +++ b/tests/integration/targets/azure_rm_publicipaddress/tasks/main.yml @@ -27,6 +27,20 @@ - output.state.tags | length == 2 - output.state.tags.testing == 'testing' +- name: Create public ip with IPV6 + azure_rm_publicipaddress: + resource_group: "{{ resource_group }}" + name: "pip{{ rpfx }}-02" + allocation_method: Static + domain_name: "{{ domain_name }}-02" + version: 'ipv6' + sku: 'Standard' + register: output + +- assert: + that: + - output.state.public_ip_address_version == 'ipv6' + - name: Should be idempotent azure_rm_publicipaddress: resource_group: "{{ resource_group }}" @@ -100,6 +114,12 @@ - assert: that: infos.publicipaddresses | length > 0 +- name: Remove IPV6 public ip + azure_rm_publicipaddress: + resource_group: "{{ resource_group }}" + name: "pip{{ rpfx }}-02" + state: absent + - name: Remove public ip azure_rm_publicipaddress: resource_group: "{{ resource_group }}" diff --git a/tests/integration/targets/azure_rm_rediscache/tasks/main.yml b/tests/integration/targets/azure_rm_rediscache/tasks/main.yml index dc0c61f39f..ef0b89f95f 100644 --- a/tests/integration/targets/azure_rm_rediscache/tasks/main.yml +++ b/tests/integration/targets/azure_rm_rediscache/tasks/main.yml @@ -39,7 +39,7 @@ - output.id - name: Get facts - azure_rm_rediscache_facts: + azure_rm_rediscache_info: resource_group: "{{ resource_group }}" name: "{{ redis_name }}" register: facts @@ -77,7 +77,7 @@ # As such, it is currently unable to accept the update request. Please try again later." block: - name: Wait for Redis provisioning to complete - azure_rm_rediscache_facts: + azure_rm_rediscache_info: resource_group: "{{ resource_group }}" name: "{{ redis_name }}" register: facts @@ -207,7 +207,7 @@ - output.id - name: Get facts - azure_rm_rediscache_facts: + azure_rm_rediscache_info: resource_group: "{{ resource_group }}" name: "{{ redis_name }}2" return_access_keys: True @@ -245,7 +245,7 @@ # a previous update request or is undergoing system maintenance. As such, it is currently unable to accept the update request. Please try again later." block: - name: Wait for Redis provisioning to complete - azure_rm_rediscache_facts: + azure_rm_rediscache_info: resource_group: "{{ resource_group }}" name: "{{ redis_name }}2" register: facts diff --git a/tests/integration/targets/azure_rm_resource/tasks/main.yml b/tests/integration/targets/azure_rm_resource/tasks/main.yml index 7c3024a5ef..6ec87237d5 100644 --- a/tests/integration/targets/azure_rm_resource/tasks/main.yml +++ b/tests/integration/targets/azure_rm_resource/tasks/main.yml @@ -57,7 +57,7 @@ that: output.changed - name: Try to get information about account - azure_rm_resource_facts: + azure_rm_resource_info: api_version: '2018-02-01' resource_group: "{{ resource_group }}" provider: network @@ -73,7 +73,7 @@ - output.response | length == 1 - name: Try to query a list - azure_rm_resource_facts: + azure_rm_resource_info: api_version: '2018-02-01' resource_group: "{{ resource_group }}" provider: network @@ -87,7 +87,7 @@ - output.response | length >= 1 - name: Try to query a list - same without API version - azure_rm_resource_facts: + azure_rm_resource_info: resource_group: "{{ resource_group }}" provider: network resource_type: networksecuritygroups @@ -100,7 +100,7 @@ - output.response | length >= 1 - name: Query all the resources in the resource group - azure_rm_resource_facts: + azure_rm_resource_info: resource_group: "{{ resource_group }}" resource_type: resources register: output diff --git a/tests/integration/targets/azure_rm_roledefinition/aliases b/tests/integration/targets/azure_rm_roledefinition/aliases new file mode 100644 index 0000000000..35b9401151 --- /dev/null +++ b/tests/integration/targets/azure_rm_roledefinition/aliases @@ -0,0 +1,3 @@ +cloud/azure +destructive +unsupported \ No newline at end of file diff --git a/tests/integration/targets/azure_rm_roledefinition/meta/main.yml b/tests/integration/targets/azure_rm_roledefinition/meta/main.yml new file mode 100644 index 0000000000..95e1952f98 --- /dev/null +++ b/tests/integration/targets/azure_rm_roledefinition/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - setup_azure diff --git a/tests/integration/targets/azure_rm_roledefinition/tasks/main.yml b/tests/integration/targets/azure_rm_roledefinition/tasks/main.yml new file mode 100644 index 0000000000..15cf266b61 --- /dev/null +++ b/tests/integration/targets/azure_rm_roledefinition/tasks/main.yml @@ -0,0 +1,211 @@ +- name: Fix resource prefix + set_fact: + role_name: "{{ (resource_group | replace('-','x'))[-8:] }}{{ 1000 | random }}testrole" + subscription_id: "{{azure_subscription_id}}" + principal_id: "{{azure_client_id}}" + run_once: yes + +- name: Create a role definition (Check Mode) + azure_rm_roledefinition: + name: "{{ role_name }}" + scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" + permissions: + - actions: + - "Microsoft.Compute/virtualMachines/read" + not_actions: + - "Microsoft.Compute/virtualMachines/write" + data_actions: + - "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read" + not_data_actions: + - "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write" + assignable_scopes: + - "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" + check_mode: yes + register: output + +- name: Assert creating role definition check mode + assert: + that: + - output.changed + +- name: Create a role definition + azure_rm_roledefinition: + name: "{{ role_name }}" + scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" + permissions: + - actions: + - "Microsoft.Compute/virtualMachines/read" + not_actions: + - "Microsoft.Compute/virtualMachines/write" + data_actions: + - "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read" + not_data_actions: + - "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write" + assignable_scopes: + - "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" + register: output + +- name: Assert creating role definition + assert: + that: + - output.changed + + +## because of the bug of azure service , the following tasks will cause failures randomly +# +#- name: Get facts by type +# azure_rm_roledefinition_info: +# scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# type: custom +# register: facts +# +#- name: Assert facts +# assert: +# that: +# - facts['roledefinitions'] | length > 1 +# +#- name: Get facts by name +# azure_rm_roledefinition_info: +# scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# role_name: "{{ role_name }}" +# register: facts +# until: facts.roledefinitions | length > 0 +# retries: 50 +# delay: 60 +# +#- name: Assert facts +# assert: +# that: +# - facts['roledefinitions'] | length == 1 +# - facts['roledefinitions'][0]['permissions'] | length == 1 +# - facts['roledefinitions'][0]['permissions'][0]['not_data_actions'] | length == 1 +# - facts['roledefinitions'][0]['permissions'][0]['data_actions'] | length == 1 +# +#- name: Update the role definition (idempotent) +# azure_rm_roledefinition: +# name: "{{ role_name }}" +# scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# permissions: +# - actions: +# - "Microsoft.Compute/virtualMachines/read" +# not_actions: +# - "Microsoft.Compute/virtualMachines/write" +# data_actions: +# - "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read" +# not_data_actions: +# - "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write" +# assignable_scopes: +# - "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# register: output +# +#- name: assert output not changed +# assert: +# that: +# - not output.changed +# +#- name: Update the role definition +# azure_rm_roledefinition: +# name: "{{ role_name }}" +# description: "update description" +# scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# permissions: +# - actions: +# - "Microsoft.Compute/virtualMachines/read" +# - "Microsoft.Compute/virtualMachines/start/action" +# not_actions: +# - "Microsoft.Compute/virtualMachines/write" +# data_actions: +# - "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read" +# not_data_actions: +# - "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write" +# assignable_scopes: +# - "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# register: output +# +#- name: assert output changed +# assert: +# that: +# - output.changed +# +#- name: Get role definition facts +# azure_rm_roledefinition_info: +# role_name: "{{ role_name }}" +# scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# type: custom +# register: roledef +# until: "{{ roledef.roledefinitions | length > 0 }}" +# retries: 50 +# delay: 60 +# +#- name: Assert role definition facts +# assert: +# that: +# - roledef['roledefinitions'] | length == 1 +# - roledef['roledefinitions'][0]['id'] +# +#- name: Create a role assignment (Check Mode) +# azure_rm_roleassignment: +# scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# assignee_object_id: "{{ principal_id }}" +# role_definition_id: "{{ roledef['roledefinitions'][0]['id'] }}" +# check_mode: yes +# register: output +# +#- name: Assert creating role definition check mode +# assert: +# that: +# - output.changed +# +#- name: Create a role assignment +# azure_rm_roleassignment: +# scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# assignee_object_id: "{{ principal_id }}" +# role_definition_id: "{{ roledef['roledefinitions'][0]['id'] }}" +# register: output +# +#- name: Assert creating role assignment +# assert: +# that: +# - output.changed +# +#- name: Get facts +# azure_rm_roleassignment_info: +# scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# assignee: "{{ principal_id }}" +# role_definition_id: "{{ roledef['roledefinitions'][0]['id'] }}" +# register: facts +# +#- name: assert role assignment facts +# assert: +# that: +# - facts['roleassignments'] | length > 0 +# - facts['roleassignments'][0]['id'] +# +#- name: delete role assignment +# azure_rm_roleassignment: +# name: "{{ facts['roleassignments'][0]['id'].split('/')[-1] }}" +# scope: "/subscriptions/{{ subscription_id }}" +# state: absent +# +#- name: Delete the role definition (Check Mode) +# azure_rm_roledefinition: +# name: "{{ role_name }}" +# scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# state: absent +# check_mode: yes +# register: output +# +#- name: assert deleting role definition check mode +# assert: +# that: output.changed +# +#- name: Delete the role definition +# azure_rm_roledefinition: +# name: "{{ role_name }}" +# scope: "/subscriptions/{{ subscription_id }}/resourceGroups/{{ resource_group }}" +# state: absent +# register: output +# +#- assert: +# that: +# - output.changed diff --git a/tests/integration/targets/azure_rm_routetable/tasks/main.yml b/tests/integration/targets/azure_rm_routetable/tasks/main.yml index 40c4159eac..e01b7e826b 100644 --- a/tests/integration/targets/azure_rm_routetable/tasks/main.yml +++ b/tests/integration/targets/azure_rm_routetable/tasks/main.yml @@ -44,7 +44,7 @@ - not output.changed - name: Get facts of the table - azure_rm_routetable_facts: + azure_rm_routetable_info: name: "{{ name }}" resource_group: "{{ resource_group }}" register: output @@ -110,7 +110,7 @@ - output.changed - name: Get facts of the table - azure_rm_routetable_facts: + azure_rm_routetable_info: name: "{{ name }}" resource_group: "{{ resource_group }}" register: output diff --git a/tests/integration/targets/azure_rm_servicebus/tasks/main.yml b/tests/integration/targets/azure_rm_servicebus/tasks/main.yml index c12d635a1d..93f56ebb28 100644 --- a/tests/integration/targets/azure_rm_servicebus/tasks/main.yml +++ b/tests/integration/targets/azure_rm_servicebus/tasks/main.yml @@ -97,7 +97,7 @@ - subs.changed - name: Retrive topic - azure_rm_servicebus_facts: + azure_rm_servicebus_info: type: topic name: "topic{{ rpfx }}" resource_group: "{{ resource_group }}" @@ -122,7 +122,7 @@ state: absent - name: Retrive topic - azure_rm_servicebus_facts: + azure_rm_servicebus_info: type: topic name: "topic{{ rpfx }}" resource_group: "{{ resource_group }}" @@ -143,7 +143,7 @@ state: absent - name: Retrive topic - azure_rm_servicebus_facts: + azure_rm_servicebus_info: name: "topic{{ rpfx }}" type: topic resource_group: "{{ resource_group }}" diff --git a/tests/integration/targets/azure_rm_sqlserver/tasks/main.yml b/tests/integration/targets/azure_rm_sqlserver/tasks/main.yml index 5a92d23015..7319b9f190 100644 --- a/tests/integration/targets/azure_rm_sqlserver/tasks/main.yml +++ b/tests/integration/targets/azure_rm_sqlserver/tasks/main.yml @@ -50,7 +50,7 @@ # azure_rm_sqlserver_facts tests - name: Gather facts SQL Server - azure_rm_sqlserver_facts: + azure_rm_sqlserver_info: resource_group: "{{ resource_group }}" server_name: "sqlsrv{{ random_postfix }}" register: output @@ -69,7 +69,7 @@ - output.servers.sqlsrv{{ random_postfix }}.tags.aaa == 'bbb' - name: Gather facts SQL Server - unexisting - azure_rm_sqlserver_facts: + azure_rm_sqlserver_info: resource_group: "{{ resource_group }}" server_name: "unexisting" register: output @@ -80,7 +80,7 @@ - output.servers == {} - name: Gather facts SQL Server - list - azure_rm_sqlserver_facts: + azure_rm_sqlserver_info: resource_group: "{{ resource_group }}" register: output - name: Assert that facts are returned @@ -150,7 +150,7 @@ location: eastus - name: Gather facts SQL Database - azure_rm_sqldatabase_facts: + azure_rm_sqldatabase_info: resource_group: "{{ resource_group }}" server_name: sqlsrv{{ random_postfix }} name: database{{ random_postfix }} @@ -169,7 +169,7 @@ - output.databases[0].status != None - name: Gather facts SQL Database - azure_rm_sqldatabase_facts: + azure_rm_sqldatabase_info: resource_group: "{{ resource_group }}" server_name: sqlsrv{{ random_postfix }} register: output @@ -241,7 +241,7 @@ # test database facts without databases - name: Gather facts SQL Database - azure_rm_sqldatabase_facts: + azure_rm_sqldatabase_info: resource_group: "{{ resource_group }}" server_name: sqlsrv{{ random_postfix }} name: database{{ random_postfix }} @@ -253,7 +253,7 @@ - output.databases | length == 0 - name: Gather facts SQL Database - azure_rm_sqldatabase_facts: + azure_rm_sqldatabase_info: resource_group: "{{ resource_group }}" server_name: sqlsrv{{ random_postfix }} register: output @@ -318,7 +318,7 @@ end_ip_address: 172.28.10.138 - name: Gather facts SQL Firewall Rule - azure_rm_sqlfirewallrule_facts: + azure_rm_sqlfirewallrule_info: resource_group: "{{ resource_group }}" server_name: sqlsrv{{ random_postfix }} name: firewallrule{{ random_postfix }} @@ -335,7 +335,7 @@ - output.rules[0].end_ip_address != None - name: Gather facts SQL Firewall Rule - azure_rm_sqlfirewallrule_facts: + azure_rm_sqlfirewallrule_info: resource_group: "{{ resource_group }}" server_name: sqlsrv{{ random_postfix }} register: output @@ -371,7 +371,7 @@ state: absent - name: Gather facts SQL Firewall Rule - azure_rm_sqlfirewallrule_facts: + azure_rm_sqlfirewallrule_info: resource_group: "{{ resource_group }}" server_name: sqlsrv{{ random_postfix }} name: firewallrule{{ random_postfix }} diff --git a/tests/integration/targets/azure_rm_storageaccount/tasks/main.yml b/tests/integration/targets/azure_rm_storageaccount/tasks/main.yml index f606ee53e9..a382ac3395 100644 --- a/tests/integration/targets/azure_rm_storageaccount/tasks/main.yml +++ b/tests/integration/targets/azure_rm_storageaccount/tasks/main.yml @@ -41,14 +41,13 @@ tags: test: test galaxy: galaxy - https_only: yes + https_only: no network_acls: bypass: AzureServices default_action: Deny ip_rules: - value: '9.9.9.9' action: Allow - register: output - name: Assert status succeeded and results include an Id value @@ -57,7 +56,7 @@ - output.changed - output.state.id is defined - output.state.blob_cors | length == 1 - - output.state.https_only + - not output.state.https_only - output.state.network_acls.bypass == "AzureServices" - output.state.network_acls.default_action == "Deny" - output.state.network_acls.ip_rules | length == 1 @@ -84,7 +83,7 @@ tags: test: test galaxy: galaxy - https_only: yes + https_only: no network_acls: bypass: AzureServices default_action: Deny @@ -147,6 +146,32 @@ - "output.state.tags.testing == 'testing'" - "output.state.tags.delete == 'never'" + - name: Update account minimum tls version + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: "{{ storage_account }}" + minimum_tls_version: "TLS1_2" + register: output + + - name: Assert status succeeded and results include an Id value + assert: + that: + - output.changed + - output.state.minimum_tls_version == "TLS1_2" + + - name: Update account blob public access + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: "{{ storage_account }}" + allow_blob_public_access: true + register: output + + - name: Assert status succeeded and results include an Id value + assert: + that: + - output.changed + - output.state.allow_blob_public_access == true + - name: Gather facts azure_rm_storageaccount_info: resource_group: "{{ resource_group }}" @@ -162,10 +187,12 @@ - output.storageaccounts[0].account_type == "Standard_GRS" - output.storageaccounts[0].primary_endpoints.blob.connectionstring - output.storageaccounts[0].blob_cors - - output.storageaccounts[0].https_only - - output.storageaccounts[0].network_acls.bypass == "AzureServices" - - output.storageaccounts[0].network_acls.default_action == "Deny" - - output.storageaccounts[0].network_acls.ip_rules | length == 1 + - output.storageaccounts[0].minimum_tls_version == "TLS1_2" + - output.storageaccounts[0].allow_blob_public_access == true + #- output.storageaccounts[0].https_only + #- output.storageaccounts[0].network_acls.bypass == "AzureServices" + #- output.storageaccounts[0].network_acls.default_action == "Deny" + #- output.storageaccounts[0].network_acls.ip_rules | length == 1 - name: Gather facts azure_rm_storageaccount_info: @@ -181,3 +208,4 @@ resource_group: "{{ resource_group }}" name: "{{ storage_account }}" state: absent + force_delete_nonempty: True diff --git a/tests/integration/targets/azure_rm_subnet/tasks/main.yml b/tests/integration/targets/azure_rm_subnet/tasks/main.yml index acc91ceee2..8f41c138cb 100644 --- a/tests/integration/targets/azure_rm_subnet/tasks/main.yml +++ b/tests/integration/targets/azure_rm_subnet/tasks/main.yml @@ -4,6 +4,7 @@ address_prefixes_cidr: - 10.1.0.0/16 - 172.100.0.0/16 + - fdda:e69b:1587:495e::/64 dns_servers: - 127.0.0.1 - 127.0.0.3 @@ -46,7 +47,9 @@ register: output - assert: - that: output.changed + that: + - output.changed + - output.state.address_prefix == "10.1.0.0/24" - name: Add the subnet back (idempontent) azure_rm_subnet: @@ -94,6 +97,18 @@ - assert: that: not output.changed +- name: Able to completely remove service endpoints + azure_rm_subnet: + name: foobar + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + address_prefix_cidr: "10.1.0.0/16" + service_endpoints: [] + register: output + +- assert: + that: output.state.service_endpoints is not defined + - name: Create network security group in another resource group azure_rm_securitygroup: name: secgroupfoo @@ -129,6 +144,71 @@ - assert: that: not output.changed +- name: Create subnet with IPv4 and IPv6 + azure_rm_subnet: + name: foobar01 + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + address_prefixes_cidr: + - "172.100.0.0/16" + - "fdda:e69b:1587:495e::/64" + register: output + +- assert: + that: + - output.changed + - not output.state.address_prefix + - output.state.address_prefixes + +- name: Update the subnet to IPv4 and IPv6 (idempotent) + azure_rm_subnet: + name: foobar01 + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + address_prefixes_cidr: + - "172.100.0.0/16" + - "fdda:e69b:1587:495e::/64" + register: output + +- assert: + that: not output.changed + +- name: Update the subnet's IPv4 and IPv6 address + azure_rm_subnet: + name: foobar01 + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + address_prefixes_cidr: + - "172.100.0.0/24" + - "fdda:e69b:1587:495e::/64" + security_group: "{{ nsg.state.id }}" + register: output + +- assert: + that: + - output.changed + + +- name: Get subnet facts + azure_rm_subnet_info: + name: foobar01 + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + register: output + +- name: Assert that facts are returned + assert: + that: + - output.changed == False + - output.subnets[0]['id'] != None + - output.subnets[0]['resource_group'] != None + - output.subnets[0]['virtual_network_name'] != None + - output.subnets[0]['name'] != None + - not output.subnets[0]['address_prefix_cidr'] + - output.subnets[0]['address_prefixes_cidr'] != None + - output.subnets[0]['security_group'] != None + - output.subnets[0]['provisioning_state'] != None + - name: Get subnet facts azure_rm_subnet_info: name: foobar @@ -136,8 +216,6 @@ resource_group: "{{ resource_group }}" register: output -- debug: - var: output - name: Assert that facts are returned assert: that: @@ -146,8 +224,8 @@ - output.subnets[0]['resource_group'] != None - output.subnets[0]['virtual_network_name'] != None - output.subnets[0]['name'] != None - - output.subnets[0]['address_prefix_cidr'] != None - output.subnets[0]['route_table'] != None + - output.subnets[0]['address_prefix_cidr'] != None - output.subnets[0]['security_group'] != None - output.subnets[0]['provisioning_state'] != None @@ -169,6 +247,13 @@ - assert: that: not output.changed +- name: Remove subnet + azure_rm_subnet: + state: absent + name: foobar01 + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + - name: Remove security group azure_rm_securitygroup: resource_group: "{{ resource_group }}" diff --git a/tests/integration/targets/azure_rm_trafficmanagerprofile/tasks/main.yml b/tests/integration/targets/azure_rm_trafficmanagerprofile/tasks/main.yml index dba81c0e25..865c56dc43 100644 --- a/tests/integration/targets/azure_rm_trafficmanagerprofile/tasks/main.yml +++ b/tests/integration/targets/azure_rm_trafficmanagerprofile/tasks/main.yml @@ -27,7 +27,7 @@ check_mode: yes - name: Check there is no Traffic Manager profile created - azure_rm_trafficmanagerprofile_facts: + azure_rm_trafficmanagerprofile_info: resource_group: "{{ resource_group }}" name: "{{ tmname }}" register: fact @@ -61,7 +61,7 @@ - tm.changed - name: Gather Traffic Manager profile facts - azure_rm_trafficmanagerprofile_facts: + azure_rm_trafficmanagerprofile_info: resource_group: "{{ resource_group }}" name: "{{ tmname }}" register: fact @@ -142,7 +142,7 @@ - output.changed - name: Get endpoint - azure_rm_trafficmanagerendpoint_facts: + azure_rm_trafficmanagerendpoint_info: resource_group: "{{ resource_group }}" profile_name: "{{ tmname }}" register: facts @@ -170,7 +170,7 @@ - output.changed - name: Get endpoint - azure_rm_trafficmanagerendpoint_facts: + azure_rm_trafficmanagerendpoint_info: resource_group: "{{ resource_group }}" profile_name: "{{ tmname }}" register: facts @@ -193,7 +193,7 @@ target: 4.3.2.1 - name: Get endpoint - azure_rm_trafficmanagerendpoint_facts: + azure_rm_trafficmanagerendpoint_info: resource_group: "{{ resource_group }}" profile_name: "{{ tmname }}" register: facts @@ -235,7 +235,7 @@ - output.changed - name: Get endpoint - azure_rm_trafficmanagerendpoint_facts: + azure_rm_trafficmanagerendpoint_info: resource_group: "{{ resource_group }}" profile_name: "{{ tmname }}" register: facts @@ -253,7 +253,7 @@ check_mode: yes - name: Gather Traffic Manager profile facts - azure_rm_trafficmanagerprofile_facts: + azure_rm_trafficmanagerprofile_info: resource_group: "{{ resource_group }}" name: "{{ tmname }}" register: fact @@ -278,7 +278,7 @@ - output.changed - name: Get Traffic Manager profile fact - azure_rm_trafficmanagerprofile_facts: + azure_rm_trafficmanagerprofile_info: resource_group: "{{ resource_group }}" name: "{{ tmname }}" register: fact diff --git a/tests/integration/targets/azure_rm_virtualmachine/tasks/azure_test_ephemeral_os.yml b/tests/integration/targets/azure_rm_virtualmachine/tasks/azure_test_ephemeral_os.yml new file mode 100644 index 0000000000..f2101ca4c1 --- /dev/null +++ b/tests/integration/targets/azure_rm_virtualmachine/tasks/azure_test_ephemeral_os.yml @@ -0,0 +1,101 @@ +- include_tasks: setup.yml + +- name: Create minimal VM with defaults + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: "{{ vm_name }}" + admin_username: "testuser" + admin_password: "Pass123$$$abx!" + vm_size: Standard_DS2_v2 + image: + offer: UbuntuServer + publisher: Canonical + sku: 16.04-LTS + version: latest + register: vm_output + +- name: Generalize VM + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: "{{ vm_name }}" + generalized: yes + +- name: Create an image from VM + azure_rm_image: + resource_group: "{{ resource_group }}" + source: "{{ vm_name }}" + name: testimage + os_type: Linux + register: output + +- assert: + that: + - output.changed + +- name: Create virtual machine ephmeral OS disk + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: "{{ vm_name }}-02" + admin_username: "testuser" + admin_password: "Pass123$$$abx!" + vm_size: Standard_DS2_v2 + os_disk_caching: ReadOnly + ephemeral_os_disk: True + image: testimage + register: output + +- assert: + that: + - output.changed + - output.ansible_facts.azure_vm.properties.storageProfile.osDisk.diffDiskSettings.option == 'Local' + +- name: Check virtual machine ephmeral OS disk idempotent + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: "{{ vm_name }}-02" + admin_username: "testuser" + admin_password: "Pass123$$$abx!" + vm_size: Standard_DS2_v2 + os_disk_caching: ReadOnly + ephemeral_os_disk: True + image: testimage + register: output + +- assert: + that: + - not output.changed + +- name: Check virtual machine ephmeral OS disk can't update + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: "{{ vm_name }}-02" + admin_username: "testuser" + admin_password: "Pass123$$$abx!" + vm_size: Standard_DS2_v2 + os_disk_caching: ReadOnly + ephemeral_os_disk: False + image: testimage + ignore_errors: yes + register: ouput + +- assert: + that: + - not output.changed + +- name: Delete VM + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: "{{ vm_name }}" + state: absent + +- name: Delete VM + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: "{{ vm_name }}-02" + state: absent + +- name: Create an image from VM + azure_rm_image: + resource_group: "{{ resource_group }}" + name: testimage + state: absent diff --git a/tests/integration/targets/azure_rm_virtualmachineextension/tasks/main.yml b/tests/integration/targets/azure_rm_virtualmachineextension/tasks/main.yml index 7cd79acbf3..b48f1692c6 100644 --- a/tests/integration/targets/azure_rm_virtualmachineextension/tasks/main.yml +++ b/tests/integration/targets/azure_rm_virtualmachineextension/tasks/main.yml @@ -84,7 +84,7 @@ that: results.changed - name: Query extension - azure_rm_virtualmachineextension_facts: + azure_rm_virtualmachineextension_info: resource_group: "{{ resource_group }}" name: testVMExtension virtual_machine_name: testVM @@ -105,7 +105,7 @@ - results.extensions[0]['provisioning_state'] != None - name: List extensions - azure_rm_virtualmachineextension_facts: + azure_rm_virtualmachineextension_info: resource_group: "{{ resource_group }}" virtual_machine_name: testVM register: results diff --git a/tests/integration/targets/azure_rm_virtualmachinescaleset/tasks/main.yml b/tests/integration/targets/azure_rm_virtualmachinescaleset/tasks/main.yml index 67a0b93802..0f61968c5a 100644 --- a/tests/integration/targets/azure_rm_virtualmachinescaleset/tasks/main.yml +++ b/tests/integration/targets/azure_rm_virtualmachinescaleset/tasks/main.yml @@ -125,7 +125,7 @@ that: results.changed - name: Get VMSS to assert no VMSS is created in check mode - azure_rm_virtualmachinescaleset_facts: + azure_rm_virtualmachinescaleset_info: resource_group: "{{ resource_group }}" name: testVMSS{{ rpfx }} format: curated @@ -204,7 +204,7 @@ that: results.changed - name: Retrieve scaleset facts - azure_rm_virtualmachinescaleset_facts: + azure_rm_virtualmachinescaleset_info: resource_group: "{{ resource_group }}" name: testVMSS{{ rpfx }} format: curated @@ -215,7 +215,7 @@ - output_scaleset.vmss[0].load_balancer == "testLB1" - name: Retrieve scaleset VMs facts - azure_rm_virtualmachinescalesetinstance_facts: + azure_rm_virtualmachinescalesetinstance_info: resource_group: "{{ resource_group }}" vmss_name: testVMSS{{ rpfx }} register: instances @@ -294,11 +294,12 @@ that: not results.changed - name: Query extension - azure_rm_virtualmachinescalesetextension_facts: + azure_rm_virtualmachinescalesetextension_info: resource_group: "{{ resource_group }}" vmss_name: testVMSS{{ rpfx }} name: testExtension register: results + - name: Assert that facts are returned assert: that: @@ -314,10 +315,11 @@ - results.extensions[0]['provisioning_state'] != None - name: List extensions - azure_rm_virtualmachinescalesetextension_facts: + azure_rm_virtualmachinescalesetextension_info: resource_group: "{{ resource_group }}" vmss_name: testVMSS{{ rpfx }} register: results + - name: Assert that facts are returned assert: that: @@ -332,7 +334,6 @@ - results.extensions[0]['auto_upgrade_minor_version'] != None - results.extensions[0]['provisioning_state'] != None - - name: Delete VMSS Extension azure_rm_virtualmachinescalesetextension: resource_group: "{{ resource_group }}" @@ -381,7 +382,6 @@ assert: that: results.changed - - name: Delete VMSS azure_rm_virtualmachinescaleset: resource_group: "{{ resource_group }}" @@ -519,6 +519,59 @@ name: testVMSS{{ rpfx }}2 state: absent +- name: Create VMSS with ephmeral OS disk. + azure_rm_virtualmachinescaleset: + resource_group: "{{ resource_group }}" + name: testVMSS{{ rpfx }}3 + vm_size: Standard_DS2_v2 + capacity: 0 + virtual_network_name: testVnet + subnet_name: testSubnet + admin_username: testuser + ssh_password_enabled: true + admin_password: "Password1234!" + ephemeral_os_disk: True + image: + name: testimageb + resource_group: "{{ resource_group }}" + upgrade_policy: Manual + security_group: + name: testNetworkSecurityGroup2 + resource_group: "{{ resource_group_secondary }}" + register: results + +- assert: + that: + - results.changed + - results.ansible_facts.azure_vmss.properties.virtualMachineProfile.storageProfile.osDisk.diffDiskSettings.option == 'Local' + +- name: Check VMSS ephmeral OS disk can't udpate + azure_rm_virtualmachinescaleset: + resource_group: "{{ resource_group }}" + name: testVMSS{{ rpfx }}3 + vm_size: Standard_DS2_v2 + capacity: 0 + virtual_network_name: testVnet + subnet_name: testSubnet + admin_username: testuser + ssh_password_enabled: true + admin_password: "Password1234!" + ephemeral_os_disk: False + image: + name: testimageb + resource_group: "{{ resource_group }}" + upgrade_policy: Manual + security_group: + name: testNetworkSecurityGroup2 + resource_group: "{{ resource_group_secondary }}" + ignore_errors: yes + +- name: Delete VMSS + azure_rm_virtualmachinescaleset: + resource_group: "{{ resource_group }}" + name: testVMSS{{ rpfx }}3 + state: absent + - name: Fail when instance type is not supported to enable accelerated networking azure_rm_virtualmachinescaleset: resource_group: "{{ resource_group }}" diff --git a/tests/integration/targets/azure_rm_virtualnetwork/tasks/main.yml b/tests/integration/targets/azure_rm_virtualnetwork/tasks/main.yml index df5916c015..24f3ce0b7a 100644 --- a/tests/integration/targets/azure_rm_virtualnetwork/tasks/main.yml +++ b/tests/integration/targets/azure_rm_virtualnetwork/tasks/main.yml @@ -14,17 +14,19 @@ address_prefixes_cidr: - 10.1.0.0/16 - 172.100.0.0/16 + - fdda:e69b:1587:495e::/64 tags: testing: testing delete: on-exit resource_group: "{{ resource_group }}" -- name: Create virtual network +- name: Update virtual network with dns server azure_rm_virtualnetwork: name: "{{ vnetname }}" address_prefixes_cidr: - 10.1.0.0/16 - 172.100.0.0/16 + - fdda:e69b:1587:495e::/64 dns_servers: - 127.0.0.1 - 127.0.0.3 @@ -36,7 +38,7 @@ - assert: that: - - "output.state.address_prefixes | length == 2" + - "output.state.address_prefixes | length == 3" - "output.state.dns_servers | length == 2" - "output.state.tags.delete == 'on-exit'" - "output.state.tags | length == 2" @@ -60,7 +62,7 @@ that: - "facts.virtualnetworks | length == 1" - "facts.virtualnetworks[0].dns_servers | length == 2" - - "facts.virtualnetworks[0].address_prefixes | length == 2" + - "facts.virtualnetworks[0].address_prefixes | length == 3" - "facts.virtualnetworks[0].subnets | length == 1" - name: Gather facts by resource group, tags @@ -88,6 +90,7 @@ address_prefixes_cidr: - 10.1.0.0/16 - 172.100.0.0/16 + - fdda:e69b:1587:495e::/64 dns_servers: - 127.0.0.1 - 127.0.0.3 diff --git a/tests/integration/targets/azure_rm_virtualnetworkpeering/tasks/main.yml b/tests/integration/targets/azure_rm_virtualnetworkpeering/tasks/main.yml index 9eb0424af3..bf7a4aa137 100644 --- a/tests/integration/targets/azure_rm_virtualnetworkpeering/tasks/main.yml +++ b/tests/integration/targets/azure_rm_virtualnetworkpeering/tasks/main.yml @@ -90,7 +90,7 @@ that: output.changed - name: Get facts - azure_rm_virtualnetworkpeering_facts: + azure_rm_virtualnetworkpeering_info: resource_group: "{{ resource_group }}" name: "{{ peering_name }}" virtual_network: "{{ vnetname1 }}" diff --git a/tests/integration/targets/azure_rm_webapp/tasks/main.yml b/tests/integration/targets/azure_rm_webapp/tasks/main.yml index 8efc6629de..e4f7e9479c 100644 --- a/tests/integration/targets/azure_rm_webapp/tasks/main.yml +++ b/tests/integration/targets/azure_rm_webapp/tasks/main.yml @@ -38,7 +38,7 @@ # enable after webapp_facts merged # - name: get the web app -# azure_rm_webapp_facts: +# azure_rm_webapp_info: # resource_group: "{{ resource_group }}" # name: "{{ win_app_name }}2" # register: stopped @@ -60,7 +60,7 @@ register: output - name: get web app with resource group and tag - azure_rm_webapp_facts: + azure_rm_webapp_info: resource_group: "{{ resource_group }}" name: "{{ win_app_name }}3" tags: @@ -91,7 +91,7 @@ that: output.changed - name: get web app with name - azure_rm_webapp_facts: + azure_rm_webapp_info: resource_group: "{{ resource_group }}" name: "{{ win_app_name }}4" register: output @@ -123,7 +123,7 @@ - output.changed - name: get web app with name - azure_rm_webapp_facts: + azure_rm_webapp_info: resource_group: "{{ resource_group }}" name: "{{ win_app_name }}4" register: output @@ -136,7 +136,7 @@ - output.webapps[0].app_settings['testkey2'] == 'testvalue2' - name: get web app with return publishing profile - azure_rm_webapp_facts: + azure_rm_webapp_info: resource_group: "{{ resource_group }}" name: "{{ win_app_name }}4" return_publish_profile: true @@ -333,7 +333,7 @@ that: output.changed - name: Get facts with publish profile - azure_rm_webapp_facts: + azure_rm_webapp_info: resource_group: "{{ resource_group }}" name: "{{ win_app_name }}13" no_log: true diff --git a/tests/integration/targets/azure_rm_workspace/tasks/main.yml b/tests/integration/targets/azure_rm_workspace/tasks/main.yml index 05efd3567c..7f9a05f79d 100644 --- a/tests/integration/targets/azure_rm_workspace/tasks/main.yml +++ b/tests/integration/targets/azure_rm_workspace/tasks/main.yml @@ -15,7 +15,7 @@ - output.changed - name: Get workspace - azure_rm_loganalyticsworkspace_facts: + azure_rm_loganalyticsworkspace_info: name: "{{ name }}" resource_group: "{{ resource_group }}" register: facts @@ -49,7 +49,7 @@ - not output.changed - name: Get workspace - azure_rm_loganalyticsworkspace_facts: + azure_rm_loganalyticsworkspace_info: name: "{{ name }}" resource_group: "{{ resource_group }}" register: facts @@ -86,7 +86,7 @@ - output.changed - name: Get workspace - azure_rm_loganalyticsworkspace_facts: + azure_rm_loganalyticsworkspace_info: name: "{{ name }}" resource_group: "{{ resource_group }}" register: facts @@ -107,7 +107,7 @@ - output.changed - name: Get workspace - azure_rm_loganalyticsworkspace_facts: + azure_rm_loganalyticsworkspace_info: name: "{{ name }}" resource_group: "{{ resource_group }}" register: facts diff --git a/tests/integration/targets/inventory_azure/playbooks/create_inventory_config.yml b/tests/integration/targets/inventory_azure/playbooks/create_inventory_config.yml index 31d3ca3586..6ed4067af0 100644 --- a/tests/integration/targets/inventory_azure/playbooks/create_inventory_config.yml +++ b/tests/integration/targets/inventory_azure/playbooks/create_inventory_config.yml @@ -8,4 +8,4 @@ - name: write inventory config file copy: dest: ../test.azure_rm.yml - content: "{{ lookup('template', template_name) }}" \ No newline at end of file + content: "{{ lookup('template', template_name) }}" diff --git a/tests/integration/targets/inventory_azure/playbooks/empty_inventory_config.yml b/tests/integration/targets/inventory_azure/playbooks/empty_inventory_config.yml index cf4118af3e..06a4279311 100644 --- a/tests/integration/targets/inventory_azure/playbooks/empty_inventory_config.yml +++ b/tests/integration/targets/inventory_azure/playbooks/empty_inventory_config.yml @@ -6,4 +6,4 @@ - name: write inventory config file copy: dest: ../test.azure_rm.yml - content: "" \ No newline at end of file + content: "" diff --git a/tests/integration/targets/inventory_azure/playbooks/test_inventory.yml b/tests/integration/targets/inventory_azure/playbooks/test_inventory.yml index d791bdc4c0..fc31fc2728 100644 --- a/tests/integration/targets/inventory_azure/playbooks/test_inventory.yml +++ b/tests/integration/targets/inventory_azure/playbooks/test_inventory.yml @@ -36,4 +36,4 @@ state: absent - name: teardown - include_tasks: teardown.yml \ No newline at end of file + include_tasks: teardown.yml diff --git a/tests/sanity/ignore-2.10.txt b/tests/sanity/ignore-2.10.txt deleted file mode 120000 index a11c71bd5e..0000000000 --- a/tests/sanity/ignore-2.10.txt +++ /dev/null @@ -1 +0,0 @@ -ignore-2.9.txt \ No newline at end of file diff --git a/tests/sanity/ignore-2.10.txt b/tests/sanity/ignore-2.10.txt new file mode 100644 index 0000000000..f6d4126c54 --- /dev/null +++ b/tests/sanity/ignore-2.10.txt @@ -0,0 +1,715 @@ +plugins/modules/azure_rm_aks.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_aks.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_aks.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_aks.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_aks.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_aks.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_aks.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_aks.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_aks_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_aks_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_aks_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_aks_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_aksversion_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_aksversion_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_aksversion_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_appgateway.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_appgateway.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_appgateway.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_appgateway.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_appgateway.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_appgateway.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_applicationsecuritygroup.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_applicationsecuritygroup.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_applicationsecuritygroup.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_applicationsecuritygroup_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_applicationsecuritygroup_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_applicationsecuritygroup_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_applicationsecuritygroup_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_appserviceplan.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_appserviceplan.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_appserviceplan.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_appserviceplan_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_appserviceplan_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_appserviceplan_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_appserviceplan_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_automationaccount.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_automationaccount.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_automationaccount_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_automationaccount_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_automationaccount_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_availabilityset.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_availabilityset.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_availabilityset.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_availabilityset_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_availabilityset_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_availabilityset_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_availabilityset_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerinstance.py validate-modules:doc-type-does-not-match-spec +plugins/modules/azure_rm_containerinstance.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerinstance.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_containerinstance.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_containerinstance.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_containerinstance.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerinstance.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerinstance_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerinstance_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_containerinstance_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerinstance_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistry.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistry.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistry.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistry_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistry_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_containerregistry_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistry_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_deployment.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_deployment.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_deployment.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_deployment.py validate-modules:return-syntax-error +plugins/modules/azure_rm_deployment_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_deployment_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_deployment_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_deployment_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-missing-type +plugins/modules/azure_rm_dnsrecordset.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_dnsrecordset.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_dnsrecordset.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_dnsrecordset.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_dnsrecordset.py validate-modules:return-syntax-error +plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_dnszone.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_dnszone.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_dnszone.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_dnszone.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_dnszone_info.py validate-modules:doc-type-does-not-match-spec +plugins/modules/azure_rm_dnszone_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_dnszone_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_dnszone_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_dnszone_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_dnszone_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_functionapp.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_functionapp.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_functionapp.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_functionapp.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_functionapp_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_functionapp_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_functionapp_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_functionapp_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_gallery.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_gallery.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_gallery.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_gallery_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_gallery_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_galleryimage.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_galleryimage.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_galleryimage.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_galleryimage.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_galleryimage.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_galleryimage_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_galleryimage_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_galleryimage_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_galleryimageversion.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_galleryimageversion.py validate-modules:doc-type-does-not-match-spec +plugins/modules/azure_rm_galleryimageversion.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_galleryimageversion.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_galleryimageversion.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_galleryimageversion.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_galleryimageversion.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_galleryimageversion.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_galleryimageversion_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_galleryimageversion_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_image.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_image.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_image.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_image.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_image.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_image_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_image_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_image_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_image_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_image_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_iotdevice.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iotdevice.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_iotdevice_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iotdevice_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_iotdevicemodule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iotdevicemodule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_iothub.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_iothub.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_iothub.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iothub_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_iothub_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iothub_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_iothubconsumergroup.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_iothubconsumergroup.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iothubconsumergroup.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvault.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_keyvault.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_keyvault.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_keyvault.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_keyvault.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvault.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvault_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_keyvault_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvault_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvaultkey.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_keyvaultkey.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvaultkey.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvaultkey_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_keyvaultkey_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvaultkey_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvaultkey_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_keyvaultsecret.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_keyvaultsecret.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvaultsecret.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvaultsecret_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvaultsecret_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_manageddisk.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_manageddisk.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_manageddisk.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_manageddisk_info.py validate-modules:doc-type-does-not-match-spec +plugins/modules/azure_rm_manageddisk_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_manageddisk_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_manageddisk_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_managementgroup.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_managementgroup.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_managementgroup.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_networkinterface.py validate-modules:doc-missing-type +plugins/modules/azure_rm_networkinterface.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_networkinterface.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_networkinterface.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_networkinterface.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_networkinterface.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_networkinterface.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_networkinterface_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_networkinterface_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_networkinterface_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_networkinterface_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_networkinterface_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_publicipaddress.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_publicipaddress.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_publicipaddress.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_publicipaddress.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_publicipaddress.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_publicipaddress.py validate-modules:return-syntax-error +plugins/modules/azure_rm_publicipaddress_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_publicipaddress_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_publicipaddress_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_publicipaddress_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_resource.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_resource.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_resource.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_resource.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_resource_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_resource_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_resource_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_resource_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_resourcegroup.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_resourcegroup.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_resourcegroup.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_resourcegroup_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_resourcegroup_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_resourcegroup_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_resourcegroup_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_securitygroup.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_securitygroup.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_securitygroup.py validate-modules:missing-suboption-docs +plugins/modules/azure_rm_securitygroup.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_securitygroup.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_securitygroup.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_securitygroup.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_securitygroup.py validate-modules:mutually_exclusive-unknown +plugins/modules/azure_rm_securitygroup.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_securitygroup.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_securitygroup_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_securitygroup_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_securitygroup_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_securitygroup_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_storageaccount.py validate-modules:doc-missing-type +plugins/modules/azure_rm_storageaccount.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_storageaccount.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_storageaccount.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_storageaccount.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_storageaccount.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_storageaccount_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_storageaccount_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_storageaccount_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_storageaccount_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_storageaccount_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_storageblob.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_storageblob.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_storageblob.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_subnet.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_subnet.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_subnet.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_subnet.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_subnet_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_subnet_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_subnet_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachine.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachine.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_virtualmachine.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_virtualmachine.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachine.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachine.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachine_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachine_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachine_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachine_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachineextension.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachineextension.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachineextension.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachineextension_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachineextension_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachineextension_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachineextension_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachineimage_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachineimage_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachineimage_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescaleset.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescaleset.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_virtualmachinescaleset.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachinescaleset.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescaleset.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescaleset_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescaleset_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachinescaleset_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescaleset_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescalesetextension.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescalesetextension.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_virtualmachinescalesetextension.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescalesetextension.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescalesetextension_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescalesetextension_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescalesetextension_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescalesetinstance.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescalesetinstance.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_virtualmachinescalesetinstance.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescalesetinstance.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_webapp.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_webapp.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_webapp.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_webapp.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_webapp.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_webapp_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_webapp_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_webapp_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_webapp_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_webappslot.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_webappslot.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_webappslot.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_webappslot.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_webappslot.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_autoscale.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_autoscale.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_autoscale.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_autoscale.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_autoscale.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_autoscale_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_autoscale_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_autoscale_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_autoscale_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cdnendpoint.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cdnendpoint.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_cdnendpoint.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_cdnendpoint.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cdnendpoint.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlab.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlab.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlab.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlab_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlab_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlab_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlab_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabarmtemplate_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabarmtemplate_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabarmtemplate_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabartifact_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabartifact_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabartifact_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabartifactsource.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabartifactsource.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabartifactsource.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabartifactsource_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabartifactsource_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabartifactsource_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabartifactsource_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabcustomimage.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabcustomimage.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabcustomimage.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabcustomimage_info.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_devtestlabcustomimage_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabcustomimage_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabcustomimage_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabcustomimage_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabenvironment.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabenvironment.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabenvironment.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabenvironment_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabenvironment_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabenvironment_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabenvironment_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabpolicy.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabpolicy.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabpolicy.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabpolicy_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabpolicy_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabpolicy_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabpolicy_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabvirtualmachine_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabvirtualmachine_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabvirtualmachine_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabvirtualmachine_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabvirtualnetwork.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabvirtualnetwork.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabvirtualnetwork.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabvirtualnetwork_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabvirtualnetwork_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_hdinsightcluster.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_hdinsightcluster.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_hdinsightcluster.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_hdinsightcluster.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_loadbalancer.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_loadbalancer.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_loadbalancer.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_loadbalancer.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_loadbalancer.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_loadbalancer.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_loadbalancer.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_loganalyticsworkspace.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_loganalyticsworkspace.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_loganalyticsworkspace.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_loganalyticsworkspace_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_loganalyticsworkspace_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_loganalyticsworkspace_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_loganalyticsworkspace_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbconfiguration.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbconfiguration.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbconfiguration_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbconfiguration_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbconfiguration_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_mariadbdatabase.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mariadbdatabase.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbdatabase.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbdatabase_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbdatabase_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbfirewallrule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mariadbfirewallrule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbfirewallrule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbfirewallrule_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbfirewallrule_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbserver.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mariadbserver.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbserver.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbserver_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_mariadbserver_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbserver_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_monitorlogprofile.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_monitorlogprofile.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_monitorlogprofile.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlconfiguration.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mysqlconfiguration.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlconfiguration.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlconfiguration_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlconfiguration_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlconfiguration_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_mysqldatabase.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mysqldatabase.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqldatabase.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqldatabase_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqldatabase_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlfirewallrule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mysqlfirewallrule.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_mysqlfirewallrule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlfirewallrule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlfirewallrule_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlfirewallrule_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlserver.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mysqlserver.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlserver.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlserver_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_mysqlserver_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlserver_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlconfiguration.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_postgresqlconfiguration.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlconfiguration.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlconfiguration_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlconfiguration_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlconfiguration_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_postgresqldatabase.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_postgresqldatabase.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqldatabase.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqldatabase_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqldatabase_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlfirewallrule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_postgresqlfirewallrule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlfirewallrule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlfirewallrule_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlfirewallrule_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlserver.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_postgresqlserver.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlserver.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlserver_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_postgresqlserver_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlserver_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_rediscache.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_rediscache.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_rediscache.py validate-modules:doc-type-does-not-match-spec +plugins/modules/azure_rm_rediscache.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_rediscache.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_rediscache.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_rediscache_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_rediscache_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_rediscache_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_rediscache_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_rediscachefirewallrule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_rediscachefirewallrule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_rediscachefirewallrule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_roleassignment.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_roleassignment.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_roleassignment.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_roleassignment_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_roleassignment_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_roleassignment_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_roledefinition.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_roledefinition.py validate-modules:invalid-argument-spec +plugins/modules/azure_rm_roledefinition.py validate-modules:missing-suboption-docs +plugins/modules/azure_rm_roledefinition.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_roledefinition.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_roledefinition.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_roledefinition.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_roledefinition.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_roledefinition_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_roledefinition_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_roledefinition_info.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_roledefinition_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_roledefinition_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_route.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_route.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_route.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_routetable.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_routetable.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_routetable.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_routetable_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_routetable_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_routetable_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_routetable_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebus.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebus.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebus.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebus_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebus_info.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_servicebus_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_servicebus_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebus_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebusqueue.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebusqueue.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebusqueue.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebustopic.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebustopic.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_servicebustopic.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebustopic.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebustopicsubscription.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebustopicsubscription.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebustopicsubscription.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebussaspolicy.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebussaspolicy.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_servicebussaspolicy.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebussaspolicy.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_snapshot.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_snapshot.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_snapshot.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_snapshot.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqldatabase.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqldatabase.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_sqldatabase.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqldatabase.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqldatabase_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqldatabase_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_sqldatabase_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqldatabase_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqlfirewallrule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqlfirewallrule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqlfirewallrule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqlfirewallrule_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqlfirewallrule_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqlfirewallrule_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqlserver.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqlserver.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqlserver.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqlserver_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqlserver_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqlserver_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_trafficmanager.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_trafficmanager.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_trafficmanager.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_trafficmanager.py validate-modules:invalid-documentation +plugins/modules/azure_rm_trafficmanager.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_trafficmanager.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_trafficmanager.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_trafficmanager.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_trafficmanager.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_trafficmanagerendpoint.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_trafficmanagerendpoint.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_trafficmanagerendpoint.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_trafficmanagerendpoint.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_trafficmanagerendpoint_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_trafficmanagerendpoint_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_trafficmanagerendpoint_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_trafficmanagerprofile_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_trafficmanagerprofile_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_trafficmanagerprofile_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_trafficmanagerprofile_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetwork.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualnetwork.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualnetwork.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualnetwork.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetwork_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualnetwork_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualnetwork_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualnetwork_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetworkpeering.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualnetworkpeering.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_virtualnetworkpeering.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualnetworkpeering.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetworkpeering_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualnetworkpeering_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualnetworkpeering_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:doc-missing-type +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_batchaccount.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_batchaccount.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_batchaccount.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_batchaccount.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cdnendpoint_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cdnendpoint_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cdnendpoint_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_cdnendpoint_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cdnendpoint_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_cdnprofile.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cdnprofile.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cdnprofile.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cosmosdbaccount_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cosmosdbaccount_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_cosmosdbaccount_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cosmosdbaccount_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabschedule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabschedule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabschedule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabschedule_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabschedule_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabschedule_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabschedule_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_hdinsightcluster_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_hdinsightcluster_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_hdinsightcluster_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_hdinsightcluster_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_hdinsightcluster_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_loadbalancer_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_loadbalancer_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_loadbalancer_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_loadbalancer_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_lock.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_lock.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_lock_info.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_lock_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_lock_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cdnprofile_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cdnprofile_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_cdnprofile_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cdnprofile_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_azurefirewall.py validate-modules:missing-suboption-docs +plugins/modules/azure_rm_azurefirewall.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_azurefirewall.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_azurefirewall.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_azurefirewall.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_azurefirewall.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_azurefirewall.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_azurefirewall_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_azurefirewall_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_privatednszone.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_privatednszone.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_privatednszone_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_privatednszone_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_privatednszone_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_adpassword.py validate-modules:return-syntax-error +plugins/modules/azure_rm_adpassword.py validate-modules:import-before-documentation +plugins/modules/azure_rm_adpassword.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_adpassword.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_adpassword.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_adpassword_info.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_adpassword_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_adpassword_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_adpassword_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_adpassword_info.py validate-modules:import-before-documentation +plugins/modules/azure_rm_adserviceprincipal.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_adserviceprincipal.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_adserviceprincipal.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_adserviceprincipal_info.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_adserviceprincipal_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_adserviceprincipal_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_backupazurevm.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_backupazurevm.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_backupazurevm_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_backupazurevm_info.py validate-modules:required_if-unknown-key +tests/utils/shippable/check_matrix.py replace-urlopen +tests/utils/shippable/timing.py shebang diff --git a/tests/sanity/ignore-2.11.txt b/tests/sanity/ignore-2.11.txt new file mode 100644 index 0000000000..89002049dc --- /dev/null +++ b/tests/sanity/ignore-2.11.txt @@ -0,0 +1,715 @@ +plugins/modules/azure_rm_aks.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_aks.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_aks.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_aks.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_aks.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_aks.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_aks.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_aks.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_aks_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_aks_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_aks_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_aks_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_aksversion_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_aksversion_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_aksversion_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_appgateway.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_appgateway.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_appgateway.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_appgateway.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_appgateway.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_appgateway.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_applicationsecuritygroup.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_applicationsecuritygroup.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_applicationsecuritygroup.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_applicationsecuritygroup_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_applicationsecuritygroup_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_applicationsecuritygroup_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_applicationsecuritygroup_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_appserviceplan.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_appserviceplan.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_appserviceplan.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_appserviceplan_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_appserviceplan_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_appserviceplan_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_appserviceplan_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_automationaccount.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_automationaccount.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_automationaccount_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_automationaccount_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_automationaccount_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_availabilityset.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_availabilityset.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_availabilityset.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_availabilityset_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_availabilityset_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_availabilityset_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_availabilityset_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerinstance.py validate-modules:doc-type-does-not-match-spec +plugins/modules/azure_rm_containerinstance.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerinstance.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_containerinstance.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_containerinstance.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_containerinstance.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerinstance.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerinstance_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerinstance_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_containerinstance_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerinstance_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistry.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistry.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistry.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistry_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistry_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_containerregistry_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistry_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistryreplication.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_deployment.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_deployment.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_deployment.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_deployment.py validate-modules:return-syntax-error +plugins/modules/azure_rm_deployment_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_deployment_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_deployment_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_deployment_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-missing-type +plugins/modules/azure_rm_dnsrecordset.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_dnsrecordset.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_dnsrecordset.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_dnsrecordset.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_dnsrecordset.py validate-modules:return-syntax-error +plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_dnszone.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_dnszone.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_dnszone.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_dnszone.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_dnszone_info.py validate-modules:doc-type-does-not-match-spec +plugins/modules/azure_rm_dnszone_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_dnszone_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_dnszone_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_dnszone_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_dnszone_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_functionapp.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_functionapp.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_functionapp.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_functionapp.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_functionapp_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_functionapp_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_functionapp_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_functionapp_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_gallery.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_gallery.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_gallery.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_gallery_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_gallery_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_galleryimage.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_galleryimage.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_galleryimage.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_galleryimage.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_galleryimage.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_galleryimage_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_galleryimage_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_galleryimage_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_galleryimageversion.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_galleryimageversion.py validate-modules:doc-type-does-not-match-spec +plugins/modules/azure_rm_galleryimageversion.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_galleryimageversion.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_galleryimageversion.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_galleryimageversion.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_galleryimageversion.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_galleryimageversion.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_galleryimageversion_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_galleryimageversion_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_image.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_image.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_image.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_image.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_image.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_image_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_image_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_image_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_image_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_image_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_iotdevice.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iotdevice.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_iotdevice_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iotdevice_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_iotdevicemodule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iotdevicemodule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_iothub.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_iothub.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_iothub.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iothub_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_iothub_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iothub_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_iothubconsumergroup.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_iothubconsumergroup.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_iothubconsumergroup.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvault.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_keyvault.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_keyvault.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_keyvault.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_keyvault.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvault.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvault_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_keyvault_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvault_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvaultkey.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_keyvaultkey.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvaultkey.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvaultkey_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_keyvaultkey_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvaultkey_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvaultkey_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_keyvaultsecret.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_keyvaultsecret.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvaultsecret.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_keyvaultsecret_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_keyvaultsecret_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_manageddisk.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_manageddisk.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_manageddisk.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_manageddisk_info.py validate-modules:doc-type-does-not-match-spec +plugins/modules/azure_rm_manageddisk_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_manageddisk_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_manageddisk_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_managementgroup.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_managementgroup.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_managementgroup.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_networkinterface.py validate-modules:doc-missing-type +plugins/modules/azure_rm_networkinterface.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_networkinterface.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_networkinterface.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_networkinterface.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_networkinterface.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_networkinterface.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_networkinterface_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_networkinterface_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_networkinterface_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_networkinterface_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_networkinterface_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_publicipaddress.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_publicipaddress.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_publicipaddress.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_publicipaddress.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_publicipaddress.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_publicipaddress.py validate-modules:return-syntax-error +plugins/modules/azure_rm_publicipaddress_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_publicipaddress_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_publicipaddress_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_publicipaddress_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_resource.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_resource.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_resource.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_resource.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_resource_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_resource_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_resource_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_resource_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_resourcegroup.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_resourcegroup.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_resourcegroup.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_resourcegroup_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_resourcegroup_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_resourcegroup_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_resourcegroup_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_securitygroup.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_securitygroup.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_securitygroup.py validate-modules:missing-suboption-docs +plugins/modules/azure_rm_securitygroup.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_securitygroup.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_securitygroup.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_securitygroup.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_securitygroup.py validate-modules:mutually_exclusive-unknown +plugins/modules/azure_rm_securitygroup.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_securitygroup.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_securitygroup_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_securitygroup_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_securitygroup_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_securitygroup_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_storageaccount.py validate-modules:doc-missing-type +plugins/modules/azure_rm_storageaccount.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_storageaccount.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_storageaccount.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_storageaccount.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_storageaccount.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_storageaccount_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_storageaccount_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_storageaccount_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_storageaccount_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_storageaccount_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_storageblob.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_storageblob.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_storageblob.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_subnet.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_subnet.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_subnet.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_subnet.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_subnet_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_subnet_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_subnet_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachine.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachine.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_virtualmachine.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_virtualmachine.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachine.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachine.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachine_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachine_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachine_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachine_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachineextension.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachineextension.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachineextension.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachineextension_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachineextension_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachineextension_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachineextension_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachineimage_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachineimage_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachineimage_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescaleset.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescaleset.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_virtualmachinescaleset.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachinescaleset.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescaleset.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescaleset_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescaleset_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachinescaleset_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescaleset_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescalesetextension.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescalesetextension.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_virtualmachinescalesetextension.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescalesetextension.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescalesetextension_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescalesetextension_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescalesetextension_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescalesetinstance.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescalesetinstance.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_virtualmachinescalesetinstance.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescalesetinstance.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_webapp.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_webapp.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_webapp.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_webapp.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_webapp.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_webapp_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_webapp_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_webapp_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_webapp_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_webappslot.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_webappslot.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_webappslot.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_webappslot.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_webappslot.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_autoscale.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_autoscale.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_autoscale.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_autoscale.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_autoscale.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_autoscale_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_autoscale_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_autoscale_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_autoscale_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cdnendpoint.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cdnendpoint.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_cdnendpoint.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_cdnendpoint.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cdnendpoint.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlab.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlab.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlab.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlab_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlab_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlab_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlab_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabarmtemplate_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabarmtemplate_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabarmtemplate_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabartifact_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabartifact_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabartifact_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabartifactsource.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabartifactsource.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabartifactsource.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabartifactsource_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabartifactsource_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabartifactsource_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabartifactsource_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabcustomimage.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabcustomimage.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabcustomimage.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabcustomimage_info.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_devtestlabcustomimage_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabcustomimage_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabcustomimage_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabcustomimage_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabenvironment.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabenvironment.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabenvironment.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabenvironment_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabenvironment_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabenvironment_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabenvironment_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabpolicy.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabpolicy.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabpolicy.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabpolicy_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabpolicy_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabpolicy_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabpolicy_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabvirtualmachine_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabvirtualmachine_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabvirtualmachine_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabvirtualmachine_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_devtestlabvirtualnetwork.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabvirtualnetwork.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabvirtualnetwork.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabvirtualnetwork_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabvirtualnetwork_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_hdinsightcluster.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_hdinsightcluster.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_hdinsightcluster.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_hdinsightcluster.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_loadbalancer.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_loadbalancer.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_loadbalancer.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_loadbalancer.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_loadbalancer.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_loadbalancer.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_loadbalancer.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_loganalyticsworkspace.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_loganalyticsworkspace.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_loganalyticsworkspace.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_loganalyticsworkspace_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_loganalyticsworkspace_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_loganalyticsworkspace_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_loganalyticsworkspace_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbconfiguration.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbconfiguration.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbconfiguration_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbconfiguration_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbconfiguration_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_mariadbdatabase.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mariadbdatabase.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbdatabase.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbdatabase_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbdatabase_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbfirewallrule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mariadbfirewallrule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbfirewallrule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbfirewallrule_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbfirewallrule_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbserver.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mariadbserver.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbserver.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mariadbserver_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_mariadbserver_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mariadbserver_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_monitorlogprofile.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_monitorlogprofile.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_monitorlogprofile.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlconfiguration.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mysqlconfiguration.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlconfiguration.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlconfiguration_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlconfiguration_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlconfiguration_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_mysqldatabase.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mysqldatabase.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqldatabase.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqldatabase_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqldatabase_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlfirewallrule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mysqlfirewallrule.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_mysqlfirewallrule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlfirewallrule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlfirewallrule_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlfirewallrule_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlserver.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_mysqlserver.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlserver.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_mysqlserver_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_mysqlserver_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_mysqlserver_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlconfiguration.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_postgresqlconfiguration.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlconfiguration.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlconfiguration_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlconfiguration_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlconfiguration_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_postgresqldatabase.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_postgresqldatabase.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqldatabase.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqldatabase_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqldatabase_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlfirewallrule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_postgresqlfirewallrule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlfirewallrule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlfirewallrule_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlfirewallrule_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlserver.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_postgresqlserver.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlserver.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_postgresqlserver_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_postgresqlserver_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_postgresqlserver_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_rediscache.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_rediscache.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_rediscache.py validate-modules:doc-type-does-not-match-spec +plugins/modules/azure_rm_rediscache.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_rediscache.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_rediscache.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_rediscache_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_rediscache_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_rediscache_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_rediscache_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_rediscachefirewallrule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_rediscachefirewallrule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_rediscachefirewallrule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_roleassignment.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_roleassignment.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_roleassignment.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_roleassignment_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_roleassignment_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_roleassignment_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_roledefinition.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_roledefinition.py validate-modules:invalid-argument-spec +plugins/modules/azure_rm_roledefinition.py validate-modules:missing-suboption-docs +plugins/modules/azure_rm_roledefinition.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_roledefinition.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_roledefinition.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_roledefinition.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_roledefinition.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_roledefinition_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_roledefinition_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_roledefinition_info.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_roledefinition_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_roledefinition_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_route.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_route.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_route.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_routetable.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_routetable.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_routetable.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_routetable_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_routetable_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_routetable_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_routetable_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebus.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebus.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebus.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebus_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebus_info.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_servicebus_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_servicebus_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebus_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebusqueue.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebusqueue.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebusqueue.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebustopic.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebustopic.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_servicebustopic.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebustopic.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebustopicsubscription.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebustopicsubscription.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebustopicsubscription.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_servicebussaspolicy.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_servicebussaspolicy.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_servicebussaspolicy.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_servicebussaspolicy.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_snapshot.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_snapshot.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_snapshot.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_snapshot.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqldatabase.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqldatabase.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_sqldatabase.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqldatabase.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqldatabase_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqldatabase_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_sqldatabase_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqldatabase_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqlfirewallrule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqlfirewallrule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqlfirewallrule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqlfirewallrule_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqlfirewallrule_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqlfirewallrule_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqlserver.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqlserver.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqlserver.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_sqlserver_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_sqlserver_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_sqlserver_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_trafficmanager.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_trafficmanager.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_trafficmanager.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_trafficmanager.py validate-modules:invalid-documentation +plugins/modules/azure_rm_trafficmanager.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_trafficmanager.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_trafficmanager.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_trafficmanager.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_trafficmanager.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_trafficmanagerendpoint.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_trafficmanagerendpoint.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_trafficmanagerendpoint.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_trafficmanagerendpoint.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_trafficmanagerendpoint_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_trafficmanagerendpoint_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_trafficmanagerendpoint_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_trafficmanagerprofile_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_trafficmanagerprofile_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_trafficmanagerprofile_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_trafficmanagerprofile_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetwork.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualnetwork.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualnetwork.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualnetwork.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetwork_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualnetwork_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_virtualnetwork_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualnetwork_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetworkpeering.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualnetworkpeering.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_virtualnetworkpeering.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualnetworkpeering.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetworkpeering_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualnetworkpeering_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualnetworkpeering_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:doc-choices-do-not-match-spec +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:doc-missing-type +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:doc-elements-mismatch +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_batchaccount.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_batchaccount.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_batchaccount.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_batchaccount.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cdnendpoint_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cdnendpoint_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cdnendpoint_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_cdnendpoint_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cdnendpoint_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_cdnprofile.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cdnprofile.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cdnprofile.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cosmosdbaccount_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cosmosdbaccount_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_cosmosdbaccount_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cosmosdbaccount_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabschedule.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_devtestlabschedule.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabschedule.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabschedule_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_devtestlabschedule_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_devtestlabschedule_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_devtestlabschedule_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_hdinsightcluster_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_hdinsightcluster_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_hdinsightcluster_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_hdinsightcluster_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_hdinsightcluster_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_loadbalancer_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_loadbalancer_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_loadbalancer_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_loadbalancer_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_lock.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_lock.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_lock_info.py validate-modules:doc-required-mismatch +plugins/modules/azure_rm_lock_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_lock_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_cdnprofile_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_cdnprofile_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_cdnprofile_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_cdnprofile_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_azurefirewall.py validate-modules:missing-suboption-docs +plugins/modules/azure_rm_azurefirewall.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_azurefirewall.py validate-modules:undocumented-parameter +plugins/modules/azure_rm_azurefirewall.py validate-modules:invalid-ansiblemodule-schema +plugins/modules/azure_rm_azurefirewall.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_azurefirewall.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_azurefirewall.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_azurefirewall_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_azurefirewall_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_privatednszone.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_privatednszone.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_privatednszone_info.py validate-modules:parameter-list-no-elements +plugins/modules/azure_rm_privatednszone_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_privatednszone_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_adpassword.py validate-modules:return-syntax-error +plugins/modules/azure_rm_adpassword.py validate-modules:import-before-documentation +plugins/modules/azure_rm_adpassword.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_adpassword.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_adpassword.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_adpassword_info.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_adpassword_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_adpassword_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_adpassword_info.py validate-modules:return-syntax-error +plugins/modules/azure_rm_adpassword_info.py validate-modules:import-before-documentation +plugins/modules/azure_rm_adserviceprincipal.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_adserviceprincipal.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_adserviceprincipal.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_adserviceprincipal_info.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_adserviceprincipal_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_adserviceprincipal_info.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_backupazurevm.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_backupazurevm.py validate-modules:required_if-unknown-key +plugins/modules/azure_rm_backupazurevm_info.py validate-modules:required_if-requirements-unknown +plugins/modules/azure_rm_backupazurevm_info.py validate-modules:required_if-unknown-key +tests/utils/shippable/check_matrix.py replace-urlopen +tests/utils/shippable/timing.py shebang diff --git a/tests/sanity/ignore-2.9.txt b/tests/sanity/ignore-2.9.txt index c3a28442ed..5393f5a7eb 100644 --- a/tests/sanity/ignore-2.9.txt +++ b/tests/sanity/ignore-2.9.txt @@ -1,159 +1,92 @@ -plugins/module_utils/azure_rm_common.py future-import-boilerplate -plugins/module_utils/azure_rm_common.py metaclass-boilerplate -plugins/module_utils/azure_rm_common_ext.py future-import-boilerplate -plugins/module_utils/azure_rm_common_ext.py metaclass-boilerplate -plugins/module_utils/azure_rm_common_rest.py future-import-boilerplate -plugins/module_utils/azure_rm_common_rest.py metaclass-boilerplate plugins/modules/azure_rm_aks.py validate-modules:doc-choices-do-not-match-spec plugins/modules/azure_rm_aks.py validate-modules:doc-default-does-not-match-spec plugins/modules/azure_rm_aks.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_aks.py validate-modules:undocumented-parameter -plugins/modules/azure_rm_aks.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_aks_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_aks_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_aksversion_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_aksversion_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_appgateway.py validate-modules:doc-choices-do-not-match-spec plugins/modules/azure_rm_appgateway.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_applicationsecuritygroup.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_applicationsecuritygroup.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_applicationsecuritygroup_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_applicationsecuritygroup_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_appserviceplan.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_appserviceplan.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_appserviceplan_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_appserviceplan_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_availabilityset.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_availabilityset.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_availabilityset_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_availabilityset_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_containerinstance.py validate-modules:doc-type-does-not-match-spec plugins/modules/azure_rm_containerinstance.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_containerinstance_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_containerregistry.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_containerregistry.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_containerregistry_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_containerregistry_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_containerregistryreplication.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_containerregistryreplication.py validate-modules:doc-choices-do-not-match-spec plugins/modules/azure_rm_containerregistryreplication.py validate-modules:doc-default-does-not-match-spec -plugins/modules/azure_rm_containerregistryreplication.py validate-modules:return-syntax-error plugins/modules/azure_rm_containerregistryreplication.py validate-modules:undocumented-parameter -plugins/modules/azure_rm_containerregistryreplication.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_containerregistryreplication_facts.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_containerregistryreplication_facts.py validate-modules:undocumented-parameter -plugins/modules/azure_rm_containerregistryreplication_facts.py validate-modules:doc-default-does-not-match-spec -plugins/modules/azure_rm_containerregistryreplication_facts.py validate-modules:missing-module-utils-import +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistryreplication_info.py validate-modules:undocumented-parameter plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:doc-choices-do-not-match-spec plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:doc-default-does-not-match-spec plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:undocumented-parameter -plugins/modules/azure_rm_containerregistrywebhook.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_containerregistrywebhook_facts.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_containerregistrywebhook_facts.py validate-modules:doc-default-does-not-match-spec -plugins/modules/azure_rm_containerregistrywebhook_facts.py validate-modules:undocumented-parameter -plugins/modules/azure_rm_containerregistrywebhook_facts.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_deployment.py validate-modules:missing-module-utils-import +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:doc-default-does-not-match-spec +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:parameter-type-not-in-doc +plugins/modules/azure_rm_containerregistrywebhook_info.py validate-modules:undocumented-parameter plugins/modules/azure_rm_deployment.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_deployment_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_deployment_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_dnsrecordset.py validate-modules:doc-missing-type plugins/modules/azure_rm_dnsrecordset.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_dnsrecordset_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_dnszone.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_dnszone_info.py validate-modules:doc-type-does-not-match-spec plugins/modules/azure_rm_dnszone_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_functionapp.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_functionapp.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_functionapp_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_functionapp_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_gallery.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_gallery_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_galleryimage.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_galleryimage_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_galleryimageversion.py validate-modules:doc-choices-do-not-match-spec plugins/modules/azure_rm_galleryimageversion.py validate-modules:doc-type-does-not-match-spec plugins/modules/azure_rm_galleryimageversion.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_galleryimageversion.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_galleryimageversion_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_image.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_image.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_image_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_image_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_keyvault.py validate-modules:doc-choices-do-not-match-spec plugins/modules/azure_rm_keyvault.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_keyvault.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_keyvault_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_keyvault_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_keyvaultkey.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_keyvaultkey.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_keyvaultkey_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_keyvaultsecret.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_keyvaultsecret.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_keyvaultsecret_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_manageddisk.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_manageddisk.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_manageddisk_info.py validate-modules:doc-type-does-not-match-spec -plugins/modules/azure_rm_manageddisk_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_networkinterface.py pep8:E501 plugins/modules/azure_rm_networkinterface.py validate-modules:doc-missing-type plugins/modules/azure_rm_networkinterface.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_networkinterface_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_networkinterface_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_publicipaddress.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_publicipaddress_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_publicipaddress_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_resource.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_resource_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_resource_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_resourcegroup.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_resourcegroup.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_resourcegroup_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_resourcegroup_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_securitygroup.py validate-modules:doc-choices-do-not-match-spec plugins/modules/azure_rm_securitygroup.py validate-modules:doc-default-does-not-match-spec plugins/modules/azure_rm_securitygroup.py validate-modules:missing-suboption-docs plugins/modules/azure_rm_securitygroup.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_securitygroup.py validate-modules:undocumented-parameter -plugins/modules/azure_rm_securitygroup_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_securitygroup_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_snapshot.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_storageaccount.py validate-modules:doc-missing-type plugins/modules/azure_rm_storageaccount.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_storageaccount_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_storageblob.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_storageblob.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_subnet.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_subnet.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_subnet_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_subnet_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_virtualmachine.py pep8:E501 plugins/modules/azure_rm_virtualmachine.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_virtualmachine_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_virtualmachineextension.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_virtualmachineextension.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_virtualmachineextension_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_virtualmachineextension_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_virtualmachineimage_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_virtualmachineimage_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_virtualmachinescaleset.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_virtualmachinescaleset_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_virtualmachinescaleset_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_virtualmachinescalesetextension.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_virtualmachinescalesetextension.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_virtualmachinescalesetextension_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_virtualmachinescalesetextension_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_virtualmachinescalesetinstance.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_virtualmachinescalesetinstance.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_virtualmachinescalesetinstance_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_webapp.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_webapp.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_webapp_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_webapp_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_webappslot.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_webappslot.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_autoscale.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_autoscale.py validate-modules:undocumented-parameter plugins/modules/azure_rm_autoscale_info.py validate-modules:parameter-type-not-in-doc @@ -163,7 +96,6 @@ plugins/modules/azure_rm_cosmosdbaccount.py validate-modules:undocumented-parame plugins/modules/azure_rm_devtestlab.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_devtestlabartifactsource.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_devtestlabcustomimage.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_devtestlabenvironment.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_devtestlabpolicy.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_devtestlabvirtualmachine.py validate-modules:undocumented-parameter @@ -174,7 +106,6 @@ plugins/modules/azure_rm_loadbalancer.py validate-modules:parameter-type-not-in- plugins/modules/azure_rm_loadbalancer.py validate-modules:doc-choices-do-not-match-spec plugins/modules/azure_rm_loadbalancer.py validate-modules:doc-default-does-not-match-spec plugins/modules/azure_rm_loganalyticsworkspace.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_mariadbconfiguration.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_mariadbdatabase.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_mariadbfirewallrule.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_mariadbserver.py validate-modules:parameter-type-not-in-doc @@ -225,9 +156,7 @@ plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:undocumented- plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:doc-default-does-not-match-spec plugins/modules/azure_rm_trafficmanagerprofile_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_virtualnetwork.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_virtualnetwork.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_virtualnetwork_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_virtualnetwork_info.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_virtualnetworkpeering.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_virtualnetworkpeering_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_virtualnetworkgateway.py validate-modules:parameter-type-not-in-doc @@ -244,37 +173,15 @@ plugins/modules/azure_rm_hdinsightcluster_info.py validate-modules:parameter-typ plugins/modules/azure_rm_loadbalancer_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_loganalyticsworkspace_info.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_cdnprofile_info.py validate-modules:parameter-type-not-in-doc -plugins/modules/azure_rm_automationaccount.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_automationaccount_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_azurefirewall.py validate-modules:missing-module-utils-import plugins/modules/azure_rm_azurefirewall.py validate-modules:missing-suboption-docs plugins/modules/azure_rm_azurefirewall.py validate-modules:parameter-type-not-in-doc plugins/modules/azure_rm_azurefirewall.py validate-modules:undocumented-parameter -plugins/modules/azure_rm_azurefirewall_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_cdnendpoint_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_cdnprofile.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_cdnprofile_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_devtestlab_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_devtestlabarmtemplate_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_devtestlabartifact_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_devtestlabartifactsource_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_devtestlabcustomimage_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_devtestlabenvironment_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_devtestlabpolicy_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_devtestlabvirtualmachine_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_devtestlabvirtualnetwork_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_hdinsightcluster.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_loadbalancer_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_routetable.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_sqldatabase.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_sqldatabase_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_sqlfirewallrule.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_sqlfirewallrule_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_sqlserver.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_sqlserver_info.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_trafficmanager.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_trafficmanagerprofile.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_virtualnetworkpeering.py validate-modules:missing-module-utils-import -plugins/modules/azure_rm_virtualnetworkpeering_info.py validate-modules:missing-module-utils-import +plugins/modules/azure_rm_adpassword.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_adpassword.py validate-modules:return-syntax-error +plugins/modules/azure_rm_adpassword.py validate-modules:import-before-documentation +plugins/modules/azure_rm_adpassword_info.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_adpassword_info.py validate-modules:import-before-documentation +plugins/modules/azure_rm_adserviceprincipal.py validate-modules:nonexistent-parameter-documented +plugins/modules/azure_rm_adserviceprincipal_info.py validate-modules:nonexistent-parameter-documented tests/utils/shippable/check_matrix.py replace-urlopen tests/utils/shippable/timing.py shebang diff --git a/tests/utils/ado/ado.sh b/tests/utils/ado/ado.sh index eb0d238f0c..7b9b2fcb15 100755 --- a/tests/utils/ado/ado.sh +++ b/tests/utils/ado/ado.sh @@ -16,6 +16,15 @@ then pip --version pip list --disable-pip-version-check else + if [ "$2" = "3.8" ] + then + sudo apt update + sudo apt install software-properties-common + sudo add-apt-repository ppa:deadsnakes/ppa + sudo apt install python"$2" -y + sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 + fi + command -v pip3 pip3 --version pip3 list --disable-pip-version-check @@ -40,9 +49,27 @@ set -ux if [ "$2" = "2.7" ] then - pip install ansible=="$3" --disable-pip-version-check + if [ "$3" = "devel" ] + then + pip install git+https://github.com/ansible/ansible.git@devel --disable-pip-version-check + else + git clone https://github.com/ansible/ansible.git + cd "ansible" + git checkout "stable-$3" + source hacking/env-setup + pip install paramiko PyYAML Jinja2 httplib2 six + fi else - pip3 install ansible=="$3" --disable-pip-version-check + if [ "$3" = "devel" ] + then + pip3 install git+https://github.com/ansible/ansible.git@devel --disable-pip-version-check + else + git clone https://github.com/ansible/ansible.git + cd "ansible" + git checkout "stable-$3" + source hacking/env-setup + pip3 install paramiko PyYAML Jinja2 httplib2 six + fi fi TEST_DIR="${HOME}/.ansible/ansible_collections/azure/azcollection" @@ -53,28 +80,38 @@ mkdir -p shippable/testresults if [ "$2" = "2.7" ] then + pip install --upgrade pip pip install -I -r "${TEST_DIR}/requirements-azure.txt" + pip3 install setuptools + pip3 install -I -r "${TEST_DIR}/sanity-requirements-azure.txt" + pip3 list else pip3 install -I -r "${TEST_DIR}/requirements-azure.txt" + pip3 install -I -r "${TEST_DIR}/sanity-requirements-azure.txt" + pip3 list fi timeout=60 -test_list=("azure_rm_acs" "azure_rm_aks" "azure_rm_appgateway" "azure_rm_appserviceplan" "azure_rm_automationaccount" "azure_rm_autoscale" "azure_rm_availabilityset" "azure_rm_azurefirewall" "azure_rm_batchaccount" "azure_rm_cdnprofile" "azure_rm_containerinstance" "azure_rm_containerregistry" "azure_rm_cosmosdbaccount" "azure_rm_deployment" "azure_rm_dnsrecordset" "azure_rm_dnszone" "azure_rm_functionapp" "azure_rm_gallery" "azure_rm_hdinsightcluster" "azure_rm_image" "azure_rm_iothub" "azure_rm_keyvault" "azure_rm_keyvaultkey" "azure_rm_keyvaultsecret" "azure_rm_loadbalancer" "azure_rm_manageddisk" "azure_rm_mariadbserver" "azure_rm_monitorlogprofile" "azure_rm_mysqlserver" "azure_rm_networkinterface" "azure_rm_postgresqlserver" "azure_rm_publicipaddress" "azure_rm_rediscache" "azure_rm_resource" "azure_rm_resourcegroup" "azure_rm_routetable" "azure_rm_securitygroup" "azure_rm_servicebus" "azure_rm_sqlserver" "azure_rm_storageaccount" "azure_rm_storageblob" "azure_rm_subnet" "azure_rm_trafficmanagerprofile" "azure_rm_virtualmachine" "azure_rm_virtualmachineextension" "azure_rm_virtualmachineimage_info" "azure_rm_virtualmachinescaleset" "azure_rm_virtualnetwork" "azure_rm_virtualnetworkgateway" "azure_rm_virtualnetworkpeering" "azure_rm_webapp" "azure_rm_workspace" "inventory_azure" "setup_azure" "azure_rm_acs" "azure_rm_aks" "azure_rm_appgateway" "azure_rm_appserviceplan" "azure_rm_automationaccount" "azure_rm_autoscale" "azure_rm_availabilityset" "azure_rm_azurefirewall" "azure_rm_batchaccount" "azure_rm_cdnprofile" "azure_rm_containerinstance" "azure_rm_containerregistry" "azure_rm_cosmosdbaccount" "azure_rm_deployment" "azure_rm_dnsrecordset" "azure_rm_dnszone" "azure_rm_functionapp" "azure_rm_gallery" "azure_rm_hdinsightcluster" "azure_rm_image" "azure_rm_iothub" "azure_rm_keyvault" "azure_rm_keyvaultkey" "azure_rm_keyvaultsecret" "azure_rm_loadbalancer" "azure_rm_manageddisk" "azure_rm_mariadbserver" "azure_rm_monitorlogprofile" "azure_rm_mysqlserver" "azure_rm_networkinterface" "azure_rm_postgresqlserver" "azure_rm_publicipaddress" "azure_rm_rediscache" "azure_rm_resource" "azure_rm_resourcegroup" "azure_rm_routetable" "azure_rm_securitygroup" "azure_rm_servicebus" "azure_rm_sqlserver" "azure_rm_storageaccount" "azure_rm_storageblob" "azure_rm_subnet" "azure_rm_trafficmanagerprofile" "azure_rm_virtualmachine" "azure_rm_virtualmachineextension" "azure_rm_virtualmachineimage_info" "azure_rm_virtualmachinescaleset" "azure_rm_virtualnetwork" "azure_rm_virtualnetworkgateway" "azure_rm_virtualnetworkpeering" "azure_rm_webapp" "azure_rm_workspace" "inventory_azure" "setup_azure") -if [ "$2" = "all" ] +if [ "$4" = "all" ] then echo "All module need test" else - for item in ${test_list[*]} + path_dir="${TEST_DIR}/tests/integration/targets/" + for item in "$path_dir"* do - if [ "${item}" = "$2" ] + if [ "${item}" = "$path_dir""$4" ] then echo "PASS" else - echo "disabled" >> "${TEST_DIR}"/tests/integration/targets/"${item}"/aliases + echo " " >> "${item}"/aliases + echo "disabled" >> "${item}"/aliases fi done fi +echo '--------------------------------------------' +ansible --version +echo '--------------------------------------------' ansible-test env --dump --show --timeout "${timeout}" --color -v @@ -90,7 +127,7 @@ EOF if [ "sanity" = "${group}" ] then - ansible-test sanity --color -v --junit --docker + ansible-test sanity --color -v --junit else ansible-test integration --color -v --retry-on-error "shippable/azure/group${group}/" --allow-destructive fi diff --git a/tests/utils/shippable/check_matrix.py b/tests/utils/shippable/check_matrix.py index 4cbe0f9aa7..96a3775896 100755 --- a/tests/utils/shippable/check_matrix.py +++ b/tests/utils/shippable/check_matrix.py @@ -9,19 +9,13 @@ import re import sys import time +from ansible.module_utils.urls import open_url as urlopen try: from typing import NoReturn except ImportError: NoReturn = None -try: - # noinspection PyCompatibility - from urllib2 import urlopen # pylint: disable=ansible-bad-import-from -except ImportError: - # noinspection PyCompatibility - from urllib.request import urlopen - def main(): # type: () -> None """Main entry point.""" diff --git a/tests/utils/shippable/timing.py b/tests/utils/shippable/timing.py index fb538271b8..d9456855df 100755 --- a/tests/utils/shippable/timing.py +++ b/tests/utils/shippable/timing.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3.7 +#!/usr/bin/env python3.6 from __future__ import (absolute_import, division, print_function) __metaclass__ = type