def autoscale_profile_delete(cmd, client, autoscale_name, resource_group_name, profile_name): from azure.cli.command_modules.monitor._autoscale_util import build_autoscale_profile import json autoscale_settings = client.get(resource_group_name, autoscale_name) default_profile, _ = build_autoscale_profile(autoscale_settings) def _should_retain_profile(profile): name = profile.name try: name = json.loads(profile.name)['for'] except ValueError: pass return name.lower() != profile_name.lower() autoscale_settings.profiles = [ x for x in autoscale_settings.profiles if _should_retain_profile(x) ] # if we removed the last "default" of a recurring pair, we need to preserve it new_default, _ = build_autoscale_profile(autoscale_settings) if not new_default: autoscale_settings.profiles.append(default_profile) autoscale_settings = client.create_or_update(resource_group_name, autoscale_name, autoscale_settings)
def _create_recurring_profile(autoscale_settings, profile_name, start, end, recurrence, capacity, copy_rules=None, timezone=None): from azure.mgmt.monitor.models import (AutoscaleProfile, Recurrence, RecurrentSchedule) from azure.cli.command_modules.monitor._autoscale_util import build_autoscale_profile, validate_autoscale_profile import dateutil from datetime import time import json def _build_recurrence(base, time): recurrence = Recurrence(frequency=base.frequency, schedule=RecurrentSchedule( time_zone=base.schedule.time_zone, days=base.schedule.days, hours=[time.hour], minutes=[time.minute])) return recurrence start_time = dateutil.parser.parse(start).time() if start else time( hour=0, minute=0) end_time = dateutil.parser.parse(end).time() if end else time(hour=23, minute=59) default_profile, autoscale_profile = build_autoscale_profile( autoscale_settings) validate_autoscale_profile(autoscale_profile, start_time, end_time, recurrence) start_profile = AutoscaleProfile(name=profile_name, capacity=capacity, rules=[], recurrence=_build_recurrence( recurrence, start_time)) _apply_copy_rules(autoscale_settings, start_profile, copy_rules) end_profile = AutoscaleProfile(name=json.dumps({ 'name': default_profile.name, 'for': profile_name }), capacity=default_profile.capacity, rules=default_profile.rules, recurrence=_build_recurrence( recurrence, end_time)) autoscale_settings.profiles.append(start_profile) autoscale_settings.profiles.append(end_profile)
def autoscale_profile_delete(cmd, client, autoscale_name, resource_group_name, profile_name): from azure.cli.command_modules.monitor._autoscale_util import build_autoscale_profile import json autoscale_settings = client.get(resource_group_name, autoscale_name) default_profile, _ = build_autoscale_profile(autoscale_settings) def _should_retain_profile(profile): name = profile.name try: name = json.loads(profile.name)['for'] except ValueError: pass return name.lower() != profile_name.lower() autoscale_settings.profiles = [x for x in autoscale_settings.profiles if _should_retain_profile(x)] # if we removed the last "default" of a recurring pair, we need to preserve it new_default, _ = build_autoscale_profile(autoscale_settings) if not new_default: autoscale_settings.profiles.append(default_profile) autoscale_settings = client.create_or_update(resource_group_name, autoscale_name, autoscale_settings)
def _create_recurring_profile(autoscale_settings, profile_name, start, end, recurrence, capacity, copy_rules=None, timezone=None): from azure.mgmt.monitor.models import ( AutoscaleProfile, Recurrence, RecurrentSchedule) from azure.cli.command_modules.monitor._autoscale_util import build_autoscale_profile, validate_autoscale_profile import dateutil from datetime import time import json def _build_recurrence(base, time): recurrence = Recurrence( frequency=base.frequency, schedule=RecurrentSchedule( time_zone=base.schedule.time_zone, days=base.schedule.days, hours=[time.hour], minutes=[time.minute] ) ) return recurrence start_time = dateutil.parser.parse(start).time() if start else time(hour=0, minute=0) end_time = dateutil.parser.parse(end).time() if end else time(hour=23, minute=59) default_profile, autoscale_profile = build_autoscale_profile(autoscale_settings) validate_autoscale_profile(autoscale_profile, start_time, end_time, recurrence) start_profile = AutoscaleProfile( name=profile_name, capacity=capacity, rules=[], recurrence=_build_recurrence(recurrence, start_time) ) _apply_copy_rules(autoscale_settings, start_profile, copy_rules) end_profile = AutoscaleProfile( name=json.dumps({'name': default_profile.name, 'for': profile_name}), capacity=default_profile.capacity, rules=default_profile.rules, recurrence=_build_recurrence(recurrence, end_time) ) autoscale_settings.profiles.append(start_profile) autoscale_settings.profiles.append(end_profile)
def autoscale_update(instance, count=None, min_count=None, max_count=None, tags=None, enabled=None, add_actions=None, remove_actions=None, email_administrator=None, email_coadministrators=None): import json from azure.mgmt.monitor.models import EmailNotification, WebhookNotification from azure.cli.command_modules.monitor._autoscale_util import build_autoscale_profile if tags is not None: instance.tags = tags if enabled is not None: instance.enabled = enabled if any([count, min_count, max_count]): # resolve the interrelated aspects of capacity default_profile, _ = build_autoscale_profile(instance) curr_count = default_profile.capacity.default curr_min = default_profile.capacity.minimum curr_max = default_profile.capacity.maximum is_fixed_count = curr_count == curr_min and curr_count == curr_max # check for special case where count is used to indicate fixed value and only # count is updated if count is not None and is_fixed_count and min_count is None and max_count is None: min_count = count max_count = count count = curr_count if count is None else count min_count = curr_min if min_count is None else min_count max_count = curr_max if max_count is None else max_count # There may be multiple "default" profiles. All need to updated. for profile in instance.profiles: if profile.fixed_date: continue if profile.recurrence: try: # portal denotes the "default" pairs by using a JSON string for their name # so if it can be decoded, we know this is a default profile json.loads(profile.name) except ValueError: continue profile.capacity.default = count profile.capacity.minimum = min_count profile.capacity.maximum = max_count if not instance.notifications: return instance notification = next(x for x in instance.notifications if x.operation.lower() == 'scale') # process removals if remove_actions is not None: removed_emails, removed_webhooks = _parse_action_removals(remove_actions) notification.email.custom_emails = \ [x for x in notification.email.custom_emails if x not in removed_emails] notification.webhooks = \ [x for x in notification.webhooks if x.service_uri not in removed_webhooks] # process additions for action in add_actions or []: if isinstance(action, EmailNotification): for email in action.custom_emails: notification.email.custom_emails.append(email) elif isinstance(action, WebhookNotification): notification.webhooks.append(action) if email_administrator is not None: notification.email.send_to_subscription_administrator = email_administrator if email_coadministrators is not None: notification.email.send_to_subscription_co_administrators = email_coadministrators return instance