def update_reservation_request(id): """ Updates the reservation request of a recipe. The request must be :mimetype:`application/json`. :param id: Recipe's id. :jsonparam boolean reserve: Whether the system will be reserved at the end of the recipe. If true, the system will be reserved. If false, the system will not be reserved. :jsonparam int duration: Number of seconds to reserve the system. :jsonparam string when: Circumstances under which the system will be reserved. Valid values are: onabort If the recipe status is Aborted. onfail If the recipe status is Aborted, or the result is Fail. onwarn If the recipe status is Aborted, or the result is Fail or Warn. always Unconditionally. """ recipe = _get_recipe_by_id(id) if not recipe.can_update_reservation_request(identity.current.user): raise Forbidden403( 'Cannot update the reservation request of recipe %s' % recipe.id) data = read_json_request(request) if 'reserve' not in data: raise BadRequest400('No reserve specified') with convert_internal_errors(): if data['reserve']: if not recipe.reservation_request: recipe.reservation_request = RecipeReservationRequest() if 'duration' in data: duration = int(data['duration']) if duration > MAX_SECONDS_PROVISION: raise BadRequest400( 'Reservation time exceeds maximum time of %s hours' % MAX_HOURS_PROVISION) old_duration = recipe.reservation_request.duration recipe.reservation_request.duration = duration _record_activity(recipe, u'Reservation Request', old_duration, duration) if 'when' in data: old_condition = recipe.reservation_request.when new_condition = RecipeReservationCondition.from_string( data['when']) recipe.reservation_request.when = new_condition _record_activity(recipe, u'Reservation Condition', old_condition, new_condition) session.flush() # to ensure the id is populated return jsonify(recipe.reservation_request.__json__()) else: if recipe.reservation_request: session.delete(recipe.reservation_request) _record_activity(recipe, u'Reservation Request', recipe.reservation_request.duration, None) return jsonify(RecipeReservationRequest.empty_json())
def create_recipe(distro_tree=None, task_list=None, task_name=u'/distribution/reservesys', num_tasks=None, whiteboard=None, role=None, cls=MachineRecipe, **kwargs): if not distro_tree: distro_tree = create_distro_tree() recipe = cls(ttasks=1) recipe.whiteboard = whiteboard recipe.distro_tree = distro_tree recipe.role = role or u'STANDALONE' recipe.distro_requires = recipe.distro_tree.to_xml().toxml() if kwargs.get('reservesys', False): duration = kwargs.get('reservesys_duration', 86400) recipe.reservation_request = RecipeReservationRequest(duration) if num_tasks: task_list = [create_task() for i in range(0, num_tasks)] if task_list: #don't specify a task_list and a task_name... for t in task_list: rt = RecipeTask.from_task(t) rt.role = u'STANDALONE' recipe.tasks.append(rt) recipe.ttasks = len(task_list) else: rt = RecipeTask.from_task(create_task(name=task_name)) rt.role = u'STANDALONE' recipe.tasks.append(rt) return recipe
def update_reservation_request(id): """ Updates the reservation request of a recipe. The request must be :mimetype:`application/json`. :param id: Recipe's id. :jsonparam boolean reserve: Whether the system will be reserved at the end of the recipe. If true, the system will be reserved. If false, the system will not be reserved. :jsonparam int duration: Number of seconds to reserve the system. :jsonparam string when: Circumstances under which the system will be reserved. Valid values are: onabort If the recipe status is Aborted. onfail If the recipe status is Aborted, or the result is Fail. onwarn If the recipe status is Aborted, or the result is Fail or Warn. always Unconditionally. """ recipe = _get_recipe_by_id(id) if not recipe.can_update_reservation_request(identity.current.user): raise Forbidden403('Cannot update the reservation request of recipe %s' % recipe.id) data = read_json_request(request) if 'reserve' not in data: raise BadRequest400('No reserve specified') with convert_internal_errors(): if data['reserve']: if not recipe.reservation_request: recipe.reservation_request = RecipeReservationRequest() if 'duration' in data: duration = int(data['duration']) if duration > MAX_SECONDS_PROVISION: raise BadRequest400('Reservation time exceeds maximum time of %s hours' % MAX_HOURS_PROVISION) old_duration = recipe.reservation_request.duration recipe.reservation_request.duration = duration _record_activity(recipe, u'Reservation Request', old_duration, duration) if 'when' in data: old_condition = recipe.reservation_request.when new_condition = RecipeReservationCondition.from_string(data['when']) recipe.reservation_request.when = new_condition _record_activity(recipe, u'Reservation Condition', old_condition, new_condition) session.flush() # to ensure the id is populated return jsonify(recipe.reservation_request.__json__()) else: if recipe.reservation_request: session.delete(recipe.reservation_request) _record_activity(recipe, u'Reservation Request', recipe.reservation_request.duration, None) return jsonify(RecipeReservationRequest.empty_json())
def update_reservation_request(id): """ Updates the reservation request of a recipe. The request must be :mimetype:`application/json`. :param id: Recipe's id. :jsonparam boolean reserve: Whether the system will be reserved at the end of the recipe. If true, the system will be reserved. If false, the system will not be reserved. :jsonparam int duration: Number of seconds to rerserve the system. """ recipe = _get_recipe_by_id(id) if not recipe.can_update_reservation_request(identity.current.user): raise Forbidden403('Cannot update the reservation request of recipe %s' % recipe.id) data = read_json_request(request) if 'reserve' not in data: raise BadRequest400('No reserve specified') with convert_internal_errors(): if data['reserve']: if 'duration' not in data: raise BadRequest400('No duration specified') duration = data['duration'] if duration > MAX_SECONDS_PROVISION: raise BadRequest400('Reservation time exceeds maximum time of %s hours' % MAX_HOURS_PROVISION) if recipe.reservation_request: old_duration = recipe.reservation_request.duration recipe.reservation_request.duration = data['duration'] _record_activity(recipe, u'Reservation Request', old_duration, data['duration']) else: reservation_request = RecipeReservationRequest(data['duration']) recipe.reservation_request = reservation_request _record_activity(recipe, u'Reservation Request', None, reservation_request.duration, 'Changed') return jsonify(recipe.reservation_request.__json__()) else: if recipe.reservation_request: session.delete(recipe.reservation_request) _record_activity(recipe, u'Reservation Request', recipe.reservation_request.duration, None) return jsonify(RecipeReservationRequest.empty_json())
def create_recipe(distro_tree=None, task_list=None, task_name=u'/distribution/reservesys', num_tasks=None, whiteboard=None, role=None, ks_meta=None, cls=MachineRecipe, **kwargs): recipe = cls(ttasks=1) recipe.ks_meta = ks_meta recipe.whiteboard = whiteboard recipe.distro_tree = distro_tree recipe.role = role or u'STANDALONE' custom_distro = kwargs.get('custom_distro', False) if not custom_distro: if not distro_tree: distro_tree = create_distro_tree(**kwargs) recipe.distro_tree = distro_tree recipe.installation = recipe.distro_tree.create_installation_from_tree() recipe.distro_requires = lxml.etree.tostring(recipe.distro_tree.to_xml(), encoding=unicode) else: name = kwargs.get('distro_name', u'MyAwesomeLinux1.0') tree_url = kwargs.get('tree_url', u'ftp://dummylab.example.com/distros/MyAwesomeLinux1/') initrd_path = kwargs.get('initrd_path', u'pxeboot/initrd') kernel_path = kwargs.get('kernel_path', u'pxeboot/vmlinuz') arch = kwargs.get('arch', u'i386') variant = kwargs.get('variant', u'Server') osmajor = kwargs.get('osmajor', u'DansAwesomeLinux6') osminor = kwargs.get('osminor', u'0') arch = Arch.by_name(arch) recipe.installation = Installation(tree_url=tree_url, initrd_path=initrd_path, kernel_path=kernel_path, arch=arch, distro_name=name, osmajor=osmajor, osminor=osminor, variant=variant) if kwargs.get('reservesys', False): recipe.reservation_request = RecipeReservationRequest() if kwargs.get('reservesys_duration'): recipe.reservation_request.duration = kwargs['reservesys_duration'] if num_tasks: task_list = [create_task() for i in range(0, num_tasks)] if not task_list: #don't specify a task_list and a task_name... try: task = Task.by_name(task_name) except LookupError: task = create_task(name=task_name) task_list = [task] for t in task_list: rt = RecipeTask.from_task(t) rt.role = u'STANDALONE' recipe.tasks.append(rt) recipe.ttasks = len(task_list) return recipe
if xmlrecipe.autopick: recipe.autopick_random = xmlrecipe.autopick.random if xmlrecipe.watchdog: recipe.panic = xmlrecipe.watchdog.panic recipe.ks_meta = xmlrecipe.ks_meta recipe.kernel_options = xmlrecipe.kernel_options recipe.kernel_options_post = xmlrecipe.kernel_options_post # try parsing install options to make sure there is no syntax error try: InstallOptions.from_strings(recipe.ks_meta, recipe.kernel_options, recipe.kernel_options_post) except Exception as e: raise BX(_('Error parsing ks_meta: %s' % e)) recipe.role = xmlrecipe.role if xmlrecipe.reservesys: recipe.reservation_request = RecipeReservationRequest( xmlrecipe.reservesys.duration) custom_packages = set() for xmlpackage in xmlrecipe.packages(): package = TaskPackage.lazy_create(package='%s' % xmlpackage.name) custom_packages.add(package) for installPackage in xmlrecipe.installPackages(): package = TaskPackage.lazy_create(package='%s' % installPackage) custom_packages.add(package) recipe.custom_packages = list(custom_packages) for xmlrepo in xmlrecipe.iter_repos(): recipe.repos.append(RecipeRepo(name=xmlrepo.name, url=xmlrepo.url)) for xmlksappend in xmlrecipe.iter_ksappends(): recipe.ks_appends.append(RecipeKSAppend(ks_append=xmlksappend)) xmltasks = [] invalid_tasks = [] for xmltask in xmlrecipe.iter_tasks():