Ejemplo n.º 1
0
 def process_create(self,
                    context,
                    pid,
                    ppid,
                    gid,
                    name,
                    glance_image_id,
                    nova_flavor_id,
                    nova_keypair_id,
                    neutron_securitygroup_ids,
                    neutron_network_ids,
                    metadata,
                    userdata
                    ):
     update_values = {}
     try:
         metadata["pid"] = pid
         metadata["ppid"] = ppid
         metadata["gid"] = gid
         nova_instance_id = self.process_client.process_create(
             name,
             glance_image_id,
             nova_flavor_id,
             nova_keypair_id,
             neutron_securitygroup_ids,
             neutron_network_ids,
             metadata,
             userdata)
         update_values["nova_instance_id"] = nova_instance_id
         update_values["status"] = "ACTIVE"
         db.process_update(context, gid, pid, update_values)
     except Exception as e:
         update_values["status"] = "ERROR"
         db.process_update(context, gid, pid, update_values)
         LOG.exception(e)
Ejemplo n.º 2
0
    def test_processes_create(self):
        self.mox.StubOutWithMock(self.manager.process_client,
                                 "process_create")
        pid = "pida309f-9638-44de-827d-5125ff7e9865"
        ppid = "ppid309f-9638-44de-827d-5125ff7e1968"
        gid = "gida309f-9638-44de-827d-5125ff7e1246"
        display_name = "display_name"
        glance_image_id = "5aea309f-9638-44de-827d-5125ff7e4689"
        nova_flavor_id = "3"
        nova_keypair_id = "test"
        neutron_securitygroup_ids = [
            "947dc616-e737-4cb9-b816-52ad80cb9e37",
            "1892987f-3874-46ef-a487-fb8e925210ce"]
        neutron_network_ids = [
            "a3c6488a-a236-46f7-aab6-8f1fe91ad9ef",
            "43015163-babe-4bee-8fe8-38470d28b2a2"]
        metadata = {"metadata": "metadata"}
        userdata = "userdata"
        self.manager.process_client.process_create(display_name,
                                                   glance_image_id,
                                                   nova_flavor_id,
                                                   nova_keypair_id,
                                                   neutron_securitygroup_ids,
                                                   neutron_network_ids,
                                                   metadata,
                                                   userdata)\
            .AndReturn(self.nova_instance_id)

        self.mox.StubOutWithMock(db, "process_update")
        db.process_update(self.context,
                          gid,
                          pid,
                          {"nova_instance_id": self.nova_instance_id,
                           "status": "ACTIVE"})
        self.mox.ReplayAll()

        self.manager.process_create(self.context,
                                    pid,
                                    ppid,
                                    gid,
                                    display_name,
                                    glance_image_id,
                                    nova_flavor_id,
                                    nova_keypair_id,
                                    neutron_securitygroup_ids,
                                    neutron_network_ids,
                                    metadata,
                                    userdata)
Ejemplo n.º 3
0
    def update(self, req, body, gid, pid):
        def _validate(body, gid, pid):
            self._uuid_check(gid, pid)

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

            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 = {"app_status": app_status}

            return valid_values

        try:
            values = _validate(body, gid, pid)
            context = req.environ['rack.context']
            process = db.process_update(context, gid, pid, values)
        except exception.InvalidInput as e:
            raise webob.exc.HTTPBadRequest(explanation=e.format_message())
        except exception.ProcessNotFound as e:
            raise webob.exc.HTTPNotFound(explanation=e.format_message())

        return self._view_builder.update(process)
