コード例 #1
0
ファイル: processes.py プロジェクト: yanyuge/rack
    def delete(self, req, gid, pid):
        def _delete_children(context, gid, pid):
            processes = db.process_get_all(context, gid, {"ppid": pid})
            for process in processes:
                _delete_children(context, gid, process["pid"])
                _delete(context, gid, process["pid"],
                        process["nova_instance_id"])
            return

        def _delete(context, gid, pid, nova_id):
            self.manager.process_delete(context, nova_id)
            try:
                db.process_delete(context, gid, pid)
            except exception.NotFound as e:
                LOG.exception(e)

        self._uuid_check(gid, pid)
        context = req.environ['rack.context']
        try:
            process = db.process_get_by_pid(context, gid, pid)
        except exception.NotFound as e:
            raise webob.exc.HTTPNotFound(explanation=e.format_message())

        _delete_children(context, gid, pid)
        _delete(context, gid, pid, process["nova_instance_id"])
コード例 #2
0
ファイル: processes.py プロジェクト: yanyuge/rack
    def show(self, req, gid, pid):
        try:
            self._uuid_check(gid, pid)
            context = req.environ['rack.context']
            process = db.process_get_by_pid(context, gid, pid)
            self.manager.process_show(context, process)
        except exception.NotFound as e:
            raise webob.exc.HTTPNotFound(explanation=e.format_message())

        return self._view_builder.show(process)
コード例 #3
0
ファイル: processes.py プロジェクト: n-nishida/rack
        def _validate(body, gid, pid):
            if not uuidutils.is_uuid_like(gid):
                raise exception.GroupNotFound(gid=gid)

            if not uuidutils.is_uuid_like(pid):
                raise exception.ProcessNotFound(pid=pid)

            if not self.is_valid_body(body, 'process'):
                msg = _("Invalid request body")
                raise exception.InvalidInput(reason=msg)

            db.process_get_by_pid(context, gid, pid)

            values = body["process"]
            app_status = values.get("app_status")

            if not app_status:
                msg = _("app_status is required")
                raise exception.InvalidInput(reason=msg)

            valid_values = {}
            valid_values["app_status"] = app_status

            return valid_values
コード例 #4
0
ファイル: processes.py プロジェクト: n-nishida/rack
    def show(self, req, gid, pid):

        def _validate(gid, pid):
            if not uuidutils.is_uuid_like(gid):
                raise exception.GroupNotFound(gid=gid)

            if not uuidutils.is_uuid_like(pid):
                raise exception.ProcessNotFound(pid=pid)

        try:
            _validate(gid, pid)
            context = req.environ['rack.context']
            process = db.process_get_by_pid(context, gid, pid)
        except exception.NotFound as exc:
            raise webob.exc.HTTPNotFound(explanation=exc.format_message())

        return self._view_builder.show(process)
コード例 #5
0
ファイル: test_db_api.py プロジェクト: n-nishida/rack
 def test_process_get_by_pid_not_found(self):
     try:
         db.process_get_by_pid(self.user_ctxt, self.gid, "notfound-pid")
     except Exception as e:
         status_code = e.code
     self.assertEqual(status_code, 404)
コード例 #6
0
ファイル: test_db_api.py プロジェクト: n-nishida/rack
 def test_process_get_by_pid(self):
     processes = self._create_process(self.gid, 3)
     res_process = db.process_get_by_pid(
         self.user_ctxt, self.gid, processes[0]["pid"])
     ignored_keys = ['deleted_at', 'updated_at', 'created_at']
     self._assertEqualObjects(res_process, processes[0], ignored_keys)
