Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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