Ejemplo n.º 4
0
    def update(self, req, body, gid):

        def _validate(body, gid):
            if not uuidutils.is_uuid_like(gid):

                raise exception.GroupNotFound(gid=gid)

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

            proxy = db.process_get_all(
                context, gid, {"is_proxy": True, "status": "ACTIVE"})
            if len(proxy) == 0:
                msg = _("Proxy instance not exists in this group")
                raise exception.ProxyNotFound(msg)

            values = body["proxy"]
            app_status = values.get("app_status")
            if not app_status:
                msg = _("app_status is required")
                raise exception.InvalidInput(reason=msg)

            valid_values = {}
            if values.get("shm_endpoint"):
                valid_values["shm_endpoint"] = values.get("shm_endpoint")
            if values.get("ipc_endpoint"):
                valid_values["ipc_endpoint"] = values.get("ipc_endpoint")
            if values.get("fs_endpoint"):
                valid_values["fs_endpoint"] = values.get("fs_endpoint")
            valid_values["app_status"] = app_status
            valid_values["pid"] = proxy[0]["pid"]
            valid_values

            return valid_values

        context = req.environ['rack.context']

        try:
            values = _validate(body, gid)
            proxy = db.process_update(context, gid, values["pid"], values)

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

        except exception.ProxyNotFound as e:
            raise webob.exc.HTTPNotFound(explanation=e.format_message())

        return self._view_builder.update(proxy)
Ejemplo n.º 5
0
 def test_process_update(self):
     values_before = self._get_base_values()
     process = db.process_create(self.user_ctxt,
                                 values_before,
                                 [self.network["network_id"]],
                                 [self.securitygroup["securitygroup_id"]])
     values = {
         "display_name": "test",
         "status": "ACTIVE",
         "fs_endpoint": "fs_data_update"
     }
     process_after = db.process_update(
         self.user_ctxt, self.gid, process["pid"], values)
     self.assertEqual(process_after["display_name"], "test")
     self.assertEqual(process_after["status"], "ACTIVE")
     self.assertEqual(process_after["fs_endpoint"], "fs_data_update")
     self.assertEqual(process_after["shm_endpoint"], "shm_data_original")
     self.assertEqual(process_after["ipc_endpoint"], "ipc_data_original")
Ejemplo n.º 6
0
    def update(self, req, body, gid, pid):

        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

        context = req.environ['rack.context']

        try:
            values = _validate(body, gid, pid)
            process = db.process_update(context, gid, pid, values)

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

        except exception.ProcessNotFound as e:
            raise webob.exc.HTTPNotFound(explanation=e.format_message())

        return self._view_builder.update(process)
Ejemplo n.º 7
0
 def _set_mox_db_process_update_on_error(self):
     self.mox.StubOutWithMock(db, "process_update")
     db.process_update(IsA(context.RequestContext), IsA(
         unicode), IsA(unicode), {"status": "ERROR"})
