)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"ae1da566f1bc079fe360b7697c3a9e4b36d0fb54","unresolved":false,"context_lines":[{"line_number":20,"context_line":"/nodes/\u003cident\u003e/vifs REST API endpoint."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I70f1166a15a26f392734e21d6bc30a03da4e5486"},{"line_number":23,"context_line":"Closes-Bug: #1582188"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a71b18c_17af0495","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":20},"updated":"2016-12-02 13:40:52.000000000","message":"might be Related-Bug and close it when documentation is added?","commit_id":"41149429c0345bf372d0a3a72f3489c7cd567173"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3656ac65ee732be80346d20350516bc050b62c4a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"/nodes/\u003cident\u003e/vifs REST API endpoint."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I70f1166a15a26f392734e21d6bc30a03da4e5486"},{"line_number":23,"context_line":"Related-Bug: #1582188"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a71b18c_95198c25","line":23,"updated":"2016-12-07 18:48:10.000000000","message":"Why is it Related?\nDoes this Close(s)?","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"a0f411f4a12b5bea31a2cc608b99ba22bd1d907f","unresolved":false,"context_lines":[{"line_number":20,"context_line":"/nodes/\u003cident\u003e/vifs REST API endpoint."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I70f1166a15a26f392734e21d6bc30a03da4e5486"},{"line_number":23,"context_line":"Related-Bug: #1582188"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a71b18c_689ce05d","line":23,"in_reply_to":"3a71b18c_2d075a82","updated":"2016-12-08 20:19:50.000000000","message":"Done","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"363c208e76c47bfc41f333dbb1f9ed95cf2ce8ba","unresolved":false,"context_lines":[{"line_number":20,"context_line":"/nodes/\u003cident\u003e/vifs REST API endpoint."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I70f1166a15a26f392734e21d6bc30a03da4e5486"},{"line_number":23,"context_line":"Related-Bug: #1582188"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a71b18c_2d075a82","line":23,"in_reply_to":"3a71b18c_3e907b95","updated":"2016-12-08 20:02:33.000000000","message":"Isn\u0027t it Partial-Bug then?","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"069c7477f85b0b5619c1bb722976a7e524f8526c","unresolved":false,"context_lines":[{"line_number":20,"context_line":"/nodes/\u003cident\u003e/vifs REST API endpoint."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I70f1166a15a26f392734e21d6bc30a03da4e5486"},{"line_number":23,"context_line":"Related-Bug: #1582188"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a71b18c_3e907b95","line":23,"in_reply_to":"3a71b18c_95198c25","updated":"2016-12-08 17:21:20.000000000","message":"There are more patches to come regarding this RFE, documentation and portgroups support, so until the last patch is up I don\u0027t thing we can close it out.","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"9d43d7411732c1811f9f76b696cf79d649350cf5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"loaded for the specified node."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This is part 3 of 3, and adds the node vif subcontroller to expose the"},{"line_number":20,"context_line":"/nodes/\u003cident\u003e/vifs REST API endpoint. API version is bumped to 1.27."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Co-Authored-By: Vasyl Saienko (vsaienko@mirantis.com)"},{"line_number":23,"context_line":"Change-Id: I70f1166a15a26f392734e21d6bc30a03da4e5486"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"ba5201f7_61b6f63e","line":20,"updated":"2017-01-10 08:09:38.000000000","message":"1.28","commit_id":"d84a40d21dcbcea89e65bece47afe682fd87ba6c"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"67961940e1151a13add243bb61fb99dcae597833","unresolved":false,"context_lines":[{"line_number":17,"context_line":"loaded for the specified node."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This is part 3 of 3, and adds the node vif subcontroller to expose the"},{"line_number":20,"context_line":"/nodes/\u003cident\u003e/vifs REST API endpoint. API version is bumped to 1.27."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Co-Authored-By: Vasyl Saienko (vsaienko@mirantis.com)"},{"line_number":23,"context_line":"Change-Id: I70f1166a15a26f392734e21d6bc30a03da4e5486"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"ba5201f7_a1e1bed2","line":20,"in_reply_to":"ba5201f7_61b6f63e","updated":"2017-01-10 08:19:41.000000000","message":"Done","commit_id":"d84a40d21dcbcea89e65bece47afe682fd87ba6c"}],"doc/source/dev/webapi-version-history.rst":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a58fdeae41705e730d17714b7b604c6636a294df","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.27** (Ocata)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add \u0027/v1/nodes/vifs\u0027 endpoint for attach, detach and list of VIFs."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"**1.26** (Ocata)"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"da4df55a_99ca7a4e","line":7,"updated":"2016-12-22 15:04:29.000000000","message":"Is the intent to add this to the API-REF later?","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"79922b388130a1c12bd3aba14ce778e81e177439","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.27** (Ocata)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add \u0027/v1/nodes/vifs\u0027 endpoint for attach, detach and list of VIFs."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"**1.26** (Ocata)"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"da4df55a_a647f71b","line":7,"in_reply_to":"da4df55a_0fa1d8a9","updated":"2016-12-23 11:18:31.000000000","message":"I\u0027m working on api-ref patch.","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3a1ecd0db44fb9654936160b4ed84fb65cea3bb4","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.27** (Ocata)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add \u0027/v1/nodes/vifs\u0027 endpoint for attach, detach and list of VIFs."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"**1.26** (Ocata)"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"da4df55a_0fa1d8a9","line":7,"in_reply_to":"da4df55a_99ca7a4e","updated":"2016-12-22 16:09:18.000000000","message":"I always forget about that. I\u0027m good with that being in a separate patch.","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b08a69ee4dc0cda9fe0f6cff53fe26cec3a7ea16","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.27** (Ocata)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add \u0027/v1/nodes/vifs\u0027 endpoint for attach, detach and list of VIFs."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"**1.26** (Ocata)"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"da4df55a_836c65d1","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":23},"updated":"2016-12-26 17:50:34.000000000","message":"\u003cnode identifier\u003e/vifs","commit_id":"21f682f3a8d0fb3a9737cca4eac78d44b5275d0f"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7b1f77010774fdf976d580f648eca592487400df","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.27** (Ocata)"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Add \u0027/v1/nodes/vifs\u0027 endpoint for attach, detach and list of VIFs."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"**1.26** (Ocata)"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"ba5201f7_8d69768e","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":23},"in_reply_to":"da4df55a_836c65d1","updated":"2016-12-29 14:57:40.000000000","message":"Done","commit_id":"21f682f3a8d0fb3a9737cca4eac78d44b5275d0f"}],"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a4998fc31086b851067b0cb0fb3453412c26559a","unresolved":false,"context_lines":[{"line_number":1071,"context_line":"        :param vif: A VIF object to attach"},{"line_number":1072,"context_line":"        \u0027\u0027\u0027"},{"line_number":1073,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1074,"context_line":"        vif_id \u003d vif.get(\u0027id\u0027)"},{"line_number":1075,"context_line":"        if vif_id is None:"},{"line_number":1076,"context_line":"            raise exception.MissingParameterValue(_(\"VIF id not specified.\"))"},{"line_number":1077,"context_line":"        types.uuid_or_name.validate(vif_id)"},{"line_number":1078,"context_line":"        return pecan.request.rpcapi.vif_attach("},{"line_number":1079,"context_line":"            pecan.request.context, rpc_node.uuid, vif\u003dvif, topic\u003dtopic)"},{"line_number":1080,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_4e1113af","line":1077,"range":{"start_line":1074,"start_character":8,"end_line":1077,"end_character":43},"updated":"2016-11-30 10:15:37.000000000","message":"Instead of this, I\u0027d still rather introduce a new dict-like type that has to include uuid_or_name \u0027id\u0027 key and may contain other keys, if it\u0027s possible.","commit_id":"6d886a8351e756212a38d29d369f965f69872c3a"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"504326da2eb4602394ce5cf4ad610b53a463cb8c","unresolved":false,"context_lines":[{"line_number":1071,"context_line":"        :param vif: A VIF object to attach"},{"line_number":1072,"context_line":"        \u0027\u0027\u0027"},{"line_number":1073,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1074,"context_line":"        vif_id \u003d vif.get(\u0027id\u0027)"},{"line_number":1075,"context_line":"        if vif_id is None:"},{"line_number":1076,"context_line":"            raise exception.MissingParameterValue(_(\"VIF id not specified.\"))"},{"line_number":1077,"context_line":"        types.uuid_or_name.validate(vif_id)"},{"line_number":1078,"context_line":"        return pecan.request.rpcapi.vif_attach("},{"line_number":1079,"context_line":"            pecan.request.context, rpc_node.uuid, vif\u003dvif, topic\u003dtopic)"},{"line_number":1080,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_4af2d59b","line":1077,"range":{"start_line":1074,"start_character":8,"end_line":1077,"end_character":43},"in_reply_to":"5a74a57a_4e1113af","updated":"2016-11-30 14:16:12.000000000","message":"Done","commit_id":"6d886a8351e756212a38d29d369f965f69872c3a"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3656ac65ee732be80346d20350516bc050b62c4a","unresolved":false,"context_lines":[{"line_number":1062,"context_line":"        self._type \u003d \u0027vifs\u0027"},{"line_number":1063,"context_line":"        limit \u003d api_utils.validate_limit(limit)"},{"line_number":1064,"context_line":"        self.vifs \u003d [Vif(**v) for v in vifs]"},{"line_number":1065,"context_line":"        self.next \u003d self.get_next(limit, **kwargs)"},{"line_number":1066,"context_line":""},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"class NodeVIFController(rest.RestController):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_f53480fc","line":1065,"updated":"2016-12-07 18:48:10.000000000","message":"this isn\u0027t going to work. I just looked at Collection.get_next(). It assumes the objects in the collection have a .uuid field.\n\nit does something with the url too, which we aren\u0027t passing. So you might want to check the link to see whether is is generating the right url.","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"069c7477f85b0b5619c1bb722976a7e524f8526c","unresolved":false,"context_lines":[{"line_number":1062,"context_line":"        self._type \u003d \u0027vifs\u0027"},{"line_number":1063,"context_line":"        limit \u003d api_utils.validate_limit(limit)"},{"line_number":1064,"context_line":"        self.vifs \u003d [Vif(**v) for v in vifs]"},{"line_number":1065,"context_line":"        self.next \u003d self.get_next(limit, **kwargs)"},{"line_number":1066,"context_line":""},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"class NodeVIFController(rest.RestController):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_decea7b3","line":1065,"in_reply_to":"3a71b18c_f53480fc","updated":"2016-12-08 17:21:20.000000000","message":"Ah... maybe I\u0027ll just manually build a list then.","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"21c116a7aebcb7749bd88f47c28a152123c29280","unresolved":false,"context_lines":[{"line_number":1068,"context_line":"class NodeVIFController(rest.RestController):"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    def __init__(self, node_ident):"},{"line_number":1071,"context_line":"        self.node_ident \u003d node_ident"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"    def _get_node_and_topic(self):"},{"line_number":1074,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(self.node_ident)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_ff60b3a6","line":1071,"updated":"2016-12-08 16:21:34.000000000","message":"It\u0027s probably a good idea to specify if node.id or node.uuid is used here; node_ident variable name may be misleading.","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"d6d5a017bfc49cadf7ac6a9ebcee11a8108ea013","unresolved":false,"context_lines":[{"line_number":1068,"context_line":"class NodeVIFController(rest.RestController):"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    def __init__(self, node_ident):"},{"line_number":1071,"context_line":"        self.node_ident \u003d node_ident"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"    def _get_node_and_topic(self):"},{"line_number":1074,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(self.node_ident)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_753ad499","line":1071,"in_reply_to":"3a71b18c_0dc7fe12","updated":"2016-12-09 14:01:13.000000000","message":"I\u0027d feel better if it specifically used node_id or node_uuid, or a proper comment was placed.","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"363c208e76c47bfc41f333dbb1f9ed95cf2ce8ba","unresolved":false,"context_lines":[{"line_number":1068,"context_line":"class NodeVIFController(rest.RestController):"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    def __init__(self, node_ident):"},{"line_number":1071,"context_line":"        self.node_ident \u003d node_ident"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"    def _get_node_and_topic(self):"},{"line_number":1074,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(self.node_ident)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_0dc7fe12","line":1071,"in_reply_to":"3a71b18c_ab90bd96","updated":"2016-12-08 20:02:33.000000000","message":"we do a lousy job of documenting our __init__ (and other) methods. It is true that node_ident refers to ID or UUID but also true that if you only looked at this, you wouldn\u0027t know.\n\nOh well, we can only do so much...","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"069c7477f85b0b5619c1bb722976a7e524f8526c","unresolved":false,"context_lines":[{"line_number":1068,"context_line":"class NodeVIFController(rest.RestController):"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    def __init__(self, node_ident):"},{"line_number":1071,"context_line":"        self.node_ident \u003d node_ident"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"    def _get_node_and_topic(self):"},{"line_number":1074,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(self.node_ident)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_ab90bd96","line":1071,"in_reply_to":"3a71b18c_ff60b3a6","updated":"2016-12-08 17:21:20.000000000","message":"Calling this node_ident is consistent with the rest of this class, the reason we use ident not id or uuid, is because this field can either be the nodes uuid or the nodes name.","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3656ac65ee732be80346d20350516bc050b62c4a","unresolved":false,"context_lines":[{"line_number":1087,"context_line":"        return VifCollection(vifs)"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":"    @expose.expose(None, body\u003dVif)"},{"line_number":1090,"context_line":"    def post(self, vif):"},{"line_number":1091,"context_line":"        \"\"\"Attach a VIF to this node"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"        :param vif: A VIF object to attach"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_c019847b","line":1090,"updated":"2016-12-07 18:48:10.000000000","message":"probably want to add status_code\u003dhttp_client.CREATED","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"363c208e76c47bfc41f333dbb1f9ed95cf2ce8ba","unresolved":false,"context_lines":[{"line_number":1087,"context_line":"        return VifCollection(vifs)"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":"    @expose.expose(None, body\u003dVif)"},{"line_number":1090,"context_line":"    def post(self, vif):"},{"line_number":1091,"context_line":"        \"\"\"Attach a VIF to this node"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"        :param vif: A VIF object to attach"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_4dd1f6cc","line":1090,"in_reply_to":"3a71b18c_7e5d93eb","updated":"2016-12-08 20:02:33.000000000","message":"OK, whatever you say, I wasn\u0027t quite sure but I figured it needed some status code :)","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"069c7477f85b0b5619c1bb722976a7e524f8526c","unresolved":false,"context_lines":[{"line_number":1087,"context_line":"        return VifCollection(vifs)"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":"    @expose.expose(None, body\u003dVif)"},{"line_number":1090,"context_line":"    def post(self, vif):"},{"line_number":1091,"context_line":"        \"\"\"Attach a VIF to this node"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"        :param vif: A VIF object to attach"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_7e5d93eb","line":1090,"in_reply_to":"3a71b18c_c019847b","updated":"2016-12-08 17:21:20.000000000","message":"The status code shouldn\u0027t be CREATED, its NO_CONTENT, the CREATED status code requires a response body and this one doesn\u0027t return anything.","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"a89d4c421339004d8ae6f2b4c808dac9d636d0c9","unresolved":false,"context_lines":[{"line_number":1093,"context_line":"        :param vif: A VIF object to attach"},{"line_number":1094,"context_line":"        \"\"\""},{"line_number":1095,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1096,"context_line":"        pecan.request.rpcapi.vif_attach(pecan.request.context, rpc_node.uuid,"},{"line_number":1097,"context_line":"                                        vif_obj\u003dvif, topic\u003dtopic)"},{"line_number":1098,"context_line":""},{"line_number":1099,"context_line":"    @expose.expose(None, types.uuid_or_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_7ab5d12f","line":1096,"updated":"2016-12-07 12:45:49.000000000","message":"get 500 from API: http://paste.openstack.org/show/591649/","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"069c7477f85b0b5619c1bb722976a7e524f8526c","unresolved":false,"context_lines":[{"line_number":1093,"context_line":"        :param vif: A VIF object to attach"},{"line_number":1094,"context_line":"        \"\"\""},{"line_number":1095,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1096,"context_line":"        pecan.request.rpcapi.vif_attach(pecan.request.context, rpc_node.uuid,"},{"line_number":1097,"context_line":"                                        vif_obj\u003dvif, topic\u003dtopic)"},{"line_number":1098,"context_line":""},{"line_number":1099,"context_line":"    @expose.expose(None, types.uuid_or_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_ab551dc7","line":1096,"in_reply_to":"3a71b18c_7ab5d12f","updated":"2016-12-08 17:21:20.000000000","message":"Fixed :)","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3656ac65ee732be80346d20350516bc050b62c4a","unresolved":false,"context_lines":[{"line_number":1097,"context_line":"                                        vif_obj\u003dvif, topic\u003dtopic)"},{"line_number":1098,"context_line":""},{"line_number":1099,"context_line":"    @expose.expose(None, types.uuid_or_name)"},{"line_number":1100,"context_line":"    def delete(self, vif_id):"},{"line_number":1101,"context_line":"        \"\"\"Detach a VIF from this node"},{"line_number":1102,"context_line":""},{"line_number":1103,"context_line":"        :param vif_id: The ID of a VIF to detach"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_a04ac853","line":1100,"updated":"2016-12-07 18:48:10.000000000","message":"add status_code\u003dhttp_client.NO_CONTENT","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"069c7477f85b0b5619c1bb722976a7e524f8526c","unresolved":false,"context_lines":[{"line_number":1097,"context_line":"                                        vif_obj\u003dvif, topic\u003dtopic)"},{"line_number":1098,"context_line":""},{"line_number":1099,"context_line":"    @expose.expose(None, types.uuid_or_name)"},{"line_number":1100,"context_line":"    def delete(self, vif_id):"},{"line_number":1101,"context_line":"        \"\"\"Detach a VIF from this node"},{"line_number":1102,"context_line":""},{"line_number":1103,"context_line":"        :param vif_id: The ID of a VIF to detach"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_512356a7","line":1100,"in_reply_to":"3a71b18c_a04ac853","updated":"2016-12-08 17:21:20.000000000","message":"Done","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3656ac65ee732be80346d20350516bc050b62c4a","unresolved":false,"context_lines":[{"line_number":1104,"context_line":"        \"\"\""},{"line_number":1105,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1106,"context_line":"        pecan.request.rpcapi.vif_detach(pecan.request.context, rpc_node.uuid,"},{"line_number":1107,"context_line":"                                        vif_id\u003dvif_id, topic\u003dtopic)"},{"line_number":1108,"context_line":""},{"line_number":1109,"context_line":""},{"line_number":1110,"context_line":"class NodesController(rest.RestController):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_80ab0cd6","line":1107,"updated":"2016-12-07 18:48:10.000000000","message":"we probably should add @METRICS.timer()  to these methods.","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"069c7477f85b0b5619c1bb722976a7e524f8526c","unresolved":false,"context_lines":[{"line_number":1104,"context_line":"        \"\"\""},{"line_number":1105,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1106,"context_line":"        pecan.request.rpcapi.vif_detach(pecan.request.context, rpc_node.uuid,"},{"line_number":1107,"context_line":"                                        vif_id\u003dvif_id, topic\u003dtopic)"},{"line_number":1108,"context_line":""},{"line_number":1109,"context_line":""},{"line_number":1110,"context_line":"class NodesController(rest.RestController):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_716852bb","line":1107,"in_reply_to":"3a71b18c_80ab0cd6","updated":"2016-12-08 17:21:20.000000000","message":"Done","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3656ac65ee732be80346d20350516bc050b62c4a","unresolved":false,"context_lines":[{"line_number":1105,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1106,"context_line":"        pecan.request.rpcapi.vif_detach(pecan.request.context, rpc_node.uuid,"},{"line_number":1107,"context_line":"                                        vif_id\u003dvif_id, topic\u003dtopic)"},{"line_number":1108,"context_line":""},{"line_number":1109,"context_line":""},{"line_number":1110,"context_line":"class NodesController(rest.RestController):"},{"line_number":1111,"context_line":"    \"\"\"REST controller for Nodes.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_c08c2482","line":1108,"updated":"2016-12-07 18:48:10.000000000","message":"OH. we should add policy.authorize() to these too.","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"069c7477f85b0b5619c1bb722976a7e524f8526c","unresolved":false,"context_lines":[{"line_number":1105,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1106,"context_line":"        pecan.request.rpcapi.vif_detach(pecan.request.context, rpc_node.uuid,"},{"line_number":1107,"context_line":"                                        vif_id\u003dvif_id, topic\u003dtopic)"},{"line_number":1108,"context_line":""},{"line_number":1109,"context_line":""},{"line_number":1110,"context_line":"class NodesController(rest.RestController):"},{"line_number":1111,"context_line":"    \"\"\"REST controller for Nodes.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_91d6cec1","line":1108,"in_reply_to":"3a71b18c_c08c2482","updated":"2016-12-08 17:21:20.000000000","message":"Done","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6e004fa4f23da977b558fad1ddf6ef3f66e58f79","unresolved":false,"context_lines":[{"line_number":1097,"context_line":"    @expose.expose(VifCollection)"},{"line_number":1098,"context_line":"    def get_all(self):"},{"line_number":1099,"context_line":"        \"\"\"Get a list of attached VIF IDs\"\"\""},{"line_number":1100,"context_line":"        cdict \u003d pecan.request.context.to_dict()"},{"line_number":1101,"context_line":"        policy.authorize(\u0027baremetal:node:vif:list\u0027, cdict, cdict)"},{"line_number":1102,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1103,"context_line":"        vifs \u003d pecan.request.rpcapi.vif_list(pecan.request.context,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_eb1f1e07","line":1100,"updated":"2016-12-19 20:44:21.000000000","message":"this is supposed to be pecan.request.context.to_policy_values(). See https://review.openstack.org/#/c/411764/","commit_id":"f9443cf3a070b682298be9e0182fc5d902b65718"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"f96adb351d0f69eb99a7f042ce28b8b85f047689","unresolved":false,"context_lines":[{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"        :param vif: A VIF object to attach"},{"line_number":1114,"context_line":"        \"\"\""},{"line_number":1115,"context_line":"        cdict \u003d pecan.request.context.to_dict()"},{"line_number":1116,"context_line":"        policy.authorize(\u0027baremetal:node:vif:attach\u0027, cdict, cdict)"},{"line_number":1117,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1118,"context_line":"        pecan.request.rpcapi.vif_attach(pecan.request.context, rpc_node.uuid,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a6eadb0_f777cfd1","line":1115,"updated":"2016-12-20 17:22:07.000000000","message":"to_policy_values()","commit_id":"7666f03ff65e57ade4190ac72329105769ba3479"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"f96adb351d0f69eb99a7f042ce28b8b85f047689","unresolved":false,"context_lines":[{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"        :param vif_id: The ID of a VIF to detach"},{"line_number":1128,"context_line":"        \"\"\""},{"line_number":1129,"context_line":"        cdict \u003d pecan.request.context.to_dict()"},{"line_number":1130,"context_line":"        policy.authorize(\u0027baremetal:node:vif:detach\u0027, cdict, cdict)"},{"line_number":1131,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1132,"context_line":"        pecan.request.rpcapi.vif_detach(pecan.request.context, rpc_node.uuid,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a6eadb0_17736be8","line":1129,"updated":"2016-12-20 17:22:07.000000000","message":"to_policy_values()","commit_id":"7666f03ff65e57ade4190ac72329105769ba3479"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"        self._set_maintenance(node_ident, False)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"class Vif(wtypes.UserType):"},{"line_number":1047,"context_line":""},{"line_number":1048,"context_line":"    basetype \u003d wtypes.text"},{"line_number":1049,"context_line":"    name \u003d \u0027vif\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_ed40ad61","line":1046,"updated":"2016-12-21 17:38:00.000000000","message":"We\u0027ve got most/all of our types in types.py, so I think it makes sense/consistent to put this in that file too. And rename it to VifType.","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"        self._set_maintenance(node_ident, False)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"class Vif(wtypes.UserType):"},{"line_number":1047,"context_line":""},{"line_number":1048,"context_line":"    basetype \u003d wtypes.text"},{"line_number":1049,"context_line":"    name \u003d \u0027vif\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_6d5efa46","line":1046,"in_reply_to":"1a6eadb0_ed40ad61","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"    basetype \u003d wtypes.text"},{"line_number":1049,"context_line":"    name \u003d \u0027vif\u0027"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"    _mandatory_fields \u003d {\u0027id\u0027: types.uuid_or_name}"},{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    @staticmethod"},{"line_number":1054,"context_line":"    def validate(value):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_f0d96257","line":1051,"updated":"2016-12-21 17:38:00.000000000","message":"I didn\u0027t realize it had to conform to our UUID or name syntax (which is fine with me)","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1048,"context_line":"    basetype \u003d wtypes.text"},{"line_number":1049,"context_line":"    name \u003d \u0027vif\u0027"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"    _mandatory_fields \u003d {\u0027id\u0027: types.uuid_or_name}"},{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    @staticmethod"},{"line_number":1054,"context_line":"    def validate(value):"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_2d4dd172","line":1051,"in_reply_to":"1a6eadb0_f0d96257","updated":"2016-12-22 14:07:34.000000000","message":"In Neutron uuid of the VIF is actually ID of the port, so we using \u0027id\u0027 instead of \u0027uuid\u0027 here.\n\nActually in other projects there is no \u0027uuid\u0027 field in API object representation. Ironic is \u0027special\u0027 case and we using \u0027uuid\u0027 in API. and \u0027id\u0027 in database.","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    @staticmethod"},{"line_number":1054,"context_line":"    def validate(value):"},{"line_number":1055,"context_line":"        value \u003d types.JsonType.validate(value)"},{"line_number":1056,"context_line":"        for key, typ in Vif._mandatory_fields.items():"},{"line_number":1057,"context_line":"            if key not in value:"},{"line_number":1058,"context_line":"                raise exception.MissingParameterValue(\u0027Missing %s\u0027 % key)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_f0a162f8","line":1055,"updated":"2016-12-21 17:38:00.000000000","message":"wonder if Vif should be a subclass of types.JsonType.","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    @staticmethod"},{"line_number":1054,"context_line":"    def validate(value):"},{"line_number":1055,"context_line":"        value \u003d types.JsonType.validate(value)"},{"line_number":1056,"context_line":"        for key, typ in Vif._mandatory_fields.items():"},{"line_number":1057,"context_line":"            if key not in value:"},{"line_number":1058,"context_line":"                raise exception.MissingParameterValue(\u0027Missing %s\u0027 % key)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_cd3e05b8","line":1055,"in_reply_to":"1a6eadb0_f0a162f8","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1055,"context_line":"        value \u003d types.JsonType.validate(value)"},{"line_number":1056,"context_line":"        for key, typ in Vif._mandatory_fields.items():"},{"line_number":1057,"context_line":"            if key not in value:"},{"line_number":1058,"context_line":"                raise exception.MissingParameterValue(\u0027Missing %s\u0027 % key)"},{"line_number":1059,"context_line":"            value[key] \u003d wsme.rest.json.fromjson(typ, value[key])"},{"line_number":1060,"context_line":"        return value"},{"line_number":1061,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_70bb920f","line":1058,"updated":"2016-12-21 17:38:00.000000000","message":"s/MissingParameterValue(.../MissingParameterValue(_(..).../","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1055,"context_line":"        value \u003d types.JsonType.validate(value)"},{"line_number":1056,"context_line":"        for key, typ in Vif._mandatory_fields.items():"},{"line_number":1057,"context_line":"            if key not in value:"},{"line_number":1058,"context_line":"                raise exception.MissingParameterValue(\u0027Missing %s\u0027 % key)"},{"line_number":1059,"context_line":"            value[key] \u003d wsme.rest.json.fromjson(typ, value[key])"},{"line_number":1060,"context_line":"        return value"},{"line_number":1061,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_53bf18d0","line":1058,"in_reply_to":"1a6eadb0_70bb920f","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1056,"context_line":"        for key, typ in Vif._mandatory_fields.items():"},{"line_number":1057,"context_line":"            if key not in value:"},{"line_number":1058,"context_line":"                raise exception.MissingParameterValue(\u0027Missing %s\u0027 % key)"},{"line_number":1059,"context_line":"            value[key] \u003d wsme.rest.json.fromjson(typ, value[key])"},{"line_number":1060,"context_line":"        return value"},{"line_number":1061,"context_line":""},{"line_number":1062,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_10289e32","line":1059,"updated":"2016-12-21 17:38:00.000000000","message":"why do we need to do this?","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1056,"context_line":"        for key, typ in Vif._mandatory_fields.items():"},{"line_number":1057,"context_line":"            if key not in value:"},{"line_number":1058,"context_line":"                raise exception.MissingParameterValue(\u0027Missing %s\u0027 % key)"},{"line_number":1059,"context_line":"            value[key] \u003d wsme.rest.json.fromjson(typ, value[key])"},{"line_number":1060,"context_line":"        return value"},{"line_number":1061,"context_line":""},{"line_number":1062,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_d3cb0871","line":1059,"in_reply_to":"1a6eadb0_10289e32","updated":"2016-12-22 14:07:34.000000000","message":"I rewrite it according to other ironic types.","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"    vifs \u003d [viftype]"},{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"    @staticmethod"},{"line_number":1077,"context_line":"    def collection_from_list(vifs):"},{"line_number":1078,"context_line":"        col \u003d VifCollection()"},{"line_number":1079,"context_line":"        col.vifs \u003d [Vif.frombasetype(vif) for vif in vifs]"},{"line_number":1080,"context_line":"        return col"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_d009c696","line":1077,"updated":"2016-12-21 17:38:00.000000000","message":"vifs is a list of ?? I\u0027m thinking those vif dicts...","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"    vifs \u003d [viftype]"},{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"    @staticmethod"},{"line_number":1077,"context_line":"    def collection_from_list(vifs):"},{"line_number":1078,"context_line":"        col \u003d VifCollection()"},{"line_number":1079,"context_line":"        col.vifs \u003d [Vif.frombasetype(vif) for vif in vifs]"},{"line_number":1080,"context_line":"        return col"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_33b614dd","line":1077,"in_reply_to":"1a6eadb0_d009c696","updated":"2016-12-22 14:07:34.000000000","message":"vifs is a list of VIFs objects.","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1090,"context_line":"        try:"},{"line_number":1091,"context_line":"            return rpc_node, pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":1092,"context_line":"        except exception.NoValidHost as e:"},{"line_number":1093,"context_line":"            e.code \u003d http_client.BAD_REQUEST"},{"line_number":1094,"context_line":"            raise"},{"line_number":1095,"context_line":""},{"line_number":1096,"context_line":"    @METRICS.timer(\u0027NodesVIFController.get_all\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_db79e794","line":1093,"updated":"2016-12-21 17:38:00.000000000","message":"If the rpc_node exists, it seems to me that if we cannot get a topic, it would be an internal error.","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1090,"context_line":"        try:"},{"line_number":1091,"context_line":"            return rpc_node, pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":1092,"context_line":"        except exception.NoValidHost as e:"},{"line_number":1093,"context_line":"            e.code \u003d http_client.BAD_REQUEST"},{"line_number":1094,"context_line":"            raise"},{"line_number":1095,"context_line":""},{"line_number":1096,"context_line":"    @METRICS.timer(\u0027NodesVIFController.get_all\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_f6b9da2f","line":1093,"in_reply_to":"1a6eadb0_db79e794","updated":"2016-12-22 14:07:34.000000000","message":"right, it should be 503 in this case.","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1093,"context_line":"            e.code \u003d http_client.BAD_REQUEST"},{"line_number":1094,"context_line":"            raise"},{"line_number":1095,"context_line":""},{"line_number":1096,"context_line":"    @METRICS.timer(\u0027NodesVIFController.get_all\u0027)"},{"line_number":1097,"context_line":"    @expose.expose(VifCollection)"},{"line_number":1098,"context_line":"    def get_all(self):"},{"line_number":1099,"context_line":"        \"\"\"Get a list of attached VIF IDs\"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_bb826b50","line":1096,"updated":"2016-12-21 17:38:00.000000000","message":"s/Nodes/Node/","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1093,"context_line":"            e.code \u003d http_client.BAD_REQUEST"},{"line_number":1094,"context_line":"            raise"},{"line_number":1095,"context_line":""},{"line_number":1096,"context_line":"    @METRICS.timer(\u0027NodesVIFController.get_all\u0027)"},{"line_number":1097,"context_line":"    @expose.expose(VifCollection)"},{"line_number":1098,"context_line":"    def get_all(self):"},{"line_number":1099,"context_line":"        \"\"\"Get a list of attached VIF IDs\"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_f3dbac19","line":1096,"in_reply_to":"1a6eadb0_bb826b50","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1096,"context_line":"    @METRICS.timer(\u0027NodesVIFController.get_all\u0027)"},{"line_number":1097,"context_line":"    @expose.expose(VifCollection)"},{"line_number":1098,"context_line":"    def get_all(self):"},{"line_number":1099,"context_line":"        \"\"\"Get a list of attached VIF IDs\"\"\""},{"line_number":1100,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":1101,"context_line":"        policy.authorize(\u0027baremetal:node:vif:list\u0027, cdict, cdict)"},{"line_number":1102,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_5b7a3725","line":1099,"updated":"2016-12-21 17:38:00.000000000","message":"it isn\u0027t IDs, right? It is VIF \u0027info\u0027? (Although right now, all we have are IDs since we don\u0027t keep anything else about the VIF.)","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1096,"context_line":"    @METRICS.timer(\u0027NodesVIFController.get_all\u0027)"},{"line_number":1097,"context_line":"    @expose.expose(VifCollection)"},{"line_number":1098,"context_line":"    def get_all(self):"},{"line_number":1099,"context_line":"        \"\"\"Get a list of attached VIF IDs\"\"\""},{"line_number":1100,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":1101,"context_line":"        policy.authorize(\u0027baremetal:node:vif:list\u0027, cdict, cdict)"},{"line_number":1102,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_767c0a73","line":1099,"in_reply_to":"1a6eadb0_5b7a3725","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1104,"context_line":"                                             rpc_node.uuid, topic\u003dtopic)"},{"line_number":1105,"context_line":"        return VifCollection.collection_from_list(vifs)"},{"line_number":1106,"context_line":""},{"line_number":1107,"context_line":"    @METRICS.timer(\u0027NodesVIFController.post\u0027)"},{"line_number":1108,"context_line":"    @expose.expose(None, body\u003dviftype,"},{"line_number":1109,"context_line":"                   status_code\u003dhttp_client.NO_CONTENT)"},{"line_number":1110,"context_line":"    def post(self, vif):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_7bd8d31e","line":1107,"updated":"2016-12-21 17:38:00.000000000","message":"s/Nodes/Node/","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1104,"context_line":"                                             rpc_node.uuid, topic\u003dtopic)"},{"line_number":1105,"context_line":"        return VifCollection.collection_from_list(vifs)"},{"line_number":1106,"context_line":""},{"line_number":1107,"context_line":"    @METRICS.timer(\u0027NodesVIFController.post\u0027)"},{"line_number":1108,"context_line":"    @expose.expose(None, body\u003dviftype,"},{"line_number":1109,"context_line":"                   status_code\u003dhttp_client.NO_CONTENT)"},{"line_number":1110,"context_line":"    def post(self, vif):"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_d693f6a1","line":1107,"in_reply_to":"1a6eadb0_7bd8d31e","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"    def post(self, vif):"},{"line_number":1111,"context_line":"        \"\"\"Attach a VIF to this node"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"        :param vif: A VIF object to attach"},{"line_number":1114,"context_line":"        \"\"\""},{"line_number":1115,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":1116,"context_line":"        policy.authorize(\u0027baremetal:node:vif:attach\u0027, cdict, cdict)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a6eadb0_bbdd0b16","line":1113,"updated":"2016-12-21 17:38:00.000000000","message":"s/object/dict with id key blah blah/","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"    def post(self, vif):"},{"line_number":1111,"context_line":"        \"\"\"Attach a VIF to this node"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"        :param vif: A VIF object to attach"},{"line_number":1114,"context_line":"        \"\"\""},{"line_number":1115,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":1116,"context_line":"        policy.authorize(\u0027baremetal:node:vif:attach\u0027, cdict, cdict)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_16bc9e04","line":1113,"in_reply_to":"1a6eadb0_bbdd0b16","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":1118,"context_line":"        pecan.request.rpcapi.vif_attach(pecan.request.context, rpc_node.uuid,"},{"line_number":1119,"context_line":"                                        vif_info\u003dvif, topic\u003dtopic)"},{"line_number":1120,"context_line":""},{"line_number":1121,"context_line":"    @METRICS.timer(\u0027NodesVIFController.delete\u0027)"},{"line_number":1122,"context_line":"    @expose.expose(None, types.uuid_or_name,"},{"line_number":1123,"context_line":"                   status_code\u003dhttp_client.NO_CONTENT)"},{"line_number":1124,"context_line":"    def delete(self, vif_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa48f94a_929a7cc4","line":1121,"updated":"2016-12-21 17:38:00.000000000","message":"ditto","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":1118,"context_line":"        pecan.request.rpcapi.vif_attach(pecan.request.context, rpc_node.uuid,"},{"line_number":1119,"context_line":"                                        vif_info\u003dvif, topic\u003dtopic)"},{"line_number":1120,"context_line":""},{"line_number":1121,"context_line":"    @METRICS.timer(\u0027NodesVIFController.delete\u0027)"},{"line_number":1122,"context_line":"    @expose.expose(None, types.uuid_or_name,"},{"line_number":1123,"context_line":"                   status_code\u003dhttp_client.NO_CONTENT)"},{"line_number":1124,"context_line":"    def delete(self, vif_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_563c6693","line":1121,"in_reply_to":"fa48f94a_929a7cc4","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3a1ecd0db44fb9654936160b4ed84fb65cea3bb4","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"        self._set_maintenance(node_ident, False)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"class VifCollection(collection.Collection):"},{"line_number":1047,"context_line":"    \"\"\"API representation of a collection of VIFs.\"\"\""},{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":"    vifs \u003d [types.viftype]"}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_af228cb7","line":1046,"updated":"2016-12-22 16:09:18.000000000","message":"Oh. It can\u0027t be a subclass of collection.Collection. Unless we 1. add an __init__(): self._type \u003d \u0027vifs\u0027 and 2. fix https://github.com/openstack/ironic/blob/eec96136be1e8d87d2a07c7d4306de52cbc3e7c8/ironic/api/controllers/v1/collection.py#L45\n\nThere might be other things, that\u0027s just what I noticed looking at the code. I had pointed some of this out in a previous revision; if we don\u0027t use collection we should add a note as to why.","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"79922b388130a1c12bd3aba14ce778e81e177439","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"        self._set_maintenance(node_ident, False)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"class VifCollection(collection.Collection):"},{"line_number":1047,"context_line":"    \"\"\"API representation of a collection of VIFs.\"\"\""},{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":"    vifs \u003d [types.viftype]"}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_465bab87","line":1046,"in_reply_to":"da4df55a_af228cb7","updated":"2016-12-23 11:18:31.000000000","message":"Done","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b08a69ee4dc0cda9fe0f6cff53fe26cec3a7ea16","unresolved":false,"context_lines":[{"line_number":1076,"context_line":"    def get_all(self):"},{"line_number":1077,"context_line":"        \"\"\"Get a list of attached VIFs\"\"\""},{"line_number":1078,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":1079,"context_line":"        policy.authorize(\u0027baremetal:node:vif:list\u0027, cdict, cdict)"},{"line_number":1080,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1081,"context_line":"        vifs \u003d pecan.request.rpcapi.vif_list(pecan.request.context,"},{"line_number":1082,"context_line":"                                             rpc_node.uuid, topic\u003dtopic)"}],"source_content_type":"text/x-python","patch_set":20,"id":"da4df55a_2351f9d8","line":1079,"updated":"2016-12-26 17:50:34.000000000","message":"Please regenerate policies sample file.","commit_id":"21f682f3a8d0fb3a9737cca4eac78d44b5275d0f"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7b1f77010774fdf976d580f648eca592487400df","unresolved":false,"context_lines":[{"line_number":1076,"context_line":"    def get_all(self):"},{"line_number":1077,"context_line":"        \"\"\"Get a list of attached VIFs\"\"\""},{"line_number":1078,"context_line":"        cdict \u003d pecan.request.context.to_policy_values()"},{"line_number":1079,"context_line":"        policy.authorize(\u0027baremetal:node:vif:list\u0027, cdict, cdict)"},{"line_number":1080,"context_line":"        rpc_node, topic \u003d self._get_node_and_topic()"},{"line_number":1081,"context_line":"        vifs \u003d pecan.request.rpcapi.vif_list(pecan.request.context,"},{"line_number":1082,"context_line":"                                             rpc_node.uuid, topic\u003dtopic)"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba5201f7_cdd7fe21","line":1079,"in_reply_to":"da4df55a_2351f9d8","updated":"2016-12-29 14:57:40.000000000","message":"Done","commit_id":"21f682f3a8d0fb3a9737cca4eac78d44b5275d0f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b08a69ee4dc0cda9fe0f6cff53fe26cec3a7ea16","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"        return VifCollection.collection_from_list(vifs)"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    @METRICS.timer(\u0027NodeVIFController.post\u0027)"},{"line_number":1086,"context_line":"    @expose.expose(None, body\u003dtypes.viftype,"},{"line_number":1087,"context_line":"                   status_code\u003dhttp_client.NO_CONTENT)"},{"line_number":1088,"context_line":"    def post(self, vif):"},{"line_number":1089,"context_line":"        \"\"\"Attach a VIF to this node"}],"source_content_type":"text/x-python","patch_set":20,"id":"da4df55a_a35b29f5","line":1086,"range":{"start_line":1086,"start_character":30,"end_line":1086,"end_character":43},"updated":"2016-12-26 17:50:34.000000000","message":"Question - do we want to allow passing a collection here? I know this was not a part of the spec, but still..","commit_id":"21f682f3a8d0fb3a9737cca4eac78d44b5275d0f"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7b1f77010774fdf976d580f648eca592487400df","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"        return VifCollection.collection_from_list(vifs)"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    @METRICS.timer(\u0027NodeVIFController.post\u0027)"},{"line_number":1086,"context_line":"    @expose.expose(None, body\u003dtypes.viftype,"},{"line_number":1087,"context_line":"                   status_code\u003dhttp_client.NO_CONTENT)"},{"line_number":1088,"context_line":"    def post(self, vif):"},{"line_number":1089,"context_line":"        \"\"\"Attach a VIF to this node"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba5201f7_add2ba32","line":1086,"range":{"start_line":1086,"start_character":30,"end_line":1086,"end_character":43},"in_reply_to":"da4df55a_a35b29f5","updated":"2016-12-29 14:57:40.000000000","message":"I doubt that we may pass collection here. We do not allow to create multiple nodes/ports in single request. Also similar action attach floating-ip/security group to server in Nova allows only one object in request\n\nhttp://developer.openstack.org/api-ref/compute/?expanded\u003dadd-associate-floating-ip-addfloatingip-action-detail#servers-run-an-action-servers-action","commit_id":"21f682f3a8d0fb3a9737cca4eac78d44b5275d0f"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b08a69ee4dc0cda9fe0f6cff53fe26cec3a7ea16","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"    _subcontroller_map \u003d {"},{"line_number":1152,"context_line":"        \u0027ports\u0027: port.PortsController,"},{"line_number":1153,"context_line":"        \u0027portgroups\u0027: portgroup.PortgroupsController,"},{"line_number":1154,"context_line":"        \u0027vifs\u0027: NodeVIFController"},{"line_number":1155,"context_line":"    }"},{"line_number":1156,"context_line":""},{"line_number":1157,"context_line":"    @pecan.expose()"}],"source_content_type":"text/x-python","patch_set":20,"id":"da4df55a_23bad90a","line":1154,"updated":"2016-12-26 17:50:34.000000000","message":"super nit - add , please :)","commit_id":"21f682f3a8d0fb3a9737cca4eac78d44b5275d0f"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7b1f77010774fdf976d580f648eca592487400df","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"    _subcontroller_map \u003d {"},{"line_number":1152,"context_line":"        \u0027ports\u0027: port.PortsController,"},{"line_number":1153,"context_line":"        \u0027portgroups\u0027: portgroup.PortgroupsController,"},{"line_number":1154,"context_line":"        \u0027vifs\u0027: NodeVIFController"},{"line_number":1155,"context_line":"    }"},{"line_number":1156,"context_line":""},{"line_number":1157,"context_line":"    @pecan.expose()"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba5201f7_2de7aa13","line":1154,"in_reply_to":"da4df55a_23bad90a","updated":"2016-12-29 14:57:40.000000000","message":"Done","commit_id":"21f682f3a8d0fb3a9737cca4eac78d44b5275d0f"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"2540168b51c41085cee90d9975d9fad2eb49405e","unresolved":false,"context_lines":[{"line_number":1174,"context_line":"                not api_utils.allow_portgroups_subcontrollers()) or"},{"line_number":1175,"context_line":"            (remainder[0] \u003d\u003d \u0027vifs\u0027 and"},{"line_number":1176,"context_line":"                not api_utils.allow_vifs_subcontroller())):"},{"line_number":1177,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":1178,"context_line":"        subcontroller \u003d self._subcontroller_map.get(remainder[0])"},{"line_number":1179,"context_line":"        if subcontroller:"},{"line_number":1180,"context_line":"            return subcontroller(node_ident\u003dident), remainder[1:]"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba5201f7_51cfee7e","line":1177,"updated":"2017-01-03 12:12:41.000000000","message":"Just a question: why Not found is used here, and not Not Allowed?","commit_id":"be6cf4b59b65fd6ca8241b0df4316b7a31a8c405"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e3523dcc958771eb67a1817aeeac058cd674d815","unresolved":false,"context_lines":[{"line_number":1174,"context_line":"                not api_utils.allow_portgroups_subcontrollers()) or"},{"line_number":1175,"context_line":"            (remainder[0] \u003d\u003d \u0027vifs\u0027 and"},{"line_number":1176,"context_line":"                not api_utils.allow_vifs_subcontroller())):"},{"line_number":1177,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":1178,"context_line":"        subcontroller \u003d self._subcontroller_map.get(remainder[0])"},{"line_number":1179,"context_line":"        if subcontroller:"},{"line_number":1180,"context_line":"            return subcontroller(node_ident\u003dident), remainder[1:]"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba5201f7_dc2695b9","line":1177,"in_reply_to":"ba5201f7_51cfee7e","updated":"2017-01-03 12:32:09.000000000","message":"Because the users of old api microversions should be getting 404 while trying to do anything with this endpoint, for them it should be non-existent, so 404.","commit_id":"be6cf4b59b65fd6ca8241b0df4316b7a31a8c405"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"6649f2eff6759bdae883b19cd0675ed7eeced160","unresolved":false,"context_lines":[{"line_number":1096,"context_line":"        try:"},{"line_number":1097,"context_line":"            return rpc_node, pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":1098,"context_line":"        except exception.NoValidHost as e:"},{"line_number":1099,"context_line":"            e.code \u003d http_client.SERVICE_UNAVAILABLE"},{"line_number":1100,"context_line":"            raise"},{"line_number":1101,"context_line":""},{"line_number":1102,"context_line":"    @METRICS.timer(\u0027NodeVIFController.get_all\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba5201f7_93dda572","line":1099,"updated":"2017-01-11 12:58:26.000000000","message":"While I don\u0027t necessarily disagree here, we use BAD_REQUEST for this error everywhere else. Why SERVICE_UNAVAILABLE here?","commit_id":"c1e72043a54bd7e8884ee8011bb13b752a8b4ad7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ad7f319256791b66d73a35c221400f9b636d9edb","unresolved":false,"context_lines":[{"line_number":1096,"context_line":"        try:"},{"line_number":1097,"context_line":"            return rpc_node, pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":1098,"context_line":"        except exception.NoValidHost as e:"},{"line_number":1099,"context_line":"            e.code \u003d http_client.SERVICE_UNAVAILABLE"},{"line_number":1100,"context_line":"            raise"},{"line_number":1101,"context_line":""},{"line_number":1102,"context_line":"    @METRICS.timer(\u0027NodeVIFController.get_all\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba5201f7_469b7618","line":1099,"in_reply_to":"ba5201f7_0346c04e","updated":"2017-01-11 15:04:29.000000000","message":"We had  an IRC discussion about this [1]. 400 and 404 are what are being returned currently so we don\u0027t want to return 503 unless we fix it for all places where it should be 503. jroll and vdrok prefer 400 so we\u0027ll leave it as 400. (I\u0027d like a comment to that effect but instead, I opened a bug about it: https://bugs.launchpad.net/ironic/+bug/1655674).\n\n[1] http://eavesdrop.openstack.org/irclogs/%23openstack-ironic/%23openstack-ironic.2017-01-11.log.html#t2017-01-11T14:35:14","commit_id":"c1e72043a54bd7e8884ee8011bb13b752a8b4ad7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"f4906eb6f8f61aab98307f0c9f0d968c0e89be3c","unresolved":false,"context_lines":[{"line_number":1096,"context_line":"        try:"},{"line_number":1097,"context_line":"            return rpc_node, pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":1098,"context_line":"        except exception.NoValidHost as e:"},{"line_number":1099,"context_line":"            e.code \u003d http_client.SERVICE_UNAVAILABLE"},{"line_number":1100,"context_line":"            raise"},{"line_number":1101,"context_line":""},{"line_number":1102,"context_line":"    @METRICS.timer(\u0027NodeVIFController.get_all\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba5201f7_0346c04e","line":1099,"in_reply_to":"ba5201f7_60b3029b","updated":"2017-01-11 14:35:51.000000000","message":"Yah, that was the logic behind that, but for consistency, let\u0027s go this way for now.","commit_id":"c1e72043a54bd7e8884ee8011bb13b752a8b4ad7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"449d639a6d7598ef4bebb01d85c564a3e837c032","unresolved":false,"context_lines":[{"line_number":1096,"context_line":"        try:"},{"line_number":1097,"context_line":"            return rpc_node, pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":1098,"context_line":"        except exception.NoValidHost as e:"},{"line_number":1099,"context_line":"            e.code \u003d http_client.SERVICE_UNAVAILABLE"},{"line_number":1100,"context_line":"            raise"},{"line_number":1101,"context_line":""},{"line_number":1102,"context_line":"    @METRICS.timer(\u0027NodeVIFController.get_all\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba5201f7_60b3029b","line":1099,"in_reply_to":"ba5201f7_769caf5d","updated":"2017-01-11 14:32:47.000000000","message":"I had asked about this in patch set 15: \u0027If the rpc_node exists, it seems to me that if we cannot get a topic, it would be an internal error.\u0027.\n\nHaving said that, if we really do use BAD_REQUEST, then I guess we should be consistent but I\u0027m not convinced BAD_REQUEST is correct.","commit_id":"c1e72043a54bd7e8884ee8011bb13b752a8b4ad7"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"8c9f738b7c6e116d19709a4891961c9c6d647554","unresolved":false,"context_lines":[{"line_number":1096,"context_line":"        try:"},{"line_number":1097,"context_line":"            return rpc_node, pecan.request.rpcapi.get_topic_for(rpc_node)"},{"line_number":1098,"context_line":"        except exception.NoValidHost as e:"},{"line_number":1099,"context_line":"            e.code \u003d http_client.SERVICE_UNAVAILABLE"},{"line_number":1100,"context_line":"            raise"},{"line_number":1101,"context_line":""},{"line_number":1102,"context_line":"    @METRICS.timer(\u0027NodeVIFController.get_all\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba5201f7_769caf5d","line":1099,"in_reply_to":"ba5201f7_93dda572","updated":"2017-01-11 13:09:04.000000000","message":"Done","commit_id":"c1e72043a54bd7e8884ee8011bb13b752a8b4ad7"}],"ironic/api/controllers/v1/portgroup.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7956ddcd09b8f8c5fc389a823e75813a2a42f71d","unresolved":false,"context_lines":[{"line_number":447,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":448,"context_line":"                error_msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        vif \u003d portgroup.extra.get(\u0027vif_port_id\u0027)"},{"line_number":451,"context_line":"        if vif:"},{"line_number":452,"context_line":"            common_utils.warn_about_deprecated_extra_vif_port_id()"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        new_portgroup \u003d objects.Portgroup(pecan.request.context,"},{"line_number":455,"context_line":"                                          **portgroup.as_dict())"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba5201f7_19c83674","line":452,"range":{"start_line":450,"start_character":8,"end_line":452,"end_character":66},"updated":"2017-01-10 11:28:50.000000000","message":"I think we should not do it yet, attaching to portgroups won\u0027t work until https://review.openstack.org/406915 is done. There is no other way to attach neutron port to portgroup apart from this one.","commit_id":"241dcca82daf4209fac18dab1c74f7a2ab4c7282"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"4827ba42c91f9f43b6e020e9f818a56c272b3752","unresolved":false,"context_lines":[{"line_number":447,"context_line":"            raise wsme.exc.ClientSideError("},{"line_number":448,"context_line":"                error_msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"        vif \u003d portgroup.extra.get(\u0027vif_port_id\u0027)"},{"line_number":451,"context_line":"        if vif:"},{"line_number":452,"context_line":"            common_utils.warn_about_deprecated_extra_vif_port_id()"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        new_portgroup \u003d objects.Portgroup(pecan.request.context,"},{"line_number":455,"context_line":"                                          **portgroup.as_dict())"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba5201f7_efcd645e","line":452,"range":{"start_line":450,"start_character":8,"end_line":452,"end_character":66},"in_reply_to":"ba5201f7_19c83674","updated":"2017-01-10 12:21:43.000000000","message":"Done","commit_id":"241dcca82daf4209fac18dab1c74f7a2ab4c7282"}],"ironic/api/controllers/v1/types.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3a1ecd0db44fb9654936160b4ed84fb65cea3bb4","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        # Check all mandatory fields are present"},{"line_number":345,"context_line":"        missing \u003d VifType.mandatory_fields - keys"},{"line_number":346,"context_line":"        if missing:"},{"line_number":347,"context_line":"            msg \u003d _(\u0027Missing mandatory keys: %s\u0027) % missing"},{"line_number":348,"context_line":"            raise exception.Invalid(msg)"},{"line_number":349,"context_line":"        UuidOrNameType.validate(value[\u0027id\u0027])"},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_2a5e8ae9","line":347,"updated":"2016-12-22 16:09:18.000000000","message":"nit. I\u0027m not sure what this exception will look like, maybe we should mention that it is the vif, eg s/Missing/VIF is missing/","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"79922b388130a1c12bd3aba14ce778e81e177439","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        # Check all mandatory fields are present"},{"line_number":345,"context_line":"        missing \u003d VifType.mandatory_fields - keys"},{"line_number":346,"context_line":"        if missing:"},{"line_number":347,"context_line":"            msg \u003d _(\u0027Missing mandatory keys: %s\u0027) % missing"},{"line_number":348,"context_line":"            raise exception.Invalid(msg)"},{"line_number":349,"context_line":"        UuidOrNameType.validate(value[\u0027id\u0027])"},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_61e179fe","line":347,"in_reply_to":"da4df55a_2a5e8ae9","updated":"2016-12-23 11:18:31.000000000","message":"Rewrite it a bit, what do you think about the following:\n\n\"Missing mandatory keys: key1, key2, ...\"?\nFor now it will look like:\n\"Missing mandatory keys: id\" since id is the only one mandatory key.","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"1b6f0804a8608af1ff123c43d82ac97ab784bab6","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        # Check all mandatory fields are present"},{"line_number":345,"context_line":"        missing \u003d VifType.mandatory_fields - keys"},{"line_number":346,"context_line":"        if missing:"},{"line_number":347,"context_line":"            msg \u003d _(\u0027Missing mandatory keys: %s\u0027) % missing"},{"line_number":348,"context_line":"            raise exception.Invalid(msg)"},{"line_number":349,"context_line":"        UuidOrNameType.validate(value[\u0027id\u0027])"},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_8bbaf3df","line":347,"in_reply_to":"da4df55a_61e179fe","updated":"2016-12-23 12:42:44.000000000","message":"It looks good to me, logged exception should contain info about failed function anyway. Seems compliant with validation error messages in other classes in this file.","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"8956e811a473b21b8433a3f39ffb958af9b62164","unresolved":false,"context_lines":[{"line_number":474,"context_line":"def allow_vifs_subcontroller():"},{"line_number":475,"context_line":"    \"\"\"Check if node/vifs can be used."},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    Version 1.27 of the API added support for VIFs to be"},{"line_number":478,"context_line":"    attached to Nodes."},{"line_number":479,"context_line":"    \"\"\""},{"line_number":480,"context_line":"    return (pecan.request.version.minor \u003e\u003d"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba5201f7_fe2443c7","line":477,"range":{"start_line":477,"start_character":12,"end_line":477,"end_character":16},"updated":"2017-01-10 08:07:06.000000000","message":"1.28","commit_id":"d84a40d21dcbcea89e65bece47afe682fd87ba6c"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"67961940e1151a13add243bb61fb99dcae597833","unresolved":false,"context_lines":[{"line_number":474,"context_line":"def allow_vifs_subcontroller():"},{"line_number":475,"context_line":"    \"\"\"Check if node/vifs can be used."},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    Version 1.27 of the API added support for VIFs to be"},{"line_number":478,"context_line":"    attached to Nodes."},{"line_number":479,"context_line":"    \"\"\""},{"line_number":480,"context_line":"    return (pecan.request.version.minor \u003e\u003d"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba5201f7_01dd2a70","line":477,"range":{"start_line":477,"start_character":12,"end_line":477,"end_character":16},"in_reply_to":"ba5201f7_fe2443c7","updated":"2017-01-10 08:19:41.000000000","message":"Done","commit_id":"d84a40d21dcbcea89e65bece47afe682fd87ba6c"}],"ironic/api/controllers/v1/versions.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3656ac65ee732be80346d20350516bc050b62c4a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"MINOR_26_VIFS_SUBCONTROLLER \u003d 26"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"# When adding another version, update MINOR_MAX_VERSION and also update"},{"line_number":90,"context_line":"# doc/source/dev/webapi-version-history.rst with a detailed explanation of"},{"line_number":91,"context_line":"# what the version has changed."},{"line_number":92,"context_line":"MINOR_MAX_VERSION \u003d MINOR_26_VIFS_SUBCONTROLLER"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_0009bcdd","line":90,"updated":"2016-12-07 18:48:10.000000000","message":"don\u0027t forget to update this page","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"069c7477f85b0b5619c1bb722976a7e524f8526c","unresolved":false,"context_lines":[{"line_number":87,"context_line":"MINOR_26_VIFS_SUBCONTROLLER \u003d 26"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"# When adding another version, update MINOR_MAX_VERSION and also update"},{"line_number":90,"context_line":"# doc/source/dev/webapi-version-history.rst with a detailed explanation of"},{"line_number":91,"context_line":"# what the version has changed."},{"line_number":92,"context_line":"MINOR_MAX_VERSION \u003d MINOR_26_VIFS_SUBCONTROLLER"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_1ecbbf73","line":90,"in_reply_to":"3a71b18c_0009bcdd","updated":"2016-12-08 17:21:20.000000000","message":"Done","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"}],"ironic/common/utils.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"2eb9827191c70db7e72fc381fbd14fa922ff5a86","unresolved":false,"context_lines":[{"line_number":545,"context_line":"    if not warn_deprecated_extra_vif_port_id:"},{"line_number":546,"context_line":"        warn_deprecated_extra_vif_port_id \u003d True"},{"line_number":547,"context_line":"        LOG.warning(_LW(\"Attaching VIF to a port/portgroup via \""},{"line_number":548,"context_line":"                        \"extra[\u0027vif_port_id\u0027] is deprecated and will be \""},{"line_number":549,"context_line":"                        \"removed in Pike release. API endpoint \""},{"line_number":550,"context_line":"                        \"v1/nodes/\u003cnode\u003e/vifs should be used instead.\"))"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_a11d61bf","line":549,"range":{"start_line":548,"start_character":64,"end_line":549,"end_character":32},"updated":"2016-12-29 16:57:02.000000000","message":"will not be supported","commit_id":"c7aa139538f234f12afd777fa24fa6ae91de0b3a"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"e9e922cb0eb1c21f2d59ff4f8d3a434944445370","unresolved":false,"context_lines":[{"line_number":545,"context_line":"    if not warn_deprecated_extra_vif_port_id:"},{"line_number":546,"context_line":"        warn_deprecated_extra_vif_port_id \u003d True"},{"line_number":547,"context_line":"        LOG.warning(_LW(\"Attaching VIF to a port/portgroup via \""},{"line_number":548,"context_line":"                        \"extra[\u0027vif_port_id\u0027] is deprecated and will be \""},{"line_number":549,"context_line":"                        \"removed in Pike release. API endpoint \""},{"line_number":550,"context_line":"                        \"v1/nodes/\u003cnode\u003e/vifs should be used instead.\"))"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_5789ccc9","line":549,"range":{"start_line":548,"start_character":64,"end_line":549,"end_character":32},"in_reply_to":"ba5201f7_a11d61bf","updated":"2016-12-30 09:09:39.000000000","message":"Done","commit_id":"c7aa139538f234f12afd777fa24fa6ae91de0b3a"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"2540168b51c41085cee90d9975d9fad2eb49405e","unresolved":false,"context_lines":[{"line_number":541,"context_line":""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"def warn_about_deprecated_extra_vif_port_id():"},{"line_number":544,"context_line":"    global warn_deprecated_extra_vif_port_id"},{"line_number":545,"context_line":"    if not warn_deprecated_extra_vif_port_id:"},{"line_number":546,"context_line":"        warn_deprecated_extra_vif_port_id \u003d True"},{"line_number":547,"context_line":"        LOG.warning(_LW(\"Attaching VIF to a port/portgroup via \""}],"source_content_type":"text/x-python","patch_set":24,"id":"ba5201f7_31eb4ab2","line":544,"updated":"2017-01-03 12:12:41.000000000","message":"shouldn\u0027t this variable be set to True at the beginning?\nThe way it\u0027s implemented now, this warning will be only displayed once - why is it better?","commit_id":"be6cf4b59b65fd6ca8241b0df4316b7a31a8c405"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e3523dcc958771eb67a1817aeeac058cd674d815","unresolved":false,"context_lines":[{"line_number":541,"context_line":""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"def warn_about_deprecated_extra_vif_port_id():"},{"line_number":544,"context_line":"    global warn_deprecated_extra_vif_port_id"},{"line_number":545,"context_line":"    if not warn_deprecated_extra_vif_port_id:"},{"line_number":546,"context_line":"        warn_deprecated_extra_vif_port_id \u003d True"},{"line_number":547,"context_line":"        LOG.warning(_LW(\"Attaching VIF to a port/portgroup via \""}],"source_content_type":"text/x-python","patch_set":24,"id":"ba5201f7_5c3b85d1","line":544,"in_reply_to":"ba5201f7_31eb4ab2","updated":"2017-01-03 12:32:09.000000000","message":"That\u0027s the common guideline in the openstack, deprecation warnings should be displayed once so that not to pollute the logs.","commit_id":"be6cf4b59b65fd6ca8241b0df4316b7a31a8c405"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4eecdcf7caf0771e550235147d8bebb31ab13dbe","unresolved":false,"context_lines":[{"line_number":546,"context_line":"        warn_deprecated_extra_vif_port_id \u003d True"},{"line_number":547,"context_line":"        LOG.warning(_LW(\"Attaching VIF to a port/portgroup via \""},{"line_number":548,"context_line":"                        \"extra[\u0027vif_port_id\u0027] is deprecated and will not \""},{"line_number":549,"context_line":"                        \"be supported in Pike release. API endpoint \""},{"line_number":550,"context_line":"                        \"v1/nodes/\u003cnode\u003e/vifs should be used instead.\"))"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba5201f7_139a3c6e","line":549,"range":{"start_line":549,"start_character":55,"end_line":549,"end_character":67},"updated":"2017-01-06 16:28:25.000000000","message":"nit - POSTing to API endpoint","commit_id":"be6cf4b59b65fd6ca8241b0df4316b7a31a8c405"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7956ddcd09b8f8c5fc389a823e75813a2a42f71d","unresolved":false,"context_lines":[{"line_number":544,"context_line":"    global warn_deprecated_extra_vif_port_id"},{"line_number":545,"context_line":"    if not warn_deprecated_extra_vif_port_id:"},{"line_number":546,"context_line":"        warn_deprecated_extra_vif_port_id \u003d True"},{"line_number":547,"context_line":"        LOG.warning(_LW(\"Attaching VIF to a port/portgroup via \""},{"line_number":548,"context_line":"                        \"extra[\u0027vif_port_id\u0027] is deprecated and will not \""},{"line_number":549,"context_line":"                        \"be supported in Pike release. API endpoint \""},{"line_number":550,"context_line":"                        \"v1/nodes/\u003cnode\u003e/vifs should be used instead.\"))"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba5201f7_99afc67c","line":547,"range":{"start_line":547,"start_character":48,"end_line":547,"end_character":58},"updated":"2017-01-10 11:28:50.000000000","message":"Here too, we might want to mention only ports here for now.","commit_id":"241dcca82daf4209fac18dab1c74f7a2ab4c7282"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"4827ba42c91f9f43b6e020e9f818a56c272b3752","unresolved":false,"context_lines":[{"line_number":544,"context_line":"    global warn_deprecated_extra_vif_port_id"},{"line_number":545,"context_line":"    if not warn_deprecated_extra_vif_port_id:"},{"line_number":546,"context_line":"        warn_deprecated_extra_vif_port_id \u003d True"},{"line_number":547,"context_line":"        LOG.warning(_LW(\"Attaching VIF to a port/portgroup via \""},{"line_number":548,"context_line":"                        \"extra[\u0027vif_port_id\u0027] is deprecated and will not \""},{"line_number":549,"context_line":"                        \"be supported in Pike release. API endpoint \""},{"line_number":550,"context_line":"                        \"v1/nodes/\u003cnode\u003e/vifs should be used instead.\"))"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba5201f7_2fef6cb1","line":547,"range":{"start_line":547,"start_character":48,"end_line":547,"end_character":58},"in_reply_to":"ba5201f7_99afc67c","updated":"2017-01-10 12:21:43.000000000","message":"Done","commit_id":"241dcca82daf4209fac18dab1c74f7a2ab4c7282"}],"ironic/conductor/manager.py":[{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"ae1da566f1bc079fe360b7697c3a9e4b36d0fb54","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    \"\"\"Ironic Conductor manager main class.\"\"\""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    # NOTE(rloo): This must be in sync with rpcapi.ConductorAPI\u0027s."},{"line_number":85,"context_line":"    RPC_API_VERSION \u003d \u00271.36\u0027"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    target \u003d messaging.Target(version\u003dRPC_API_VERSION)"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_b463ae19","line":85,"updated":"2016-12-02 13:40:52.000000000","message":"It is RPC api change, should go to https://review.openstack.org/#/c/404239","commit_id":"41149429c0345bf372d0a3a72f3489c7cd567173"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"ae1da566f1bc079fe360b7697c3a9e4b36d0fb54","unresolved":false,"context_lines":[{"line_number":2249,"context_line":"    @messaging.expected_exceptions(exception.NodeLocked,"},{"line_number":2250,"context_line":"                                   exception.NetworkError,"},{"line_number":2251,"context_line":"                                   exception.InvalidParameterValue)"},{"line_number":2252,"context_line":"    def vif_attach(self, context, node_id, vif):"},{"line_number":2253,"context_line":"        with task_manager.acquire(context, node_id,"},{"line_number":2254,"context_line":"                                  purpose\u003d\u0027attach vif\u0027) as task:"},{"line_number":2255,"context_line":"            task.driver.network.validate(task)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_b779f0fe","line":2252,"updated":"2016-12-02 13:40:52.000000000","message":"it is vif_object right?","commit_id":"41149429c0345bf372d0a3a72f3489c7cd567173"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"53a3c98d9e104b4e785063f9913bf264be7c1fbf","unresolved":false,"context_lines":[{"line_number":2249,"context_line":"    @messaging.expected_exceptions(exception.NodeLocked,"},{"line_number":2250,"context_line":"                                   exception.NetworkError,"},{"line_number":2251,"context_line":"                                   exception.InvalidParameterValue)"},{"line_number":2252,"context_line":"    def vif_attach(self, context, node_id, vif):"},{"line_number":2253,"context_line":"        with task_manager.acquire(context, node_id,"},{"line_number":2254,"context_line":"                                  purpose\u003d\u0027attach vif\u0027) as task:"},{"line_number":2255,"context_line":"            task.driver.network.validate(task)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_4c717c43","line":2252,"in_reply_to":"3a71b18c_b779f0fe","updated":"2016-12-06 12:15:14.000000000","message":"Done","commit_id":"41149429c0345bf372d0a3a72f3489c7cd567173"}],"ironic/conductor/rpcapi.py":[{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"ae1da566f1bc079fe360b7697c3a9e4b36d0fb54","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    |    1.33 - Added update and destroy portgroup."},{"line_number":83,"context_line":"    |    1.34 - Added heartbeat"},{"line_number":84,"context_line":"    |    1.35 - Added destroy_volume_connector and update_volume_connector"},{"line_number":85,"context_line":"    |    1.36 - Added vif_attach, vif_detach, vif_list"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    \"\"\""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_d4666a28","line":85,"updated":"2016-12-02 13:40:52.000000000","message":"ditto: https://review.openstack.org/#/c/404239","commit_id":"41149429c0345bf372d0a3a72f3489c7cd567173"}],"ironic/drivers/modules/network/common.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"2eb9827191c70db7e72fc381fbd14fa922ff5a86","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        if \u0027extra\u0027 in port_obj.obj_what_changed():"},{"line_number":59,"context_line":"            original_port \u003d objects.Port.get_by_id(context, port_obj.id)"},{"line_number":60,"context_line":"            updated_client_id \u003d port_obj.extra.get(\u0027client-id\u0027)"},{"line_number":61,"context_line":"            if vif:"},{"line_number":62,"context_line":"                utils.warn_about_deprecated_extra_vif_port_id()"},{"line_number":63,"context_line":"            if (original_port.extra.get(\u0027client-id\u0027) !\u003d"},{"line_number":64,"context_line":"                updated_client_id):"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_c11185b1","line":61,"updated":"2016-12-29 16:57:02.000000000","message":"This can mean that tenant_vif_port_id is set in internal info and something in extra has changed. Please check that it\u0027s actual extra.vif_port_id is changed.","commit_id":"c7aa139538f234f12afd777fa24fa6ae91de0b3a"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"e9e922cb0eb1c21f2d59ff4f8d3a434944445370","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        if \u0027extra\u0027 in port_obj.obj_what_changed():"},{"line_number":59,"context_line":"            original_port \u003d objects.Port.get_by_id(context, port_obj.id)"},{"line_number":60,"context_line":"            updated_client_id \u003d port_obj.extra.get(\u0027client-id\u0027)"},{"line_number":61,"context_line":"            if vif:"},{"line_number":62,"context_line":"                utils.warn_about_deprecated_extra_vif_port_id()"},{"line_number":63,"context_line":"            if (original_port.extra.get(\u0027client-id\u0027) !\u003d"},{"line_number":64,"context_line":"                updated_client_id):"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_c990c498","line":61,"in_reply_to":"ba5201f7_c11185b1","updated":"2016-12-30 09:09:39.000000000","message":"Indeed if vif was set with port-create we will have additional warning in conductor log. Fixed.","commit_id":"c7aa139538f234f12afd777fa24fa6ae91de0b3a"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"2eb9827191c70db7e72fc381fbd14fa922ff5a86","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                                            token\u003dcontext.auth_token)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        if \u0027extra\u0027 in portgroup_obj.obj_what_changed():"},{"line_number":121,"context_line":"            if portgroup_obj.extra.get(\u0027vif_port_id\u0027):"},{"line_number":122,"context_line":"                utils.warn_about_deprecated_extra_vif_port_id()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        if (\u0027standalone_ports_supported\u0027 in"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_c178a5fb","line":121,"updated":"2016-12-29 16:57:02.000000000","message":"ditto","commit_id":"c7aa139538f234f12afd777fa24fa6ae91de0b3a"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"e9e922cb0eb1c21f2d59ff4f8d3a434944445370","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                                            token\u003dcontext.auth_token)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        if \u0027extra\u0027 in portgroup_obj.obj_what_changed():"},{"line_number":121,"context_line":"            if portgroup_obj.extra.get(\u0027vif_port_id\u0027):"},{"line_number":122,"context_line":"                utils.warn_about_deprecated_extra_vif_port_id()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        if (\u0027standalone_ports_supported\u0027 in"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba5201f7_e98d887c","line":121,"in_reply_to":"ba5201f7_c178a5fb","updated":"2016-12-30 09:09:39.000000000","message":"Done","commit_id":"c7aa139538f234f12afd777fa24fa6ae91de0b3a"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7956ddcd09b8f8c5fc389a823e75813a2a42f71d","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                                            portgroup_obj.address,"},{"line_number":118,"context_line":"                                            token\u003dcontext.auth_token)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        if \u0027extra\u0027 in portgroup_obj.obj_what_changed():"},{"line_number":121,"context_line":"            original_portgroup \u003d objects.Portgroup.get_by_id(context,"},{"line_number":122,"context_line":"                                                             portgroup_obj.id)"},{"line_number":123,"context_line":"            if (portgroup_obj.extra.get(\u0027vif_port_id\u0027) !\u003d"},{"line_number":124,"context_line":"                    original_portgroup.extra.get(\u0027vif_port_id\u0027)):"},{"line_number":125,"context_line":"                utils.warn_about_deprecated_extra_vif_port_id()"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        if (\u0027standalone_ports_supported\u0027 in"},{"line_number":128,"context_line":"                portgroup_obj.obj_what_changed()):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba5201f7_b9af2a93","line":125,"range":{"start_line":120,"start_character":8,"end_line":125,"end_character":63},"updated":"2017-01-10 11:28:50.000000000","message":"ditto","commit_id":"241dcca82daf4209fac18dab1c74f7a2ab4c7282"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"4827ba42c91f9f43b6e020e9f818a56c272b3752","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                                            portgroup_obj.address,"},{"line_number":118,"context_line":"                                            token\u003dcontext.auth_token)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        if \u0027extra\u0027 in portgroup_obj.obj_what_changed():"},{"line_number":121,"context_line":"            original_portgroup \u003d objects.Portgroup.get_by_id(context,"},{"line_number":122,"context_line":"                                                             portgroup_obj.id)"},{"line_number":123,"context_line":"            if (portgroup_obj.extra.get(\u0027vif_port_id\u0027) !\u003d"},{"line_number":124,"context_line":"                    original_portgroup.extra.get(\u0027vif_port_id\u0027)):"},{"line_number":125,"context_line":"                utils.warn_about_deprecated_extra_vif_port_id()"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        if (\u0027standalone_ports_supported\u0027 in"},{"line_number":128,"context_line":"                portgroup_obj.obj_what_changed()):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba5201f7_0f49c8d0","line":125,"range":{"start_line":120,"start_character":8,"end_line":125,"end_character":63},"in_reply_to":"ba5201f7_b9af2a93","updated":"2017-01-10 12:21:43.000000000","message":"Done","commit_id":"241dcca82daf4209fac18dab1c74f7a2ab4c7282"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"eed578d6ab5e35bb6676aacf6b218103ca03d3af","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            original_port \u003d objects.Port.get_by_id(context, port_obj.id)"},{"line_number":60,"context_line":"            updated_client_id \u003d port_obj.extra.get(\u0027client-id\u0027)"},{"line_number":61,"context_line":"            if vif !\u003d original_port.extra.get(\u0027vif_port_id\u0027):"},{"line_number":62,"context_line":"                utils.warn_about_deprecated_extra_vif_port_id()"},{"line_number":63,"context_line":"            if (original_port.extra.get(\u0027client-id\u0027) !\u003d"},{"line_number":64,"context_line":"                updated_client_id):"},{"line_number":65,"context_line":"                # DHCP Option with opt_value\u003dNone will remove it"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_e5e81919","line":62,"updated":"2017-01-10 15:50:32.000000000","message":"I\u0027m a bit lost here, but it could be due to being away from the code for awhile.\n\nAre we issuing a warning here because we think that the vif was specified (and/or changed) in port_obj.extra[\u0027vif_port_id\u0027]? \n\nWhat if \n    1. original_port.internal_info[TENANT_VIF_KEY] \u003d vif1 and original_port.extra doesn\u0027t have \u0027vif_port_id\u0027 AND\n    2. port_obj.internal_info[TENANT_VIF_KEY] \u003d vif1 and port_obj.extra doesn\u0027t have \u0027vif_port_id\u0027\n\nthen vif \u003d vif1 and we\u0027ll issue a warning?","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e97231a6be827f1e79f15a888c69abce432877d6","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            original_port \u003d objects.Port.get_by_id(context, port_obj.id)"},{"line_number":60,"context_line":"            updated_client_id \u003d port_obj.extra.get(\u0027client-id\u0027)"},{"line_number":61,"context_line":"            if vif !\u003d original_port.extra.get(\u0027vif_port_id\u0027):"},{"line_number":62,"context_line":"                utils.warn_about_deprecated_extra_vif_port_id()"},{"line_number":63,"context_line":"            if (original_port.extra.get(\u0027client-id\u0027) !\u003d"},{"line_number":64,"context_line":"                updated_client_id):"},{"line_number":65,"context_line":"                # DHCP Option with opt_value\u003dNone will remove it"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_fe1186b0","line":62,"in_reply_to":"ba5201f7_08d61427","updated":"2017-01-10 16:39:48.000000000","message":"Ok, so it should be something like\nif port_obj.extra.get(\u0027vif_port_id\u0027) and (port_obj.extra.[\u0027vif_port_id\u0027] !\u003d original_port.extra.get(\u0027vif_port_id\u0027)):","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"44a216afd46631c191dabff43e0666c8bff01197","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            original_port \u003d objects.Port.get_by_id(context, port_obj.id)"},{"line_number":60,"context_line":"            updated_client_id \u003d port_obj.extra.get(\u0027client-id\u0027)"},{"line_number":61,"context_line":"            if vif !\u003d original_port.extra.get(\u0027vif_port_id\u0027):"},{"line_number":62,"context_line":"                utils.warn_about_deprecated_extra_vif_port_id()"},{"line_number":63,"context_line":"            if (original_port.extra.get(\u0027client-id\u0027) !\u003d"},{"line_number":64,"context_line":"                updated_client_id):"},{"line_number":65,"context_line":"                # DHCP Option with opt_value\u003dNone will remove it"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_08d61427","line":62,"in_reply_to":"ba5201f7_e5e81919","updated":"2017-01-10 16:15:53.000000000","message":"Hm, yeah, that seems to be the case, need to udpate this piece. We need to look specifically at port_obj.extra.get(\u0027vif_port_id\u0027) here.","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"}],"ironic/tests/unit/api/v1/test_nodes.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":3051,"context_line":"            \u0027misc\u0027: \u0027Something extra\u0027"},{"line_number":3052,"context_line":"        }"},{"line_number":3053,"context_line":"        vif \u003d api_node.viftype.frombasetype(request_body)"},{"line_number":3054,"context_line":"        self.assertEqual(vif[\u0027id\u0027], vif_id)"},{"line_number":3055,"context_line":"        self.assertEqual(vif[\u0027misc\u0027], \u0027Something extra\u0027)"},{"line_number":3056,"context_line":""},{"line_number":3057,"context_line":"    @mock.patch(\"pecan.request\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa48f94a_92b99cef","line":3054,"updated":"2016-12-21 17:38:00.000000000","message":"it\u0027s the other way, .assertEqual(vif_id, vif[\u0027id\u0027])","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":3051,"context_line":"            \u0027misc\u0027: \u0027Something extra\u0027"},{"line_number":3052,"context_line":"        }"},{"line_number":3053,"context_line":"        vif \u003d api_node.viftype.frombasetype(request_body)"},{"line_number":3054,"context_line":"        self.assertEqual(vif[\u0027id\u0027], vif_id)"},{"line_number":3055,"context_line":"        self.assertEqual(vif[\u0027misc\u0027], \u0027Something extra\u0027)"},{"line_number":3056,"context_line":""},{"line_number":3057,"context_line":"    @mock.patch(\"pecan.request\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_f66c7a9e","line":3054,"in_reply_to":"fa48f94a_92b99cef","updated":"2016-12-22 14:07:34.000000000","message":"correct first argument is expected, second -actual.","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":3052,"context_line":"        }"},{"line_number":3053,"context_line":"        vif \u003d api_node.viftype.frombasetype(request_body)"},{"line_number":3054,"context_line":"        self.assertEqual(vif[\u0027id\u0027], vif_id)"},{"line_number":3055,"context_line":"        self.assertEqual(vif[\u0027misc\u0027], \u0027Something extra\u0027)"},{"line_number":3056,"context_line":""},{"line_number":3057,"context_line":"    @mock.patch(\"pecan.request\")"},{"line_number":3058,"context_line":"    def test_vif_type_bad_id(self, mock_req):"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa48f94a_32cb9074","line":3055,"updated":"2016-12-21 17:38:00.000000000","message":"ditto","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":3052,"context_line":"        }"},{"line_number":3053,"context_line":"        vif \u003d api_node.viftype.frombasetype(request_body)"},{"line_number":3054,"context_line":"        self.assertEqual(vif[\u0027id\u0027], vif_id)"},{"line_number":3055,"context_line":"        self.assertEqual(vif[\u0027misc\u0027], \u0027Something extra\u0027)"},{"line_number":3056,"context_line":""},{"line_number":3057,"context_line":"    @mock.patch(\"pecan.request\")"},{"line_number":3058,"context_line":"    def test_vif_type_bad_id(self, mock_req):"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_166ade80","line":3055,"in_reply_to":"fa48f94a_32cb9074","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":3096,"context_line":"        self.assertEqual(http_client.NO_CONTENT, ret.status_code)"},{"line_number":3097,"context_line":"        mock_get.assert_called_once_with(mock.ANY, self.node.uuid)"},{"line_number":3098,"context_line":"        mock_attach.assert_called_once_with(mock.ANY, self.node.uuid,"},{"line_number":3099,"context_line":"                                            vif_info\u003dmock.ANY,"},{"line_number":3100,"context_line":"                                            topic\u003d\u0027test-topic\u0027)"},{"line_number":3101,"context_line":""},{"line_number":3102,"context_line":"    @mock.patch.object(objects.Node, \u0027get_by_name\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa48f94a_32c71047","line":3099,"updated":"2016-12-21 17:38:00.000000000","message":"wouldn\u0027t mock.ANY be request_body?","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":3096,"context_line":"        self.assertEqual(http_client.NO_CONTENT, ret.status_code)"},{"line_number":3097,"context_line":"        mock_get.assert_called_once_with(mock.ANY, self.node.uuid)"},{"line_number":3098,"context_line":"        mock_attach.assert_called_once_with(mock.ANY, self.node.uuid,"},{"line_number":3099,"context_line":"                                            vif_info\u003dmock.ANY,"},{"line_number":3100,"context_line":"                                            topic\u003d\u0027test-topic\u0027)"},{"line_number":3101,"context_line":""},{"line_number":3102,"context_line":"    @mock.patch.object(objects.Node, \u0027get_by_name\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_3688c222","line":3099,"in_reply_to":"fa48f94a_32c71047","updated":"2016-12-22 14:07:34.000000000","message":"first argument is context please see: https://review.openstack.org/#/c/404239/14/ironic/conductor/rpcapi.py@844","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":3119,"context_line":"                                            vif_info\u003dmock.ANY,"},{"line_number":3120,"context_line":"                                            topic\u003d\u0027test-topic\u0027)"},{"line_number":3121,"context_line":""},{"line_number":3122,"context_line":"    @mock.patch.object(rpcapi.ConductorAPI, \u0027vif_attach\u0027)"},{"line_number":3123,"context_line":"    def test_vif_attach_node_not_found(self, mock_attach):"},{"line_number":3124,"context_line":"        vif_id \u003d uuidutils.generate_uuid()"},{"line_number":3125,"context_line":"        request_body \u003d {"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa48f94a_92119cb2","line":3122,"updated":"2016-12-21 17:38:00.000000000","message":"no need for this mock, unless you want to check that it wasn\u0027t called.","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":3119,"context_line":"                                            vif_info\u003dmock.ANY,"},{"line_number":3120,"context_line":"                                            topic\u003d\u0027test-topic\u0027)"},{"line_number":3121,"context_line":""},{"line_number":3122,"context_line":"    @mock.patch.object(rpcapi.ConductorAPI, \u0027vif_attach\u0027)"},{"line_number":3123,"context_line":"    def test_vif_attach_node_not_found(self, mock_attach):"},{"line_number":3124,"context_line":"        vif_id \u003d uuidutils.generate_uuid()"},{"line_number":3125,"context_line":"        request_body \u003d {"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_b67cb221","line":3122,"in_reply_to":"fa48f94a_92119cb2","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":3215,"context_line":"                                            vif_id\u003dvif_id,"},{"line_number":3216,"context_line":"                                            topic\u003d\u0027test-topic\u0027)"},{"line_number":3217,"context_line":""},{"line_number":3218,"context_line":"    @mock.patch.object(rpcapi.ConductorAPI, \u0027vif_detach\u0027)"},{"line_number":3219,"context_line":"    def test_vif_detach_node_not_found(self, mock_detach):"},{"line_number":3220,"context_line":"        vif_id \u003d uuidutils.generate_uuid()"},{"line_number":3221,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa48f94a_52fc943e","line":3218,"updated":"2016-12-21 17:38:00.000000000","message":"this mock isn\u0027t used?","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":3215,"context_line":"                                            vif_id\u003dvif_id,"},{"line_number":3216,"context_line":"                                            topic\u003d\u0027test-topic\u0027)"},{"line_number":3217,"context_line":""},{"line_number":3218,"context_line":"    @mock.patch.object(rpcapi.ConductorAPI, \u0027vif_detach\u0027)"},{"line_number":3219,"context_line":"    def test_vif_detach_node_not_found(self, mock_detach):"},{"line_number":3220,"context_line":"        vif_id \u003d uuidutils.generate_uuid()"},{"line_number":3221,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_16749e33","line":3218,"in_reply_to":"fa48f94a_52fc943e","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3a1ecd0db44fb9654936160b4ed84fb65cea3bb4","unresolved":false,"context_lines":[{"line_number":3053,"context_line":"        }"},{"line_number":3054,"context_line":"        vif \u003d types.viftype.frombasetype(request_body)"},{"line_number":3055,"context_line":"        self.assertEqual(vif_id, vif[\u0027id\u0027])"},{"line_number":3056,"context_line":"        self.assertEqual(\u0027Something extra\u0027, vif[\u0027misc\u0027])"},{"line_number":3057,"context_line":""},{"line_number":3058,"context_line":"    @mock.patch(\"pecan.request\")"},{"line_number":3059,"context_line":"    def test_vif_type_bad_id(self, mock_req):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_25379db1","line":3056,"updated":"2016-12-22 16:09:18.000000000","message":"this test can move to test_types.py","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"79922b388130a1c12bd3aba14ce778e81e177439","unresolved":false,"context_lines":[{"line_number":3053,"context_line":"        }"},{"line_number":3054,"context_line":"        vif \u003d types.viftype.frombasetype(request_body)"},{"line_number":3055,"context_line":"        self.assertEqual(vif_id, vif[\u0027id\u0027])"},{"line_number":3056,"context_line":"        self.assertEqual(\u0027Something extra\u0027, vif[\u0027misc\u0027])"},{"line_number":3057,"context_line":""},{"line_number":3058,"context_line":"    @mock.patch(\"pecan.request\")"},{"line_number":3059,"context_line":"    def test_vif_type_bad_id(self, mock_req):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_61eb39b1","line":3056,"in_reply_to":"da4df55a_25379db1","updated":"2016-12-23 11:18:31.000000000","message":"Done","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3a1ecd0db44fb9654936160b4ed84fb65cea3bb4","unresolved":false,"context_lines":[{"line_number":3059,"context_line":"    def test_vif_type_bad_id(self, mock_req):"},{"line_number":3060,"context_line":"        mock_req.version.minor \u003d versions.MINOR_MAX_VERSION"},{"line_number":3061,"context_line":"        self.assertRaises(exception.InvalidUuidOrName,"},{"line_number":3062,"context_line":"                          types.viftype.frombasetype, {\u0027id\u0027: 5678})"},{"line_number":3063,"context_line":""},{"line_number":3064,"context_line":"    @mock.patch.object(objects.Node, \u0027get_by_uuid\u0027)"},{"line_number":3065,"context_line":"    def test_vif_subcontroller_old_version(self, mock_get):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_e56cb59e","line":3062,"updated":"2016-12-22 16:09:18.000000000","message":"this can move to test_types.py (which is the test I was commenting about in the other file)","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"79922b388130a1c12bd3aba14ce778e81e177439","unresolved":false,"context_lines":[{"line_number":3059,"context_line":"    def test_vif_type_bad_id(self, mock_req):"},{"line_number":3060,"context_line":"        mock_req.version.minor \u003d versions.MINOR_MAX_VERSION"},{"line_number":3061,"context_line":"        self.assertRaises(exception.InvalidUuidOrName,"},{"line_number":3062,"context_line":"                          types.viftype.frombasetype, {\u0027id\u0027: 5678})"},{"line_number":3063,"context_line":""},{"line_number":3064,"context_line":"    @mock.patch.object(objects.Node, \u0027get_by_uuid\u0027)"},{"line_number":3065,"context_line":"    def test_vif_subcontroller_old_version(self, mock_get):"}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_e1ee49b3","line":3062,"in_reply_to":"da4df55a_e56cb59e","updated":"2016-12-23 11:18:31.000000000","message":"Done","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3a1ecd0db44fb9654936160b4ed84fb65cea3bb4","unresolved":false,"context_lines":[{"line_number":3097,"context_line":"        self.assertEqual(http_client.NO_CONTENT, ret.status_code)"},{"line_number":3098,"context_line":"        mock_get.assert_called_once_with(mock.ANY, self.node.uuid)"},{"line_number":3099,"context_line":"        mock_attach.assert_called_once_with(mock.ANY, self.node.uuid,"},{"line_number":3100,"context_line":"                                            vif_info\u003dmock.ANY,"},{"line_number":3101,"context_line":"                                            topic\u003d\u0027test-topic\u0027)"},{"line_number":3102,"context_line":""},{"line_number":3103,"context_line":"    @mock.patch.object(objects.Node, \u0027get_by_name\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_0a7f06ab","line":3100,"updated":"2016-12-22 16:09:18.000000000","message":"(continuing comment from patch set 15). I meant for vif_info\u003dmock.ANY, won\u0027t this mock.ANY be the request body?","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"79922b388130a1c12bd3aba14ce778e81e177439","unresolved":false,"context_lines":[{"line_number":3097,"context_line":"        self.assertEqual(http_client.NO_CONTENT, ret.status_code)"},{"line_number":3098,"context_line":"        mock_get.assert_called_once_with(mock.ANY, self.node.uuid)"},{"line_number":3099,"context_line":"        mock_attach.assert_called_once_with(mock.ANY, self.node.uuid,"},{"line_number":3100,"context_line":"                                            vif_info\u003dmock.ANY,"},{"line_number":3101,"context_line":"                                            topic\u003d\u0027test-topic\u0027)"},{"line_number":3102,"context_line":""},{"line_number":3103,"context_line":"    @mock.patch.object(objects.Node, \u0027get_by_name\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_e1548922","line":3100,"in_reply_to":"da4df55a_0a7f06ab","updated":"2016-12-23 11:18:31.000000000","message":"Ruby, you are right! it will be checked as requested_body. Fixed here and at L3120","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"}],"ironic/tests/unit/api/v1/test_types.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3a1ecd0db44fb9654936160b4ed84fb65cea3bb4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"da4df55a_ca097e33","line":358,"updated":"2016-12-22 16:09:18.000000000","message":"i suppose we could add another test with an invalid value for the id (not a uuid or an acceptable name)","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"79922b388130a1c12bd3aba14ce778e81e177439","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"da4df55a_e14569b3","line":358,"in_reply_to":"da4df55a_ca097e33","updated":"2016-12-23 11:18:31.000000000","message":"Done","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"eed578d6ab5e35bb6676aacf6b218103ca03d3af","unresolved":false,"context_lines":[{"line_number":344,"context_line":"class TestVifType(base.TestCase):"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def test_vif_type(self, mock_req):"},{"line_number":347,"context_line":"        mock_req.version.minor \u003d 27"},{"line_number":348,"context_line":"        v \u003d types.viftype"},{"line_number":349,"context_line":"        value \u003d {\u0027id\u0027: \u0027foo\u0027}"},{"line_number":350,"context_line":"        self.assertItemsEqual(value, v.validate(value))"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_6fafaae3","line":347,"updated":"2017-01-10 15:50:32.000000000","message":"this is odd. The version for this is 28 now. And if you don\u0027t specify this value, the tests will probably pass. But this value is really needed cuz the code makes this call: UuidOrNameType.validate(), and that requires version.minor \u003d 10. Maybe it makes more sense to make this explicit, as s/27/versions.MINOR_10_UNRESTRICTED_NODE_NAME/\n\nwith \u0027from ironic.api.controllers.v1 import versions\u0027","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"ed1fe091e0e7484a74d4204d8b13ea08ee173b83","unresolved":false,"context_lines":[{"line_number":344,"context_line":"class TestVifType(base.TestCase):"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def test_vif_type(self, mock_req):"},{"line_number":347,"context_line":"        mock_req.version.minor \u003d 27"},{"line_number":348,"context_line":"        v \u003d types.viftype"},{"line_number":349,"context_line":"        value \u003d {\u0027id\u0027: \u0027foo\u0027}"},{"line_number":350,"context_line":"        self.assertItemsEqual(value, v.validate(value))"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_e57819fb","line":347,"in_reply_to":"ba5201f7_6fafaae3","updated":"2017-01-10 16:19:00.000000000","message":"+1\n\nunfortunately, other tests in this file follow the same pattern (but with 10 hardcoded as an int, instead) :/","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e97231a6be827f1e79f15a888c69abce432877d6","unresolved":false,"context_lines":[{"line_number":344,"context_line":"class TestVifType(base.TestCase):"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def test_vif_type(self, mock_req):"},{"line_number":347,"context_line":"        mock_req.version.minor \u003d 27"},{"line_number":348,"context_line":"        v \u003d types.viftype"},{"line_number":349,"context_line":"        value \u003d {\u0027id\u0027: \u0027foo\u0027}"},{"line_number":350,"context_line":"        self.assertItemsEqual(value, v.validate(value))"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_fe9a66c4","line":347,"in_reply_to":"ba5201f7_e57819fb","updated":"2017-01-10 16:39:48.000000000","message":"Yeah, the copy/paste syndrome :-( Something that someone can clean up later I guess.","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"868c56b7e4641e615e9acff6d83020678787721d","unresolved":false,"context_lines":[{"line_number":344,"context_line":"class TestVifType(base.TestCase):"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"    def test_vif_type(self, mock_req):"},{"line_number":347,"context_line":"        mock_req.version.minor \u003d 27"},{"line_number":348,"context_line":"        v \u003d types.viftype"},{"line_number":349,"context_line":"        value \u003d {\u0027id\u0027: \u0027foo\u0027}"},{"line_number":350,"context_line":"        self.assertItemsEqual(value, v.validate(value))"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_39b6c88a","line":347,"in_reply_to":"ba5201f7_fe9a66c4","updated":"2017-01-10 17:11:38.000000000","message":"Done it with 10 for now.","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"}],"ironic_tempest_plugin/services/baremetal/base.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    def _create_request_no_response_body(self, resource, object_dict):"},{"line_number":171,"context_line":"        \"\"\"Create an object of the specified type."},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"           Do not expect any body to be replied."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param resource: The name of the REST resource, e.g., \u0027nodes\u0027."},{"line_number":176,"context_line":"        :param object_dict: A Python dict that represents an object of the"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa48f94a_52065421","line":173,"updated":"2016-12-21 17:38:00.000000000","message":"maybe s/to be replied/in the response/","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    def _create_request_no_response_body(self, resource, object_dict):"},{"line_number":171,"context_line":"        \"\"\"Create an object of the specified type."},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"           Do not expect any body to be replied."},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        :param resource: The name of the REST resource, e.g., \u0027nodes\u0027."},{"line_number":176,"context_line":"        :param object_dict: A Python dict that represents an object of the"}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_36b602dd","line":173,"in_reply_to":"fa48f94a_52065421","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        resp, body \u003d self.post(uri, body\u003dbody)"},{"line_number":185,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        return resp, body"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def _delete_request(self, resource, uuid):"},{"line_number":190,"context_line":"        \"\"\"Delete specified object."}],"source_content_type":"text/x-python","patch_set":15,"id":"fa48f94a_353e1ab9","line":187,"updated":"2016-12-21 17:38:00.000000000","message":"Guess I am confused. What is in the body?","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        resp, body \u003d self.post(uri, body\u003dbody)"},{"line_number":185,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        return resp, body"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def _delete_request(self, resource, uuid):"},{"line_number":190,"context_line":"        \"\"\"Delete specified object."}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_f6db9a19","line":187,"in_reply_to":"fa48f94a_353e1ab9","updated":"2016-12-22 14:07:34.000000000","message":"there is no body, I\u0027ve did this in the same fashion as delete request it also has empty body.\n\nhttps://github.com/openstack/ironic/blob/master/ironic_tempest_plugin/services/baremetal/base.py#L180","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"3a1ecd0db44fb9654936160b4ed84fb65cea3bb4","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        resp, body \u003d self.post(uri, body\u003dbody)"},{"line_number":185,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        return resp, body"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def _delete_request(self, resource, uuid):"},{"line_number":190,"context_line":"        \"\"\"Delete specified object."}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_a541cd3b","line":187,"updated":"2016-12-22 16:09:18.000000000","message":"I don\u0027t know why we want to return the body if it is empty, but I\u0027m also not familiar with the way the tempest tests are done/consistency with existing tests. Seems like we should at least add a comment saying the body is empty, or be explicit and just \u0027return resp, {}\u0027. Dunno.","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"79922b388130a1c12bd3aba14ce778e81e177439","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        resp, body \u003d self.post(uri, body\u003dbody)"},{"line_number":185,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        return resp, body"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def _delete_request(self, resource, uuid):"},{"line_number":190,"context_line":"        \"\"\"Delete specified object."}],"source_content_type":"text/x-python","patch_set":17,"id":"da4df55a_bc6388db","line":187,"in_reply_to":"da4df55a_a541cd3b","updated":"2016-12-23 11:18:31.000000000","message":"dropped body to avoid confusion.","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"ed1fe091e0e7484a74d4204d8b13ea08ee173b83","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        return patch"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _list_request(self, resource, permanent\u003dFalse, headers\u003dNone,"},{"line_number":119,"context_line":"                      extra_headers\u003dNone, **kwargs):"},{"line_number":120,"context_line":"        \"\"\"Get the list of objects of the specified type."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        :param resource: The name of the REST resource, e.g., \u0027nodes\u0027."}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_a8ad088a","line":119,"range":{"start_line":119,"start_character":22,"end_line":119,"end_character":40},"updated":"2017-01-10 16:19:00.000000000","message":"this should default to False since tempest advertises this as a bool; might break if they started using a check like \"if extra_headers is False: ...\"","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"868c56b7e4641e615e9acff6d83020678787721d","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        return patch"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _list_request(self, resource, permanent\u003dFalse, headers\u003dNone,"},{"line_number":119,"context_line":"                      extra_headers\u003dNone, **kwargs):"},{"line_number":120,"context_line":"        \"\"\"Get the list of objects of the specified type."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        :param resource: The name of the REST resource, e.g., \u0027nodes\u0027."}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_797770d4","line":119,"range":{"start_line":119,"start_character":22,"end_line":119,"end_character":40},"in_reply_to":"ba5201f7_a8ad088a","updated":"2017-01-10 17:11:38.000000000","message":"Done","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"eed578d6ab5e35bb6676aacf6b218103ca03d3af","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        :param resource: The name of the REST resource, e.g., \u0027nodes\u0027."},{"line_number":123,"context_line":"        :param headers: List of headers to use in request."},{"line_number":124,"context_line":"        :param extra_headers: Specify wherever to use headers."},{"line_number":125,"context_line":"        :param **kwargs: Parameters for the request."},{"line_number":126,"context_line":"        :returns: A tuple with the server response and deserialized JSON list"},{"line_number":127,"context_line":"                 of objects"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_8fe20e00","line":124,"updated":"2017-01-10 15:50:32.000000000","message":"this doesn\u0027t make sense to me. \u0027wherever\u0027 ?\n\nI looked at how you\u0027re calling this, and extra_headers looks like it is  Boolean. So True to do something...","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"868c56b7e4641e615e9acff6d83020678787721d","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        :param resource: The name of the REST resource, e.g., \u0027nodes\u0027."},{"line_number":123,"context_line":"        :param headers: List of headers to use in request."},{"line_number":124,"context_line":"        :param extra_headers: Specify wherever to use headers."},{"line_number":125,"context_line":"        :param **kwargs: Parameters for the request."},{"line_number":126,"context_line":"        :returns: A tuple with the server response and deserialized JSON list"},{"line_number":127,"context_line":"                 of objects"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_997254e2","line":124,"in_reply_to":"ba5201f7_5e0c523b","updated":"2017-01-10 17:11:38.000000000","message":"Done","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"e97231a6be827f1e79f15a888c69abce432877d6","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        :param resource: The name of the REST resource, e.g., \u0027nodes\u0027."},{"line_number":123,"context_line":"        :param headers: List of headers to use in request."},{"line_number":124,"context_line":"        :param extra_headers: Specify wherever to use headers."},{"line_number":125,"context_line":"        :param **kwargs: Parameters for the request."},{"line_number":126,"context_line":"        :returns: A tuple with the server response and deserialized JSON list"},{"line_number":127,"context_line":"                 of objects"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_5e0c523b","line":124,"in_reply_to":"ba5201f7_6895e03e","updated":"2017-01-10 16:39:48.000000000","message":"Thx for the link Mario (I was too lazy to look for it). Too bad the description there is a bit unclear grammatically but anyway, we now know :)","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"ed1fe091e0e7484a74d4204d8b13ea08ee173b83","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        :param resource: The name of the REST resource, e.g., \u0027nodes\u0027."},{"line_number":123,"context_line":"        :param headers: List of headers to use in request."},{"line_number":124,"context_line":"        :param extra_headers: Specify wherever to use headers."},{"line_number":125,"context_line":"        :param **kwargs: Parameters for the request."},{"line_number":126,"context_line":"        :returns: A tuple with the server response and deserialized JSON list"},{"line_number":127,"context_line":"                 of objects"}],"source_content_type":"text/x-python","patch_set":27,"id":"ba5201f7_6895e03e","line":124,"in_reply_to":"ba5201f7_8fe20e00","updated":"2017-01-10 16:19:00.000000000","message":"yeah, should be \"whether\" to use headers, and it ought to be a bool: https://github.com/openstack/tempest/blob/525ec718f6f2a8d452ef90c35f5144d1af9aecd7/tempest/lib/common/rest_client.py#L278","commit_id":"deb4d58901803c4bd7ab28c0907ee21d85833010"}],"ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a4998fc31086b851067b0cb0fb3453412c26559a","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        \"\"\""},{"line_number":391,"context_line":"        vif \u003d {\u0027id\u0027: vif_id}"},{"line_number":392,"context_line":"        resp, body \u003d self._create_request(\u0027nodes/%s/vifs\u0027 % node_uuid, vif)"},{"line_number":393,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":394,"context_line":"        return resp, body"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    @base.handle_errors"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_0e939bfb","line":393,"range":{"start_line":393,"start_character":30,"end_line":393,"end_character":33},"updated":"2016-11-30 10:15:37.000000000","message":"201? Or did you mean to change it to 204 in the controller?","commit_id":"6d886a8351e756212a38d29d369f965f69872c3a"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"504326da2eb4602394ce5cf4ad610b53a463cb8c","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        \"\"\""},{"line_number":391,"context_line":"        vif \u003d {\u0027id\u0027: vif_id}"},{"line_number":392,"context_line":"        resp, body \u003d self._create_request(\u0027nodes/%s/vifs\u0027 % node_uuid, vif)"},{"line_number":393,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":394,"context_line":"        return resp, body"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    @base.handle_errors"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_2d3773e4","line":393,"range":{"start_line":393,"start_character":30,"end_line":393,"end_character":33},"in_reply_to":"5a74a57a_0e939bfb","updated":"2016-11-30 14:16:12.000000000","message":"204 is correct, I made a mistake in the controller which means that its returning the wrong status code.","commit_id":"6d886a8351e756212a38d29d369f965f69872c3a"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"21c116a7aebcb7749bd88f47c28a152123c29280","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        \"\"\""},{"line_number":391,"context_line":"        vif \u003d {\u0027id\u0027: vif_id}"},{"line_number":392,"context_line":"        resp, body \u003d self._create_request(\u0027nodes/%s/vifs\u0027 % node_uuid, vif)"},{"line_number":393,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":394,"context_line":"        return resp, body"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    @base.handle_errors"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_30fed86b","line":393,"updated":"2016-12-08 16:21:34.000000000","message":"I think 201 would fit this case better. Also - does it have to be a magic number (same with ln 404)?","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"069c7477f85b0b5619c1bb722976a7e524f8526c","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        \"\"\""},{"line_number":391,"context_line":"        vif \u003d {\u0027id\u0027: vif_id}"},{"line_number":392,"context_line":"        resp, body \u003d self._create_request(\u0027nodes/%s/vifs\u0027 % node_uuid, vif)"},{"line_number":393,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":394,"context_line":"        return resp, body"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    @base.handle_errors"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_4320ed9b","line":393,"in_reply_to":"3a71b18c_30fed86b","updated":"2016-12-08 17:21:20.000000000","message":"Vif attach doesn\u0027t return a response body, so 204 is the correct HTTP code.","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"d6d5a017bfc49cadf7ac6a9ebcee11a8108ea013","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        \"\"\""},{"line_number":391,"context_line":"        vif \u003d {\u0027id\u0027: vif_id}"},{"line_number":392,"context_line":"        resp, body \u003d self._create_request(\u0027nodes/%s/vifs\u0027 % node_uuid, vif)"},{"line_number":393,"context_line":"        self.expected_success(204, resp.status)"},{"line_number":394,"context_line":"        return resp, body"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    @base.handle_errors"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_d53ac8cc","line":393,"in_reply_to":"3a71b18c_4320ed9b","updated":"2016-12-09 14:01:13.000000000","message":"The response body does not determine the status code. Status code are used to show what the result of action was.\n\nhttps://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html","commit_id":"bd3de118d197a6e8beec7324532ad3fa945d8d31"},{"author":{"_account_id":23883,"name":"Joanna Taryma","email":"joanna.taryma@intel.com","username":"jtaryma"},"change_message_id":"806a90f4735470a289ae24ecf901182cdae581ce","unresolved":false,"context_lines":[{"line_number":389,"context_line":"        :param vif_id: An ID representing the VIF"},{"line_number":390,"context_line":"        \"\"\""},{"line_number":391,"context_line":"        vif \u003d {\u0027id\u0027: vif_id}"},{"line_number":392,"context_line":"        resp, body \u003d self._create_request_no_responce_body("},{"line_number":393,"context_line":"            \u0027nodes/%s/vifs\u0027 % node_uuid, vif)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        return resp, body"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6eadb0_9b012f09","line":392,"updated":"2016-12-15 12:23:51.000000000","message":"responce/response\nI\u0027d still look into status code compatibility with the RFC","commit_id":"072c793b229bbb8c33b94486da6345a82ca34aa0"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"a3408bb09101d6ae8f8b45f04be60d72ad1b8684","unresolved":false,"context_lines":[{"line_number":389,"context_line":"        :param vif_id: An ID representing the VIF"},{"line_number":390,"context_line":"        \"\"\""},{"line_number":391,"context_line":"        vif \u003d {\u0027id\u0027: vif_id}"},{"line_number":392,"context_line":"        resp, body \u003d self._create_request_no_responce_body("},{"line_number":393,"context_line":"            \u0027nodes/%s/vifs\u0027 % node_uuid, vif)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        return resp, body"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6eadb0_5a0bdad5","line":392,"in_reply_to":"1a6eadb0_9b012f09","updated":"2016-12-16 12:20:23.000000000","message":"fix type, response code already tested: https://review.openstack.org/#/c/404240/7/ironic_tempest_plugin/services/baremetal/base.py@185","commit_id":"072c793b229bbb8c33b94486da6345a82ca34aa0"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    @base.handle_errors"},{"line_number":377,"context_line":"    def vif_list(self, node_uuid):"},{"line_number":378,"context_line":"        \"\"\"Get list of attached VIF ids."},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        :param node_uuid: Unique identifier of the node in UUID format."},{"line_number":381,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"fa48f94a_1225acc1","line":378,"updated":"2016-12-21 17:38:00.000000000","message":"s/VIF ids/VIFs/ (cuz one day, it won\u0027t only be IDs.)","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"90e08e36a94e501a997a7cbd7689aa517744550e","unresolved":false,"context_lines":[{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    @base.handle_errors"},{"line_number":377,"context_line":"    def vif_list(self, node_uuid):"},{"line_number":378,"context_line":"        \"\"\"Get list of attached VIF ids."},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        :param node_uuid: Unique identifier of the node in UUID format."},{"line_number":381,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"da4df55a_963a4e35","line":378,"in_reply_to":"fa48f94a_1225acc1","updated":"2016-12-22 14:07:34.000000000","message":"Done","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"f146a8e5453ee80d36ccc3aa4f349009357191bb","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        return resp, body"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    @base.handle_errors"},{"line_number":377,"context_line":"    def vif_list(self, node_uuid, api_version\u003dNone):"},{"line_number":378,"context_line":"        \"\"\"Get list of attached VIFs."},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        :param node_uuid: Unique identifier of the node in UUID format."}],"source_content_type":"text/x-python","patch_set":28,"id":"ba5201f7_d44901b9","line":377,"range":{"start_line":377,"start_character":34,"end_line":377,"end_character":50},"updated":"2017-01-10 17:13:13.000000000","message":"not sure if we want to allow this, or just hardcode the version inside the function here.","commit_id":"c1e72043a54bd7e8884ee8011bb13b752a8b4ad7"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"c79c79e04572876d418c363ecad12876351891d1","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        return resp, body"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    @base.handle_errors"},{"line_number":377,"context_line":"    def vif_list(self, node_uuid, api_version\u003dNone):"},{"line_number":378,"context_line":"        \"\"\"Get list of attached VIFs."},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        :param node_uuid: Unique identifier of the node in UUID format."}],"source_content_type":"text/x-python","patch_set":28,"id":"ba5201f7_3a1cdac0","line":377,"range":{"start_line":377,"start_character":34,"end_line":377,"end_character":50},"in_reply_to":"ba5201f7_8e492591","updated":"2017-01-11 09:10:19.000000000","message":"We don\u0027t have scenario tests that requires specific API version yet.\nThis client is used in both API and Scenario tests, for API tests we using fixtures to apply specific version [0], [1].\n\nHowever in Scenario test we can\u0027t apply fixtures as it will affect all requests. To apply non-default API version to specific request only \u0027api_version\u0027 param was introduced.\n\nTo avoid confusion which api version was applied (from fixture or from param) the default value should be None.\n\n[0] https://github.com/openstack/ironic/blob/5603a215b726ca465eed2867d830821bb24b1a72/ironic_tempest_plugin/tests/api/admin/test_nodestates.py#L96\n[1] https://review.openstack.org/#/c/404240/28/ironic_tempest_plugin/tests/api/admin/test_nodes.py@174","commit_id":"c1e72043a54bd7e8884ee8011bb13b752a8b4ad7"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"26a31a2b6e8b5f8846bd4d60b918f620481f7bfd","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        return resp, body"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    @base.handle_errors"},{"line_number":377,"context_line":"    def vif_list(self, node_uuid, api_version\u003dNone):"},{"line_number":378,"context_line":"        \"\"\"Get list of attached VIFs."},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        :param node_uuid: Unique identifier of the node in UUID format."}],"source_content_type":"text/x-python","patch_set":28,"id":"ba5201f7_8e492591","line":377,"range":{"start_line":377,"start_character":34,"end_line":377,"end_character":50},"in_reply_to":"ba5201f7_d44901b9","updated":"2017-01-10 19:06:28.000000000","message":"that\u0027s a good point. How are we handling other features that require a specific api version? Anyway, can be cleaned up in a followup patch.","commit_id":"c1e72043a54bd7e8884ee8011bb13b752a8b4ad7"}],"ironic_tempest_plugin/tests/api/admin/test_nodes.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"a4998fc31086b851067b0cb0fb3453412c26559a","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        self.client.vif_attach(self.node[\u0027uuid\u0027], \u0027test-vif\u0027)"},{"line_number":179,"context_line":"        _, body \u003d self.client.vif_list(self.node[\u0027uuid\u0027])"},{"line_number":180,"context_line":"        self.assertEqual(body, {\u0027vifs\u0027: [\u0027test-vif\u0027]})"},{"line_number":181,"context_line":"        self.client.vif_detach(self.node[\u0027uuid\u0027], \u0027test-vif\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_ae71c7e2","line":181,"updated":"2016-11-30 10:15:37.000000000","message":"might be good to also add a test when calling attach on a port containing vif_port_id in extra","commit_id":"6d886a8351e756212a38d29d369f965f69872c3a"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"504326da2eb4602394ce5cf4ad610b53a463cb8c","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        self.client.vif_attach(self.node[\u0027uuid\u0027], \u0027test-vif\u0027)"},{"line_number":179,"context_line":"        _, body \u003d self.client.vif_list(self.node[\u0027uuid\u0027])"},{"line_number":180,"context_line":"        self.assertEqual(body, {\u0027vifs\u0027: [\u0027test-vif\u0027]})"},{"line_number":181,"context_line":"        self.client.vif_detach(self.node[\u0027uuid\u0027], \u0027test-vif\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_bba49d08","line":181,"in_reply_to":"5a74a57a_ae71c7e2","updated":"2016-11-30 14:16:12.000000000","message":"Done","commit_id":"6d886a8351e756212a38d29d369f965f69872c3a"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"9d43d7411732c1811f9f76b696cf79d649350cf5","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    @test.idempotent_id(\u0027a3d319d0-cacb-4e55-a3dc-3fa8b74880f1\u0027)"},{"line_number":172,"context_line":"    def test_vifs(self):"},{"line_number":173,"context_line":"        self.useFixture("},{"line_number":174,"context_line":"            api_microversion_fixture.APIMicroversionFixture(\u00271.27\u0027))"},{"line_number":175,"context_line":"        _, self.port \u003d self.create_port(self.node[\u0027uuid\u0027],"},{"line_number":176,"context_line":"                                        data_utils.rand_mac_address())"},{"line_number":177,"context_line":"        self.client.vif_attach(self.node[\u0027uuid\u0027], \u0027test-vif\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba5201f7_41901296","line":174,"range":{"start_line":174,"start_character":63,"end_line":174,"end_character":65},"updated":"2017-01-10 08:09:38.000000000","message":"1.28","commit_id":"d84a40d21dcbcea89e65bece47afe682fd87ba6c"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"67961940e1151a13add243bb61fb99dcae597833","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    @test.idempotent_id(\u0027a3d319d0-cacb-4e55-a3dc-3fa8b74880f1\u0027)"},{"line_number":172,"context_line":"    def test_vifs(self):"},{"line_number":173,"context_line":"        self.useFixture("},{"line_number":174,"context_line":"            api_microversion_fixture.APIMicroversionFixture(\u00271.27\u0027))"},{"line_number":175,"context_line":"        _, self.port \u003d self.create_port(self.node[\u0027uuid\u0027],"},{"line_number":176,"context_line":"                                        data_utils.rand_mac_address())"},{"line_number":177,"context_line":"        self.client.vif_attach(self.node[\u0027uuid\u0027], \u0027test-vif\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba5201f7_41e73240","line":174,"range":{"start_line":174,"start_character":63,"end_line":174,"end_character":65},"in_reply_to":"ba5201f7_41901296","updated":"2017-01-10 08:19:41.000000000","message":"Done","commit_id":"d84a40d21dcbcea89e65bece47afe682fd87ba6c"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"9d43d7411732c1811f9f76b696cf79d649350cf5","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    @test.idempotent_id(\u0027a3d319d0-cacb-4e55-a3dc-3fa8b74880f2\u0027)"},{"line_number":183,"context_line":"    def test_vif_already_set_on_extra(self):"},{"line_number":184,"context_line":"        self.useFixture("},{"line_number":185,"context_line":"            api_microversion_fixture.APIMicroversionFixture(\u00271.27\u0027))"},{"line_number":186,"context_line":"        _, self.port \u003d self.create_port(self.node[\u0027uuid\u0027],"},{"line_number":187,"context_line":"                                        data_utils.rand_mac_address())"},{"line_number":188,"context_line":"        patch \u003d [{\u0027path\u0027: \u0027/extra/vif_port_id\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba5201f7_618d167b","line":185,"updated":"2017-01-10 08:09:38.000000000","message":"ditto","commit_id":"d84a40d21dcbcea89e65bece47afe682fd87ba6c"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"67961940e1151a13add243bb61fb99dcae597833","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    @test.idempotent_id(\u0027a3d319d0-cacb-4e55-a3dc-3fa8b74880f2\u0027)"},{"line_number":183,"context_line":"    def test_vif_already_set_on_extra(self):"},{"line_number":184,"context_line":"        self.useFixture("},{"line_number":185,"context_line":"            api_microversion_fixture.APIMicroversionFixture(\u00271.27\u0027))"},{"line_number":186,"context_line":"        _, self.port \u003d self.create_port(self.node[\u0027uuid\u0027],"},{"line_number":187,"context_line":"                                        data_utils.rand_mac_address())"},{"line_number":188,"context_line":"        patch \u003d [{\u0027path\u0027: \u0027/extra/vif_port_id\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba5201f7_61e4363b","line":185,"in_reply_to":"ba5201f7_618d167b","updated":"2017-01-10 08:19:41.000000000","message":"Done","commit_id":"d84a40d21dcbcea89e65bece47afe682fd87ba6c"}],"ironic_tempest_plugin/tests/scenario/test_baremetal_basic_ops.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"4eecdcf7caf0771e550235147d8bebb31ab13dbe","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    def test_baremetal_server_ops(self):"},{"line_number":110,"context_line":"        self.add_keypair()"},{"line_number":111,"context_line":"        self.instance, self.node \u003d self.boot_instance()"},{"line_number":112,"context_line":"        self.validate_ports()"},{"line_number":113,"context_line":"        ip_address \u003d self.get_server_ip(self.instance)"},{"line_number":114,"context_line":"        self.get_remote_client(ip_address).validate_authentication()"},{"line_number":115,"context_line":"        vm_client \u003d self.get_remote_client(ip_address)"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba5201f7_d387d4b2","side":"PARENT","line":112,"updated":"2017-01-06 16:28:25.000000000","message":"I\u0027d change this to actually do vif list instead of removing it.","commit_id":"01374adc2fadb9bada6d14c0ba476d8b5b6b6e93"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7956ddcd09b8f8c5fc389a823e75813a2a42f71d","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            return None"},{"line_number":97,"context_line":"        return int(ephemeral)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def validate_ports(self):"},{"line_number":100,"context_line":"        for port in self.get_ports(self.node[\u0027uuid\u0027]):"},{"line_number":101,"context_line":"            n_port_id \u003d port[\u0027extra\u0027][\u0027vif_port_id\u0027]"},{"line_number":102,"context_line":"            body \u003d self.ports_client.show_port(n_port_id)"},{"line_number":103,"context_line":"            n_port \u003d body[\u0027port\u0027]"},{"line_number":104,"context_line":"            self.assertEqual(n_port[\u0027device_id\u0027], self.instance[\u0027id\u0027])"},{"line_number":105,"context_line":"            self.assertEqual(n_port[\u0027mac_address\u0027], port[\u0027address\u0027])"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @test.idempotent_id(\u0027549173a5-38ec-42bb-b0e2-c8b9f4a08943\u0027)"},{"line_number":108,"context_line":"    @test.services(\u0027compute\u0027, \u0027image\u0027, \u0027network\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba5201f7_391dfabd","side":"PARENT","line":105,"range":{"start_line":99,"start_character":4,"end_line":105,"end_character":68},"updated":"2017-01-10 11:28:50.000000000","message":"See comment on PS 24, would be good to still do the validation, at least ensuring that everything in vif_list output exists in neutron and device_id is set to proper value.","commit_id":"d18ebbc3e20b38eaecf681e698690101b0bd516d"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"4827ba42c91f9f43b6e020e9f818a56c272b3752","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            return None"},{"line_number":97,"context_line":"        return int(ephemeral)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def validate_ports(self):"},{"line_number":100,"context_line":"        for port in self.get_ports(self.node[\u0027uuid\u0027]):"},{"line_number":101,"context_line":"            n_port_id \u003d port[\u0027extra\u0027][\u0027vif_port_id\u0027]"},{"line_number":102,"context_line":"            body \u003d self.ports_client.show_port(n_port_id)"},{"line_number":103,"context_line":"            n_port \u003d body[\u0027port\u0027]"},{"line_number":104,"context_line":"            self.assertEqual(n_port[\u0027device_id\u0027], self.instance[\u0027id\u0027])"},{"line_number":105,"context_line":"            self.assertEqual(n_port[\u0027mac_address\u0027], port[\u0027address\u0027])"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @test.idempotent_id(\u0027549173a5-38ec-42bb-b0e2-c8b9f4a08943\u0027)"},{"line_number":108,"context_line":"    @test.services(\u0027compute\u0027, \u0027image\u0027, \u0027network\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba5201f7_af10bca9","side":"PARENT","line":105,"range":{"start_line":99,"start_character":4,"end_line":105,"end_character":68},"in_reply_to":"ba5201f7_391dfabd","updated":"2017-01-10 12:21:43.000000000","message":"Done","commit_id":"d18ebbc3e20b38eaecf681e698690101b0bd516d"}],"releasenotes/notes/add-vif-attach-detach-support-99eca43eea6e5a30.yaml":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"c25912af344ae234c4717e772526e42249448f55","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    to ironic ports by using ``v1/nodes/\u003cnode\u003e/vifs``"},{"line_number":5,"context_line":"    API endpoint that was added in API version 1.27."},{"line_number":6,"context_line":"deprecations:"},{"line_number":7,"context_line":"  - Using extra[\u0027vif_port_id\u0027] for attaching/detaching"},{"line_number":8,"context_line":"    VIFs to ports and portgroups is deprecated and will"},{"line_number":9,"context_line":"    be removed in Pike release."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"fa48f94a_92499c91","line":7,"updated":"2016-12-21 17:38:00.000000000","message":"we might be more explicit here, s/extra/node.extra/ or s/extra/ a node\u0027s extra/","commit_id":"d8fc68d2e0482b87f6394a48061e6d93190db651"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a58fdeae41705e730d17714b7b604c6636a294df","unresolved":false,"context_lines":[{"line_number":6,"context_line":"deprecations:"},{"line_number":7,"context_line":"  - Using node.extra[\u0027vif_port_id\u0027] for attaching/detaching"},{"line_number":8,"context_line":"    VIFs to ports and portgroups is deprecated and will"},{"line_number":9,"context_line":"    be removed in Pike release."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"da4df55a_d9f2429a","line":9,"updated":"2016-12-22 15:04:29.000000000","message":"Guess I need to write an ansible module for port control finally :)","commit_id":"2901e48f0ce1848c65199f45698f918dafd0d8f2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b08a69ee4dc0cda9fe0f6cff53fe26cec3a7ea16","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    to ironic ports by using ``v1/nodes/\u003cnode\u003e/vifs``"},{"line_number":5,"context_line":"    API endpoint that was added in API version 1.27."},{"line_number":6,"context_line":"deprecations:"},{"line_number":7,"context_line":"  - Using node.extra[\u0027vif_port_id\u0027] for attaching/detaching"},{"line_number":8,"context_line":"    VIFs to ports and portgroups is deprecated and will"},{"line_number":9,"context_line":"    be removed in Pike release."}],"source_content_type":"text/x-yaml","patch_set":20,"id":"da4df55a_e3e61114","line":7,"range":{"start_line":7,"start_character":10,"end_line":7,"end_character":15},"updated":"2016-12-26 17:50:34.000000000","message":"port{group}.extra. Also I don\u0027t see how it is user-visible, no additional logging is added so that the user can actually see this.","commit_id":"21f682f3a8d0fb3a9737cca4eac78d44b5275d0f"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"7b1f77010774fdf976d580f648eca592487400df","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    to ironic ports by using ``v1/nodes/\u003cnode\u003e/vifs``"},{"line_number":5,"context_line":"    API endpoint that was added in API version 1.27."},{"line_number":6,"context_line":"deprecations:"},{"line_number":7,"context_line":"  - Using node.extra[\u0027vif_port_id\u0027] for attaching/detaching"},{"line_number":8,"context_line":"    VIFs to ports and portgroups is deprecated and will"},{"line_number":9,"context_line":"    be removed in Pike release."}],"source_content_type":"text/x-yaml","patch_set":20,"id":"ba5201f7_901d09c0","line":7,"range":{"start_line":7,"start_character":10,"end_line":7,"end_character":15},"in_reply_to":"da4df55a_e3e61114","updated":"2016-12-29 14:57:40.000000000","message":"Done","commit_id":"21f682f3a8d0fb3a9737cca4eac78d44b5275d0f"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"8956e811a473b21b8433a3f39ffb958af9b62164","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds support of attaching/detaching network VIFs"},{"line_number":4,"context_line":"    to ironic ports by using ``v1/nodes/\u003cnode\u003e/vifs``"},{"line_number":5,"context_line":"    API endpoint that was added in API version 1.27."},{"line_number":6,"context_line":"deprecations:"},{"line_number":7,"context_line":"  - Using port{group}.extra[\u0027vif_port_id\u0027] for attaching/detaching"},{"line_number":8,"context_line":"    VIFs to ports and portgroups is deprecated and will"}],"source_content_type":"text/x-yaml","patch_set":25,"id":"ba5201f7_e172e6ac","line":5,"range":{"start_line":5,"start_character":49,"end_line":5,"end_character":51},"updated":"2017-01-10 08:07:06.000000000","message":"1.28","commit_id":"d84a40d21dcbcea89e65bece47afe682fd87ba6c"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"67961940e1151a13add243bb61fb99dcae597833","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Adds support of attaching/detaching network VIFs"},{"line_number":4,"context_line":"    to ironic ports by using ``v1/nodes/\u003cnode\u003e/vifs``"},{"line_number":5,"context_line":"    API endpoint that was added in API version 1.27."},{"line_number":6,"context_line":"deprecations:"},{"line_number":7,"context_line":"  - Using port{group}.extra[\u0027vif_port_id\u0027] for attaching/detaching"},{"line_number":8,"context_line":"    VIFs to ports and portgroups is deprecated and will"}],"source_content_type":"text/x-yaml","patch_set":25,"id":"ba5201f7_a1d45e47","line":5,"range":{"start_line":5,"start_character":49,"end_line":5,"end_character":51},"in_reply_to":"ba5201f7_e172e6ac","updated":"2017-01-10 08:19:41.000000000","message":"Done","commit_id":"d84a40d21dcbcea89e65bece47afe682fd87ba6c"}]}
