def search(self, image, image_driver=None, exact_match=False): """Search a specific image :param image: Name of the image. :param image_driver: Name of the image driver (glance, docker). :param exact_match: if True, exact match the image name. """ context = pecan.request.context policy.enforce(context, "image:search", action="image:search") LOG.debug('Calling compute.image_search with %s', image) try: exact_match = strutils.bool_from_string(exact_match, strict=True) except ValueError: bools = ', '.join(strutils.TRUE_STRINGS + strutils.FALSE_STRINGS) raise exception.InvalidValue(_('Valid exact_match values are: %s') % bools) # Valiadtion accepts 'None' so need to convert it to None image_driver = api_utils.string_or_none(image_driver) if not image_driver: image_driver = CONF.default_image_driver return pecan.request.compute_api.image_search(context, image, image_driver, exact_match)
def _transfer_different_field(self, field_tpl, field_container, **container_dict): """Transfer the template specified field to container_field""" if container_dict.get(field_tpl): container_dict[field_container] = api_utils.string_or_none( container_dict.get(field_tpl)) container_dict.pop(field_tpl) return container_dict
def search(self, image, image_driver=None, exact_match=False): context = pecan.request.context policy.enforce(context, "image:search", action="image:search") LOG.debug('Calling compute.image_search with %s', image) try: exact_match = strutils.bool_from_string(exact_match, strict=True) except ValueError: msg = _("Valid exact_match values are true," " false, 0, 1, yes and no") raise exception.InvalidValue(msg) # Valiadtion accepts 'None' so need to convert it to None if image_driver: image_driver = api_utils.string_or_none(image_driver) return pecan.request.compute_api.image_search(context, image, image_driver, exact_match)
def search(self, image, image_driver=None, exact_match=False): context = pecan.request.context policy.enforce(context, "image:search", action="image:search") LOG.debug('Calling compute.image_search with %s', image) try: exact_match = strutils.bool_from_string(exact_match, strict=True) except ValueError: bools = ', '.join(strutils.TRUE_STRINGS + strutils.FALSE_STRINGS) raise exception.InvalidValue( _('Valid exact_match values are: %s') % bools) # Valiadtion accepts 'None' so need to convert it to None if image_driver: image_driver = api_utils.string_or_none(image_driver) return pecan.request.compute_api.image_search(context, image, image_driver, exact_match)
def search(self, image, image_driver=None, exact_match=False): """Search a specific image :param image: Name of the image. :param image_driver: Name of the image driver (glance, docker). :param exact_match: if True, exact match the image name. """ context = pecan.request.context policy.enforce(context, "image:search", action="image:search") LOG.debug('Calling compute.image_search with %s', image) try: exact_match = strutils.bool_from_string(exact_match, strict=True) except ValueError: bools = ', '.join(strutils.TRUE_STRINGS + strutils.FALSE_STRINGS) raise exception.InvalidValue( _('Valid exact_match values are: %s') % bools) # Valiadtion accepts 'None' so need to convert it to None image_driver = api_utils.string_or_none(image_driver) if not image_driver: image_driver = CONF.default_image_driver return pecan.request.compute_api.image_search(context, image, image_driver, exact_match)
def post(self, run=False, **container_dict): """Create or run a new container. :param run: if true, starts the container :param container_dict: a container within the request body. """ context = pecan.request.context compute_api = pecan.request.compute_api policy.enforce(context, "container:create", action="container:create") if container_dict.get('security_groups'): # remove duplicate security_groups from list container_dict['security_groups'] = list( set(container_dict.get('security_groups'))) for index, sg in enumerate(container_dict['security_groups']): security_group_id = self._check_security_group( context, {'name': sg}) container_dict['security_groups'][index] = security_group_id try: run = strutils.bool_from_string(run, strict=True) container_dict['interactive'] = strutils.bool_from_string( container_dict.get('interactive', False), strict=True) except ValueError: raise exception.InvalidValue( _('Valid run or interactive values ' 'are: true, false, True, False')) auto_remove = container_dict.pop('auto_remove', None) if auto_remove is not None: req_version = pecan.request.version min_version = versions.Version('', '', '', '1.3') if req_version >= min_version: try: container_dict['auto_remove'] = strutils.bool_from_string( auto_remove, strict=True) except ValueError: raise exception.InvalidValue( _('Auto_remove values are: ' 'true, false, True, False')) else: raise exception.InvalidParamInVersion(param='auto_remove', req_version=req_version, min_version=min_version) runtime = container_dict.pop('runtime', None) if runtime is not None: req_version = pecan.request.version min_version = versions.Version('', '', '', '1.5') if req_version >= min_version: container_dict['runtime'] = runtime else: raise exception.InvalidParamInVersion(param='runtime', req_version=req_version, min_version=min_version) hostname = container_dict.pop('hostname', None) if hostname is not None: req_version = pecan.request.version min_version = versions.Version('', '', '', '1.9') if req_version >= min_version: container_dict['hostname'] = hostname else: raise exception.InvalidParamInVersion(param='hostname', req_version=req_version, min_version=min_version) nets = container_dict.get('nets', []) requested_networks = utils.build_requested_networks(context, nets) pci_req = self._create_pci_requests_for_sriov_ports( context, requested_networks) mounts = container_dict.pop('mounts', []) if mounts: req_version = pecan.request.version min_version = versions.Version('', '', '', '1.11') if req_version < min_version: raise exception.InvalidParamInVersion(param='mounts', req_version=req_version, min_version=min_version) requested_volumes = self._build_requested_volumes(context, mounts) # Valiadtion accepts 'None' so need to convert it to None if container_dict.get('image_driver'): container_dict['image_driver'] = api_utils.string_or_none( container_dict.get('image_driver')) container_dict['project_id'] = context.project_id container_dict['user_id'] = context.user_id name = container_dict.get('name') or \ self._generate_name_for_container() container_dict['name'] = name if container_dict.get('memory'): container_dict['memory'] = \ str(container_dict['memory']) + 'M' if container_dict.get('restart_policy'): utils.check_for_restart_policy(container_dict) container_dict['status'] = consts.CREATING extra_spec = {} extra_spec['hints'] = container_dict.get('hints', None) extra_spec['pci_requests'] = pci_req new_container = objects.Container(context, **container_dict) new_container.create(context) kwargs = {} kwargs['extra_spec'] = extra_spec kwargs['requested_networks'] = requested_networks kwargs['requested_volumes'] = requested_volumes if pci_req.requests: kwargs['pci_requests'] = pci_req kwargs['run'] = run compute_api.container_create(context, new_container, **kwargs) # Set the HTTP Location Header pecan.response.location = link.build_url('containers', new_container.uuid) pecan.response.status = 202 return view.format_container(pecan.request.host_url, new_container)
def post(self, run=False, **container_dict): """Create a new container. :param run: if true, starts the container :param container_dict: a container within the request body. """ context = pecan.request.context compute_api = pecan.request.compute_api policy.enforce(context, "container:create", action="container:create") # remove duplicate security_groups from list if container_dict.get('security_groups'): container_dict['security_groups'] = list( set(container_dict.get('security_groups'))) try: run = strutils.bool_from_string(run, strict=True) container_dict['interactive'] = strutils.bool_from_string( container_dict.get('interactive', False), strict=True) except ValueError: msg = _('Valid run or interactive value is ''true'', ' '"false", True, False, "True" and "False"') raise exception.InvalidValue(msg) requested_networks = container_dict.get('nets', []) # Valiadtion accepts 'None' so need to convert it to None if container_dict.get('image_driver'): container_dict['image_driver'] = api_utils.string_or_none( container_dict.get('image_driver')) # NOTE(mkrai): Intent here is to check the existence of image # before proceeding to create container. If image is not found, # container create will fail with 400 status. images = compute_api.image_search(context, container_dict['image'], container_dict.get('image_driver'), True) if not images: raise exception.ImageNotFound(image=container_dict['image']) container_dict['project_id'] = context.project_id container_dict['user_id'] = context.user_id name = container_dict.get('name') or \ self._generate_name_for_container() container_dict['name'] = name if container_dict.get('memory'): container_dict['memory'] = \ str(container_dict['memory']) + 'M' if container_dict.get('restart_policy'): self._check_for_restart_policy(container_dict) auto_remove = container_dict.pop('auto_remove', None) if auto_remove is not None: req_version = pecan.request.version min_version = versions.Version('', '', '', '1.3') if req_version >= min_version: try: container_dict['auto_remove'] = strutils.bool_from_string( auto_remove, strict=True) except ValueError: msg = _('Auto_remove value are true or false') raise exception.InvalidValue(msg) else: msg = _('Invalid param auto_remove because current request ' 'version is %(req_version)s. Auto_remove is only ' 'supported from version %(min_version)s') % \ {'req_version': req_version, 'min_version': min_version} raise exception.InvalidParam(msg) container_dict['status'] = consts.CREATING extra_spec = container_dict.get('hints', None) new_container = objects.Container(context, **container_dict) new_container.create(context) if run: compute_api.container_run(context, new_container, extra_spec, requested_networks) else: compute_api.container_create(context, new_container, extra_spec, requested_networks) # Set the HTTP Location Header pecan.response.location = link.build_url('containers', new_container.uuid) pecan.response.status = 202 return view.format_container(pecan.request.host_url, new_container)