Beispiel #1
0
 def give_to_pool(cls, pool, custom_limit=None):
     """Give appliances from shepherd to the pool where the maximum count is specified by pool
     or you can specify a custom limit
     """
     from appliances.tasks import (
         appliance_power_on, mark_appliance_ready, wait_appliance_ready, appliance_yum_update,
         appliance_reboot)
     limit = custom_limit if custom_limit is not None else pool.total_count
     appliances = []
     with transaction.atomic():
         for template in pool.possible_templates:
             for appliance in cls.unassigned().filter(
                     template=template).all()[:limit - len(appliances)]:
                 with appliance.kill_lock:
                     appliance.appliance_pool = pool
                     appliance.save()
                     appliance.set_status("Given to pool {}".format(pool.id))
                     tasks = [appliance_power_on.si(appliance.id)]
                     if pool.yum_update:
                         tasks.append(appliance_yum_update.si(appliance.id))
                         tasks.append(
                             appliance_reboot.si(appliance.id, if_needs_restarting=True))
                     if appliance.preconfigured:
                         tasks.append(wait_appliance_ready.si(appliance.id))
                     else:
                         tasks.append(mark_appliance_ready.si(appliance.id))
                     chain(*tasks)()
                     appliances.append(appliance)
             if len(appliances) == limit:
                 break
     return len(appliances)
Beispiel #2
0
 def give_to_pool(cls, pool, custom_limit=None):
     """Give appliances from shepherd to the pool where the maximum count is specified by pool
     or you can specify a custom limit
     """
     from appliances.tasks import (appliance_power_on, mark_appliance_ready,
                                   wait_appliance_ready,
                                   appliance_yum_update, appliance_reboot)
     limit = custom_limit if custom_limit is not None else pool.total_count
     appliances = []
     with transaction.atomic():
         for template in pool.possible_templates:
             for appliance in cls.unassigned().filter(
                     template=template).all()[:limit - len(appliances)]:
                 with appliance.kill_lock:
                     appliance.appliance_pool = pool
                     appliance.save()
                     appliance.set_status("Given to pool {}".format(
                         pool.id))
                     tasks = [appliance_power_on.si(appliance.id)]
                     if pool.yum_update:
                         tasks.append(appliance_yum_update.si(appliance.id))
                         tasks.append(
                             appliance_reboot.si(appliance.id,
                                                 if_needs_restarting=True))
                     if appliance.preconfigured:
                         tasks.append(wait_appliance_ready.si(appliance.id))
                     else:
                         tasks.append(mark_appliance_ready.si(appliance.id))
                     chain(*tasks)()
                     appliances.append(appliance)
             if len(appliances) == limit:
                 break
     return len(appliances)
Beispiel #3
0
def power_on(user, appliance, wait_ready=True):
    """Power on the appliance. If task is called, an id is returned, otherwise None.

    You can specify appliance by IP address, id or name.
    """
    appliance = get_appliance(appliance, user)
    if appliance.power_state != Appliance.Power.ON:
        tasks = [appliance_power_on.si(appliance.id)]
        if wait_ready:
            tasks.append(wait_appliance_ready.si(appliance.id))
        else:
            tasks.append(mark_appliance_ready.si(appliance.id))
        return chain(*tasks)().task_id
Beispiel #4
0
def power_on(user, appliance, wait_ready=True):
    """Power on the appliance. If task is called, an id is returned, otherwise None.

    You can specify appliance by IP address, id or name.
    """
    appliance = get_appliance(appliance, user)
    if appliance.power_state != Appliance.Power.ON:
        tasks = [appliance_power_on.si(appliance.id)]
        if wait_ready:
            tasks.append(wait_appliance_ready.si(appliance.id))
        else:
            tasks.append(mark_appliance_ready.si(appliance.id))
        return chain(*tasks)().task_id
