Skip to content

Commit

Permalink
Azure Recovery Services VM Backup Policy (#271)
Browse files Browse the repository at this point in the history
* Resolved #234

* Adjusted code as per review comments

* Updated the main.yaml file extension and registered module in pr-pipelines.yml

* Removed azure_rm_backupazurevm_info from pr-pipelines.yaml

* Updated meta/main.yaml to meta/main.yml

* removed meta/main.yaml

* Updated module with latest review comments

* Adjusted task/main.yml as per the recommendation

* Adjusted long string with column size 80

* Update azure_rm_backupazurevm_info.py

* Update azure_rm_backupazurevm_info.py

* Updated azure_rm_backupazurevm_info with latest review comments

* Updated tests/sanity/ignore-2.xx

* Udpated tests/sanity/ignore-2.xx

* Updated ignore-2.9.txt(removed lines 186-189) and tasks/main.yml(removed extra blank line)

* Resolved #210 Recovery Service Vault

* Adjusted the state and added provision for deleting RSV

* Updated Class Name

* Adjusted the code with latest review comments

* Added new line at end of aliases main.yml files

* Adjusted tasks/main.yml

* removed line no 3 from tasks/main.yml

* Read Recovery Vault Details Pre Creation Logic Integrated

* Added idempotent test and adjusted module return type

* Adjusted code as per review comments

* '2016-06-01' is required for create, delete as per official doc

* Adjusted code as per latest review comments

* Adjusted indentation

* Removed whitespace from line 175

* Added new module for VM Backup Policy #255

* Adjusted code as per review comments

* Added recovery vault testcases in policy module

* Documentation is updated

* Updated code as per review comments

* Updated sanity ignore files

* Updated tasks/main.yml

* Updated test cases

Co-authored-by: Suyeb Ansari <>
Co-authored-by: Fred-sun <37327967+Fred-sun@users.noreply.github.com>
Co-authored-by: haiyuan_zhang <haiyuan.zhang1982@gmail.com>
  • Loading branch information
3 people authored Oct 26, 2020
1 parent 0dcdcaa commit 7d13133
Show file tree
Hide file tree
Showing 8 changed files with 830 additions and 1 deletion.
468 changes: 468 additions & 0 deletions plugins/modules/azure_rm_vmbackuppolicy.py

Large diffs are not rendered by default.

267 changes: 267 additions & 0 deletions plugins/modules/azure_rm_vmbackuppolicy_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,267 @@
#!/usr/bin/python
#
# Copyright (c) 2020 Suyeb Ansari (@suyeb786)
#
# 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_vmbackuppolicy_info
version_added: '1.1.0'
short_description: Fetch Backup Policy Details
description:
- Get Backup Policy Details.
options:
name:
description:
- Policy Name.
required: true
type: str
resource_group:
description:
- The name of the resource group.
required: true
type: str
vault_name:
description:
- Recovery Service Vault Name.
required: true
type: str
extends_documentation_fragment:
- azure.azcollection.azure
- azure.azcollection.azure_tags
author:
- Suyeb Ansari (@suyeb786)
'''

EXAMPLES = '''
azure_rm_backvmuppolicy_info:
name: 'myBackupPolicy'
vault_name: 'myVault'
resource_group: 'myResourceGroup'
'''

RETURN = '''
response:
description:
- The response about the current state of the backup policy.
returned: always
type: complex
contains:
id:
description:
- Resource ID.
returned: always
type: str
sample: "/subscriptions/xxxxxxx/resourceGroups/resourcegroup_name/ \
providers/Microsoft.RecoveryServices/vaults/myVault/backupPolicies/myBackup"
name:
description:
- Backup Policy Name.
returned: always
type: str
sample: "myBackup"
properties:
description:
- The backup policy properties.
returned: always
type: dict
sample: {
"backupManagementType": "AzureIaasVM",
"schedulePolicy": {
"schedulePolicyType": "SimpleSchedulePolicy",
"scheduleRunFrequency": "Weekly",
"scheduleRunDays": [
"Monday",
"Wednesday",
"Thursday"
],
"scheduleRunTimes": [
"2018-01-24T10:00:00Z"
],
"scheduleWeeklyFrequency": 0
},
"retentionPolicy": {
"retentionPolicyType": "LongTermRetentionPolicy",
"weeklySchedule": {
"daysOfTheWeek": [
"Monday",
"Wednesday",
"Thursday"
],
"retentionTimes": [
"2018-01-24T10:00:00Z"
],
"retentionDuration": {
"count": 1,
"durationType": "Weeks"
}
},
"monthlySchedule": {
"retentionScheduleFormatType": "Weekly",
"retentionScheduleWeekly": {
"daysOfTheWeek": [
"Wednesday",
"Thursday"
],
"weeksOfTheMonth": [
"First",
"Third"
]
},
"retentionTimes": [
"2018-01-24T10:00:00Z"
],
"retentionDuration": {
"count": 2,
"durationType": "Months"
}
},
"yearlySchedule": {
"retentionScheduleFormatType": "Weekly",
"monthsOfYear": [
"February",
"November"
],
"retentionScheduleWeekly": {
"daysOfTheWeek": [
"Monday",
"Thursday"
],
"weeksOfTheMonth": [
"Fourth"
]
},
"retentionTimes": [
"2018-01-24T10:00:00Z"
],
"retentionDuration": {
"count": 4,
"durationType": "Years"
}
}
},
"timeZone": "Pacific Standard Time",
"protectedItemsCount": 0
}
type:
description:
- Resource type.
returned: always
type: str
sample: "Microsoft.RecoveryServices/vaults/backupPolicies"
'''

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 json

try:
from msrestazure.azure_exceptions import CloudError
except ImportError:
# This is handled in azure_rm_common
pass


class BackupPolicyVMInfo(AzureRMModuleBaseExt):
def __init__(self):
self.module_arg_spec = dict(
resource_group=dict(
type='str',
required=True
),
name=dict(
type='str',
required=True
),
vault_name=dict(
type='str',
required=True
)
)

self.resource_group = None
self.name = None
self.vault_name = None

self.results = dict(changed=False)
self.mgmt_client = None
self.url = None
self.status_code = [200, 202]

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(BackupPolicyVMInfo, 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.vault_name + '/' \
+ "backupPolicies/" \
+ self.name

def exec_module(self, **kwargs):
for key in list(self.module_arg_spec.keys()):
if hasattr(self, key):
setattr(self, key, kwargs[key])

self.url = self.get_url()

self.mgmt_client = self.get_mgmt_svc_client(GenericRestClient,
base_url=self._cloud_environment.endpoints.resource_manager)

response = self.get_resource()
changed = False
self.results['response'] = response
self.results['changed'] = changed

return self.results

def get_resource(self):
# self.log('Fetch Backup Policy Details {0}'.format(self.))
try:
response = self.mgmt_client.query(
self.url,
'GET',
self.query_parameters,
self.header_parameters,
None,
self.status_code,
600,
30,
)
found = True
except CloudError as e:
self.log('Backup policy does not exist.')
self.fail('Error in fetching VM Backup Policy {0}'.format(str(e)))
try:
response = json.loads(response.text)
except Exception:
response = {'text': response.text}

return response


def main():
BackupPolicyVMInfo()


if __name__ == '__main__':
main()
3 changes: 2 additions & 1 deletion pr-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ parameters:
- "azure_rm_virtualnetworkgateway"
- "azure_rm_virtualnetworkeepring"
- "azure_rm_backupazurevm"
- "azure_rm_recoveryservicesvault"
- "azure_rm_recoveryservicesvault"
- "azure_rm_vmbackuppolicy"
- "azure_rm_webapp"
- "azure_rm_workspace"
- "inventory_azure"
Expand Down
3 changes: 3 additions & 0 deletions tests/integration/targets/azure_rm_vmbackuppolicy/aliases
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
cloud/azure
shippable/azure/group12
destructive
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
dependencies:
- setup_azure
78 changes: 78 additions & 0 deletions tests/integration/targets/azure_rm_vmbackuppolicy/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
- name: Fix resource prefix
set_fact:
name: "myPolicy{{ resource_group | hash('md5') | truncate(22, True, '') }}"
vault_name: "myVault"
location: "eastus"

- name: Create Azure Recovery Service vault
azure_rm_recoveryservicesvault:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
location: "{{ location }}"
state: "present"
register: vault

- name: Create VM Backup Policy
azure_rm_vmbackuppolicy:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
vault_name: "{{ vault.response.name }}"
state: "present"
register: output

- name: Assert that output has changed
assert:
that:
- output.changed

- name: Create VM Backup Policy (idempotent)
azure_rm_vmbackuppolicy:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
vault_name: "{{ vault.response.name }}"
state: "present"
register: output

- name: Assert that output has no changed
assert:
that:
- not output.changed

- name: Get VM Backup Policy Details
azure_rm_vmbackuppolicy_info:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
vault_name: "{{ vault.response.name }}"
register: output

- name: Assert that output has changed
assert:
that:
- output.response.id != None
- output.response.name != None

- name: Delete VM Backup Policy
azure_rm_vmbackuppolicy:
resource_group: "{{ resource_group }}"
name: "{{ name }}"
vault_name: "{{ vault.response.name }}"
state: "absent"
register: output

- name: Assert that output has changed
assert:
that:
- output.changed

- name: Delete Azure Recovery Service vault
azure_rm_recoveryservicesvault:
resource_group: "{{ resource_group }}"
name: "{{ vault.response.name }}"
location: "{{ location }}"
state: "absent"
register: output

- name: Assert that output has changed
assert:
that:
- output.changed
5 changes: 5 additions & 0 deletions tests/sanity/ignore-2.10.txt
Original file line number Diff line number Diff line change
Expand Up @@ -718,9 +718,14 @@ plugins/modules/azure_rm_recoveryservicesvault.py validate-modules:required_if-r
plugins/modules/azure_rm_recoveryservicesvault.py validate-modules:required_if-unknown-key
plugins/modules/azure_rm_recoveryservicesvault_info.py validate-modules:required_if-requirements-unknown
plugins/modules/azure_rm_recoveryservicesvault_info.py validate-modules:required_if-unknown-key
plugins/modules/azure_rm_vmbackuppolicy.py validate-modules:required_if-requirements-unknown
plugins/modules/azure_rm_vmbackuppolicy.py validate-modules:required_if-unknown-key
plugins/modules/azure_rm_vmbackuppolicy_info.py validate-modules:required_if-requirements-unknown
plugins/modules/azure_rm_vmbackuppolicy_info.py validate-modules:required_if-unknown-key
plugins/modules/azure_rm_openshiftmanagedcluster.py validate-modules:required_if-unknown-key
plugins/modules/azure_rm_openshiftmanagedcluster.py validate-modules:invalid-ansiblemodule-schema
plugins/modules/azure_rm_openshiftmanagedcluster.py validate-modules:required_if-requirements-unknown
plugins/modules/azure_rm_openshiftmanagedcluster.py validate-modules:parameter-list-no-elements
plugins/modules/azure_rm_vmbackuppolicy.py validate-modules:parameter-list-no-elements
tests/utils/shippable/check_matrix.py replace-urlopen
tests/utils/shippable/timing.py shebang
5 changes: 5 additions & 0 deletions tests/sanity/ignore-2.11.txt
Original file line number Diff line number Diff line change
Expand Up @@ -718,9 +718,14 @@ plugins/modules/azure_rm_recoveryservicesvault.py validate-modules:required_if-r
plugins/modules/azure_rm_recoveryservicesvault.py validate-modules:required_if-unknown-key
plugins/modules/azure_rm_recoveryservicesvault_info.py validate-modules:required_if-requirements-unknown
plugins/modules/azure_rm_recoveryservicesvault_info.py validate-modules:required_if-unknown-key
plugins/modules/azure_rm_vmbackuppolicy.py validate-modules:required_if-requirements-unknown
plugins/modules/azure_rm_vmbackuppolicy.py validate-modules:required_if-unknown-key
plugins/modules/azure_rm_vmbackuppolicy_info.py validate-modules:required_if-requirements-unknown
plugins/modules/azure_rm_vmbackuppolicy_info.py validate-modules:required_if-unknown-key
plugins/modules/azure_rm_openshiftmanagedcluster.py validate-modules:required_if-unknown-key
plugins/modules/azure_rm_openshiftmanagedcluster.py validate-modules:invalid-ansiblemodule-schema
plugins/modules/azure_rm_openshiftmanagedcluster.py validate-modules:required_if-requirements-unknown
plugins/modules/azure_rm_openshiftmanagedcluster.py validate-modules:parameter-list-no-elements
plugins/modules/azure_rm_vmbackuppolicy.py validate-modules:parameter-list-no-elements
tests/utils/shippable/check_matrix.py replace-urlopen
tests/utils/shippable/timing.py shebang

0 comments on commit 7d13133

Please sign in to comment.