def args2body(self, parsed_args): params = {} if parsed_args.name: params['name'] = parsed_args.name if parsed_args.prolong_for: params['prolong_for'] = parsed_args.prolong_for if parsed_args.reduce_by: params['reduce_by'] = parsed_args.reduce_by if parsed_args.end_date: params['end_date'] = parsed_args.end_date if parsed_args.defer_by: params['defer_by'] = parsed_args.defer_by if parsed_args.advance_by: params['advance_by'] = parsed_args.advance_by if parsed_args.start_date: params['start_date'] = parsed_args.start_date if parsed_args.reservation: keys = [ # General keys 'id', # Keys for host reservation 'min', 'max', 'hypervisor_properties', 'resource_properties', # Keys for instance reservation 'vcpus', 'memory_mb', 'disk_gb', 'amount', 'affinity' ] params['reservations'] = [] reservations = [] for res_str in parsed_args.reservation: err_msg = ("Invalid reservation argument '%s'. " "Reservation arguments must be of the form " "--reservation <key=value>" % res_str) res_info = {} prog = re.compile('^(?:(.*),)?(%s)=(.*)$' % '|'.join(keys)) def parse_params(params): match = prog.search(params) if match: k, v = match.group(2, 3) if strutils.is_int_like(v): v = int(v) res_info[k] = v if match.group(1) is not None: parse_params(match.group(1)) parse_params(res_str) if res_info: if 'id' not in res_info: raise exception.IncorrectLease( 'The key-value pair id=<reservation_id> is ' 'required for the --reservation argument') reservations.append(res_info) if not reservations: raise exception.IncorrectLease(err_msg) params['reservations'] = reservations return params
def _parse_params(self, str_params, default, err_msg): request_params = {} prog = re.compile('^(?:(.*),)?(%s)=(.*)$' % "|".join(default.keys())) while str_params != "": match = prog.search(str_params) if match is None: raise exception.IncorrectLease(err_msg) self.log.info("Matches: %s", match.groups()) k, v = match.group(2, 3) if k in request_params.keys(): raise exception.DuplicatedLeaseParameters(err_msg) else: if strutils.is_int_like(v): request_params[k] = int(v) elif isinstance(default[k], list): request_params[k] = jsonutils.loads(v) else: request_params[k] = v str_params = match.group(1) if match.group(1) else "" request_params.update({ k: v for k, v in default.items() if k not in request_params.keys() and v is not None }) return request_params
def args2body(self, parsed_args): params = self._generate_params(parsed_args) physical_reservations = [] for phys_res_str in parsed_args.physical_reservations: err_msg = ("Invalid physical-reservation argument '%s'. " "Reservation arguments must be of the " "form --physical-reservation <min=int,max=int," "hypervisor_properties=str,resource_properties=str," "before_end=str>" % phys_res_str) defaults = CREATE_RESERVATION_KEYS["physical:host"] phys_res_info = self._parse_params(phys_res_str, defaults, err_msg) if not (phys_res_info['min'] and phys_res_info['max']): raise exception.IncorrectLease(err_msg) if not (strutils.is_int_like(phys_res_info['min']) and strutils.is_int_like(phys_res_info['max'])): raise exception.IncorrectLease(err_msg) min_host = int(phys_res_info['min']) max_host = int(phys_res_info['max']) if min_host > max_host: err_msg = ("Invalid physical-reservation argument '%s'. " "Reservation argument min value must be " "less than max value" % phys_res_str) raise exception.IncorrectLease(err_msg) if min_host == 0 or max_host == 0: err_msg = ("Invalid physical-reservation argument '%s'. " "Reservation arguments min and max values " "must be greater than or equal to 1" % phys_res_str) raise exception.IncorrectLease(err_msg) # NOTE(sbauza): The resource type should be conf-driven mapped with # blazar.conf file but that's potentially on another # host phys_res_info['resource_type'] = 'physical:host' physical_reservations.append(phys_res_info) if physical_reservations: # We prepend the physical_reservations to preserve legacy order # of reservations params['reservations'] = physical_reservations \ + params['reservations'] return params
def parse_params(params): match = prog.search(params) if match: self.log.info("Matches: %s", match.groups()) k, v = match.group(2, 3) if not phys_res_info[k]: phys_res_info[k] = v else: raise exception.DuplicatedLeaseParameters(err_msg) if match.group(1) is not None: parse_params(match.group(1)) else: raise exception.IncorrectLease(err_msg)
def _generate_params(self, parsed_args): params = {} if parsed_args.name: params['name'] = parsed_args.name if not isinstance(parsed_args.start, datetime.datetime): if parsed_args.start != 'now': try: parsed_args.start = datetime.datetime.strptime( parsed_args.start, '%Y-%m-%d %H:%M') except ValueError: raise exception.IncorrectLease if not isinstance(parsed_args.end, datetime.datetime): try: parsed_args.end = datetime.datetime.strptime( parsed_args.end, '%Y-%m-%d %H:%M') except ValueError: raise exception.IncorrectLease if parsed_args.start == 'now': start = _utc_now() else: start = parsed_args.start if start > parsed_args.end: raise exception.IncorrectLease if parsed_args.before_end: try: parsed_args.before_end = datetime.datetime.strptime( parsed_args.before_end, '%Y-%m-%d %H:%M') except ValueError: raise exception.IncorrectLease if (parsed_args.before_end < start or parsed_args.end < parsed_args.before_end): raise exception.IncorrectLease params['before_end'] = datetime.datetime.strftime( parsed_args.before_end, '%Y-%m-%d %H:%M') if parsed_args.start == 'now': params['start'] = parsed_args.start else: params['start'] = datetime.datetime.strftime( parsed_args.start, '%Y-%m-%d %H:%M') params['end'] = datetime.datetime.strftime(parsed_args.end, '%Y-%m-%d %H:%M') params['reservations'] = [] params['events'] = [] reservations = [] for res_str in parsed_args.reservations: err_msg = ("Invalid reservation argument '%s'. " "Reservation arguments must be of the " "form --reservation <key=value>" % res_str) if "physical:host" in res_str: defaults = CREATE_RESERVATION_KEYS['physical:host'] elif "virtual:instance" in res_str: defaults = CREATE_RESERVATION_KEYS['virtual:instance'] elif "virtual:floatingip" in res_str: defaults = CREATE_RESERVATION_KEYS['virtual:floatingip'] else: defaults = CREATE_RESERVATION_KEYS['others'] res_info = self._parse_params(res_str, defaults, err_msg) reservations.append(res_info) if reservations: params['reservations'] += reservations events = [] for event_str in parsed_args.events: err_msg = ("Invalid event argument '%s'. " "Event arguments must be of the " "form --event <event_type=str,event_date=time>" % event_str) event_info = {"event_type": "", "event_date": ""} for kv_str in event_str.split(","): try: k, v = kv_str.split("=", 1) except ValueError: raise exception.IncorrectLease(err_msg) if k in event_info: event_info[k] = v else: raise exception.IncorrectLease(err_msg) if not event_info['event_type'] and not event_info['event_date']: raise exception.IncorrectLease(err_msg) event_date = event_info['event_date'] try: date = datetime.datetime.strptime(event_date, '%Y-%m-%d %H:%M') event_date = datetime.datetime.strftime(date, '%Y-%m-%d %H:%M') event_info['event_date'] = event_date except ValueError: raise exception.IncorrectLease events.append(event_info) if events: params['events'] = events return params
def args2body(self, parsed_args): def parse_params(str_params, default): request_params = {} prog = re.compile('^(?:(.*),)?(%s)=(.*)$' % "|".join(default.keys())) while str_params != "": match = prog.search(str_params) if match is None: raise exception.IncorrectLease(err_msg) self.log.info("Matches: %s", match.groups()) k, v = match.group(2, 3) if k in request_params.keys(): raise exception.DuplicatedLeaseParameters(err_msg) else: if strutils.is_int_like(v): request_params[k] = int(v) elif isinstance(defaults[k], list): request_params[k] = jsonutils.loads(v) else: request_params[k] = v str_params = match.group(1) if match.group(1) else "" request_params.update({ k: v for k, v in default.items() if k not in request_params.keys() and v is not None }) return request_params params = {} if parsed_args.name: params['name'] = parsed_args.name if not isinstance(parsed_args.start, datetime.datetime): if parsed_args.start != 'now': try: parsed_args.start = datetime.datetime.strptime( parsed_args.start, '%Y-%m-%d %H:%M') except ValueError: raise exception.IncorrectLease if not isinstance(parsed_args.end, datetime.datetime): try: parsed_args.end = datetime.datetime.strptime( parsed_args.end, '%Y-%m-%d %H:%M') except ValueError: raise exception.IncorrectLease if parsed_args.start == 'now': start = _utc_now() else: start = parsed_args.start if start > parsed_args.end: raise exception.IncorrectLease if parsed_args.before_end: try: parsed_args.before_end = datetime.datetime.strptime( parsed_args.before_end, '%Y-%m-%d %H:%M') except ValueError: raise exception.IncorrectLease if (parsed_args.before_end < start or parsed_args.end < parsed_args.before_end): raise exception.IncorrectLease params['before_end'] = datetime.datetime.strftime( parsed_args.before_end, '%Y-%m-%d %H:%M') if parsed_args.start == 'now': params['start'] = parsed_args.start else: params['start'] = datetime.datetime.strftime( parsed_args.start, '%Y-%m-%d %H:%M') params['end'] = datetime.datetime.strftime(parsed_args.end, '%Y-%m-%d %H:%M') params['reservations'] = [] params['events'] = [] physical_reservations = [] for phys_res_str in parsed_args.physical_reservations: err_msg = ("Invalid physical-reservation argument '%s'. " "Reservation arguments must be of the " "form --physical-reservation <min=int,max=int," "hypervisor_properties=str,resource_properties=str," "before_end=str>" % phys_res_str) defaults = CREATE_RESERVATION_KEYS["physical:host"] phys_res_info = parse_params(phys_res_str, defaults) if not (phys_res_info['min'] and phys_res_info['max']): raise exception.IncorrectLease(err_msg) if not (strutils.is_int_like(phys_res_info['min']) and strutils.is_int_like(phys_res_info['max'])): raise exception.IncorrectLease(err_msg) min_host = int(phys_res_info['min']) max_host = int(phys_res_info['max']) if min_host > max_host: err_msg = ("Invalid physical-reservation argument '%s'. " "Reservation argument min value must be " "less than max value" % phys_res_str) raise exception.IncorrectLease(err_msg) if min_host == 0 or max_host == 0: err_msg = ("Invalid physical-reservation argument '%s'. " "Reservation arguments min and max values " "must be greater than or equal to 1" % phys_res_str) raise exception.IncorrectLease(err_msg) # NOTE(sbauza): The resource type should be conf-driven mapped with # blazar.conf file but that's potentially on another # host phys_res_info['resource_type'] = 'physical:host' physical_reservations.append(phys_res_info) if physical_reservations: params['reservations'] += physical_reservations reservations = [] for res_str in parsed_args.reservations: err_msg = ("Invalid reservation argument '%s'. " "Reservation arguments must be of the " "form --reservation <key=value>" % res_str) if "physical:host" in res_str: defaults = CREATE_RESERVATION_KEYS['physical:host'] elif "virtual:instance" in res_str: defaults = CREATE_RESERVATION_KEYS['virtual:instance'] elif "virtual:floatingip" in res_str: defaults = CREATE_RESERVATION_KEYS['virtual:floatingip'] else: defaults = CREATE_RESERVATION_KEYS['others'] res_info = parse_params(res_str, defaults) reservations.append(res_info) if reservations: params['reservations'] += reservations if not params['reservations']: raise exception.IncorrectLease events = [] for event_str in parsed_args.events: err_msg = ("Invalid event argument '%s'. " "Event arguments must be of the " "form --event <event_type=str,event_date=time>" % event_str) event_info = {"event_type": "", "event_date": ""} for kv_str in event_str.split(","): try: k, v = kv_str.split("=", 1) except ValueError: raise exception.IncorrectLease(err_msg) if k in event_info: event_info[k] = v else: raise exception.IncorrectLease(err_msg) if not event_info['event_type'] and not event_info['event_date']: raise exception.IncorrectLease(err_msg) event_date = event_info['event_date'] try: date = datetime.datetime.strptime(event_date, '%Y-%m-%d %H:%M') event_date = datetime.datetime.strftime(date, '%Y-%m-%d %H:%M') event_info['event_date'] = event_date except ValueError: raise exception.IncorrectLease events.append(event_info) if events: params['events'] = events return params
def args2body(self, parsed_args): params = {} if parsed_args.name: params['name'] = parsed_args.name if not isinstance(parsed_args.start, datetime.datetime): try: parsed_args.start = datetime.datetime.strptime( parsed_args.start, '%Y-%m-%d %H:%M') except ValueError: raise exception.IncorrectLease if not isinstance(parsed_args.end, datetime.datetime): try: parsed_args.end = datetime.datetime.strptime( parsed_args.end, '%Y-%m-%d %H:%M') except ValueError: raise exception.IncorrectLease if parsed_args.start > parsed_args.end: raise exception.IncorrectLease if parsed_args.before_end: try: parsed_args.before_end = datetime.datetime.strptime( parsed_args.before_end, '%Y-%m-%d %H:%M') except ValueError: raise exception.IncorrectLease if (parsed_args.before_end < parsed_args.start or parsed_args.end < parsed_args.before_end): raise exception.IncorrectLease params['before_end'] = datetime.datetime.strftime( parsed_args.before_end, '%Y-%m-%d %H:%M') params['start'] = datetime.datetime.strftime(parsed_args.start, '%Y-%m-%d %H:%M') params['end'] = datetime.datetime.strftime(parsed_args.end, '%Y-%m-%d %H:%M') params['reservations'] = [] params['events'] = [] physical_reservations = [] for phys_res_str in parsed_args.physical_reservations: err_msg = ("Invalid physical-reservation argument '%s'. " "Reservation arguments must be of the " "form --physical-reservation <min=int,max=int," "hypervisor_properties=str,resource_properties=str," "before_end=str>" % phys_res_str) phys_res_info = {"min": "", "max": "", "hypervisor_properties": "", "resource_properties": "", "before_end": None} prog = re.compile('^(?:(.*),)?(%s)=(.*)$' % "|".join(phys_res_info.keys())) def parse_params(params): match = prog.search(params) if match: self.log.info("Matches: %s", match.groups()) k, v = match.group(2, 3) if not phys_res_info[k]: phys_res_info[k] = v else: raise exception.DuplicatedLeaseParameters(err_msg) if match.group(1) is not None: parse_params(match.group(1)) else: raise exception.IncorrectLease(err_msg) parse_params(phys_res_str) if not (phys_res_info['min'] and phys_res_info['max']): raise exception.IncorrectLease(err_msg) if not (strutils.is_int_like(phys_res_info['min']) and strutils.is_int_like(phys_res_info['max'])): raise exception.IncorrectLease(err_msg) min_host = int(phys_res_info['min']) max_host = int(phys_res_info['max']) if min_host > max_host: err_msg = ("Invalid physical-reservation argument '%s'. " "Reservation argument min value must be " "less than max value" % phys_res_str) raise exception.IncorrectLease(err_msg) if min_host == 0 or max_host == 0: err_msg = ("Invalid physical-reservation argument '%s'. " "Reservation arguments min and max values " "must be greater than or equal to 1" % phys_res_str) raise exception.IncorrectLease(err_msg) if phys_res_info['before_end'] is None: phys_res_info.pop('before_end') # NOTE(sbauza): The resource type should be conf-driven mapped with # blazar.conf file but that's potentially on another # host phys_res_info['resource_type'] = 'physical:host' physical_reservations.append(phys_res_info) if physical_reservations: params['reservations'] += physical_reservations reservations = [] for res_str in parsed_args.reservations: err_msg = ("Invalid reservation argument '%s'. " "Reservation arguments must be of the " "form --reservation <key=value>" % res_str) res_info = {} for kv_str in res_str.split(","): try: k, v = kv_str.split("=", 1) except ValueError: raise exception.IncorrectLease(err_msg) if strutils.is_int_like(v): v = int(v) res_info[k] = v reservations.append(res_info) if reservations: params['reservations'] += reservations if not params['reservations']: raise exception.IncorrectLease events = [] for event_str in parsed_args.events: err_msg = ("Invalid event argument '%s'. " "Event arguments must be of the " "form --event <event_type=str,event_date=time>" % event_str) event_info = {"event_type": "", "event_date": ""} for kv_str in event_str.split(","): try: k, v = kv_str.split("=", 1) except ValueError: raise exception.IncorrectLease(err_msg) if k in event_info: event_info[k] = v else: raise exception.IncorrectLease(err_msg) if not event_info['event_type'] and not event_info['event_date']: raise exception.IncorrectLease(err_msg) event_date = event_info['event_date'] try: date = datetime.datetime.strptime(event_date, '%Y-%m-%d %H:%M') event_date = datetime.datetime.strftime(date, '%Y-%m-%d %H:%M') event_info['event_date'] = event_date except ValueError: raise exception.IncorrectLease events.append(event_info) if events: params['events'] = events return params