コード例 #7
0
ファイル: processes.py プロジェクト: yanyuge/rack
        def _validate(context, body, gid, is_proxy=False):
            proxy = db.process_get_all(context,
                                       gid,
                                       filters={"is_proxy": True})
            if is_proxy:
                if len(proxy) > 0:
                    msg = _("Proxy process already exists in the group %s" %
                            gid)
                    raise exception.InvalidInput(reason=msg)
            else:
                if len(proxy) != 1:
                    msg = _("Proxy process does not exist in the group %s" %
                            gid)
                    raise webob.exc.HTTPBadRequest(explanation=msg)

            keyname = "proxy" if is_proxy else "process"
            if not self.is_valid_body(body, keyname):
                msg = _("Invalid request body")
                raise exception.InvalidInput(reason=msg)

            values = body[keyname]
            ppid = values.get("ppid")
            name = values.get("name")
            keypair_id = values.get("keypair_id")
            securitygroup_ids = values.get("securitygroup_ids")
            glance_image_id = values.get("glance_image_id")
            nova_flavor_id = values.get("nova_flavor_id")
            userdata = values.get("userdata")
            args = values.get("args")

            self._uuid_check(gid, ppid, keypair_id)

            pid = unicode(uuid.uuid4())
            if not name:
                prefix = "proxy-" if is_proxy else "process-"
                name = prefix + pid

            if ppid:
                parent_process = db.process_get_by_pid(context, gid, ppid)

            nova_keypair_id = None
            if keypair_id:
                keypair = db.keypair_get_by_keypair_id(context, gid,
                                                       keypair_id)
                nova_keypair_id = keypair["nova_keypair_id"]
            elif ppid:
                keypair_id = parent_process.get("keypair_id")
                if keypair_id:
                    keypair = db.keypair_get_by_keypair_id(
                        context, gid, keypair_id)
                    nova_keypair_id = keypair["nova_keypair_id"]
            else:
                default_keypair = db.keypair_get_all(
                    context, gid, filters={"is_default": True})
                if default_keypair:
                    keypair_id = default_keypair[0]["keypair_id"]
                    nova_keypair_id = default_keypair[0]["nova_keypair_id"]

            if securitygroup_ids is not None and\
                    not isinstance(securitygroup_ids, list):
                msg = _("securitygroupids must be a list")
                raise exception.InvalidInput(reason=msg)
            elif securitygroup_ids:
                neutron_securitygroup_ids = []
                for id in securitygroup_ids:
                    self._uuid_check(securitygroup_id=id)
                    securitygroup = db.securitygroup_get_by_securitygroup_id(
                        context, gid, id)
                    neutron_securitygroup_ids.append(
                        securitygroup["neutron_securitygroup_id"])
            elif ppid:
                securitygroups = parent_process.get("securitygroups")
                securitygroup_ids =\
                    [securitygroup["securitygroup_id"]
                        for securitygroup in securitygroups]
                neutron_securitygroup_ids =\
                    [securitygroup["neutron_securitygroup_id"]
                        for securitygroup in securitygroups]
            else:
                default_securitygroups = db.securitygroup_get_all(
                    context, gid, filters={"is_default": True})
                if default_securitygroups:
                    securitygroup_ids =\
                        [securitygroup["securitygroup_id"]
                            for securitygroup in default_securitygroups]
                    neutron_securitygroup_ids =\
                        [securitygroup["neutron_securitygroup_id"]
                            for securitygroup in default_securitygroups]
                else:
                    msg = _("securitygroup_ids is required. Default \
                            securitygroup_ids are not registered.")
                    raise exception.InvalidInput(reason=msg)

            if not glance_image_id and ppid:
                glance_image_id = parent_process.get("glance_image_id")

            if not nova_flavor_id and ppid:
                nova_flavor_id = parent_process.get("nova_flavor_id")

            if userdata:
                try:
                    base64.b64decode(userdata)
                except TypeError:
                    msg = _("userdadta must be a base64 encoded value.")
                    raise exception.InvalidInput(reason=msg)

            networks = db.network_get_all(context, gid)
            if not networks:
                msg = _("Netwoks does not exist in the group %s" % gid)
                raise webob.exc.HTTPBadRequest(explanation=msg)

            network_ids =\
                [network["network_id"] for network in networks]
            neutron_network_ids =\
                [network["neutron_network_id"] for network in networks]
            nics = []
            for id in neutron_network_ids:
                nics.append({"net-id": id})

            if args is None:
                args = {}
            elif args is not None and\
                    not isinstance(args, dict):
                msg = _("args must be a dict.")
                raise exception.InvalidInput(reason=msg)
            else:
                for key in args.keys():
                    args[key] = str(args[key])

            default_args = {
                "gid": gid,
                "pid": pid,
            }
            if ppid:
                default_args["ppid"] = ppid

            if is_proxy:
                default_args["rackapi_ip"] = cfg.CONF.my_ip
                default_args["os_username"] = cfg.CONF.os_username
                default_args["os_password"] = cfg.CONF.os_password
                default_args["os_tenant_name"] = cfg.CONF.os_tenant_name
                default_args["os_auth_url"] = cfg.CONF.os_auth_url
                default_args["os_region_name"] = cfg.CONF.os_region_name
            else:
                proxy_instance_id = proxy[0]["nova_instance_id"]
                default_args["proxy_ip"] = self.manager.get_process_address(
                    context, proxy_instance_id)
            args.update(default_args)

            valid_values = {}
            valid_values["gid"] = gid
            valid_values["ppid"] = ppid
            valid_values["pid"] = pid
            valid_values["display_name"] = name
            valid_values["keypair_id"] = keypair_id
            valid_values["securitygroup_ids"] = securitygroup_ids
            valid_values["glance_image_id"] = glance_image_id
            valid_values["nova_flavor_id"] = nova_flavor_id
            valid_values["userdata"] = userdata
            valid_values["args"] = json.dumps(args)
            valid_values["is_proxy"] = True if is_proxy else False
            valid_values["network_ids"] = network_ids

            if is_proxy:
                ipc_endpoint = values.get("ipc_endpoint")
                shm_endpoint = values.get("shm_endpoint")
                fs_endpoint = values.get("fs_endpoint")
                if ipc_endpoint:
                    utils.check_string_length(ipc_endpoint,
                                              'ipc_endpoint',
                                              min_length=1,
                                              max_length=255)
                if shm_endpoint:
                    utils.check_string_length(shm_endpoint,
                                              'shm_endpoint',
                                              min_length=1,
                                              max_length=255)
                if fs_endpoint:
                    utils.check_string_length(fs_endpoint,
                                              'fs_endpoint',
                                              min_length=1,
                                              max_length=255)
                valid_values["ipc_endpoint"] = ipc_endpoint
                valid_values["shm_endpoint"] = shm_endpoint
                valid_values["fs_endpoint"] = fs_endpoint

            boot_values = {}
            boot_values["name"] = name
            boot_values["key_name"] = nova_keypair_id
            boot_values["security_groups"] = neutron_securitygroup_ids
            boot_values["image"] = glance_image_id
            boot_values["flavor"] = nova_flavor_id
            boot_values["userdata"] = userdata
            boot_values["meta"] = args
            boot_values["nics"] = nics

            return valid_values, boot_values