Ejemplo n.º 8
0
    def update_proxy(self, req, body, gid):
        def _validate(context, body, gid):
            self._uuid_check(gid)
            process = db.process_get_all(context,
                                         gid,
                                         filters={"is_proxy": True})
            if not process:
                msg = _("Proxy process does not exist in the group %s" % gid)
                raise exception.InvalidInput(reason=msg)

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

            values = body["proxy"]
            app_status = values.get("app_status")
            ipc_endpoint = values.get("ipc_endpoint")
            shm_endpoint = values.get("shm_endpoint")
            fs_endpoint = values.get("fs_endpoint")

            valid_values = {}
            if app_status:
                utils.check_string_length(app_status,
                                          'app_status',
                                          min_length=1,
                                          max_length=255)
                valid_values["app_status"] = app_status
            if ipc_endpoint:
                utils.check_string_length(ipc_endpoint,
                                          'ipc_endpoint',
                                          min_length=1,
                                          max_length=255)
                valid_values["ipc_endpoint"] = ipc_endpoint
            if shm_endpoint:
                utils.check_string_length(shm_endpoint,
                                          'shm_endpoint',
                                          min_length=1,
                                          max_length=255)
                valid_values["shm_endpoint"] = shm_endpoint
            if fs_endpoint:
                utils.check_string_length(fs_endpoint,
                                          'fs_endpoint',
                                          min_length=1,
                                          max_length=255)
                valid_values["fs_endpoint"] = fs_endpoint

            if not valid_values:
                msg = _("No keyword is provided.")
                raise exception.InvalidInput(reason=msg)

            return process[0]["pid"], valid_values

        try:
            context = req.environ['rack.context']
            pid, values = _validate(context, body, gid)
            process = db.process_update(context, gid, pid, values)
        except exception.InvalidInput as e:
            raise webob.exc.HTTPBadRequest(explanation=e.format_message())
        except exception.ProcessNotFound as e:
            raise webob.exc.HTTPNotFound(explanation=e.format_message())

        return self._view_builder.update(process)
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
    def create(self, req, body, gid):

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

            proxy = db.process_get_not_error_status_for_proxy(context, gid)
            if len(proxy) > 0:
                msg = _("Proxy instance already exists in this group")
                raise exception.ProxyCreateFailed(msg)

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

            values = body["proxy"]
            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 keypair_id is not None:
                if not uuidutils.is_uuid_like(keypair_id):
                    raise exception.KeypairNotFound(keypair_id=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 not uuidutils.is_uuid_like(glance_image_id):
                msg = _("glance_image_id is invalid format")
                raise exception.InvalidInput(reason=msg)

            utils.validate_integer(nova_flavor_id, 'nova_flavor_id')

            if not securitygroup_ids:
                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_proxy = {}
            valid_values_proxy["gid"] = gid
            valid_values_proxy["keypair_id"] = keypair_id
            valid_values_proxy["display_name"] = name
            valid_values_proxy["glance_image_id"] = glance_image_id
            valid_values_proxy["nova_flavor_id"] = nova_flavor_id
            valid_values_proxy["is_proxy"] = True
            valid_values_proxy["app_status"] = "BUILDING"

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

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

            valid_values["proxy"] = valid_values_proxy
            valid_values["userdata"] = valid_values_userdata
            valid_values["securitygroup"] = valid_values_securitygroup

            return valid_values

        def _validate_metadata(args):
            if args is None:
                return dict(roles="ipc/shm/api/proxy")
            else:
                if not isinstance(args, dict):
                    msg = _("args must be a dict")
                    raise exception.InvalidInput(reason=msg)

                if args.get("roles"):
                    args["roles"] = args.get("roles") + "/proxy"
                else:
                    args["roles"] = "ipc/shm/api/proxy"

            return args

        def _get_proxy_conf():
            conf = {}
            expr = "(127.0.0.1|localhost)"
            conf.update(dict(rabbit_userid=cfg.CONF.rabbit_userid))
            conf.update(dict(rabbit_password=cfg.CONF.rabbit_password))
            conf.update(
                dict(rabbit_host=re.sub(expr, cfg.CONF.my_ip,
                                        cfg.CONF.rabbit_host)))
            conf.update(
                dict(sql_connection=re.sub(expr, cfg.CONF.my_ip,
                                           cfg.CONF.sql_connection)))
            return conf

        try:
            context = req.environ['rack.context']
            valid_values = _validate_proxy(context, gid, body)
            values = valid_values.get("proxy")
            securitygroup_ids = valid_values.get(
                "securitygroup").get("securitygroup_ids")
            userdata = valid_values.get("userdata")
            args = _validate_metadata(body["proxy"].get("args"))
            metadata = dict(args)
            metadata.update(_get_proxy_conf())

            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")
            values["args"] = json.dumps(args)

            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]
            proxy = db.process_create(
                context, values, network_ids, securitygroup_ids)

        except exception.ProxyCreateFailed as e:
            raise webob.exc.HTTPBadRequest(explanation=e.format_message())

        except exception.InvalidInput as e:
            raise webob.exc.HTTPBadRequest(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="",
                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 proxy["securitygroups"]],
                neutron_network_ids=[network["neutron_network_id"]
                                     for network in proxy["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(proxy)