)]}'
{"ironic_python_agent/ironic_api_client.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"c5063e0d15753714db69534af3e309ba382a0ee0","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            headers \u003d None"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        if self.send_version_on_heartbeat:"},{"line_number":85,"context_line":"            data[\u0027agent_version\u0027] \u003d str(version.version_info)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        response \u003d self._request(\u0027POST\u0027, path, data\u003ddata, headers\u003dheaders)"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5da102_e987370d","line":85,"updated":"2016-10-27 21:02:45.000000000","message":"nit: Why not use version.version_info.version_string() (see http://docs.openstack.org/developer/pbr/api/pbr.html#pbr.version.VersionInfo.version_string) or the equivalent CONF.version (https://github.com/openstack/ironic-python-agent/blob/dd69ef3cd59e2e78f58dcedba106b9d865395c36/doc/source/conf.py#L44) ?\n\nI don\u0027t think it matters much, but it\u0027s not clear from the docs what exactly str(VersionInfo()) will give you.","commit_id":"abbf91e29ba865e0d2e4591770372f93d09010fa"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"66190a82e58cce8b33c63f416aef0f455a1ba25b","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            headers \u003d None"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        if self.send_version_on_heartbeat:"},{"line_number":85,"context_line":"            data[\u0027agent_version\u0027] \u003d str(version.version_info)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        response \u003d self._request(\u0027POST\u0027, path, data\u003ddata, headers\u003dheaders)"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ffe62b97_381b68ca","line":85,"in_reply_to":"ba5da102_e987370d","updated":"2017-03-29 13:42:14.000000000","message":"Thanks for the pointer! Switched to use the functions.","commit_id":"abbf91e29ba865e0d2e4591770372f93d09010fa"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"115008d4b9dd05f5633bc1f258b2ca69737b5809","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        data \u003d {\u0027callback_url\u0027: self._get_agent_url(advertise_address)}"},{"line_number":91,"context_line":"        headers \u003d self._get_ironic_api_version_header()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        if self._get_ironic_api_version()[1] \u003e\u003d 32:"},{"line_number":94,"context_line":"            data[\u0027agent_version\u0027] \u003d version.version_info.release_string()"},{"line_number":95,"context_line":"            headers \u003d self._get_ironic_api_version_header((1, 32))"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7f231b9d_07a75d0d","line":93,"range":{"start_line":93,"start_character":9,"end_line":93,"end_character":51},"updated":"2017-06-15 15:49:27.000000000","message":"I hate to be that jerk and point this out, but we should evaluate both fields that make up the version, not just the minor in case, by some happenstance we create a v2 api.","commit_id":"1f57b96906c9bb9e3b34da24201d8d48d97bea83"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"05ffe94994ffbe2aa43501865c30d1885d9ff190","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        data \u003d {\u0027callback_url\u0027: self._get_agent_url(advertise_address)}"},{"line_number":91,"context_line":"        headers \u003d self._get_ironic_api_version_header()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        if self._get_ironic_api_version()[1] \u003e\u003d 32:"},{"line_number":94,"context_line":"            data[\u0027agent_version\u0027] \u003d version.version_info.release_string()"},{"line_number":95,"context_line":"            headers \u003d self._get_ironic_api_version_header((1, 32))"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7f231b9d_8ac0c6e2","line":93,"range":{"start_line":93,"start_character":9,"end_line":93,"end_character":51},"in_reply_to":"7f231b9d_07a75d0d","updated":"2017-06-19 14:52:17.000000000","message":"Done","commit_id":"1f57b96906c9bb9e3b34da24201d8d48d97bea83"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"8ab2d4b012d0a46e9847932923f3b6b5acbdff6c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    _ironic_api_version \u003d None"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, api_url):"},{"line_number":42,"context_line":"        self.api_url \u003d api_url.rstrip(\u0027/\u0027)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        # Only keep alive a maximum of 2 connections to the API. More will be"},{"line_number":45,"context_line":"        # opened if they are needed, but they will be closed immediately after"}],"source_content_type":"text/x-python","patch_set":13,"id":"bf3e73b7_53d7efc0","line":42,"updated":"2017-08-07 16:56:55.000000000","message":"nit: not knowing how aggressively malformed the input can be, just noting that `rstrip()` might not handle the case like \"http:/abc.com/def/.\" which otherwise seems perfectly valid URL","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"94b2a04a2e4fe6edd04f9ae784c55e637ec3dc8d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    _ironic_api_version \u003d None"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, api_url):"},{"line_number":42,"context_line":"        self.api_url \u003d api_url.rstrip(\u0027/\u0027)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        # Only keep alive a maximum of 2 connections to the API. More will be"},{"line_number":45,"context_line":"        # opened if they are needed, but they will be closed immediately after"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff82abbf_9f15af42","line":42,"in_reply_to":"bf3e73b7_53d7efc0","updated":"2017-11-28 14:47:54.000000000","message":"This isn\u0027t part of this change, if we want to fix this it\u0027ll be a separate patch.","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"005cafcf8263815d2511cf70160b71bb52c2051d","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _get_ironic_api_version(self):"},{"line_number":80,"context_line":"        if not self._ironic_api_version:"},{"line_number":81,"context_line":"            response \u003d self._request(\u0027GET\u0027, \u0027/\u0027)"},{"line_number":82,"context_line":"            data \u003d jsonutils.loads(response.content)"},{"line_number":83,"context_line":"            version \u003d data[\u0027default_version\u0027][\u0027version\u0027].split(\u0027.\u0027)"},{"line_number":84,"context_line":"            self._ironic_api_version \u003d (int(version[0]), int(version[1]))"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_4e9cabbf","line":81,"updated":"2017-08-02 01:04:46.000000000","message":"should we wrap this in a try/except?\n\nand maybe if it doesn\u0027t succeed, use MIN_IRONIC_VERSION (but don\u0027t cache it?)","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3a5f80e2650a37e8f81a4c4629e1e464d8528560","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _get_ironic_api_version(self):"},{"line_number":80,"context_line":"        if not self._ironic_api_version:"},{"line_number":81,"context_line":"            response \u003d self._request(\u0027GET\u0027, \u0027/\u0027)"},{"line_number":82,"context_line":"            data \u003d jsonutils.loads(response.content)"},{"line_number":83,"context_line":"            version \u003d data[\u0027default_version\u0027][\u0027version\u0027].split(\u0027.\u0027)"},{"line_number":84,"context_line":"            self._ironic_api_version \u003d (int(version[0]), int(version[1]))"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_c7575002","line":81,"in_reply_to":"df3967d1_4e9cabbf","updated":"2017-08-02 12:17:36.000000000","message":"+1","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"94b2a04a2e4fe6edd04f9ae784c55e637ec3dc8d","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _get_ironic_api_version(self):"},{"line_number":80,"context_line":"        if not self._ironic_api_version:"},{"line_number":81,"context_line":"            response \u003d self._request(\u0027GET\u0027, \u0027/\u0027)"},{"line_number":82,"context_line":"            data \u003d jsonutils.loads(response.content)"},{"line_number":83,"context_line":"            version \u003d data[\u0027default_version\u0027][\u0027version\u0027].split(\u0027.\u0027)"},{"line_number":84,"context_line":"            self._ironic_api_version \u003d (int(version[0]), int(version[1]))"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff82abbf_ff295b36","line":81,"in_reply_to":"df3967d1_c7575002","updated":"2017-11-28 14:47:54.000000000","message":"Done","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":26340,"name":"Ilya Etingof","email":"etingof@gmail.com","username":"etingof"},"change_message_id":"8ab2d4b012d0a46e9847932923f3b6b5acbdff6c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            response \u003d self._request(\u0027GET\u0027, \u0027/\u0027)"},{"line_number":82,"context_line":"            data \u003d jsonutils.loads(response.content)"},{"line_number":83,"context_line":"            version \u003d data[\u0027default_version\u0027][\u0027version\u0027].split(\u0027.\u0027)"},{"line_number":84,"context_line":"            self._ironic_api_version \u003d (int(version[0]), int(version[1]))"},{"line_number":85,"context_line":"        return self._ironic_api_version"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def heartbeat(self, uuid, advertise_address):"}],"source_content_type":"text/x-python","patch_set":13,"id":"bf3e73b7_33e46bac","line":84,"updated":"2017-08-07 16:56:55.000000000","message":"Also, may be it would make sense to catch possible JSON processing faults as well as possible Key/ValueError caused by mismatching document layout...","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"94b2a04a2e4fe6edd04f9ae784c55e637ec3dc8d","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            response \u003d self._request(\u0027GET\u0027, \u0027/\u0027)"},{"line_number":82,"context_line":"            data \u003d jsonutils.loads(response.content)"},{"line_number":83,"context_line":"            version \u003d data[\u0027default_version\u0027][\u0027version\u0027].split(\u0027.\u0027)"},{"line_number":84,"context_line":"            self._ironic_api_version \u003d (int(version[0]), int(version[1]))"},{"line_number":85,"context_line":"        return self._ironic_api_version"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def heartbeat(self, uuid, advertise_address):"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff82abbf_1fa43fb9","line":84,"in_reply_to":"bf3e73b7_33e46bac","updated":"2017-11-28 14:47:54.000000000","message":"Covering this whole block in a blanket try-except so even faults from processing the returned data will be caught and logged before falling back to MIN_IRONIC_VERSION","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"121da6bba3765fd1c7f01cfea24b60fbbbf5c10e","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        data \u003d {\u0027callback_url\u0027: self._get_agent_url(advertise_address)}"},{"line_number":91,"context_line":"        headers \u003d self._get_ironic_api_version_header()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        if self._get_ironic_api_version() \u003e\u003d (1, 35):"},{"line_number":94,"context_line":"            data[\u0027agent_version\u0027] \u003d version.version_info.release_string()"},{"line_number":95,"context_line":"            headers \u003d self._get_ironic_api_version_header((1, 35))"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_ee2b5f2d","line":93,"updated":"2017-08-02 01:12:47.000000000","message":"there is a bit of a chicken/egg here. We are assuming that ironic 1.35 will have code to handle agent_version... :)\n\nDo we want to land them both \u0027at the same time\u0027? Actually, I feel like we should land the ironic code first...","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c36947294a7c66c1f8cc71e60f189c5a8b4e9ae1","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        data \u003d {\u0027callback_url\u0027: self._get_agent_url(advertise_address)}"},{"line_number":91,"context_line":"        headers \u003d self._get_ironic_api_version_header()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        if self._get_ironic_api_version() \u003e\u003d (1, 35):"},{"line_number":94,"context_line":"            data[\u0027agent_version\u0027] \u003d version.version_info.release_string()"},{"line_number":95,"context_line":"            headers \u003d self._get_ironic_api_version_header((1, 35))"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_87a3889e","line":93,"in_reply_to":"df3967d1_876a68b0","updated":"2017-08-02 12:31:19.000000000","message":"+1 unfortunately other API patches keep landing, so my patches keep being rebased and this version keeps going up, so we\u0027ll have to land the ironic part to lock-in the Ironic API version that adds agent_version to the API.","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3a5f80e2650a37e8f81a4c4629e1e464d8528560","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        data \u003d {\u0027callback_url\u0027: self._get_agent_url(advertise_address)}"},{"line_number":91,"context_line":"        headers \u003d self._get_ironic_api_version_header()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        if self._get_ironic_api_version() \u003e\u003d (1, 35):"},{"line_number":94,"context_line":"            data[\u0027agent_version\u0027] \u003d version.version_info.release_string()"},{"line_number":95,"context_line":"            headers \u003d self._get_ironic_api_version_header((1, 35))"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_876a68b0","line":93,"in_reply_to":"df3967d1_ee2b5f2d","updated":"2017-08-02 12:17:36.000000000","message":"Agree, ironic code first, realistically operators will not touch IPA until they have to because it is not working for them.","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"005cafcf8263815d2511cf70160b71bb52c2051d","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        if self._get_ironic_api_version() \u003e\u003d (1, 35):"},{"line_number":94,"context_line":"            data[\u0027agent_version\u0027] \u003d version.version_info.release_string()"},{"line_number":95,"context_line":"            headers \u003d self._get_ironic_api_version_header((1, 35))"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        try:"},{"line_number":98,"context_line":"            response \u003d self._request(\u0027POST\u0027, path, data\u003ddata, headers\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_ce6adbb1","line":95,"updated":"2017-08-02 01:04:46.000000000","message":"Instead of L91-95, what do you think about\n\nversion \u003d self._get_ironic_api_version()\nif version \u003e\u003d (1,35):\n    data[] \u003d ...\nheaders \u003d self._get_ironic_api_version_header(version)","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"db33d376b37550b5b3714d55be9015b894f14ce0","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        if self._get_ironic_api_version() \u003e\u003d (1, 35):"},{"line_number":94,"context_line":"            data[\u0027agent_version\u0027] \u003d version.version_info.release_string()"},{"line_number":95,"context_line":"            headers \u003d self._get_ironic_api_version_header((1, 35))"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        try:"},{"line_number":98,"context_line":"            response \u003d self._request(\u0027POST\u0027, path, data\u003ddata, headers\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff82abbf_e40c6e95","line":95,"in_reply_to":"df3967d1_ce6adbb1","updated":"2017-11-28 14:02:42.000000000","message":"we should be explicit about the version we are requesting so that the behaviour is known, e.g. if version \u003e\u003d 1.35 and in 1.37 the behaviour of the heartbeat request we\u0027re making changes then this logic will break, but if we pin this specific request to 1.35 then we know regardless of ironic\u0027s max version this request will always behave the same.","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"43ca5293098f1e8555934bb5a2d34de3fec4ea93","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                version \u003d data[\u0027default_version\u0027][\u0027version\u0027].split(\u0027.\u0027)"},{"line_number":86,"context_line":"                self._ironic_api_version \u003d (int(version[0]), int(version[1]))"},{"line_number":87,"context_line":"            except Exception:"},{"line_number":88,"context_line":"                LOG.exception(\"An error occured while attempting to discover\""},{"line_number":89,"context_line":"                              \"the available Ironic API versions, falling back\""},{"line_number":90,"context_line":"                              \"to using version 1.22\")"},{"line_number":91,"context_line":"                return MIN_IRONIC_VERSION"}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_ff030441","line":88,"updated":"2017-12-05 23:11:31.000000000","message":"missing blank space at end, s/discover/discover /\n\noh, also s/occured/occurred/","commit_id":"627a98658be37ef5dd7ee1c2b1584c455c8e78e0"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"8929918029bc35dfe809dff5a35eae59bef895fe","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                version \u003d data[\u0027default_version\u0027][\u0027version\u0027].split(\u0027.\u0027)"},{"line_number":86,"context_line":"                self._ironic_api_version \u003d (int(version[0]), int(version[1]))"},{"line_number":87,"context_line":"            except Exception:"},{"line_number":88,"context_line":"                LOG.exception(\"An error occured while attempting to discover\""},{"line_number":89,"context_line":"                              \"the available Ironic API versions, falling back\""},{"line_number":90,"context_line":"                              \"to using version 1.22\")"},{"line_number":91,"context_line":"                return MIN_IRONIC_VERSION"}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_48ed8623","line":88,"in_reply_to":"df87a7cf_ff030441","updated":"2017-12-06 12:58:18.000000000","message":"Done","commit_id":"627a98658be37ef5dd7ee1c2b1584c455c8e78e0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"43ca5293098f1e8555934bb5a2d34de3fec4ea93","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                self._ironic_api_version \u003d (int(version[0]), int(version[1]))"},{"line_number":87,"context_line":"            except Exception:"},{"line_number":88,"context_line":"                LOG.exception(\"An error occured while attempting to discover\""},{"line_number":89,"context_line":"                              \"the available Ironic API versions, falling back\""},{"line_number":90,"context_line":"                              \"to using version 1.22\")"},{"line_number":91,"context_line":"                return MIN_IRONIC_VERSION"},{"line_number":92,"context_line":"        return self._ironic_api_version"}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_bffd7c3b","line":89,"updated":"2017-12-05 23:11:31.000000000","message":"ditto, missing blank space at end","commit_id":"627a98658be37ef5dd7ee1c2b1584c455c8e78e0"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"8929918029bc35dfe809dff5a35eae59bef895fe","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                self._ironic_api_version \u003d (int(version[0]), int(version[1]))"},{"line_number":87,"context_line":"            except Exception:"},{"line_number":88,"context_line":"                LOG.exception(\"An error occured while attempting to discover\""},{"line_number":89,"context_line":"                              \"the available Ironic API versions, falling back\""},{"line_number":90,"context_line":"                              \"to using version 1.22\")"},{"line_number":91,"context_line":"                return MIN_IRONIC_VERSION"},{"line_number":92,"context_line":"        return self._ironic_api_version"}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_c893d6a2","line":89,"in_reply_to":"df87a7cf_bffd7c3b","updated":"2017-12-06 12:58:18.000000000","message":"Done","commit_id":"627a98658be37ef5dd7ee1c2b1584c455c8e78e0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"43ca5293098f1e8555934bb5a2d34de3fec4ea93","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            except Exception:"},{"line_number":88,"context_line":"                LOG.exception(\"An error occured while attempting to discover\""},{"line_number":89,"context_line":"                              \"the available Ironic API versions, falling back\""},{"line_number":90,"context_line":"                              \"to using version 1.22\")"},{"line_number":91,"context_line":"                return MIN_IRONIC_VERSION"},{"line_number":92,"context_line":"        return self._ironic_api_version"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_5fa2304d","line":90,"updated":"2017-12-05 23:11:31.000000000","message":"this is ok, but if we ever change the value for MIN_IRONIC_VERSION, it won\u0027t be. (up to you if you want to change it)","commit_id":"627a98658be37ef5dd7ee1c2b1584c455c8e78e0"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"8929918029bc35dfe809dff5a35eae59bef895fe","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            except Exception:"},{"line_number":88,"context_line":"                LOG.exception(\"An error occured while attempting to discover\""},{"line_number":89,"context_line":"                              \"the available Ironic API versions, falling back\""},{"line_number":90,"context_line":"                              \"to using version 1.22\")"},{"line_number":91,"context_line":"                return MIN_IRONIC_VERSION"},{"line_number":92,"context_line":"        return self._ironic_api_version"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"df87a7cf_08f77ef7","line":90,"in_reply_to":"df87a7cf_5fa2304d","updated":"2017-12-06 12:58:18.000000000","message":"Done","commit_id":"627a98658be37ef5dd7ee1c2b1584c455c8e78e0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b0ef769928b0d3a8697f4a4fe33bfd6a720f5a18","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        path \u003d self.heartbeat_api.format(uuid\u003duuid)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        data \u003d {\u0027callback_url\u0027: self._get_agent_url(advertise_address)}"},{"line_number":99,"context_line":"        headers \u003d self._get_ironic_api_version_header()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        if self._get_ironic_api_version() \u003e\u003d AGENT_VERSION_IRONIC_VERSION:"},{"line_number":102,"context_line":"            data[\u0027agent_version\u0027] \u003d version.version_info.release_string()"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_16c0f37a","line":99,"updated":"2017-12-06 22:36:53.000000000","message":"Should this be moved to line the area around line 105 but as an else?\n\nIt doesn\u0027t make sense to me to call/assign the value twice unless we absolutely have to.","commit_id":"5407bc96f8ef87bc73df6e4d3c71e0c8bb21ebdd"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"be0a839ae7bf81d6072adcdbfd80008ef4eac621","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        path \u003d self.heartbeat_api.format(uuid\u003duuid)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        data \u003d {\u0027callback_url\u0027: self._get_agent_url(advertise_address)}"},{"line_number":99,"context_line":"        headers \u003d self._get_ironic_api_version_header()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        if self._get_ironic_api_version() \u003e\u003d AGENT_VERSION_IRONIC_VERSION:"},{"line_number":102,"context_line":"            data[\u0027agent_version\u0027] \u003d version.version_info.release_string()"}],"source_content_type":"text/x-python","patch_set":17,"id":"df87a7cf_ee86c613","line":99,"in_reply_to":"df87a7cf_16c0f37a","updated":"2017-12-07 12:16:21.000000000","message":"Done","commit_id":"5407bc96f8ef87bc73df6e4d3c71e0c8bb21ebdd"}],"ironic_python_agent/tests/unit/test_ironic_api_client.py":[{"author":{"_account_id":7080,"name":"Mathieu Mitchell","email":"mat128@gmail.com","username":"mat128"},"change_message_id":"b02e3f29db739956239f0238eaea4c31ba106392","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from ironic_python_agent import hardware"},{"line_number":24,"context_line":"from ironic_python_agent import ironic_api_client"},{"line_number":25,"context_line":"from ironic_python_agent import version"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"API_URL \u003d \u0027http://agent-api.ironic.example.org/\u0027"},{"line_number":28,"context_line":"DRIVER \u003d \u0027agent_ipmitool\u0027"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_ae522011","line":26,"updated":"2016-09-02 11:16:41.000000000","message":"Looks like we are missing an assert in this file?","commit_id":"fc7b309273e8611698ffc55712e097becaac9630"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5828019a58e1f435175409a57d8a3e72187344f0","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def __init__(self, content\u003dNone, status_code\u003d200, headers\u003dNone):"},{"line_number":33,"context_line":"        content \u003d content or {}"},{"line_number":34,"context_line":"        self.content \u003d json.dumps(content)"},{"line_number":35,"context_line":"        self._json \u003d content"},{"line_number":36,"context_line":"        self.status_code \u003d status_code"},{"line_number":37,"context_line":"        self.headers \u003d headers or {}"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_dbd46bed","line":35,"updated":"2016-09-07 22:12:02.000000000","message":"What does this addition do? I don\u0027t see it being used anywhere","commit_id":"e81ecafe2caef4644a0a1a4d3a421d0801832796"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5828019a58e1f435175409a57d8a3e72187344f0","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.status_code \u003d status_code"},{"line_number":37,"context_line":"        self.headers \u003d headers or {}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def json(self):"},{"line_number":40,"context_line":"        return self._json"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_fbcf6f53","line":39,"updated":"2016-09-07 22:12:02.000000000","message":"ditto","commit_id":"e81ecafe2caef4644a0a1a4d3a421d0801832796"},{"author":{"_account_id":20522,"name":"Aline Bousquet","email":"albousque@gmail.com","username":"alineb"},"change_message_id":"1db3a05ed22eeb3bffaf1b289170c310e09a5204","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            )"},{"line_number":116,"context_line":"        except errors.HeartbeatError as e:"},{"line_number":117,"context_line":"            excp \u003d e"},{"line_number":118,"context_line":"        self.assertEqual(None, excp)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def test_heartbeat_requests_exception(self):"},{"line_number":121,"context_line":"        self.api_client.session.request \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_55ae3e2e","line":118,"updated":"2016-09-08 15:17:15.000000000","message":"Why isn\u0027t request_args checked here as it is in the other tests?","commit_id":"e81ecafe2caef4644a0a1a4d3a421d0801832796"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"005cafcf8263815d2511cf70160b71bb52c2051d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def setUp(self):"},{"line_number":42,"context_line":"        super(TestBaseIronicPythonAgent, self).setUp()"},{"line_number":43,"context_line":"        self.api_client \u003d ironic_api_client.APIClient(API_URL)"},{"line_number":44,"context_line":"        self.api_client._ironic_api_version \u003d (1, 22)"},{"line_number":45,"context_line":"        self.hardware_info \u003d {"},{"line_number":46,"context_line":"            \u0027interfaces\u0027: ["},{"line_number":47,"context_line":"                hardware.NetworkInterface("}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_eef6bff9","line":44,"updated":"2017-08-02 01:04:46.000000000","message":"or s/(1, 22)/ironic_api_client.MIN_IRONIC_VERSION/","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"94b2a04a2e4fe6edd04f9ae784c55e637ec3dc8d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def setUp(self):"},{"line_number":42,"context_line":"        super(TestBaseIronicPythonAgent, self).setUp()"},{"line_number":43,"context_line":"        self.api_client \u003d ironic_api_client.APIClient(API_URL)"},{"line_number":44,"context_line":"        self.api_client._ironic_api_version \u003d (1, 22)"},{"line_number":45,"context_line":"        self.hardware_info \u003d {"},{"line_number":46,"context_line":"            \u0027interfaces\u0027: ["},{"line_number":47,"context_line":"                hardware.NetworkInterface("}],"source_content_type":"text/x-python","patch_set":13,"id":"ff82abbf_5f2de7a5","line":44,"in_reply_to":"df3967d1_eef6bff9","updated":"2017-11-28 14:47:54.000000000","message":"Done","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"005cafcf8263815d2511cf70160b71bb52c2051d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        }"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def test__get_ironic_api_version_already_set(self):"},{"line_number":67,"context_line":"        self.assertEqual(self.api_client._get_ironic_api_version(), (1, 22))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test__get_ironic_api_version_fresh(self):"},{"line_number":70,"context_line":"        self.api_client._ironic_api_version \u003d None"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_eecfdfad","line":67,"updated":"2017-08-02 01:04:46.000000000","message":"the other way around, .assertEqual(expected, actual)","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"94b2a04a2e4fe6edd04f9ae784c55e637ec3dc8d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        }"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def test__get_ironic_api_version_already_set(self):"},{"line_number":67,"context_line":"        self.assertEqual(self.api_client._get_ironic_api_version(), (1, 22))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test__get_ironic_api_version_fresh(self):"},{"line_number":70,"context_line":"        self.api_client._ironic_api_version \u003d None"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff82abbf_7f28eb95","line":67,"in_reply_to":"df3967d1_eecfdfad","updated":"2017-11-28 14:47:54.000000000","message":"Done","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"005cafcf8263815d2511cf70160b71bb52c2051d","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.api_client.session.request \u003d mock.Mock()"},{"line_number":86,"context_line":"        self.api_client.session.request.return_value \u003d response"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.assertEqual(self.api_client._get_ironic_api_version(), (1, 31))"},{"line_number":89,"context_line":"        self.assertEqual((1, 31), self.api_client._ironic_api_version)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def test_successful_heartbeat(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_6ebbef0d","line":88,"updated":"2017-08-02 01:04:46.000000000","message":"ditto","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"94b2a04a2e4fe6edd04f9ae784c55e637ec3dc8d","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.api_client.session.request \u003d mock.Mock()"},{"line_number":86,"context_line":"        self.api_client.session.request.return_value \u003d response"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.assertEqual(self.api_client._get_ironic_api_version(), (1, 31))"},{"line_number":89,"context_line":"        self.assertEqual((1, 31), self.api_client._ironic_api_version)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def test_successful_heartbeat(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff82abbf_9f104f59","line":88,"in_reply_to":"df3967d1_6ebbef0d","updated":"2017-11-28 14:47:54.000000000","message":"Done","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"1f81a0995c99651ffea0ff0c800f268977d3148d","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.assertEqual(API_URL + heartbeat_path, request_args[1])"},{"line_number":130,"context_line":"        expected_data \u003d {"},{"line_number":131,"context_line":"            \u0027callback_url\u0027: \u0027http://[fc00:1111::4]:9999\u0027,"},{"line_number":132,"context_line":"            \u0027agent_version\u0027: version.version_info.release_string()}"},{"line_number":133,"context_line":"        self.assertEqual(jsonutils.dumps(expected_data), data)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def test_heartbeat_agent_version_unsupported(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_0b7343b3","line":132,"updated":"2017-08-01 15:42:01.000000000","message":"don\u0027t we also need to do the same test for lookup?","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d32c744f7bee3cf3cc1050e64b2a56711d702626","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.assertEqual(API_URL + heartbeat_path, request_args[1])"},{"line_number":130,"context_line":"        expected_data \u003d {"},{"line_number":131,"context_line":"            \u0027callback_url\u0027: \u0027http://[fc00:1111::4]:9999\u0027,"},{"line_number":132,"context_line":"            \u0027agent_version\u0027: version.version_info.release_string()}"},{"line_number":133,"context_line":"        self.assertEqual(jsonutils.dumps(expected_data), data)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def test_heartbeat_agent_version_unsupported(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_8bb3b34d","line":132,"in_reply_to":"df3967d1_0b7343b3","updated":"2017-08-01 15:43:35.000000000","message":"lookup is a GET request, no data is passed from IPA to Ironic as part of that request","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9ed6b0acf5e57b4ef604c7e73c57daf89aaef969","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.assertEqual(API_URL + heartbeat_path, request_args[1])"},{"line_number":130,"context_line":"        expected_data \u003d {"},{"line_number":131,"context_line":"            \u0027callback_url\u0027: \u0027http://[fc00:1111::4]:9999\u0027,"},{"line_number":132,"context_line":"            \u0027agent_version\u0027: version.version_info.release_string()}"},{"line_number":133,"context_line":"        self.assertEqual(jsonutils.dumps(expected_data), data)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def test_heartbeat_agent_version_unsupported(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"df3967d1_0bf6a3fa","line":132,"in_reply_to":"df3967d1_8bb3b34d","updated":"2017-08-01 15:45:57.000000000","message":"Oh, sorry, I\u0027m a bit dumb, you only pass ironic api version in the lookup","commit_id":"00bb0a283ee1e2650dcb4820aeadc4fcef0ee049"}],"releasenotes/notes/start_passing_agent_version_to_ironic-6fa8670ae0e7eb38.yaml":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a90f18b45144945edcde4ead63ea6d28f253c2b4","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":"    Now passes an ``agent_version`` field to the bare metal service as part of"},{"line_number":5,"context_line":"    the heartbeat request if the bare metal service API version is new enough."},{"line_number":6,"context_line":"    This provides the bare metal service with the information required to"},{"line_number":7,"context_line":"    determine what agent features are available, so that the bare metal service"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"df87a7cf_c928b735","line":4,"updated":"2017-12-06 15:16:38.000000000","message":"nit s/bare metal service/Bare Metal service/","commit_id":"5407bc96f8ef87bc73df6e4d3c71e0c8bb21ebdd"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"be0a839ae7bf81d6072adcdbfd80008ef4eac621","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":"    Now passes an ``agent_version`` field to the bare metal service as part of"},{"line_number":5,"context_line":"    the heartbeat request if the bare metal service API version is new enough."},{"line_number":6,"context_line":"    This provides the bare metal service with the information required to"},{"line_number":7,"context_line":"    determine what agent features are available, so that the bare metal service"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"df87a7cf_6e72b64b","line":4,"in_reply_to":"df87a7cf_c928b735","updated":"2017-12-07 12:16:21.000000000","message":"Done","commit_id":"5407bc96f8ef87bc73df6e4d3c71e0c8bb21ebdd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a90f18b45144945edcde4ead63ea6d28f253c2b4","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Now passes an ``agent_version`` field to the bare metal service as part of"},{"line_number":5,"context_line":"    the heartbeat request if the bare metal service API version is new enough."},{"line_number":6,"context_line":"    This provides the bare metal service with the information required to"},{"line_number":7,"context_line":"    determine what agent features are available, so that the bare metal service"},{"line_number":8,"context_line":"    can be updated before the agent version, whilst preventing the bare metal"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"df87a7cf_29c04350","line":5,"updated":"2017-12-06 15:16:38.000000000","message":"Dmitry refers to it as \u0027Bare Metal API version\u0027.\n\nI wonder if we should be explicit and s/new enough/1.36 or higher/","commit_id":"5407bc96f8ef87bc73df6e4d3c71e0c8bb21ebdd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b0ef769928b0d3a8697f4a4fe33bfd6a720f5a18","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Now passes an ``agent_version`` field to the bare metal service as part of"},{"line_number":5,"context_line":"    the heartbeat request if the bare metal service API version is new enough."},{"line_number":6,"context_line":"    This provides the bare metal service with the information required to"},{"line_number":7,"context_line":"    determine what agent features are available, so that the bare metal service"},{"line_number":8,"context_line":"    can be updated before the agent version, whilst preventing the bare metal"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"df87a7cf_b644a71c","line":5,"in_reply_to":"df87a7cf_29c04350","updated":"2017-12-06 22:36:53.000000000","message":"++","commit_id":"5407bc96f8ef87bc73df6e4d3c71e0c8bb21ebdd"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"be0a839ae7bf81d6072adcdbfd80008ef4eac621","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Now passes an ``agent_version`` field to the bare metal service as part of"},{"line_number":5,"context_line":"    the heartbeat request if the bare metal service API version is new enough."},{"line_number":6,"context_line":"    This provides the bare metal service with the information required to"},{"line_number":7,"context_line":"    determine what agent features are available, so that the bare metal service"},{"line_number":8,"context_line":"    can be updated before the agent version, whilst preventing the bare metal"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"df87a7cf_0e91aa47","line":5,"in_reply_to":"df87a7cf_b644a71c","updated":"2017-12-07 12:16:21.000000000","message":"Done","commit_id":"5407bc96f8ef87bc73df6e4d3c71e0c8bb21ebdd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"a90f18b45144945edcde4ead63ea6d28f253c2b4","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    the heartbeat request if the bare metal service API version is new enough."},{"line_number":6,"context_line":"    This provides the bare metal service with the information required to"},{"line_number":7,"context_line":"    determine what agent features are available, so that the bare metal service"},{"line_number":8,"context_line":"    can be updated before the agent version, whilst preventing the bare metal"},{"line_number":9,"context_line":"    service requesting agent features that aren\u0027t yet available."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"df87a7cf_89d06f21","line":8,"updated":"2017-12-06 15:16:38.000000000","message":"by \u0027updated\u0027 you mean upgraded to a new release/version, right?","commit_id":"5407bc96f8ef87bc73df6e4d3c71e0c8bb21ebdd"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"be0a839ae7bf81d6072adcdbfd80008ef4eac621","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    the heartbeat request if the bare metal service API version is new enough."},{"line_number":6,"context_line":"    This provides the bare metal service with the information required to"},{"line_number":7,"context_line":"    determine what agent features are available, so that the bare metal service"},{"line_number":8,"context_line":"    can be updated before the agent version, whilst preventing the bare metal"},{"line_number":9,"context_line":"    service requesting agent features that aren\u0027t yet available."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"df87a7cf_4e1fb2b6","line":8,"in_reply_to":"df87a7cf_89d06f21","updated":"2017-12-07 12:16:21.000000000","message":"Done","commit_id":"5407bc96f8ef87bc73df6e4d3c71e0c8bb21ebdd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b0ef769928b0d3a8697f4a4fe33bfd6a720f5a18","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    This provides the bare metal service with the information required to"},{"line_number":7,"context_line":"    determine what agent features are available, so that the bare metal service"},{"line_number":8,"context_line":"    can be updated before the agent version, whilst preventing the bare metal"},{"line_number":9,"context_line":"    service requesting agent features that aren\u0027t yet available."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"df87a7cf_965ac3f0","line":9,"range":{"start_line":9,"start_character":43,"end_line":9,"end_character":49},"updated":"2017-12-06 22:36:53.000000000","message":"nit: I think we should not use a contraction.","commit_id":"5407bc96f8ef87bc73df6e4d3c71e0c8bb21ebdd"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"be0a839ae7bf81d6072adcdbfd80008ef4eac621","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    This provides the bare metal service with the information required to"},{"line_number":7,"context_line":"    determine what agent features are available, so that the bare metal service"},{"line_number":8,"context_line":"    can be updated before the agent version, whilst preventing the bare metal"},{"line_number":9,"context_line":"    service requesting agent features that aren\u0027t yet available."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"df87a7cf_0e7beaf4","line":9,"range":{"start_line":9,"start_character":43,"end_line":9,"end_character":49},"in_reply_to":"df87a7cf_965ac3f0","updated":"2017-12-07 12:16:21.000000000","message":"Done","commit_id":"5407bc96f8ef87bc73df6e4d3c71e0c8bb21ebdd"}]}