コード例 #8
0
ファイル: processes.py プロジェクト: n-nishida/rack
        def _validate_process(context, gid, body):
            if not uuidutils.is_uuid_like(gid):
                raise exception.GroupNotFound(gid=gid)

            if not self.is_valid_body(body, 'process'):
                msg = _("Invalid request body")
                raise exception.InvalidInput(reason=msg)

            values = body["process"]
            ppid = values.get("ppid")
            keypair_id = values.get("keypair_id")
            name = values.get("name")
            glance_image_id = values.get("glance_image_id")
            nova_flavor_id = values.get("nova_flavor_id")
            securitygroup_ids = values.get("securitygroup_ids")
            userdata = values.get("userdata")

            if ppid is not None:
                if not uuidutils.is_uuid_like(ppid):
                    raise exception.ProcessNotFound(pid=ppid)
                p_process = db.process_get_by_pid(context, gid, ppid)

            if keypair_id is not None:
                if not uuidutils.is_uuid_like(keypair_id):
                    raise exception.KeypairNotFound(keypair_id=keypair_id)
            elif ppid is not None:
                keypair_id = p_process.get("keypair_id")

            if isinstance(name, six.string_types):
                name = name.strip()
                utils.check_string_length(name, 'name', min_length=1,
                                          max_length=255)
            elif name is not None:
                msg = _("name must be a String")
                raise exception.InvalidInput(reason=msg)

            if glance_image_id is None:
                if ppid is not None:
                    glance_image_id = p_process.get("glance_image_id")
            elif not uuidutils.is_uuid_like(glance_image_id):
                msg = _("glance_image_id is invalid format")
                raise exception.InvalidInput(reason=msg)

            if nova_flavor_id is None and ppid is not None:
                nova_flavor_id = p_process.get("nova_flavor_id")
            utils.validate_integer(nova_flavor_id, 'nova_flavor_id')

            if not securitygroup_ids:
                if ppid is not None:
                    securitygroup_ids = [securitygroup.get("securitygroup_id")
                                         for securitygroup in p_process.get(
                                         "securitygroups")]
                else:
                    msg = _("securitygroup_ids is required")
                    raise exception.InvalidInput(reason=msg)

            if isinstance(securitygroup_ids, list):
                for securitygroup_id in securitygroup_ids:
                    if securitygroup_id is not None and not uuidutils\
                            .is_uuid_like(securitygroup_id):
                        raise exception.SecuritygroupNotFound(
                            securitygroup_id=securitygroup_id)
            else:
                msg = _("securitygroup_ids must be list")
                raise exception.InvalidInput(reason=msg)

            if userdata:
                try:
                    userdata = base64.b64decode(userdata)
                except TypeError as e:
                    raise webob.exc.HTTPBadRequest(
                        explanation=e.format_message())

            valid_values = {}
            valid_values_process = {}
            valid_values_process["gid"] = gid
            valid_values_process["keypair_id"] = keypair_id
            valid_values_process["ppid"] = ppid
            valid_values_process["display_name"] = name
            valid_values_process["glance_image_id"] = glance_image_id
            valid_values_process["nova_flavor_id"] = nova_flavor_id
            valid_values_process["is_proxy"] = False
            valid_values_process["app_status"] = "BUILDING"

            valid_values_userdata = {}
            valid_values_userdata["userdata"] = userdata

            valid_values_securitygroup = {}
            valid_values_securitygroup["securitygroup_ids"] = securitygroup_ids

            valid_values["process"] = valid_values_process
            valid_values["userdata"] = valid_values_userdata
            valid_values["securitygroup"] = valid_values_securitygroup

            return valid_values
