)]}'
{"ironic_inspector/cmd/api.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"7faddb67_f012e957","updated":"2019-08-01 11:45:14.000000000","message":"Let us maybe not introduce a new API script, but rather only a WSGI entry point?","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a47612f51a94e2480bb6c17d063793ad87ecd866","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"7faddb67_59051a0f","in_reply_to":"7faddb67_c3527713","updated":"2019-08-02 08:26:36.000000000","message":"I did not suggest mixing standalone and API scripts, merely not having the unnecessary API script (should be a WSGI entry point instead).","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"7faddb67_c3527713","in_reply_to":"7faddb67_f012e957","updated":"2019-08-02 05:51:46.000000000","message":"Although they merely has difference on one argument, mixing standalone and api-only script with different purpose seems confusing. I think the standalone case will be deprecated in the long run, this also helps evolving, this is how I thought about it. Opinions?","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    if CONF.standalone:"},{"line_number":32,"context_line":"        msg \u003d _(\u0027To run ironic-inspector-api, [DEFAULT]standalone should be \u0027"},{"line_number":33,"context_line":"                \u0027set to False.\u0027)"},{"line_number":34,"context_line":"        raise RuntimeError(msg)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    launcher \u003d service.ServiceLauncher(CONF, restart_method\u003d\u0027mutate\u0027)"},{"line_number":37,"context_line":"    launcher.launch_service(wsgi_service.WSGIService(use_coordination\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_1010e54d","line":34,"updated":"2019-08-01 11:45:14.000000000","message":"better use sys.exit(msg) to avoid tracebacks","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    if CONF.standalone:"},{"line_number":32,"context_line":"        msg \u003d _(\u0027To run ironic-inspector-api, [DEFAULT]standalone should be \u0027"},{"line_number":33,"context_line":"                \u0027set to False.\u0027)"},{"line_number":34,"context_line":"        raise RuntimeError(msg)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    launcher \u003d service.ServiceLauncher(CONF, restart_method\u003d\u0027mutate\u0027)"},{"line_number":37,"context_line":"    launcher.launch_service(wsgi_service.WSGIService(use_coordination\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_e5a8db78","line":34,"in_reply_to":"7faddb67_1010e54d","updated":"2019-08-02 05:51:46.000000000","message":"Done","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"}],"ironic_inspector/cmd/conductor.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    if CONF.standalone:"},{"line_number":32,"context_line":"        msg \u003d _(\u0027To run ironic-inspector-conductor, [DEFAULT]standalone \u0027"},{"line_number":33,"context_line":"                \u0027should be set to False.\u0027)"},{"line_number":34,"context_line":"        raise RuntimeError(msg)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    launcher \u003d service.ServiceLauncher(CONF, restart_method\u003d\u0027mutate\u0027)"},{"line_number":37,"context_line":"    launcher.launch_service(RPCService(CONF.host))"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_d02ecd8a","line":34,"updated":"2019-08-01 11:45:14.000000000","message":"ditto","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    if CONF.standalone:"},{"line_number":32,"context_line":"        msg \u003d _(\u0027To run ironic-inspector-conductor, [DEFAULT]standalone \u0027"},{"line_number":33,"context_line":"                \u0027should be set to False.\u0027)"},{"line_number":34,"context_line":"        raise RuntimeError(msg)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    launcher \u003d service.ServiceLauncher(CONF, restart_method\u003d\u0027mutate\u0027)"},{"line_number":37,"context_line":"    launcher.launch_service(RPCService(CONF.host))"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_a5b8a3c7","line":34,"in_reply_to":"7faddb67_d02ecd8a","updated":"2019-08-02 05:51:46.000000000","message":"Done","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"}],"ironic_inspector/cmd/wsgi.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0855578dd836db55312be5ede02ce229013c57ed","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    if CONF.standalone:"},{"line_number":29,"context_line":"        msg \u003d _(\u0027To run ironic-inspector-api, [DEFAULT]standalone should be \u0027"},{"line_number":30,"context_line":"                \u0027set to False.\u0027)"},{"line_number":31,"context_line":"        raise sys.exit(msg)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    return main.get_app()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_ecab9f1b","line":31,"updated":"2019-08-07 08:26:40.000000000","message":"s/raise// (it raises SystemExit internally)","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"162ea6513573a097d0ef5bd00b54eb715769d335","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    if CONF.standalone:"},{"line_number":29,"context_line":"        msg \u003d _(\u0027To run ironic-inspector-api, [DEFAULT]standalone should be \u0027"},{"line_number":30,"context_line":"                \u0027set to False.\u0027)"},{"line_number":31,"context_line":"        raise sys.exit(msg)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    return main.get_app()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_e08cd72f","line":31,"in_reply_to":"7faddb67_ecab9f1b","updated":"2019-08-09 06:06:42.000000000","message":"Done","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"6c5d4dcfaeea3d12f23c45df501ceaae1f545b3f","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    if CONF.standalone:"},{"line_number":29,"context_line":"        msg \u003d _(\u0027To run ironic-inspector-api, [DEFAULT]standalone should be \u0027"},{"line_number":30,"context_line":"                \u0027set to False.\u0027)"},{"line_number":31,"context_line":"        raise sys.exit(msg)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    return main.get_app()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_2f43e915","line":31,"in_reply_to":"7faddb67_ecab9f1b","updated":"2019-08-07 08:54:43.000000000","message":"ack, not sure why I mixed them together..","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"}],"ironic_inspector/common/coordination.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.coordinator \u003d coordination.get_coordinator("},{"line_number":59,"context_line":"            CONF.coordination.backend_url, member_id)"},{"line_number":60,"context_line":"        self.coordinator.start(start_heart\u003dheartbeat)"},{"line_number":61,"context_line":"        self.started \u003d True"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def stop(self):"},{"line_number":64,"context_line":"        \"\"\"Disconnect from coordination backend and stop heartbeat.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_d0156d3e","line":61,"updated":"2019-08-01 11:45:14.000000000","message":"nit: LOG.debug that it started?","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.coordinator \u003d coordination.get_coordinator("},{"line_number":59,"context_line":"            CONF.coordination.backend_url, member_id)"},{"line_number":60,"context_line":"        self.coordinator.start(start_heart\u003dheartbeat)"},{"line_number":61,"context_line":"        self.started \u003d True"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def stop(self):"},{"line_number":64,"context_line":"        \"\"\"Disconnect from coordination backend and stop heartbeat.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_c804d617","line":61,"in_reply_to":"7faddb67_d0156d3e","updated":"2019-08-02 05:51:46.000000000","message":"Done","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            except Exception as e:"},{"line_number":69,"context_line":"                LOG.error(\u0027Failed to stop coordinator: %s\u0027, e)"},{"line_number":70,"context_line":"            self.coordinator \u003d None"},{"line_number":71,"context_line":"            self.started \u003d False"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _validate_state(self):"},{"line_number":74,"context_line":"        if not self.started:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_70283985","line":71,"updated":"2019-08-01 11:45:14.000000000","message":"nit: LOG.debug that it stopped?","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            except Exception as e:"},{"line_number":69,"context_line":"                LOG.error(\u0027Failed to stop coordinator: %s\u0027, e)"},{"line_number":70,"context_line":"            self.coordinator \u003d None"},{"line_number":71,"context_line":"            self.started \u003d False"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _validate_state(self):"},{"line_number":74,"context_line":"        if not self.started:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_681e0260","line":71,"in_reply_to":"7faddb67_70283985","updated":"2019-08-02 05:51:46.000000000","message":"Done","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            request \u003d self.coordinator.create_group(self.group_name)"},{"line_number":81,"context_line":"            request.get()"},{"line_number":82,"context_line":"        except coordination.GroupAlreadyExist:"},{"line_number":83,"context_line":"            LOG.info(\u0027Group %s already exists.\u0027, self.group_name)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def join_group(self):"},{"line_number":86,"context_line":"        \"\"\"Join service group.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_902db596","line":83,"updated":"2019-08-01 11:45:14.000000000","message":"s/info/debug/ ? do we expect operators to care?","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            request \u003d self.coordinator.create_group(self.group_name)"},{"line_number":81,"context_line":"            request.get()"},{"line_number":82,"context_line":"        except coordination.GroupAlreadyExist:"},{"line_number":83,"context_line":"            LOG.info(\u0027Group %s already exists.\u0027, self.group_name)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def join_group(self):"},{"line_number":86,"context_line":"        \"\"\"Join service group.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_283c8ac6","line":83,"in_reply_to":"7faddb67_902db596","updated":"2019-08-02 05:51:46.000000000","message":"debug will be ok.","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            request.get()"},{"line_number":105,"context_line":"            LOG.info(\u0027Left group %s\u0027, self.group_name)"},{"line_number":106,"context_line":"        except coordination.MemberNotJoined:"},{"line_number":107,"context_line":"            LOG.warning(\u0027Leaving a non-existing group.\u0027)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def get_members(self):"},{"line_number":110,"context_line":"        \"\"\"Get members in the service group.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_301e415f","line":107,"updated":"2019-08-01 11:45:14.000000000","message":"If we keep this a warning, we should make it clearer. Something like \"Cannot leave group %s because we\u0027re not a member\".","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            request.get()"},{"line_number":105,"context_line":"            LOG.info(\u0027Left group %s\u0027, self.group_name)"},{"line_number":106,"context_line":"        except coordination.MemberNotJoined:"},{"line_number":107,"context_line":"            LOG.warning(\u0027Leaving a non-existing group.\u0027)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def get_members(self):"},{"line_number":110,"context_line":"        \"\"\"Get members in the service group.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_2841ea39","line":107,"in_reply_to":"7faddb67_301e415f","updated":"2019-08-02 05:51:46.000000000","message":"Ah, it was used for debug, I assume all logs here are debug purposed. User shouldn\u0027t care about leaving a non-existing group.","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            return result.get()"},{"line_number":115,"context_line":"        except coordination.GroupNotCreated:"},{"line_number":116,"context_line":"            # If the group does not exist, there should be no members in it."},{"line_number":117,"context_line":"            pass"},{"line_number":118,"context_line":"        return set()"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def get_lock(self, uuid):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_5023bda7","line":117,"updated":"2019-08-01 11:45:14.000000000","message":"nit: use return set() here to avoid the redundant pass instruction","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            return result.get()"},{"line_number":115,"context_line":"        except coordination.GroupNotCreated:"},{"line_number":116,"context_line":"            # If the group does not exist, there should be no members in it."},{"line_number":117,"context_line":"            pass"},{"line_number":118,"context_line":"        return set()"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def get_lock(self, uuid):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_8871feaa","line":117,"in_reply_to":"7faddb67_5023bda7","updated":"2019-08-02 05:51:46.000000000","message":"Done\nHmm, maybe I need to add some retry mechanism to the get topic, currently it\u0027s also not try-cached.","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"}],"ironic_inspector/common/rpc.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    if CONF.standalone:"},{"line_number":40,"context_line":"        target \u003d messaging.Target(topic\u003dmanager.MANAGER_TOPIC,"},{"line_number":41,"context_line":"                                  server\u003dCONF.host,"},{"line_number":42,"context_line":"                                  version\u003d\u00271.2\u0027)"},{"line_number":43,"context_line":"    else:"},{"line_number":44,"context_line":"        target \u003d messaging.Target(topic\u003dtopic, version\u003d\u00271.2\u0027)"},{"line_number":45,"context_line":"    transport \u003d get_transport()"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_f03bc9cd","line":42,"updated":"2019-08-01 11:45:14.000000000","message":"side note: we should get rid of dependency on oslo.message for standalone case. It was added as a temporary measure before \u0027standalone\u0027 existed.","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    if CONF.standalone:"},{"line_number":40,"context_line":"        target \u003d messaging.Target(topic\u003dmanager.MANAGER_TOPIC,"},{"line_number":41,"context_line":"                                  server\u003dCONF.host,"},{"line_number":42,"context_line":"                                  version\u003d\u00271.2\u0027)"},{"line_number":43,"context_line":"    else:"},{"line_number":44,"context_line":"        target \u003d messaging.Target(topic\u003dtopic, version\u003d\u00271.2\u0027)"},{"line_number":45,"context_line":"    transport \u003d get_transport()"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_e5721b12","line":42,"in_reply_to":"7faddb67_f03bc9cd","updated":"2019-08-02 05:51:46.000000000","message":"Maybe we\u0027ll get rid of it after json-rpc is introduced.\nI expect json-rpc is a complement to rabbitmq, so it\u0027s still a requirement for non-standalone case.","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"}],"ironic_inspector/conductor/manager.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    @messaging.expected_exceptions(utils.Error)"},{"line_number":169,"context_line":"    def do_reapply(self, context, node_uuid, token\u003dNone, data\u003dNone):"},{"line_number":170,"context_line":"        LOG.info(\u0027RPC: do_introspection\u0027)"},{"line_number":171,"context_line":"        if not data:"},{"line_number":172,"context_line":"            try:"},{"line_number":173,"context_line":"                data \u003d process.get_introspection_data(node_uuid,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_b018f175","line":170,"updated":"2019-08-01 11:45:14.000000000","message":"s/indo/debug/ (also why do it here but not in other places?)","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    @messaging.expected_exceptions(utils.Error)"},{"line_number":169,"context_line":"    def do_reapply(self, context, node_uuid, token\u003dNone, data\u003dNone):"},{"line_number":170,"context_line":"        LOG.info(\u0027RPC: do_introspection\u0027)"},{"line_number":171,"context_line":"        if not data:"},{"line_number":172,"context_line":"            try:"},{"line_number":173,"context_line":"                data \u003d process.get_introspection_data(node_uuid,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_4553ef6b","line":170,"in_reply_to":"7faddb67_b018f175","updated":"2019-08-02 05:51:46.000000000","message":"Uh, removed\n\nIt\u0027s piece of code during debug, for convenience I turned debug off to have less logs so used the info level :/","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"}],"ironic_inspector/main.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            hosts.append(host)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    topic \u003d \u0027%s.%s\u0027 % (manager.MANAGER_TOPIC, random.choice(hosts))"},{"line_number":60,"context_line":"    LOG.info(\u0027Get topic %s from members %s\u0027, topic, members)"},{"line_number":61,"context_line":"    return topic"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_704d9970","line":60,"updated":"2019-08-01 11:45:14.000000000","message":"s/info/debug/ s/Get/Got/","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            hosts.append(host)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    topic \u003d \u0027%s.%s\u0027 % (manager.MANAGER_TOPIC, random.choice(hosts))"},{"line_number":60,"context_line":"    LOG.info(\u0027Get topic %s from members %s\u0027, topic, members)"},{"line_number":61,"context_line":"    return topic"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_e5e0db99","line":60,"in_reply_to":"7faddb67_704d9970","updated":"2019-08-02 05:51:46.000000000","message":"Removed, this is also a debug log.","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def get_client_compat():"},{"line_number":65,"context_line":"    if CONF.standalone:"},{"line_number":66,"context_line":"        return rpc.get_client()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    topic \u003d get_random_topic()"},{"line_number":69,"context_line":"    return rpc.get_client(topic)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_90529512","line":66,"updated":"2019-08-01 11:45:14.000000000","message":"ditto re removing RPC indirection when standalone is used.","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def get_client_compat():"},{"line_number":65,"context_line":"    if CONF.standalone:"},{"line_number":66,"context_line":"        return rpc.get_client()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    topic \u003d get_random_topic()"},{"line_number":69,"context_line":"    return rpc.get_client(topic)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_450bef28","line":66,"in_reply_to":"7faddb67_90529512","updated":"2019-08-02 05:51:46.000000000","message":"Do you suggest we do it before other messaging mechanism is introduced? Like adding a fake rpc interface which directly calls manager methods?","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0855578dd836db55312be5ede02ce229013c57ed","unresolved":false,"context_lines":[{"line_number":37,"context_line":"CONF \u003d ironic_inspector.conf.CONF"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"app \u003d flask.Flask(__name__)"},{"line_number":41,"context_line":"LOG \u003d utils.getProcessingLogger(__name__)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"MINIMUM_API_VERSION \u003d (1, 0)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_8ca8eb20","line":40,"updated":"2019-08-07 08:26:40.000000000","message":"Let\u0027s make app private to make sure it\u0027s only accessed via get_app?","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6a576add5f495c2c2e34e8940936bb1cee45fa5f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"CONF \u003d ironic_inspector.conf.CONF"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"app \u003d flask.Flask(__name__)"},{"line_number":41,"context_line":"LOG \u003d utils.getProcessingLogger(__name__)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"MINIMUM_API_VERSION \u003d (1, 0)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_efc5d13e","line":40,"in_reply_to":"7faddb67_4fcf45b3","updated":"2019-08-07 09:11:16.000000000","message":"we can just rename it to e.g. _app","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"6c5d4dcfaeea3d12f23c45df501ceaae1f545b3f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"CONF \u003d ironic_inspector.conf.CONF"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"app \u003d flask.Flask(__name__)"},{"line_number":41,"context_line":"LOG \u003d utils.getProcessingLogger(__name__)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"MINIMUM_API_VERSION \u003d (1, 0)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_4fcf45b3","line":40,"in_reply_to":"7faddb67_8ca8eb20","updated":"2019-08-07 08:54:43.000000000","message":"it\u0027s used as a decorator below, I am not sure there is a neat way to do it, any suggestions?","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"162ea6513573a097d0ef5bd00b54eb715769d335","unresolved":false,"context_lines":[{"line_number":37,"context_line":"CONF \u003d ironic_inspector.conf.CONF"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"app \u003d flask.Flask(__name__)"},{"line_number":41,"context_line":"LOG \u003d utils.getProcessingLogger(__name__)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"MINIMUM_API_VERSION \u003d (1, 0)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_c0867b14","line":40,"in_reply_to":"7faddb67_efc5d13e","updated":"2019-08-09 06:06:42.000000000","message":"Done","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"6c5d4dcfaeea3d12f23c45df501ceaae1f545b3f","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"@app.before_first_request"},{"line_number":140,"context_line":"def start_coordinator():"},{"line_number":141,"context_line":"    \"\"\"Create a coordinator instance for non-standalone case.\"\"\""},{"line_number":142,"context_line":"    if not CONF.standalone:"},{"line_number":143,"context_line":"        coordinator \u003d coordination.get_coordinator(prefix\u003d\u0027api\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_8fbc5d07","line":140,"updated":"2019-08-07 08:54:43.000000000","message":"I am realizing one-time initialization probably is not a robust way, maybe we need to check and start it (if not started) on each request, otherwise there is no way to restore once the first request fails.","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"17c1060b0f02ab8f67fd27c59062fdd274f87787","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"@app.before_first_request"},{"line_number":140,"context_line":"def start_coordinator():"},{"line_number":141,"context_line":"    \"\"\"Create a coordinator instance for non-standalone case.\"\"\""},{"line_number":142,"context_line":"    if not CONF.standalone:"},{"line_number":143,"context_line":"        coordinator \u003d coordination.get_coordinator(prefix\u003d\u0027api\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_fa3a71c2","line":140,"in_reply_to":"7faddb67_4f2e65ac","updated":"2019-08-07 09:38:44.000000000","message":"Given that a WSGI service can be multi-threaded, is it really safe to do it in initialize_wsgi_app? Are coordinators thread-safe?","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6a576add5f495c2c2e34e8940936bb1cee45fa5f","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"@app.before_first_request"},{"line_number":140,"context_line":"def start_coordinator():"},{"line_number":141,"context_line":"    \"\"\"Create a coordinator instance for non-standalone case.\"\"\""},{"line_number":142,"context_line":"    if not CONF.standalone:"},{"line_number":143,"context_line":"        coordinator \u003d coordination.get_coordinator(prefix\u003d\u0027api\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_8fc21d34","line":140,"in_reply_to":"7faddb67_8fbc5d07","updated":"2019-08-07 09:11:16.000000000","message":"how costly would it be to move it to before_request?","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"a2a9622db9a6a2347a89b57b9159c88e12f2111a","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"@app.before_first_request"},{"line_number":140,"context_line":"def start_coordinator():"},{"line_number":141,"context_line":"    \"\"\"Create a coordinator instance for non-standalone case.\"\"\""},{"line_number":142,"context_line":"    if not CONF.standalone:"},{"line_number":143,"context_line":"        coordinator \u003d coordination.get_coordinator(prefix\u003d\u0027api\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_4f2e65ac","line":140,"in_reply_to":"7faddb67_8fc21d34","updated":"2019-08-07 09:31:21.000000000","message":"We only start coordinator once, there should be no cost for a started coordinator.\n\nBut maybe we could move this op to initialize_wsgi_app, only one time initialization is required, stop the service if we failed to get an available coordinator during startup. Once we started the service, the heartbeat will provide kind of tolerance.","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"0faaf35937176f99af3cab11e32551414255bfe1","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"@app.before_first_request"},{"line_number":140,"context_line":"def start_coordinator():"},{"line_number":141,"context_line":"    \"\"\"Create a coordinator instance for non-standalone case.\"\"\""},{"line_number":142,"context_line":"    if not CONF.standalone:"},{"line_number":143,"context_line":"        coordinator \u003d coordination.get_coordinator(prefix\u003d\u0027api\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_88c44510","line":140,"in_reply_to":"7faddb67_fa3a71c2","updated":"2019-08-08 03:27:08.000000000","message":"No doc from tooz claims that, I suspect it\u0027s not thread safety. A coordinator is a wrapper on the backend instance, I haven\u0027t found synchronization protection on super classes.\nIt seems we need to add some protection on the get_coordinator at least.","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"aadd17ee320daa833d208e34dacd88ede19d1eea","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    return _app"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"# TODO(kaifeng) Extract rpc related code into a rpcapi module"},{"line_number":69,"context_line":"def get_random_topic():"},{"line_number":70,"context_line":"    coordinator \u003d coordination.get_coordinator(prefix\u003d\u0027api\u0027)"},{"line_number":71,"context_line":"    members \u003d coordinator.get_members()"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_37191ed0","line":68,"updated":"2019-08-21 09:04:33.000000000","message":"++ especially since we\u0027ll want to support JSON RPC as well","commit_id":"293b0c7c157d5ef5ebc69c32c85bba81d2594298"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"aadd17ee320daa833d208e34dacd88ede19d1eea","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    return wrapper"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"@_app.before_first_request"},{"line_number":144,"context_line":"def start_coordinator():"},{"line_number":145,"context_line":"    \"\"\"Create a coordinator instance for non-standalone case.\"\"\""},{"line_number":146,"context_line":"    if not CONF.standalone:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_d779aafb","line":143,"updated":"2019-08-21 09:04:33.000000000","message":"I\u0027m still wondering if we should use before_request and store the coordinator in flask request-scope context (flask.request.g or something like that).","commit_id":"293b0c7c157d5ef5ebc69c32c85bba81d2594298"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"8093a399fd5e27a5fdabee4ec1104f04bd5eb234","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    return wrapper"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"@_app.before_first_request"},{"line_number":144,"context_line":"def start_coordinator():"},{"line_number":145,"context_line":"    \"\"\"Create a coordinator instance for non-standalone case.\"\"\""},{"line_number":146,"context_line":"    if not CONF.standalone:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_e9464a50","line":143,"in_reply_to":"7faddb67_d779aafb","updated":"2019-08-21 09:20:54.000000000","message":"I could follow up with it, currently I am stuck on the uwsgi stuff :(","commit_id":"293b0c7c157d5ef5ebc69c32c85bba81d2594298"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"aadd17ee320daa833d208e34dacd88ede19d1eea","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    if not CONF.standalone:"},{"line_number":147,"context_line":"        coordinator \u003d coordination.get_coordinator(prefix\u003d\u0027api\u0027)"},{"line_number":148,"context_line":"        coordinator.start(heartbeat\u003dFalse)"},{"line_number":149,"context_line":"        LOG.info(\u0027Sucessfully created coordinator.\u0027)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"@_app.before_request"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_f77ce6eb","line":149,"updated":"2019-08-21 09:04:33.000000000","message":"nit: Successfully","commit_id":"293b0c7c157d5ef5ebc69c32c85bba81d2594298"}],"ironic_inspector/test/unit/test_main.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"aadd17ee320daa833d208e34dacd88ede19d1eea","unresolved":false,"context_lines":[{"line_number":707,"context_line":"            topic \u003d main.get_random_topic()"},{"line_number":708,"context_line":"            self.assertIn(topic, topics)"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"    @mock.patch.object(coordination, \u0027get_coordinator\u0027)"},{"line_number":711,"context_line":"    def test_get_random_topic_host_with_domain(self, mock_get_coordinator):"},{"line_number":712,"context_line":"        mock_coordinator \u003d mock.Mock(spec\u003d[\u0027get_members\u0027])"},{"line_number":713,"context_line":"        members \u003d [\u0027ironic_inspector.conductor.\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_977fb2dd","line":710,"updated":"2019-08-21 09:04:33.000000000","message":"nit: autospec\u003dTrue (ditto above and below)","commit_id":"293b0c7c157d5ef5ebc69c32c85bba81d2594298"}],"ironic_inspector/utils.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0855578dd836db55312be5ede02ce229013c57ed","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"class NoAvailableConductor(Error):"},{"line_number":165,"context_line":"    \"\"\"No available conductor in the service group.\"\"\""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"def executor():"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_2cba176e","line":165,"updated":"2019-08-07 08:26:40.000000000","message":"nit: default code to 503 here","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"162ea6513573a097d0ef5bd00b54eb715769d335","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"class NoAvailableConductor(Error):"},{"line_number":165,"context_line":"    \"\"\"No available conductor in the service group.\"\"\""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"def executor():"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_e52b8930","line":165,"in_reply_to":"7faddb67_2cba176e","updated":"2019-08-09 06:06:42.000000000","message":"Done","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"}],"ironic_inspector/wsgi_service.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3baa97f86c2ae897e4ee27868f4d51101dc0c4c7","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                                  use_ssl\u003dCONF.use_ssl)"},{"line_number":36,"context_line":"        self.coordinator \u003d None"},{"line_number":37,"context_line":"        if use_coordination:"},{"line_number":38,"context_line":"            self.coordinator \u003d coordination.get_coordinator(prefix\u003d\u0027api\u0027)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _init_middleware(self):"},{"line_number":41,"context_line":"        \"\"\"Initialize WSGI middleware."}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_b4ee931f","line":38,"updated":"2019-08-02 09:48:18.000000000","message":"To follow-up what we discussed on IRC: we should move all application logic out of WSGIService since it\u0027s just a way to launch a WSGI application. Instead, we need a WSGI entrypoint like https://github.com/openstack/ironic/blob/master/ironic/api/wsgi.py#L28 otherwise operators won\u0027t be able to use ironic-inspector API behind a real WSGI container (which is one of the goals here).","commit_id":"354801bfe679cb7981ccb72f63c3d5adeb76b7f9"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"04b32e30a6a9003cb92ac1622f301c4a6bd57215","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                                  use_ssl\u003dCONF.use_ssl)"},{"line_number":36,"context_line":"        self.coordinator \u003d None"},{"line_number":37,"context_line":"        if use_coordination:"},{"line_number":38,"context_line":"            self.coordinator \u003d coordination.get_coordinator(prefix\u003d\u0027api\u0027)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _init_middleware(self):"},{"line_number":41,"context_line":"        \"\"\"Initialize WSGI middleware."}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_75232457","line":38,"in_reply_to":"7faddb67_b4ee931f","updated":"2019-08-05 03:06:41.000000000","message":"Done","commit_id":"354801bfe679cb7981ccb72f63c3d5adeb76b7f9"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3baa97f86c2ae897e4ee27868f4d51101dc0c4c7","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            self.coordinator \u003d coordination.get_coordinator(prefix\u003d\u0027api\u0027)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _init_middleware(self):"},{"line_number":41,"context_line":"        \"\"\"Initialize WSGI middleware."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        :returns: None"},{"line_number":44,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_54ef1f1c","line":41,"updated":"2019-08-02 09:48:18.000000000","message":"This should be moved out as well","commit_id":"354801bfe679cb7981ccb72f63c3d5adeb76b7f9"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"04b32e30a6a9003cb92ac1622f301c4a6bd57215","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            self.coordinator \u003d coordination.get_coordinator(prefix\u003d\u0027api\u0027)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _init_middleware(self):"},{"line_number":41,"context_line":"        \"\"\"Initialize WSGI middleware."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        :returns: None"},{"line_number":44,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_d528d833","line":41,"in_reply_to":"7faddb67_54ef1f1c","updated":"2019-08-05 03:06:41.000000000","message":"Done","commit_id":"354801bfe679cb7981ccb72f63c3d5adeb76b7f9"}],"releasenotes/notes/split-services-99873ff27ef2d89b.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Splits the ironic-inspector service to ironic-inspector-api and"},{"line_number":5,"context_line":"    ironic-inspector-conductor which coordinate via tooz and its underlying"},{"line_number":6,"context_line":"    backend. A new configuration option ``[DEFAULT]standalone`` is introduced"},{"line_number":7,"context_line":"    to differentiate two modes. The configuration defaults to True, which is"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"7faddb67_1039c5d5","line":4,"updated":"2019-08-01 11:45:14.000000000","message":"nit: s/Splits/Allows splitting/","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Splits the ironic-inspector service to ironic-inspector-api and"},{"line_number":5,"context_line":"    ironic-inspector-conductor which coordinate via tooz and its underlying"},{"line_number":6,"context_line":"    backend. A new configuration option ``[DEFAULT]standalone`` is introduced"},{"line_number":7,"context_line":"    to differentiate two modes. The configuration defaults to True, which is"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"7faddb67_28256ac2","line":4,"in_reply_to":"7faddb67_1039c5d5","updated":"2019-08-02 05:51:46.000000000","message":"Done","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"24854dd561dd8045b03ae3a5731438fbc6853aa7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Splits the ironic-inspector service to ironic-inspector-api and"},{"line_number":5,"context_line":"    ironic-inspector-conductor which coordinate via tooz and its underlying"},{"line_number":6,"context_line":"    backend. A new configuration option ``[DEFAULT]standalone`` is introduced"},{"line_number":7,"context_line":"    to differentiate two modes. The configuration defaults to True, which is"},{"line_number":8,"context_line":"    compatible with old behaviors. When set to False, ``ironic-inspector-api``"},{"line_number":9,"context_line":"    is used to start the API service, and ``ironic-inspector-conductor`` is"},{"line_number":10,"context_line":"    used to start the conductor service. For ironic-inspector running at"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"7faddb67_b031d1ef","line":7,"updated":"2019-08-01 11:45:14.000000000","message":"s/two modes/enable this feature/? you did not mention any other mode before.","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"446df8f3d07848cc371fe846773d11a6411ef2fd","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Splits the ironic-inspector service to ironic-inspector-api and"},{"line_number":5,"context_line":"    ironic-inspector-conductor which coordinate via tooz and its underlying"},{"line_number":6,"context_line":"    backend. A new configuration option ``[DEFAULT]standalone`` is introduced"},{"line_number":7,"context_line":"    to differentiate two modes. The configuration defaults to True, which is"},{"line_number":8,"context_line":"    compatible with old behaviors. When set to False, ``ironic-inspector-api``"},{"line_number":9,"context_line":"    is used to start the API service, and ``ironic-inspector-conductor`` is"},{"line_number":10,"context_line":"    used to start the conductor service. For ironic-inspector running at"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"7faddb67_482226bb","line":7,"in_reply_to":"7faddb67_b031d1ef","updated":"2019-08-02 05:51:46.000000000","message":"Done","commit_id":"34f9403d05b0b9b7c4244c6ec1c39f5d21ca11cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0855578dd836db55312be5ede02ce229013c57ed","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    backend. A new configuration option ``[DEFAULT]standalone`` is introduced"},{"line_number":7,"context_line":"    to enable this feature. The configuration defaults to True,"},{"line_number":8,"context_line":"    ironic-inspector runs as a single service, which is compatible with the"},{"line_number":9,"context_line":"    old behavior. When set to False, ``ironic-inspector-api`` is used to start"},{"line_number":10,"context_line":"    the API service, and ``ironic-inspector-conductor`` is used to start the"},{"line_number":11,"context_line":"    conductor service. For ironic-inspector running at non-standalone mode,"},{"line_number":12,"context_line":"    user needs to set the new configuration option"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"7faddb67_ccaee32e","line":9,"updated":"2019-08-07 08:26:40.000000000","message":"ironic-inspector-api-wsgi","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"162ea6513573a097d0ef5bd00b54eb715769d335","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    backend. A new configuration option ``[DEFAULT]standalone`` is introduced"},{"line_number":7,"context_line":"    to enable this feature. The configuration defaults to True,"},{"line_number":8,"context_line":"    ironic-inspector runs as a single service, which is compatible with the"},{"line_number":9,"context_line":"    old behavior. When set to False, ``ironic-inspector-api`` is used to start"},{"line_number":10,"context_line":"    the API service, and ``ironic-inspector-conductor`` is used to start the"},{"line_number":11,"context_line":"    conductor service. For ironic-inspector running at non-standalone mode,"},{"line_number":12,"context_line":"    user needs to set the new configuration option"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"7faddb67_a525915e","line":9,"in_reply_to":"7faddb67_ccaee32e","updated":"2019-08-09 06:06:42.000000000","message":"Done","commit_id":"ddbcc4b32076c6ee69eeba286545bd5d65e5ed3e"}]}
