)]}'
{"openstack/baremetal/v1/_proxy.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a2afadcb61d3007c0c2461526309cdf7ebca07c1","unresolved":false,"context_lines":[{"line_number":905,"context_line":"        res \u003d self._get_resource(_allocation.Allocation, allocation)"},{"line_number":906,"context_line":"        return res.wait(self, timeout\u003dtimeout, ignore_error\u003dignore_error)"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"    def add_trait(self, node, trait):"},{"line_number":909,"context_line":"        \"\"\"Add a trait to a node."},{"line_number":910,"context_line":""},{"line_number":911,"context_line":"        :param node: The value can be the name or ID of a node or a"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_251a0117","line":908,"updated":"2019-07-24 06:42:01.000000000","message":"nit: maybe add_node_trait, remove_node_trait and set_node_traits? I don\u0027t expect anything else to have traits, but it may be clearer, since all other calls have an object.","commit_id":"a34348934ad1bc5f15e2273273c24378e68f632b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"00198b9c018b43076bfda0ce0d71155229be6021","unresolved":false,"context_lines":[{"line_number":905,"context_line":"        res \u003d self._get_resource(_allocation.Allocation, allocation)"},{"line_number":906,"context_line":"        return res.wait(self, timeout\u003dtimeout, ignore_error\u003dignore_error)"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"    def add_trait(self, node, trait):"},{"line_number":909,"context_line":"        \"\"\"Add a trait to a node."},{"line_number":910,"context_line":""},{"line_number":911,"context_line":"        :param node: The value can be the name or ID of a node or a"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_5bdb607c","line":908,"in_reply_to":"7faddb67_251a0117","updated":"2019-07-24 08:44:24.000000000","message":"makes sense, I changed them","commit_id":"a34348934ad1bc5f15e2273273c24378e68f632b"}],"openstack/baremetal/v1/node.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb1d34a40b75635bee44b450459efc11311a94fb","unresolved":false,"context_lines":[{"line_number":728,"context_line":"        :returns: The updated :class:`~openstack.baremetal.v1.node.Node`"},{"line_number":729,"context_line":"        \"\"\""},{"line_number":730,"context_line":"        session \u003d self._get_session(session)"},{"line_number":731,"context_line":"        version \u003d utils.pick_microversion(session, None)"},{"line_number":732,"context_line":"        request \u003d self._prepare_request(requires_id\u003dTrue)"},{"line_number":733,"context_line":"        request.url \u003d utils.urljoin(request.url, \u0027traits\u0027, trait)"},{"line_number":734,"context_line":"        response \u003d session.put("}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_6a3f73b5","line":731,"updated":"2019-07-23 14:53:06.000000000","message":"s/None/\"1.37\"/ since that\u0027s what traits API requires","commit_id":"06d660db84fded6507dce556ee23c064e4141f3a"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"ab7580779e1d51a65d562b812ae3f305887fbf34","unresolved":false,"context_lines":[{"line_number":728,"context_line":"        :returns: The updated :class:`~openstack.baremetal.v1.node.Node`"},{"line_number":729,"context_line":"        \"\"\""},{"line_number":730,"context_line":"        session \u003d self._get_session(session)"},{"line_number":731,"context_line":"        version \u003d utils.pick_microversion(session, None)"},{"line_number":732,"context_line":"        request \u003d self._prepare_request(requires_id\u003dTrue)"},{"line_number":733,"context_line":"        request.url \u003d utils.urljoin(request.url, \u0027traits\u0027, trait)"},{"line_number":734,"context_line":"        response \u003d session.put("}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_f47ca1ec","line":731,"in_reply_to":"7faddb67_6a3f73b5","updated":"2019-07-24 00:31:52.000000000","message":"I blame the heat for this. done! :)","commit_id":"06d660db84fded6507dce556ee23c064e4141f3a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb1d34a40b75635bee44b450459efc11311a94fb","unresolved":false,"context_lines":[{"line_number":748,"context_line":"        :returns: The updated :class:`~openstack.baremetal.v1.node.Node`"},{"line_number":749,"context_line":"        \"\"\""},{"line_number":750,"context_line":"        session \u003d self._get_session(session)"},{"line_number":751,"context_line":"        version \u003d utils.pick_microversion(session, None)"},{"line_number":752,"context_line":"        request \u003d self._prepare_request(requires_id\u003dTrue)"},{"line_number":753,"context_line":"        request.url \u003d utils.urljoin(request.url, \u0027traits\u0027, trait)"},{"line_number":754,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_8a3c2fc0","line":751,"updated":"2019-07-23 14:53:06.000000000","message":"ditto","commit_id":"06d660db84fded6507dce556ee23c064e4141f3a"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"ab7580779e1d51a65d562b812ae3f305887fbf34","unresolved":false,"context_lines":[{"line_number":748,"context_line":"        :returns: The updated :class:`~openstack.baremetal.v1.node.Node`"},{"line_number":749,"context_line":"        \"\"\""},{"line_number":750,"context_line":"        session \u003d self._get_session(session)"},{"line_number":751,"context_line":"        version \u003d utils.pick_microversion(session, None)"},{"line_number":752,"context_line":"        request \u003d self._prepare_request(requires_id\u003dTrue)"},{"line_number":753,"context_line":"        request.url \u003d utils.urljoin(request.url, \u0027traits\u0027, trait)"},{"line_number":754,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_9481adc6","line":751,"in_reply_to":"7faddb67_8a3c2fc0","updated":"2019-07-24 00:31:52.000000000","message":"done","commit_id":"06d660db84fded6507dce556ee23c064e4141f3a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb1d34a40b75635bee44b450459efc11311a94fb","unresolved":false,"context_lines":[{"line_number":759,"context_line":"        if response.status_code \u003d\u003d 400:"},{"line_number":760,"context_line":"            session.log.debug("},{"line_number":761,"context_line":"                \u0027Trait %(trait)s was already removed from node %(node)s\u0027,"},{"line_number":762,"context_line":"                {\u0027trait\u0027: trait, \u0027node\u0027: self.id})"},{"line_number":763,"context_line":"            return False"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"        msg \u003d (\"Failed to remove trait {trait} from bare metal node {node}\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_2a497b5f","line":762,"updated":"2019-07-23 14:53:06.000000000","message":"This behavior is usually regulated by a parameter, see delete_* methods","commit_id":"06d660db84fded6507dce556ee23c064e4141f3a"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"ab7580779e1d51a65d562b812ae3f305887fbf34","unresolved":false,"context_lines":[{"line_number":759,"context_line":"        if response.status_code \u003d\u003d 400:"},{"line_number":760,"context_line":"            session.log.debug("},{"line_number":761,"context_line":"                \u0027Trait %(trait)s was already removed from node %(node)s\u0027,"},{"line_number":762,"context_line":"                {\u0027trait\u0027: trait, \u0027node\u0027: self.id})"},{"line_number":763,"context_line":"            return False"},{"line_number":764,"context_line":""},{"line_number":765,"context_line":"        msg \u003d (\"Failed to remove trait {trait} from bare metal node {node}\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_546b351e","line":762,"in_reply_to":"7faddb67_2a497b5f","updated":"2019-07-24 00:31:52.000000000","message":"I ignored that the ignore_missing parameter was missing :/\ndone!","commit_id":"06d660db84fded6507dce556ee23c064e4141f3a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb1d34a40b75635bee44b450459efc11311a94fb","unresolved":false,"context_lines":[{"line_number":766,"context_line":"               .format(node\u003dself.id, trait\u003dtrait))"},{"line_number":767,"context_line":"        exceptions.raise_from_response(response, error_message\u003dmsg)"},{"line_number":768,"context_line":"        return True"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"NodeDetail \u003d Node"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_4a463752","line":769,"updated":"2019-07-23 14:53:06.000000000","message":"Maybe expose set_traits as well?","commit_id":"06d660db84fded6507dce556ee23c064e4141f3a"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"ab7580779e1d51a65d562b812ae3f305887fbf34","unresolved":false,"context_lines":[{"line_number":766,"context_line":"               .format(node\u003dself.id, trait\u003dtrait))"},{"line_number":767,"context_line":"        exceptions.raise_from_response(response, error_message\u003dmsg)"},{"line_number":768,"context_line":"        return True"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"NodeDetail \u003d Node"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_7468b120","line":769,"in_reply_to":"7faddb67_4a463752","updated":"2019-07-24 00:31:52.000000000","message":"done!","commit_id":"06d660db84fded6507dce556ee23c064e4141f3a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cb5e13aeceff5de9e38b01b9a8b4f2944b4f6603","unresolved":false,"context_lines":[{"line_number":735,"context_line":"            request.url, json\u003dNone,"},{"line_number":736,"context_line":"            headers\u003drequest.headers, microversion\u003dversion,"},{"line_number":737,"context_line":"            retriable_status_codes\u003d_common.RETRIABLE_STATUS_CODES)"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"        msg \u003d (\"Failed to add trait {trait} for node {node}\""},{"line_number":740,"context_line":"               .format(trait\u003dtrait, node\u003dself.id))"},{"line_number":741,"context_line":"        exceptions.raise_from_response(response, error_message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_91620616","line":738,"updated":"2019-07-25 08:06:37.000000000","message":"Let us do\n\n self.traits \u003d list(set(self.traits or ()) | {trait})\n\nor something like that to ensure the list is more or less up-to-date without reloading the node.\n\nor maybe we should just refresh the node?\n\nUPD: it has to go after the error check, of course","commit_id":"92b36647b32e69dc5a7d7a98dc0e82c4bbd52ad7"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"f86a7a13b40ccc9532c32eeeaf830801ad889ded","unresolved":false,"context_lines":[{"line_number":735,"context_line":"            request.url, json\u003dNone,"},{"line_number":736,"context_line":"            headers\u003drequest.headers, microversion\u003dversion,"},{"line_number":737,"context_line":"            retriable_status_codes\u003d_common.RETRIABLE_STATUS_CODES)"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"        msg \u003d (\"Failed to add trait {trait} for node {node}\""},{"line_number":740,"context_line":"               .format(trait\u003dtrait, node\u003dself.id))"},{"line_number":741,"context_line":"        exceptions.raise_from_response(response, error_message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_a32d7047","line":738,"in_reply_to":"7faddb67_91620616","updated":"2019-07-25 14:11:04.000000000","message":"I opted for the first solution, thanks!","commit_id":"92b36647b32e69dc5a7d7a98dc0e82c4bbd52ad7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cb5e13aeceff5de9e38b01b9a8b4f2944b4f6603","unresolved":false,"context_lines":[{"line_number":768,"context_line":""},{"line_number":769,"context_line":"        msg \u003d (\"Failed to remove trait {trait} from bare metal node {node}\""},{"line_number":770,"context_line":"               .format(node\u003dself.id, trait\u003dtrait))"},{"line_number":771,"context_line":"        exceptions.raise_from_response(response, error_message\u003dmsg)"},{"line_number":772,"context_line":"        return True"},{"line_number":773,"context_line":""},{"line_number":774,"context_line":"    def set_traits(self, session, traits):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_b165c21f","line":771,"updated":"2019-07-25 08:06:37.000000000","message":"ditto","commit_id":"92b36647b32e69dc5a7d7a98dc0e82c4bbd52ad7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cb5e13aeceff5de9e38b01b9a8b4f2944b4f6603","unresolved":false,"context_lines":[{"line_number":795,"context_line":""},{"line_number":796,"context_line":"        msg \u003d (\"Failed to set traits for node {node}\""},{"line_number":797,"context_line":"               .format(node\u003dself.id))"},{"line_number":798,"context_line":"        exceptions.raise_from_response(response, error_message\u003dmsg)"},{"line_number":799,"context_line":""},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"NodeDetail \u003d Node"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_516c8e07","line":798,"updated":"2019-07-25 08:06:37.000000000","message":"even easier here:\n\n self.traits \u003d traits\n\n(or refresh)","commit_id":"92b36647b32e69dc5a7d7a98dc0e82c4bbd52ad7"}],"openstack/tests/functional/baremetal/test_baremetal_node.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"278cb64dcedede92c1cc68dd737a8e1428cf02f0","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        self.assertTrue(node.is_maintenance)"},{"line_number":262,"context_line":"        self.assertEqual(reason, node.maintenance_reason)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def test_add_remove_trait(self):"},{"line_number":265,"context_line":"        node \u003d self.create_node()"},{"line_number":266,"context_line":"        self.assertIsNone(node.traits)"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_aad00e55","line":264,"updated":"2019-07-23 12:44:01.000000000","message":"This has to go in a separate class with min_microversion set accordingly","commit_id":"21c5164e688b9cb87b524e7d12716bb2a158d954"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"278cb64dcedede92c1cc68dd737a8e1428cf02f0","unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def test_add_remove_trait(self):"},{"line_number":265,"context_line":"        node \u003d self.create_node()"},{"line_number":266,"context_line":"        self.assertIsNone(node.traits)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        self.conn.baremetal.add_trait(node, \u0027fake_trait\u0027)"},{"line_number":269,"context_line":"        node \u003d self.conn.baremetal.get_node(node.id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_cad54a45","line":266,"updated":"2019-07-23 12:44:01.000000000","message":"doesn\u0027t work, the actual value is []","commit_id":"21c5164e688b9cb87b524e7d12716bb2a158d954"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"278cb64dcedede92c1cc68dd737a8e1428cf02f0","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        self.conn.baremetal.remove_trait(node, \u0027fake_trait\u0027)"},{"line_number":273,"context_line":"        node \u003d self.conn.baremetal.get_node(node.id)"},{"line_number":274,"context_line":"        self.assertIsNone(node.traits)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"class TestBareMetalNodeFields(base.BaseBaremetalTest):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_6aca16a2","line":274,"updated":"2019-07-23 12:44:01.000000000","message":"ditto","commit_id":"21c5164e688b9cb87b524e7d12716bb2a158d954"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fb1d34a40b75635bee44b450459efc11311a94fb","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"class TestTraits(base.BaseBaremetalTest):"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    min_microversion \u003d \u00271.1\u0027"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def setUp(self):"},{"line_number":313,"context_line":"        super(TestTraits, self).setUp()"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_ea74c39e","line":310,"updated":"2019-07-23 14:53:06.000000000","message":"1.37","commit_id":"06d660db84fded6507dce556ee23c064e4141f3a"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"ab7580779e1d51a65d562b812ae3f305887fbf34","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"class TestTraits(base.BaseBaremetalTest):"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    min_microversion \u003d \u00271.1\u0027"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def setUp(self):"},{"line_number":313,"context_line":"        super(TestTraits, self).setUp()"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_1475bdfa","line":310,"in_reply_to":"7faddb67_ea74c39e","updated":"2019-07-24 00:31:52.000000000","message":"done","commit_id":"06d660db84fded6507dce556ee23c064e4141f3a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a2afadcb61d3007c0c2461526309cdf7ebca07c1","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":318,"context_line":"        self.assertEqual([], node.traits)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        self.conn.baremetal.add_trait(self.node, \u0027fake_trait\u0027)"},{"line_number":321,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":322,"context_line":"        self.assertEqual([\u0027fake_trait\u0027], node.traits)"},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_6520f94a","line":320,"updated":"2019-07-24 06:42:01.000000000","message":"SIGH, sorry for spotting one thing at a time.. as you see in the ironic job, this is not a valid trait name, you\u0027re looking for something like CUSTOM_FAKE and CUSTOM_REAL.","commit_id":"a34348934ad1bc5f15e2273273c24378e68f632b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"00198b9c018b43076bfda0ce0d71155229be6021","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":318,"context_line":"        self.assertEqual([], node.traits)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        self.conn.baremetal.add_trait(self.node, \u0027fake_trait\u0027)"},{"line_number":321,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":322,"context_line":"        self.assertEqual([\u0027fake_trait\u0027], node.traits)"},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_dbe75046","line":320,"in_reply_to":"7faddb67_6520f94a","updated":"2019-07-24 08:44:24.000000000","message":"I literally had the spec page opened when adding this.....\nI blame the late hour :/\nanyway, done","commit_id":"a34348934ad1bc5f15e2273273c24378e68f632b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a2afadcb61d3007c0c2461526309cdf7ebca07c1","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        self.assertEqual([], node.traits)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        traits1 \u003d [\u0027fake_trait\u0027, \u0027real_trait\u0027]"},{"line_number":337,"context_line":"        traits2 \u003d [\u0027foobar\u0027]"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        self.conn.baremetal.set_traits(self.node, traits1)"},{"line_number":340,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_851df510","line":337,"updated":"2019-07-24 06:42:01.000000000","message":"ditto","commit_id":"a34348934ad1bc5f15e2273273c24378e68f632b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"00198b9c018b43076bfda0ce0d71155229be6021","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        self.assertEqual([], node.traits)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        traits1 \u003d [\u0027fake_trait\u0027, \u0027real_trait\u0027]"},{"line_number":337,"context_line":"        traits2 \u003d [\u0027foobar\u0027]"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        self.conn.baremetal.set_traits(self.node, traits1)"},{"line_number":340,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_fbec8c2a","line":337,"in_reply_to":"7faddb67_851df510","updated":"2019-07-24 08:44:24.000000000","message":"done","commit_id":"a34348934ad1bc5f15e2273273c24378e68f632b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f992bdf571b94a99e1590c4f001dd3b67c18ffc4","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":318,"context_line":"        self.assertEqual([], node.traits)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        self.conn.baremetal.add_trait(self.node, \u0027CUSTOM_FAKE\u0027)"},{"line_number":321,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":322,"context_line":"        self.assertEqual([\u0027CUSTOM_FAKE\u0027], node.traits)"},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_78497f5e","line":320,"updated":"2019-07-24 10:34:27.000000000","message":"needs updating here and below to add \"node\"","commit_id":"0e6c88612976b9c4953794eea03d29bd5dcb24d2"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a55bb322a4aa71baa0662fe0dff280f3eea915e2","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        self.conn.baremetal.remove_node_trait(node, \u0027CUSTOM_FAKE\u0027,"},{"line_number":329,"context_line":"                                              ignore_missing\u003dFalse)"},{"line_number":330,"context_line":"        self.assertEqual([\u0027CUSTOM_REAL\u0027], node.traits)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def test_set_node_traits(self):"},{"line_number":333,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_de6f3b90","line":330,"updated":"2019-07-24 12:26:50.000000000","message":"you need to do get_node before this.\n\nwhich raises a good question: maybe we should try to update `node` to simulate the outcome of the API call?","commit_id":"8289933a0844b9a4e800732b38beebb1a1d4bac6"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"9c2faf1ed40df2a1366a590e314b78638afb6210","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"        self.conn.baremetal.remove_node_trait(node, \u0027CUSTOM_FAKE\u0027,"},{"line_number":329,"context_line":"                                              ignore_missing\u003dFalse)"},{"line_number":330,"context_line":"        self.assertEqual([\u0027CUSTOM_REAL\u0027], node.traits)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def test_set_node_traits(self):"},{"line_number":333,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_1e7153e1","line":330,"in_reply_to":"7faddb67_de6f3b90","updated":"2019-07-24 12:53:59.000000000","message":"I think we should keep using get_node here, to test remove_node_trait directly, but I can add a test with update_node separately","commit_id":"8289933a0844b9a4e800732b38beebb1a1d4bac6"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"cb5e13aeceff5de9e38b01b9a8b4f2944b4f6603","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        traits1 \u003d [\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027]"},{"line_number":353,"context_line":"        traits2 \u003d [\u0027CUSTOM_FOOBAR\u0027]"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        node \u003d self.conn.baremetal.update_node(node, traits\u003dtraits1)"},{"line_number":356,"context_line":"        self.assertEqual([\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027], node.traits)"},{"line_number":357,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":358,"context_line":"        self.assertEqual([\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027], node.traits)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_716f4afc","line":355,"updated":"2019-07-25 08:06:37.000000000","message":"This test won\u0027t work unless you write explicit code for that.","commit_id":"92b36647b32e69dc5a7d7a98dc0e82c4bbd52ad7"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"83d5fad20adc7254d253a6fb79d8b322b6771139","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        traits1 \u003d [\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027]"},{"line_number":353,"context_line":"        traits2 \u003d [\u0027CUSTOM_FOOBAR\u0027]"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        node \u003d self.conn.baremetal.update_node(node, traits\u003dtraits1)"},{"line_number":356,"context_line":"        self.assertEqual([\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027], node.traits)"},{"line_number":357,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":358,"context_line":"        self.assertEqual([\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027], node.traits)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_8b488a87","line":355,"in_reply_to":"7faddb67_0b99fa77","updated":"2019-07-25 16:36:21.000000000","message":"ok, clear now","commit_id":"92b36647b32e69dc5a7d7a98dc0e82c4bbd52ad7"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"f86a7a13b40ccc9532c32eeeaf830801ad889ded","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        traits1 \u003d [\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027]"},{"line_number":353,"context_line":"        traits2 \u003d [\u0027CUSTOM_FOOBAR\u0027]"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        node \u003d self.conn.baremetal.update_node(node, traits\u003dtraits1)"},{"line_number":356,"context_line":"        self.assertEqual([\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027], node.traits)"},{"line_number":357,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":358,"context_line":"        self.assertEqual([\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027], node.traits)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_e39da866","line":355,"in_reply_to":"7faddb67_716f4afc","updated":"2019-07-25 14:11:04.000000000","message":"oh whoops! I think I ignored this comment, sorry!\nI\u0027m probably missing or misunderstanding something, shouldn\u0027t the update_node method update the traits values ?","commit_id":"92b36647b32e69dc5a7d7a98dc0e82c4bbd52ad7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"fab97c8df202f759e21e2ebcb03aef2712851660","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        traits1 \u003d [\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027]"},{"line_number":353,"context_line":"        traits2 \u003d [\u0027CUSTOM_FOOBAR\u0027]"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        node \u003d self.conn.baremetal.update_node(node, traits\u003dtraits1)"},{"line_number":356,"context_line":"        self.assertEqual([\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027], node.traits)"},{"line_number":357,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":358,"context_line":"        self.assertEqual([\u0027CUSTOM_FAKE\u0027, \u0027CUSTOM_REAL\u0027], node.traits)"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_0b99fa77","line":355,"in_reply_to":"7faddb67_e39da866","updated":"2019-07-25 16:16:32.000000000","message":"update_node cannot update traits, since they\u0027re not regular fields. I suggest we remove this test for now and implement it separately.","commit_id":"92b36647b32e69dc5a7d7a98dc0e82c4bbd52ad7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"05404bd09d8087da1dee0f0265dfa13e98eb1874","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":318,"context_line":"        self.assertEqual([], node.traits)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        self.conn.baremetal.add_node_trait(self.node, \u0027CUSTOM_FAKE\u0027)"},{"line_number":321,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":322,"context_line":"        self.assertEqual([\u0027CUSTOM_FAKE\u0027], node.traits)"},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_8b9baa64","line":320,"updated":"2019-07-25 16:19:17.000000000","message":"Let\u0027s check that self.node is correctly updated even before we fetch it explicitly (ditto everywhere below)","commit_id":"8ed9b111772ce1c081ea3d4806019950f9c5d174"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"83d5fad20adc7254d253a6fb79d8b322b6771139","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":318,"context_line":"        self.assertEqual([], node.traits)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        self.conn.baremetal.add_node_trait(self.node, \u0027CUSTOM_FAKE\u0027)"},{"line_number":321,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":322,"context_line":"        self.assertEqual([\u0027CUSTOM_FAKE\u0027], node.traits)"},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_ab4b0685","line":320,"in_reply_to":"7faddb67_8b9baa64","updated":"2019-07-25 16:36:21.000000000","message":"I added the checks","commit_id":"8ed9b111772ce1c081ea3d4806019950f9c5d174"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"05404bd09d8087da1dee0f0265dfa13e98eb1874","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":346,"context_line":"        self.assertEqual([\u0027CUSTOM_FOOBAR\u0027], node.traits)"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def test_set_node_traits_via_update(self):"},{"line_number":349,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":350,"context_line":"        self.assertEqual([], node.traits)"},{"line_number":351,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_6b98ae69","line":348,"range":{"start_line":348,"start_character":0,"end_line":348,"end_character":46},"updated":"2019-07-25 16:19:17.000000000","message":"This won\u0027t work without explicit code in node update, let\u0027s remove it for now.","commit_id":"8ed9b111772ce1c081ea3d4806019950f9c5d174"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"83d5fad20adc7254d253a6fb79d8b322b6771139","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":346,"context_line":"        self.assertEqual([\u0027CUSTOM_FOOBAR\u0027], node.traits)"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def test_set_node_traits_via_update(self):"},{"line_number":349,"context_line":"        node \u003d self.conn.baremetal.get_node(self.node)"},{"line_number":350,"context_line":"        self.assertEqual([], node.traits)"},{"line_number":351,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_cb4e8295","line":348,"range":{"start_line":348,"start_character":0,"end_line":348,"end_character":46},"in_reply_to":"7faddb67_6b98ae69","updated":"2019-07-25 16:36:21.000000000","message":"removed","commit_id":"8ed9b111772ce1c081ea3d4806019950f9c5d174"}]}