コード例 #9
0
ファイル: processes.py プロジェクト: n-nishida/rack
    def create(self, req, body, gid):

        def _validate_process(context, gid, body):
            if not uuidutils.is_uuid_like(gid):
                raise exception.GroupNotFound(gid=gid)

            if not self.is_valid_body(body, 'process'):
                msg = _("Invalid request body")
                raise exception.InvalidInput(reason=msg)

            values = body["process"]
            ppid = values.get("ppid")
            keypair_id = values.get("keypair_id")
            name = values.get("name")
            glance_image_id = values.get("glance_image_id")
            nova_flavor_id = values.get("nova_flavor_id")
            securitygroup_ids = values.get("securitygroup_ids")
            userdata = values.get("userdata")

            if ppid is not None:
                if not uuidutils.is_uuid_like(ppid):
                    raise exception.ProcessNotFound(pid=ppid)
                p_process = db.process_get_by_pid(context, gid, ppid)

            if keypair_id is not None:
                if not uuidutils.is_uuid_like(keypair_id):
                    raise exception.KeypairNotFound(keypair_id=keypair_id)
            elif ppid is not None:
                keypair_id = p_process.get("keypair_id")

            if isinstance(name, six.string_types):
                name = name.strip()
                utils.check_string_length(name, 'name', min_length=1,
                                          max_length=255)
            elif name is not None:
                msg = _("name must be a String")
                raise exception.InvalidInput(reason=msg)

            if glance_image_id is None:
                if ppid is not None:
                    glance_image_id = p_process.get("glance_image_id")
            elif not uuidutils.is_uuid_like(glance_image_id):
                msg = _("glance_image_id is invalid format")
                raise exception.InvalidInput(reason=msg)

            if nova_flavor_id is None and ppid is not None:
                nova_flavor_id = p_process.get("nova_flavor_id")
            utils.validate_integer(nova_flavor_id, 'nova_flavor_id')

            if not securitygroup_ids:
                if ppid is not None:
                    securitygroup_ids = [securitygroup.get("securitygroup_id")
                                         for securitygroup in p_process.get(
                                         "securitygroups")]
                else:
                    msg = _("securitygroup_ids is required")
                    raise exception.InvalidInput(reason=msg)

            if isinstance(securitygroup_ids, list):
                for securitygroup_id in securitygroup_ids:
                    if securitygroup_id is not None and not uuidutils\
                            .is_uuid_like(securitygroup_id):
                        raise exception.SecuritygroupNotFound(
                            securitygroup_id=securitygroup_id)
            else:
                msg = _("securitygroup_ids must be list")
                raise exception.InvalidInput(reason=msg)

            if userdata:
                try:
                    userdata = base64.b64decode(userdata)
                except TypeError as e:
                    raise webob.exc.HTTPBadRequest(
                        explanation=e.format_message())

            valid_values = {}
            valid_values_process = {}
            valid_values_process["gid"] = gid
            valid_values_process["keypair_id"] = keypair_id
            valid_values_process["ppid"] = ppid
            valid_values_process["display_name"] = name
            valid_values_process["glance_image_id"] = glance_image_id
            valid_values_process["nova_flavor_id"] = nova_flavor_id
            valid_values_process["is_proxy"] = False
            valid_values_process["app_status"] = "BUILDING"

            valid_values_userdata = {}
            valid_values_userdata["userdata"] = userdata

            valid_values_securitygroup = {}
            valid_values_securitygroup["securitygroup_ids"] = securitygroup_ids

            valid_values["process"] = valid_values_process
            valid_values["userdata"] = valid_values_userdata
            valid_values["securitygroup"] = valid_values_securitygroup

            return valid_values

        def _validate_metadata(metadata):
            if metadata is None:
                return {}

            if not isinstance(metadata, dict):
                msg = _("metadata must be a dict")
                raise exception.InvalidInput(reason=msg)

            return metadata

        try:
            context = req.environ['rack.context']
            valid_values = _validate_process(context, gid, body)
            values = valid_values.get("process")
            securitygroup_ids = valid_values.get(
                "securitygroup").get("securitygroup_ids")
            metadata = _validate_metadata(metadata=body["process"]
                                          .get("args"))
            metadata.update({"proxy_ip": cfg.CONF.my_ip})
            userdata = valid_values.get("userdata")

            values["deleted"] = 0
            values["status"] = "BUILDING"
            values["pid"] = unicode(uuid.uuid4())
            values["user_id"] = context.user_id
            values["project_id"] = context.project_id
            values["display_name"] = values[
                "display_name"] or "pro-" + values["pid"]
            values["userdata"] = userdata.get("userdata")

            if values["ppid"]:
                db.process_get_by_pid(context, gid, values["ppid"])
            if values["keypair_id"]:
                nova_keypair_id = db.keypair_get_by_keypair_id(
                    context, gid, values["keypair_id"]).get("nova_keypair_id")
            else:
                nova_keypair_id = None
            networks = db.network_get_all(context, gid, {"status": "ACTIVE"})
            if not networks:
                raise exception.NoNetworksFound(gid=values["gid"])
            network_ids = [network["network_id"] for network in networks]
            process = db.process_create(
                context, values, network_ids, securitygroup_ids)

        except exception.InvalidInput as e:
            raise webob.exc.HTTPBadRequest(explanation=e.format_message())
        except exception.NotFound as e:
            raise webob.exc.HTTPNotFound(explanation=e.format_message())

        try:
            host = self.scheduler_rpcapi.select_destinations(
                context,
                request_spec={},
                filter_properties={})
            self.operator_rpcapi.process_create(
                context,
                host["host"],
                pid=values["pid"],
                ppid=values["ppid"] or values["pid"],
                gid=gid,
                name=values["display_name"],
                glance_image_id=values["glance_image_id"],
                nova_flavor_id=values["nova_flavor_id"],
                nova_keypair_id=nova_keypair_id,
                neutron_securitygroup_ids=[securitygroup[
                    "neutron_securitygroup_id"]
                    for securitygroup in process["securitygroups"]],
                neutron_network_ids=[network["neutron_network_id"]
                                     for network in process["networks"]],
                metadata=metadata,
                userdata=userdata.get("userdata"))
        except Exception as e:
            LOG.exception(e)
            pid = values["pid"]
            db.process_update(context, gid, pid, {"status": "ERROR"})
            raise exception.ProcessCreateFailed()

        return self._view_builder.create(process)