Beispiel #5
0
def appliance_action(request, appliance_id, action, x=None):
    try:
        appliance = Appliance.objects.get(id=appliance_id)
    except ObjectDoesNotExist:
        messages.warning(
            request,
            'Appliance with ID {} does not exist!.'.format(appliance_id))
        return go_back_or_home(request)
    if not can_operate_appliance_or_pool(appliance, request.user):
        messages.warning(
            request,
            'This appliance belongs either to some other user or nobody.')
        return go_back_or_home(request)
    if action == "start":
        if appliance.power_state != Appliance.Power.ON:
            chain(appliance_power_on.si(appliance.id),
                  (wait_appliance_ready if appliance.preconfigured else
                   mark_appliance_ready).si(appliance.id))()
            messages.success(request, 'Initiated launch of appliance.')
            return go_back_or_home(request)
        else:
            messages.info(request, 'Appliance was already powered on.')
            return go_back_or_home(request)
    elif action == "reboot":
        if appliance.power_state == Appliance.Power.ON:
            chain(appliance_reboot.si(appliance.id),
                  mark_appliance_ready.si(appliance.id))()
            messages.success(request, 'Initiated reboot of appliance.')
            return go_back_or_home(request)
        else:
            messages.warning(request,
                             'Only powered on appliances can be rebooted')
            return go_back_or_home(request)
    elif action == "stop":
        if appliance.power_state != Appliance.Power.OFF:
            appliance_power_off.delay(appliance.id)
            messages.success(request, 'Initiated stop of appliance.')
            return go_back_or_home(request)
        else:
            messages.info(request, 'Appliance was already powered off.')
            return go_back_or_home(request)
    elif action == "suspend":
        if appliance.power_state != Appliance.Power.SUSPENDED:
            appliance_suspend.delay(appliance.id)
            messages.success(request, 'Initiated suspend of appliance.')
            return go_back_or_home(request)
        else:
            messages.info(request, 'Appliance was already suspended.')
            return go_back_or_home(request)
    elif action == "kill":
        Appliance.kill(appliance)
        messages.success(request, 'Kill initiated.')
        return go_back_or_home(request)
    elif action == "dont_expire":
        if not request.user.is_superuser:
            messages.warning(
                request,
                'Disabling expiration time is allowed only for superusers.')
            return go_back_or_home(request)
        with transaction.atomic():
            appliance.leased_until = None
            appliance.save()
        messages.success(request, 'Lease disabled successfully. Be careful.')
        return go_back_or_home(request)
    elif action == "set_lease":
        if not can_operate_appliance_or_pool(appliance, request.user):
            messages.warning(
                request,
                'This appliance belongs either to some other user or nobody.')
            return go_back_or_home(request)
        appliance.prolong_lease(time=int(x))
        messages.success(request, 'Lease prolonged successfully.')
        return go_back_or_home(request)
    else:
        messages.warning(request, "Unknown action '{}'".format(action))
Beispiel #6
0
def appliance_action(request, appliance_id, action, x=None):
    try:
        appliance = Appliance.objects.get(id=appliance_id)
    except ObjectDoesNotExist:
        messages.warning(request, 'Appliance with ID {} does not exist!.'.format(appliance_id))
        return go_back_or_home(request)
    if not can_operate_appliance_or_pool(appliance, request.user):
        messages.warning(request, 'This appliance belongs either to some other user or nobody.')
        return go_back_or_home(request)
    if action == "start":
        if appliance.power_state != Appliance.Power.ON:
            chain(
                appliance_power_on.si(appliance.id),
                (wait_appliance_ready if appliance.preconfigured else mark_appliance_ready).si(
                    appliance.id))()
            messages.success(request, 'Initiated launch of appliance.')
            return go_back_or_home(request)
        else:
            messages.info(request, 'Appliance was already powered on.')
            return go_back_or_home(request)
    elif action == "reboot":
        if appliance.power_state == Appliance.Power.ON:
            chain(
                appliance_reboot.si(appliance.id),
                mark_appliance_ready.si(appliance.id))()
            messages.success(request, 'Initiated reboot of appliance.')
            return go_back_or_home(request)
        else:
            messages.warning(request, 'Only powered on appliances can be rebooted')
            return go_back_or_home(request)
    elif action == "stop":
        if appliance.power_state != Appliance.Power.OFF:
            appliance_power_off.delay(appliance.id)
            messages.success(request, 'Initiated stop of appliance.')
            return go_back_or_home(request)
        else:
            messages.info(request, 'Appliance was already powered off.')
            return go_back_or_home(request)
    elif action == "suspend":
        if appliance.power_state != Appliance.Power.SUSPENDED:
            appliance_suspend.delay(appliance.id)
            messages.success(request, 'Initiated suspend of appliance.')
            return go_back_or_home(request)
        else:
            messages.info(request, 'Appliance was already suspended.')
            return go_back_or_home(request)
    elif action == "kill":
        Appliance.kill(appliance)
        messages.success(request, 'Kill initiated.')
        return go_back_or_home(request)
    elif action == "dont_expire":
        if not request.user.is_superuser:
            messages.warning(request, 'Disabling expiration time is allowed only for superusers.')
            return go_back_or_home(request)
        with transaction.atomic():
            appliance.leased_until = None
            appliance.save()
        messages.success(request, 'Lease disabled successfully. Be careful.')
        return go_back_or_home(request)
    elif action == "set_lease":
        if not can_operate_appliance_or_pool(appliance, request.user):
            messages.warning(request, 'This appliance belongs either to some other user or nobody.')
            return go_back_or_home(request)
        appliance.prolong_lease(time=int(x))
        messages.success(request, 'Lease prolonged successfully.')
        return go_back_or_home(request)
    else:
        messages.warning(request, "Unknown action '{}'".format(action))