azdev/operations/resource.py (59 lines of code) (raw):
# -----------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# -----------------------------------------------------------------------------
import json
from knack.log import get_logger
from knack.prompting import prompt_y_n
from knack.util import CLIError
from azdev.utilities import (
cmd as run_cmd, subheading, display, require_azure_cli)
logger = get_logger(__name__)
class Data:
def __init__(self, **kw):
self.__dict__.update(kw)
if 'properties' in self.__dict__:
self.__dict__.update(self.properties) # pylint: disable=no-member
del self.properties # pylint: disable=no-member
def delete_groups(prefixes=None, older_than=6, product='azurecli', cause='automation', yes=False):
from datetime import datetime, timedelta
require_azure_cli()
groups = json.loads(run_cmd('az group list -ojson').result)
groups_to_delete = []
def _filter_by_tags():
for group in groups:
group = Data(**group)
if not group.tags: # pylint: disable=no-member
continue
tags = Data(**group.tags) # pylint: disable=no-member
try:
date_tag = datetime.strptime(tags.date, '%Y-%m-%dT%H:%M:%SZ')
curr_time = datetime.utcnow()
if (tags.product == product and tags.cause == cause and
(curr_time - date_tag <= timedelta(hours=older_than + 1))):
groups_to_delete.append(group.name)
except AttributeError:
continue
def _filter_by_prefix():
for group in groups:
group = Data(**group)
for prefix in prefixes:
if group.name.startswith(prefix):
groups_to_delete.append(group.name)
def _delete():
for group in groups_to_delete:
run_cmd('az group delete -g {} -y --no-wait'.format(group), message=True)
if prefixes:
logger.info('Filter by prefix')
_filter_by_prefix()
else:
logger.info('Filter by tags')
_filter_by_tags()
if not groups_to_delete:
raise CLIError('No groups meet the criteria to delete.')
if yes:
_delete()
else:
subheading('Groups to Delete')
for group in groups_to_delete:
display('\t{}'.format(group))
if prompt_y_n('Delete {} resource groups?'.format(len(groups_to_delete)), 'y'):
_delete()
else:
raise CLIError('Command cancelled.')