def convert_with_links(rpc_capsules, limit, url=None, expand=False, **kwargs): collection = CapsuleCollection() collection.capsules = \ [view.format_capsule(url, p) for p in rpc_capsules] collection.next = collection.get_next(limit, url=url, **kwargs) return collection
def get_one(self, capsule_ident): """Retrieve information about the given capsule. :param capsule_ident: UUID or name of a capsule. """ capsule = _get_capsule(capsule_ident) check_policy_on_capsule(capsule.as_dict(), "capsule:get") context = pecan.request.context compute_api = pecan.request.compute_api sandbox = utils.get_container(capsule.containers_uuids[0]) try: container = compute_api.container_show(context, sandbox) capsule.status = container.status capsule.save(context) except Exception as e: LOG.exception(("Error while show capsule %(uuid)s: " "%(e)s."), {'uuid': capsule.uuid, 'e': e}) capsule.status = consts.UNKNOWN return view.format_capsule(pecan.request.host_url, capsule)
def post(self, **capsule_dict): """Create a new capsule. :param capsule_dict: a capsule within the request body. """ context = pecan.request.context compute_api = pecan.request.compute_api policy.enforce(context, "capsule:create", action="capsule:create") capsules_spec = capsule_dict['spec'] containers_spec = utils.check_capsule_template(capsules_spec) new_capsule = objects.Capsule(context, **capsule_dict) new_capsule.project_id = context.project_id new_capsule.user_id = context.user_id new_capsule.create(context) new_capsule.containers = [] new_capsule.containers_uuids = [] new_capsule.volumes = [] capsule_need_cpu = 0 capsule_need_memory = 0 count = len(containers_spec) capsule_restart_policy = capsules_spec.get('restart_policy', 'always') metadata_info = capsules_spec.get('metadata', None) requested_networks = capsules_spec.get('nets', []) if metadata_info: new_capsule.meta_name = metadata_info.get('name', None) new_capsule.meta_labels = metadata_info.get('labels', None) # Generate Object for infra container sandbox_container = objects.Container(context) sandbox_container.project_id = context.project_id sandbox_container.user_id = context.user_id name = self._generate_name_for_capsule_sandbox(new_capsule) sandbox_container.name = name sandbox_container.create(context) new_capsule.containers.append(sandbox_container) new_capsule.containers_uuids.append(sandbox_container.uuid) for k in range(count): container_dict = containers_spec[k] container_dict['project_id'] = context.project_id container_dict['user_id'] = context.user_id name = self._generate_name_for_capsule_container(new_capsule) container_dict['name'] = name if container_dict.get('args') and container_dict.get('command'): container_dict = self._transfer_list_to_str(container_dict, 'command') container_dict = self._transfer_list_to_str(container_dict, 'args') container_dict['command'] = \ container_dict['command'] + ' ' + container_dict['args'] container_dict.pop('args') elif container_dict.get('command'): container_dict = self._transfer_list_to_str(container_dict, 'command') elif container_dict.get('args'): container_dict = self._transfer_list_to_str(container_dict, 'args') container_dict['command'] = container_dict['args'] container_dict.pop('args') # NOTE(kevinz): Don't support pod remapping, will find a # easy way to implement it. # if container need to open some port, just open it in container, # user can change the security group and getting access to port. if container_dict.get('ports'): container_dict.pop('ports') if container_dict.get('resources'): resources_list = container_dict.get('resources') allocation = resources_list.get('allocation') if allocation.get('cpu'): capsule_need_cpu += allocation.get('cpu') container_dict['cpu'] = allocation.get('cpu') if allocation.get('memory'): capsule_need_memory += allocation.get('memory') container_dict['memory'] = str(allocation['memory']) + 'M' container_dict.pop('resources') if capsule_restart_policy: container_dict['restart_policy'] = \ {"MaximumRetryCount": "0", "Name": capsule_restart_policy} utils.check_for_restart_policy(container_dict) container_dict['status'] = consts.CREATING container_dict['interactive'] = True new_container = objects.Container(context, **container_dict) new_container.create(context) new_capsule.containers.append(new_container) new_capsule.containers_uuids.append(new_container.uuid) new_capsule.cpu = capsule_need_cpu new_capsule.memory = str(capsule_need_memory) + 'M' new_capsule.save(context) compute_api.capsule_create(context, new_capsule, requested_networks) # Set the HTTP Location Header pecan.response.location = link.build_url('capsules', new_capsule.uuid) pecan.response.status = 202 return view.format_capsule(pecan.request.host_url, new_capsule)