)]}'
{"metalsmith/_provisioner.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e057f284a3f69ad7bdd9bf2cea26d89f54ab2e46","unresolved":false,"context_lines":[{"line_number":414,"context_line":"            # indicate to novajoin-listener that this node needs to be"},{"line_number":415,"context_line":"            # unenrolled during node delete"},{"line_number":416,"context_line":"            if isinstance(config, instance_config.NovajoinConfig):"},{"line_number":417,"context_line":"                instance_info[\u0027ipa_enroll\u0027: \u0027true\u0027]"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"            extra \u003d node.extra.copy()"},{"line_number":420,"context_line":"            extra[_CREATED_PORTS] \u003d nics.created_ports"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_a5624714","line":417,"updated":"2019-12-03 11:41:04.000000000","message":"This has to be encapsulated inside NovajoinConfig. Maybe a new call on an instance config?\n\nAs an aside, why use instance_info for this? Since it\u0027s not interpreted by ironic, node.extra may be a better choice.","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"da752cac79de34f08cbc8efc5f7cc2c51da9d7c6","unresolved":false,"context_lines":[{"line_number":414,"context_line":"            # indicate to novajoin-listener that this node needs to be"},{"line_number":415,"context_line":"            # unenrolled during node delete"},{"line_number":416,"context_line":"            if isinstance(config, instance_config.NovajoinConfig):"},{"line_number":417,"context_line":"                instance_info[\u0027ipa_enroll\u0027: \u0027true\u0027]"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"            extra \u003d node.extra.copy()"},{"line_number":420,"context_line":"            extra[_CREATED_PORTS] \u003d nics.created_ports"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_6a840f5e","line":417,"in_reply_to":"3fa7e38b_a5624714","updated":"2019-12-04 01:28:40.000000000","message":"Done, I needed a field which is included in the ironic NodeCRUDPayload object, which \u0027extra\u0027 is","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"}],"metalsmith/instance_config.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e057f284a3f69ad7bdd9bf2cea26d89f54ab2e46","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        super(NovajoinConfig, self).__init__(ssh_keys, user_data)"},{"line_number":155,"context_line":"        self.cloud_config_path \u003d cloud_config_path"},{"line_number":156,"context_line":"        self.endpoint \u003d endpoint"},{"line_number":157,"context_line":"        self.session \u003d session"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def generate(self, node, hostname\u003dNone):"},{"line_number":160,"context_line":"        configdrive \u003d super(NovajoinConfig, self).generate(node, hostname)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_456913f6","line":157,"updated":"2019-12-03 11:41:04.000000000","message":"Let\u0027s raise TypeError if either session or endpoint are None.","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"da752cac79de34f08cbc8efc5f7cc2c51da9d7c6","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        super(NovajoinConfig, self).__init__(ssh_keys, user_data)"},{"line_number":155,"context_line":"        self.cloud_config_path \u003d cloud_config_path"},{"line_number":156,"context_line":"        self.endpoint \u003d endpoint"},{"line_number":157,"context_line":"        self.session \u003d session"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def generate(self, node, hostname\u003dNone):"},{"line_number":160,"context_line":"        configdrive \u003d super(NovajoinConfig, self).generate(node, hostname)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_6ae96f17","line":157,"in_reply_to":"3fa7e38b_456913f6","updated":"2019-12-04 01:28:40.000000000","message":"Done","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e057f284a3f69ad7bdd9bf2cea26d89f54ab2e46","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    def generate(self, node, hostname\u003dNone):"},{"line_number":160,"context_line":"        configdrive \u003d super(NovajoinConfig, self).generate(node, hostname)"},{"line_number":161,"context_line":"        if not self.session:"},{"line_number":162,"context_line":"            LOG.warn(\u0027No session to call novajoin with\u0027)"},{"line_number":163,"context_line":"            return configdrive"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if not self.endpoint:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_656c4f07","line":162,"updated":"2019-12-03 11:41:04.000000000","message":"This is not a valid case, let\u0027s handle it in __init__","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"da752cac79de34f08cbc8efc5f7cc2c51da9d7c6","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    def generate(self, node, hostname\u003dNone):"},{"line_number":160,"context_line":"        configdrive \u003d super(NovajoinConfig, self).generate(node, hostname)"},{"line_number":161,"context_line":"        if not self.session:"},{"line_number":162,"context_line":"            LOG.warn(\u0027No session to call novajoin with\u0027)"},{"line_number":163,"context_line":"            return configdrive"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if not self.endpoint:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_0af0fbfc","line":162,"in_reply_to":"3fa7e38b_656c4f07","updated":"2019-12-04 01:28:40.000000000","message":"Done","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e057f284a3f69ad7bdd9bf2cea26d89f54ab2e46","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            return configdrive"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if not self.endpoint:"},{"line_number":166,"context_line":"            LOG.warn(\u0027No novajoin endpoint to call\u0027)"},{"line_number":167,"context_line":"            return configdrive"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_05731bea","line":166,"updated":"2019-12-03 11:41:04.000000000","message":"ditto","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"da752cac79de34f08cbc8efc5f7cc2c51da9d7c6","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            return configdrive"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        if not self.endpoint:"},{"line_number":166,"context_line":"            LOG.warn(\u0027No novajoin endpoint to call\u0027)"},{"line_number":167,"context_line":"            return configdrive"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        body \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_2af3770b","line":166,"in_reply_to":"3fa7e38b_05731bea","updated":"2019-12-04 01:28:40.000000000","message":"Done","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e057f284a3f69ad7bdd9bf2cea26d89f54ab2e46","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        headers \u003d {"},{"line_number":175,"context_line":"            \u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":176,"context_line":"            \u0027Accept\u0027: \u0027application/json\u0027,"},{"line_number":177,"context_line":"            \u0027User-Agent\u0027: \u0027action-baremetal-deploy\u0027"},{"line_number":178,"context_line":"        }"},{"line_number":179,"context_line":"        res \u003d self.session.post(self.endpoint,"},{"line_number":180,"context_line":"                                data\u003djson.dumps(body),"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_256e57fe","line":177,"updated":"2019-12-03 11:41:04.000000000","message":"Is it required? If so, it should probably be \u0027metalsmith {version}\u0027","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"da752cac79de34f08cbc8efc5f7cc2c51da9d7c6","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        headers \u003d {"},{"line_number":175,"context_line":"            \u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":176,"context_line":"            \u0027Accept\u0027: \u0027application/json\u0027,"},{"line_number":177,"context_line":"            \u0027User-Agent\u0027: \u0027action-baremetal-deploy\u0027"},{"line_number":178,"context_line":"        }"},{"line_number":179,"context_line":"        res \u003d self.session.post(self.endpoint,"},{"line_number":180,"context_line":"                                data\u003djson.dumps(body),"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_2addb740","line":177,"in_reply_to":"3fa7e38b_256e57fe","updated":"2019-12-04 01:28:40.000000000","message":"whoops, forklifted out of the old version of https://review.opendev.org/#/c/685865/\n\nI did *something* to get the metalsmith version, maybe there is a better way","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e057f284a3f69ad7bdd9bf2cea26d89f54ab2e46","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            \u0027User-Agent\u0027: \u0027action-baremetal-deploy\u0027"},{"line_number":178,"context_line":"        }"},{"line_number":179,"context_line":"        res \u003d self.session.post(self.endpoint,"},{"line_number":180,"context_line":"                                data\u003djson.dumps(body),"},{"line_number":181,"context_line":"                                headers\u003dheaders, timeout\u003d30)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        vendor_data \u003d configdrive.setdefault(\u0027vendor_data\u0027, {})"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_c57c23b8","line":180,"updated":"2019-12-03 11:41:04.000000000","message":"nit: json\u003dbody","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"da752cac79de34f08cbc8efc5f7cc2c51da9d7c6","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            \u0027User-Agent\u0027: \u0027action-baremetal-deploy\u0027"},{"line_number":178,"context_line":"        }"},{"line_number":179,"context_line":"        res \u003d self.session.post(self.endpoint,"},{"line_number":180,"context_line":"                                data\u003djson.dumps(body),"},{"line_number":181,"context_line":"                                headers\u003dheaders, timeout\u003d30)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        vendor_data \u003d configdrive.setdefault(\u0027vendor_data\u0027, {})"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_4ab913ea","line":180,"in_reply_to":"3fa7e38b_c57c23b8","updated":"2019-12-04 01:28:40.000000000","message":"Done","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e057f284a3f69ad7bdd9bf2cea26d89f54ab2e46","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        }"},{"line_number":179,"context_line":"        res \u003d self.session.post(self.endpoint,"},{"line_number":180,"context_line":"                                data\u003djson.dumps(body),"},{"line_number":181,"context_line":"                                headers\u003dheaders, timeout\u003d30)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        vendor_data \u003d configdrive.setdefault(\u0027vendor_data\u0027, {})"},{"line_number":184,"context_line":"        if res and res.text:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_e577dfd0","line":181,"updated":"2019-12-03 11:41:04.000000000","message":"nit: make timeout configurable via __init__?","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"da752cac79de34f08cbc8efc5f7cc2c51da9d7c6","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        }"},{"line_number":179,"context_line":"        res \u003d self.session.post(self.endpoint,"},{"line_number":180,"context_line":"                                data\u003djson.dumps(body),"},{"line_number":181,"context_line":"                                headers\u003dheaders, timeout\u003d30)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        vendor_data \u003d configdrive.setdefault(\u0027vendor_data\u0027, {})"},{"line_number":184,"context_line":"        if res and res.text:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_2ab617fb","line":181,"in_reply_to":"3fa7e38b_e577dfd0","updated":"2019-12-04 01:28:40.000000000","message":"Done","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e057f284a3f69ad7bdd9bf2cea26d89f54ab2e46","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        if user_data:"},{"line_number":195,"context_line":"            user_data \u003d user_data.encode(\u0027utf-8\u0027)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        LOG.debug(\u0027Building a configdrive for node %s\u0027, node.id)"},{"line_number":198,"context_line":"        return os_configdrive.build("},{"line_number":199,"context_line":"            meta_data,"},{"line_number":200,"context_line":"            user_data\u003duser_data,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_85486b8a","line":197,"updated":"2019-12-03 11:41:04.000000000","message":"This brings back the dependency on genisoimage for metalsmith. I\u0027d highly prefer we avoid it and pass vendor_data to ironic inside (I assume the corresponding change has landed but may need an openstacksdk counterpart)?","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"da752cac79de34f08cbc8efc5f7cc2c51da9d7c6","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        if user_data:"},{"line_number":195,"context_line":"            user_data \u003d user_data.encode(\u0027utf-8\u0027)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        LOG.debug(\u0027Building a configdrive for node %s\u0027, node.id)"},{"line_number":198,"context_line":"        return os_configdrive.build("},{"line_number":199,"context_line":"            meta_data,"},{"line_number":200,"context_line":"            user_data\u003duser_data,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_2a84d70a","line":197,"in_reply_to":"3fa7e38b_85486b8a","updated":"2019-12-04 01:28:40.000000000","message":"The ironic change landed in Ussuri [1] but we\u0027re going to need to backport this functionality to Train, and I assume the ironic change is too much of a feature to backport.\n\nI\u0027ve made the tripleo-common change[2] subclass NovajoinConfig and call os_configdrive.build. (with a followup change to remove the subclass[3]\n\n[1] https://review.opendev.org/#/c/683847/\n[2] https://review.opendev.org/#/c/685865/\n[3] https://review.opendev.org/697209","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e057f284a3f69ad7bdd9bf2cea26d89f54ab2e46","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            LOG.warn(\u0027novajoin cloud-config file not specified\u0027)"},{"line_number":207,"context_line":"        elif not os.path.isfile(self.cloud_config_path):"},{"line_number":208,"context_line":"            LOG.warn(\u0027Missing novajoin cloud-config file %s\u0027 %"},{"line_number":209,"context_line":"                     self.cloud_config_path)"},{"line_number":210,"context_line":"        else:"},{"line_number":211,"context_line":"            with open(self.cloud_config_path, \"rb\") as fp:"},{"line_number":212,"context_line":"                vendor_data[\u0027static\u0027] \u003d json.load(fp)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_a54b2784","line":209,"updated":"2019-12-03 11:41:04.000000000","message":"This all should be handled in __init_, I guess? If the file is really optional, we should not warn about it.","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"da752cac79de34f08cbc8efc5f7cc2c51da9d7c6","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            LOG.warn(\u0027novajoin cloud-config file not specified\u0027)"},{"line_number":207,"context_line":"        elif not os.path.isfile(self.cloud_config_path):"},{"line_number":208,"context_line":"            LOG.warn(\u0027Missing novajoin cloud-config file %s\u0027 %"},{"line_number":209,"context_line":"                     self.cloud_config_path)"},{"line_number":210,"context_line":"        else:"},{"line_number":211,"context_line":"            with open(self.cloud_config_path, \"rb\") as fp:"},{"line_number":212,"context_line":"                vendor_data[\u0027static\u0027] \u003d json.load(fp)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_8a74eb37","line":209,"in_reply_to":"3fa7e38b_a54b2784","updated":"2019-12-04 01:28:40.000000000","message":"Done","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b956a07317189e212be29937f8d1be1834ca732","unresolved":false,"context_lines":[{"line_number":157,"context_line":"class NovajoinConfig(CloudInitConfig):"},{"line_number":158,"context_line":"    def __init__(self, ssh_keys\u003dNone, user_data\u003dNone,"},{"line_number":159,"context_line":"                 cloud_config_path\u003dNone,"},{"line_number":160,"context_line":"                 endpoint\u003dNone, session\u003dNone, timeout\u003d30):"},{"line_number":161,"context_line":"        super(NovajoinConfig, self).__init__(ssh_keys, user_data)"},{"line_number":162,"context_line":"        self.cloud_config_path \u003d cloud_config_path"},{"line_number":163,"context_line":"        if not endpoint:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_7d783b2a","line":160,"updated":"2019-12-05 13:51:28.000000000","message":"why default endpoint and session to None if they are required? just make them required here, will save you some checks below","commit_id":"1c22a011f9b6ac73a09c7caf31e5068a07998ac0"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5bb6efc1ffac72ff51ea2a5ab15320c37840cead","unresolved":false,"context_lines":[{"line_number":157,"context_line":"class NovajoinConfig(CloudInitConfig):"},{"line_number":158,"context_line":"    def __init__(self, ssh_keys\u003dNone, user_data\u003dNone,"},{"line_number":159,"context_line":"                 cloud_config_path\u003dNone,"},{"line_number":160,"context_line":"                 endpoint\u003dNone, session\u003dNone, timeout\u003d30):"},{"line_number":161,"context_line":"        super(NovajoinConfig, self).__init__(ssh_keys, user_data)"},{"line_number":162,"context_line":"        self.cloud_config_path \u003d cloud_config_path"},{"line_number":163,"context_line":"        if not endpoint:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_92d0602d","line":160,"in_reply_to":"3fa7e38b_7d783b2a","updated":"2019-12-09 19:27:19.000000000","message":"Done","commit_id":"1c22a011f9b6ac73a09c7caf31e5068a07998ac0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b956a07317189e212be29937f8d1be1834ca732","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        headers \u003d {"},{"line_number":183,"context_line":"            \u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":184,"context_line":"            \u0027Accept\u0027: \u0027application/json\u0027,"},{"line_number":185,"context_line":"            \u0027User-Agent\u0027: \u0027metalsmith %s\u0027 % metalsmith.__version__"},{"line_number":186,"context_line":"        }"},{"line_number":187,"context_line":"        res \u003d self.session.post(self.endpoint, json\u003dbody,"},{"line_number":188,"context_line":"                                headers\u003dheaders, timeout\u003dself.timeout)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_1d710746","line":185,"updated":"2019-12-05 13:51:28.000000000","message":"the established format seems to be \"metalsmith/%s\"","commit_id":"1c22a011f9b6ac73a09c7caf31e5068a07998ac0"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5bb6efc1ffac72ff51ea2a5ab15320c37840cead","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        headers \u003d {"},{"line_number":183,"context_line":"            \u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":184,"context_line":"            \u0027Accept\u0027: \u0027application/json\u0027,"},{"line_number":185,"context_line":"            \u0027User-Agent\u0027: \u0027metalsmith %s\u0027 % metalsmith.__version__"},{"line_number":186,"context_line":"        }"},{"line_number":187,"context_line":"        res \u003d self.session.post(self.endpoint, json\u003dbody,"},{"line_number":188,"context_line":"                                headers\u003dheaders, timeout\u003dself.timeout)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_b2d55c1d","line":185,"in_reply_to":"3fa7e38b_1d710746","updated":"2019-12-09 19:27:19.000000000","message":"Done","commit_id":"1c22a011f9b6ac73a09c7caf31e5068a07998ac0"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"7b956a07317189e212be29937f8d1be1834ca732","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def _add_static(self, vendor_data):"},{"line_number":202,"context_line":"        if not self.cloud_config_path:"},{"line_number":203,"context_line":"            LOG.warn(\u0027novajoin cloud-config file not specified\u0027)"},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            with open(self.cloud_config_path, \"rb\") as fp:"},{"line_number":206,"context_line":"                vendor_data[\u0027static\u0027] \u003d json.load(fp)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_3d6e4364","line":203,"updated":"2019-12-05 13:51:28.000000000","message":"s/warn/warning/ (I think warn is the deprecated alias).","commit_id":"1c22a011f9b6ac73a09c7caf31e5068a07998ac0"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"5bb6efc1ffac72ff51ea2a5ab15320c37840cead","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def _add_static(self, vendor_data):"},{"line_number":202,"context_line":"        if not self.cloud_config_path:"},{"line_number":203,"context_line":"            LOG.warn(\u0027novajoin cloud-config file not specified\u0027)"},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            with open(self.cloud_config_path, \"rb\") as fp:"},{"line_number":206,"context_line":"                vendor_data[\u0027static\u0027] \u003d json.load(fp)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_52d66828","line":203,"in_reply_to":"3fa7e38b_3d6e4364","updated":"2019-12-09 19:27:19.000000000","message":"Done","commit_id":"1c22a011f9b6ac73a09c7caf31e5068a07998ac0"}],"metalsmith/test/test_instance_config.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e057f284a3f69ad7bdd9bf2cea26d89f54ab2e46","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"class TestNovajoinConfig(TestCloudInitConfig):"},{"line_number":145,"context_line":"    CLASS \u003d instance_config.NovajoinConfig"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_855f0b4c","line":145,"updated":"2019-12-03 11:41:04.000000000","message":"you need to provide tests for additional features?","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"a4ab9a7224d41a35bf3f5973a199f1889c074286","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"class TestNovajoinConfig(TestCloudInitConfig):"},{"line_number":145,"context_line":"    CLASS \u003d instance_config.NovajoinConfig"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_1f9b4673","line":145,"in_reply_to":"3fa7e38b_855f0b4c","updated":"2019-12-04 22:43:24.000000000","message":"Done","commit_id":"fe3195bb5a9b891dc3cafac66ac4d53631babc18"}]}
