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)
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)
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))
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))