)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"b95b75b3bdf6ac16979aa12c483ee4a97d2121ed","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Vasyl Saienko \u003cvsaienko@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-08-30 12:15:31 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add portgroups to support LAG interfaces - API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Ironic should be able to provide the requisite connectivity"},{"line_number":10,"context_line":"information to the Neutron ML2 plugin to allow drivers to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"fa7ab95a_520bce7c","line":7,"updated":"2016-08-30 12:32:52.000000000","message":"Integrate portgroups with ports to support LAG","commit_id":"feba26b492b4c833c039caf6f2cb952e38f16b27"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"0fefa0cd943283a3317c703e2ec144ac154ec127","unresolved":false,"context_lines":[{"line_number":23,"context_line":"Co-Authored-By: Vasyl Saienko \u003cvsaienko@mirantis.com\u003e"},{"line_number":24,"context_line":"Co-Authored-By: Vladyslav Drok \u003cvdrok@mirantis.com\u003e"},{"line_number":25,"context_line":"Co-Authored-By: Zhenguo Niu \u003cNiu.ZGlinux@gmail.com\u003e"},{"line_number":26,"context_line":"Co-Authored-By: Michael Turek\u003cmjturek@linux.vnet.ibm.com\u003e"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: I597ae1a3a969ee9fb4df57e444c606c77c5c093c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"fa7ab95a_ea13e262","line":26,"updated":"2016-08-30 22:35:06.000000000","message":"Missing space between name and email address.","commit_id":"bdba5e15489e9b983e2931ca9895a55adee1522e"}],"doc/source/dev/webapi-version-history.rst":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"fddad7fef490d2dcea07a84b9b33da7997db188c","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.24**"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added new endpoint \u0027/v1/nodes/\u003cnode\u003e/portgroups\u0027."},{"line_number":8,"context_line":"    Added new fields ``port.portgroup_uuid`` and ``node.portgroups``."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"**1.23**"}],"source_content_type":"text/x-rst","patch_set":19,"id":"fa7ab95a_c7b5f7cd","line":7,"updated":"2016-08-26 16:28:36.000000000","message":"also /v1/portgroups/\u003cpg\u003e/ports","commit_id":"66148f7c3d4ad79b3eeb46483afdb3ceb6ba58a1"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"fddad7fef490d2dcea07a84b9b33da7997db188c","unresolved":false,"context_lines":[{"line_number":5,"context_line":"**1.24**"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added new endpoint \u0027/v1/nodes/\u003cnode\u003e/portgroups\u0027."},{"line_number":8,"context_line":"    Added new fields ``port.portgroup_uuid`` and ``node.portgroups``."},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"**1.23**"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-rst","patch_set":19,"id":"fa7ab95a_67126bb6","line":8,"range":{"start_line":8,"start_character":49,"end_line":8,"end_character":68},"updated":"2016-08-26 16:28:36.000000000","message":"this is not a field strictly speaking, it\u0027s just a link.","commit_id":"66148f7c3d4ad79b3eeb46483afdb3ceb6ba58a1"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"0fefa0cd943283a3317c703e2ec144ac154ec127","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.24**"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added new endpoint \u0027/v1/nodes/\u003cnode\u003e/portgroups\u0027 and \u0027/v1/portgroups/\u003cpg\u003e/ports\u0027."},{"line_number":8,"context_line":"    Added new field ``port.portgroup_uuid``"},{"line_number":9,"context_line":"    Added new link ``node.portgroups``."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"fa7ab95a_25497b31","line":7,"range":{"start_line":7,"start_character":14,"end_line":7,"end_character":22},"updated":"2016-08-30 22:35:06.000000000","message":"s/endpoint/endpoints/","commit_id":"bdba5e15489e9b983e2931ca9895a55adee1522e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.24**"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added new endpoints \u0027/v1/nodes/\u003cnode\u003e/portgroups\u0027 and \u0027/v1/portgroups/\u003cpg\u003e/ports\u0027."},{"line_number":8,"context_line":"    Added new field ``port.portgroup_uuid``"},{"line_number":9,"context_line":"    Added new link ``node.portgroups``."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-rst","patch_set":32,"id":"9a629dbe_7699526e","line":7,"updated":"2016-11-07 22:27:16.000000000","message":"I think this was meant for documentation, so s/pg/portgroup/","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":4,"context_line":""},{"line_number":5,"context_line":"**1.24**"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added new endpoints \u0027/v1/nodes/\u003cnode\u003e/portgroups\u0027 and \u0027/v1/portgroups/\u003cpg\u003e/ports\u0027."},{"line_number":8,"context_line":"    Added new field ``port.portgroup_uuid``"},{"line_number":9,"context_line":"    Added new link ``node.portgroups``."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-rst","patch_set":32,"id":"9a629dbe_71ff8501","line":7,"in_reply_to":"9a629dbe_7699526e","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added new endpoints \u0027/v1/nodes/\u003cnode\u003e/portgroups\u0027 and \u0027/v1/portgroups/\u003cpg\u003e/ports\u0027."},{"line_number":8,"context_line":"    Added new field ``port.portgroup_uuid``"},{"line_number":9,"context_line":"    Added new link ``node.portgroups``."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"**1.23**"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-rst","patch_set":32,"id":"9a629dbe_36b6fadc","line":9,"updated":"2016-11-07 22:27:16.000000000","message":"i don\u0027t think we should mention this link, will people know what it means?","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added new endpoints \u0027/v1/nodes/\u003cnode\u003e/portgroups\u0027 and \u0027/v1/portgroups/\u003cpg\u003e/ports\u0027."},{"line_number":8,"context_line":"    Added new field ``port.portgroup_uuid``"},{"line_number":9,"context_line":"    Added new link ``node.portgroups``."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"**1.23**"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-rst","patch_set":32,"id":"9a629dbe_d10e9133","line":9,"in_reply_to":"9a629dbe_36b6fadc","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ca29ecd56a6d1a5adabb70aee17f54f3e7097635","unresolved":false,"context_lines":[{"line_number":5,"context_line":"**1.24**"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added new endpoints \u0027/v1/nodes/\u003cnode\u003e/portgroups\u0027 and \u0027/v1/portgroups/\u003cportgroup\u003e/ports\u0027."},{"line_number":8,"context_line":"    Added new field ``port.portgroup_uuid``"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"**1.23**"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-rst","patch_set":34,"id":"9a629dbe_7d73b8e7","line":8,"updated":"2016-11-08 21:18:31.000000000","message":"nit, missing period at end.","commit_id":"a8664102eea53545ecc2d9d682adfa567d34f635"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"beaf19316155b313ca8fe5702098217d4aac7b18","unresolved":false,"context_lines":[{"line_number":5,"context_line":"**1.24**"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Added new endpoints \u0027/v1/nodes/\u003cnode\u003e/portgroups\u0027 and \u0027/v1/portgroups/\u003cportgroup\u003e/ports\u0027."},{"line_number":8,"context_line":"    Added new field ``port.portgroup_uuid``"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"**1.23**"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-rst","patch_set":34,"id":"9a629dbe_6e2cce02","line":8,"in_reply_to":"9a629dbe_7d73b8e7","updated":"2016-11-09 11:39:12.000000000","message":"Done","commit_id":"a8664102eea53545ecc2d9d682adfa567d34f635"}],"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"0fefa0cd943283a3317c703e2ec144ac154ec127","unresolved":false,"context_lines":[{"line_number":780,"context_line":""},{"line_number":781,"context_line":"    @staticmethod"},{"line_number":782,"context_line":"    def _convert_with_links(node, url, fields\u003dNone, show_states_links\u003dTrue,"},{"line_number":783,"context_line":"                            show_portgroups\u003dTrue):"},{"line_number":784,"context_line":"        # NOTE(lucasagomes): Since we are able to return a specified set of"},{"line_number":785,"context_line":"        # fields the \"uuid\" can be unset, so we need to save it in another"},{"line_number":786,"context_line":"        # variable to use when building the links"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa7ab95a_45acbf8b","line":783,"updated":"2016-08-30 22:35:06.000000000","message":"Do we need this variable? Why not just change L803 to check?","commit_id":"bdba5e15489e9b983e2931ca9895a55adee1522e"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"0fefa0cd943283a3317c703e2ec144ac154ec127","unresolved":false,"context_lines":[{"line_number":800,"context_line":"                               link.Link.make_link(\u0027bookmark\u0027, url, \u0027nodes\u0027,"},{"line_number":801,"context_line":"                                                   node_uuid + \"/states\","},{"line_number":802,"context_line":"                                                   bookmark\u003dTrue)]"},{"line_number":803,"context_line":"            if show_portgroups:"},{"line_number":804,"context_line":"                node.portgroups \u003d ["},{"line_number":805,"context_line":"                    link.Link.make_link(\u0027self\u0027, url, \u0027nodes\u0027,"},{"line_number":806,"context_line":"                                        node_uuid + \"/portgroups\"),"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa7ab95a_a5d82b54","line":803,"updated":"2016-08-30 22:35:06.000000000","message":"Why not just:\n\n if api_utils.allow_portgroups_subcontrollers():\n\nSeems like less changes doing that.","commit_id":"bdba5e15489e9b983e2931ca9895a55adee1522e"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"1620056cadf9819ff541ba1bff82d86ba1fc35e2","unresolved":false,"context_lines":[{"line_number":1089,"context_line":"                if (remainder[0] \u003d\u003d \u0027portgroups\u0027 and"},{"line_number":1090,"context_line":"                        not api_utils.allow_portgroups_subcontrollers()):"},{"line_number":1091,"context_line":"                    pecan.abort(http_client.NOT_FOUND)"},{"line_number":1092,"context_line":"                return subcontroller(node_ident\u003dident), remainder[1:]"},{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"    def _get_nodes_collection(self, chassis_uuid, instance_uuid, associated,"},{"line_number":1095,"context_line":"                              maintenance, provision_state, marker, limit,"}],"source_content_type":"text/x-python","patch_set":35,"id":"9a629dbe_0abc0bdb","line":1092,"updated":"2016-11-09 15:45:00.000000000","message":"This is slightly odd to me.\n\nSo if pass in /v1/nodes/\u003cnode\u003e/portgroups but earlier API will say NOT_FOUND.\n\nBut pass in /v1/nodes/\u003cnode\u003e/kilroy-was-here we return????","commit_id":"dd57ed5a2d2c42abc72ac13ce7eb491c27b7468a"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"8ce3bbc13fe5ec97eb41db08f6c30a123eb6ec40","unresolved":false,"context_lines":[{"line_number":1089,"context_line":"                if (remainder[0] \u003d\u003d \u0027portgroups\u0027 and"},{"line_number":1090,"context_line":"                        not api_utils.allow_portgroups_subcontrollers()):"},{"line_number":1091,"context_line":"                    pecan.abort(http_client.NOT_FOUND)"},{"line_number":1092,"context_line":"                return subcontroller(node_ident\u003dident), remainder[1:]"},{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"    def _get_nodes_collection(self, chassis_uuid, instance_uuid, associated,"},{"line_number":1095,"context_line":"                              maintenance, provision_state, marker, limit,"}],"source_content_type":"text/x-python","patch_set":35,"id":"9a629dbe_8d8bd5c2","line":1092,"in_reply_to":"9a629dbe_0abc0bdb","updated":"2016-11-09 16:13:05.000000000","message":"Also is the 404 error the same error that will be returned currently (without this patch) if a client sends \u0027portgroups\u0027?","commit_id":"dd57ed5a2d2c42abc72ac13ce7eb491c27b7468a"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"cbde8c002d7fd48caca758dbc82988416058019c","unresolved":false,"context_lines":[{"line_number":1089,"context_line":"                if (remainder[0] \u003d\u003d \u0027portgroups\u0027 and"},{"line_number":1090,"context_line":"                        not api_utils.allow_portgroups_subcontrollers()):"},{"line_number":1091,"context_line":"                    pecan.abort(http_client.NOT_FOUND)"},{"line_number":1092,"context_line":"                return subcontroller(node_ident\u003dident), remainder[1:]"},{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"    def _get_nodes_collection(self, chassis_uuid, instance_uuid, associated,"},{"line_number":1095,"context_line":"                              maintenance, provision_state, marker, limit,"}],"source_content_type":"text/x-python","patch_set":35,"id":"9a629dbe_4d10dd59","line":1092,"in_reply_to":"9a629dbe_0abc0bdb","updated":"2016-11-09 16:14:44.000000000","message":"OK, so, if we do /v1/nodes/\u003cnode\u003e/kilroy-was-here, we get \n\n webtest.app.AppError: Bad response: 400 Bad Request (not 200 OK or 3xx redirect for http://localhost/v1/nodes/1be26c0b-03f2-4d2e-ae87-c02d7f33c123/kilroy-was-here)\n \u0027{\"error_message\": \"{\\\\\"faultstring\\\\\": \\\\\"Field(s) \\\\\\\\\\\\\"kilroy-was-here\\\\\\\\\\\\\" are not valid\\\\\", \\\\\"debuginfo\\\\\": null, \\\\\"faultcode\\\\\": \\\\\"Client\\\\\"}\"}\u0027\n\nWhile when we do /v1/kilroy-was-here, we get 404. Seems like we should do 404 in case when subcontroller is not in  the dict.","commit_id":"dd57ed5a2d2c42abc72ac13ce7eb491c27b7468a"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"596edbedc5621ce46b6f76d498682882bb8f74ed","unresolved":false,"context_lines":[{"line_number":1089,"context_line":"                if (remainder[0] \u003d\u003d \u0027portgroups\u0027 and"},{"line_number":1090,"context_line":"                        not api_utils.allow_portgroups_subcontrollers()):"},{"line_number":1091,"context_line":"                    pecan.abort(http_client.NOT_FOUND)"},{"line_number":1092,"context_line":"                return subcontroller(node_ident\u003dident), remainder[1:]"},{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"    def _get_nodes_collection(self, chassis_uuid, instance_uuid, associated,"},{"line_number":1095,"context_line":"                              maintenance, provision_state, marker, limit,"}],"source_content_type":"text/x-python","patch_set":35,"id":"9a629dbe_d02d62a9","line":1092,"in_reply_to":"9a629dbe_4d10dd59","updated":"2016-11-09 16:35:41.000000000","message":"So I think this should return the same value before and after (with older API) this patch.\n\nSo I think better to fall through if older API and not return 404. Let the caller return the 400. And maybe in the future we change the default.\n\nWhat do you think?","commit_id":"dd57ed5a2d2c42abc72ac13ce7eb491c27b7468a"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"99b354ad116428db117beaf8df804bcbeafcd730","unresolved":false,"context_lines":[{"line_number":1089,"context_line":"                if (remainder[0] \u003d\u003d \u0027portgroups\u0027 and"},{"line_number":1090,"context_line":"                        not api_utils.allow_portgroups_subcontrollers()):"},{"line_number":1091,"context_line":"                    pecan.abort(http_client.NOT_FOUND)"},{"line_number":1092,"context_line":"                return subcontroller(node_ident\u003dident), remainder[1:]"},{"line_number":1093,"context_line":""},{"line_number":1094,"context_line":"    def _get_nodes_collection(self, chassis_uuid, instance_uuid, associated,"},{"line_number":1095,"context_line":"                              maintenance, provision_state, marker, limit,"}],"source_content_type":"text/x-python","patch_set":35,"id":"9a629dbe_09edf0ee","line":1092,"in_reply_to":"9a629dbe_d02d62a9","updated":"2016-11-09 19:24:41.000000000","message":"We had a discussion in IRC on this [1] and we decided to return 404.\n\n[1] see stuff leading up to http://eavesdrop.openstack.org/irclogs/%23openstack-ironic/%23openstack-ironic.2016-11-09.log.html#t2016-11-09T16:50:31","commit_id":"dd57ed5a2d2c42abc72ac13ce7eb491c27b7468a"}],"ironic/api/controllers/v1/port.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6801182c6e2753aad4786e83015877279bf036cb","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        obj.pxe_enabled \u003d wsme.Unset"},{"line_number":51,"context_line":"        obj.local_link_connection \u003d wsme.Unset"},{"line_number":52,"context_line":"    # if requested version is \u003c 1.21, hide portgroup_uuid field"},{"line_number":53,"context_line":"    if not api_utils.allow_portgroups():"},{"line_number":54,"context_line":"        obj.portgroup_uuid \u003d wsme.Unset"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad45d7e_cc06e41f","line":53,"updated":"2016-08-08 18:06:02.000000000","message":"All of these changes should be in another 1.24 microversion now.","commit_id":"bcb5a224a50b640d8528adc6ee80c0b9160d320b"},{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"69e28cb4f444b6af7f1edf7e57c2154e06d7c813","unresolved":false,"context_lines":[{"line_number":279,"context_line":"    def __init__(self, node_id\u003dNone, portgroup_id\u003dNone):"},{"line_number":280,"context_line":"        super(PortsController, self).__init__()"},{"line_number":281,"context_line":"        self.node_id_from_node \u003d node_id"},{"line_number":282,"context_line":"        self.portgroup_id \u003d portgroup_id"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _get_ports_collection(self, node_ident, address, portgroup_ident,"},{"line_number":285,"context_line":"                              marker, limit, sort_key, sort_dir,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ac371cc_29394242","line":282,"range":{"start_line":282,"start_character":13,"end_line":282,"end_character":25},"updated":"2016-08-16 05:09:27.000000000","message":"It would be better to rename it to a consistent name with node_id_from_node.","commit_id":"3c817a8a83b9c93f5c1797f183fbec18a2ae917b"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e5f662a0e33ea9c2f648db65287fa0ada417aea1","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    if not api_utils.allow_port_advanced_net_fields():"},{"line_number":50,"context_line":"        obj.pxe_enabled \u003d wsme.Unset"},{"line_number":51,"context_line":"        obj.local_link_connection \u003d wsme.Unset"},{"line_number":52,"context_line":"    # if requested version is \u003c 1.23, hide portgroup_uuid field"},{"line_number":53,"context_line":"    if not api_utils.allow_portgroups():"},{"line_number":54,"context_line":"        obj.portgroup_uuid \u003d wsme.Unset"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1ac06dbe_43f9f4c7","line":52,"range":{"start_line":52,"start_character":34,"end_line":52,"end_character":36},"updated":"2016-08-25 12:13:35.000000000","message":"I think you\u0027ll have to add yet another 1.24 api version, that will handle addition of subcontrollers and portgroup_uuid field to port.","commit_id":"4a2130b9091fecd6a24b332caa076c7dc2e06dda"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e5f662a0e33ea9c2f648db65287fa0ada417aea1","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        cdict \u003d pecan.request.context.to_dict()"},{"line_number":473,"context_line":"        policy.authorize(\u0027baremetal:port:get\u0027, cdict, cdict)"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        if self.parent_node_ident:"},{"line_number":476,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        api_utils.check_allow_specify_fields(fields)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ac06dbe_63bfd0aa","line":475,"updated":"2016-08-25 12:13:35.000000000","message":"here parent_portgroup_ident should be checked too.","commit_id":"4a2130b9091fecd6a24b332caa076c7dc2e06dda"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"fddad7fef490d2dcea07a84b9b33da7997db188c","unresolved":false,"context_lines":[{"line_number":391,"context_line":"                raise exception.NotAcceptable()"},{"line_number":392,"context_line":"            if (portgroup and not api_utils.allow_portgroups_subcontrollers()"},{"line_number":393,"context_line":"                or \u0027portgroup_uuid\u0027 in fields):"},{"line_number":394,"context_line":"                raise exception.NotAcceptable()"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        if fields is None:"},{"line_number":397,"context_line":"            fields \u003d _DEFAULT_RETURN_FIELDS"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_224cd16f","line":394,"range":{"start_line":394,"start_character":16,"end_line":394,"end_character":47},"updated":"2016-08-26 16:28:36.000000000","message":"We need to distinguish whether it\u0027s self.parent_portgroup_id is set, and in this case raise 404 as /portgroups endpoint should not exist, and when ?portgroup\u003dabc is passed along with request, and in this case raise 406. Ditto for other places.","commit_id":"66148f7c3d4ad79b3eeb46483afdb3ceb6ba58a1"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"0b296fc7f6061546e02f9bacac94e037de5d3db5","unresolved":false,"context_lines":[{"line_number":391,"context_line":"                raise exception.NotAcceptable()"},{"line_number":392,"context_line":"            if (portgroup and not api_utils.allow_portgroups_subcontrollers()"},{"line_number":393,"context_line":"                or \u0027portgroup_uuid\u0027 in fields):"},{"line_number":394,"context_line":"                raise exception.NotAcceptable()"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        if fields is None:"},{"line_number":397,"context_line":"            fields \u003d _DEFAULT_RETURN_FIELDS"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_b4fdf56f","line":394,"range":{"start_line":394,"start_character":16,"end_line":394,"end_character":47},"in_reply_to":"fa7ab95a_224cd16f","updated":"2016-08-30 09:23:29.000000000","message":"Done","commit_id":"66148f7c3d4ad79b3eeb46483afdb3ceb6ba58a1"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"fddad7fef490d2dcea07a84b9b33da7997db188c","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        cdict \u003d pecan.request.context.to_dict()"},{"line_number":493,"context_line":"        policy.authorize(\u0027baremetal:port:create\u0027, cdict, cdict)"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":496,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"        pdict \u003d port.as_dict()"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_02942d89","line":495,"range":{"start_line":495,"start_character":34,"end_line":495,"end_character":64},"updated":"2016-08-26 16:28:36.000000000","message":"same here - if self.parent_portgroup_ident is set but the api version is too low, we need to raise 404 instead. And only if the api version is high enough we do operation not permitted.","commit_id":"66148f7c3d4ad79b3eeb46483afdb3ceb6ba58a1"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"0fefa0cd943283a3317c703e2ec144ac154ec127","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"# Copyright 2013 UnitedStack Inc."},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa7ab95a_c57a8f76","line":1,"updated":"2016-08-30 22:35:06.000000000","message":"Why a new blank line?","commit_id":"bdba5e15489e9b983e2931ca9895a55adee1522e"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"96e56f152dd84b4e525d244a43baa57652f8c0df","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    \"\"\"The UUID of the node this port belongs to\"\"\""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    portgroup_uuid \u003d wsme.wsproperty(types.uuid, _get_portgroup_uuid,"},{"line_number":137,"context_line":"                                     _set_portgroup_uuid, mandatory\u003dFalse)"},{"line_number":138,"context_line":"    \"\"\"The UUID of the portgroup this port belongs to\"\"\""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    pxe_enabled \u003d types.boolean"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a89bdaa_ad362301","line":137,"updated":"2016-09-05 12:08:48.000000000","message":"nit: mandatory is False by default","commit_id":"94f258d132f6d4da417495a5d1a9c95c16368652"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"96e56f152dd84b4e525d244a43baa57652f8c0df","unresolved":false,"context_lines":[{"line_number":587,"context_line":"            if rpc_port[field] !\u003d patch_val:"},{"line_number":588,"context_line":"                rpc_port[field] \u003d patch_val"},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"        if api_utils.is_path_removed(patch, \u0027/portgroup_uuid\u0027):"},{"line_number":591,"context_line":"            rpc_port.portgroup_id \u003d None"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"        rpc_node \u003d objects.Node.get_by_id(pecan.request.context,"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a89bdaa_16147c42","line":590,"updated":"2016-09-05 12:08:48.000000000","message":"If one json patch has two operations: first removes \u0027/portgroup_uuid\u0027 and next adds \u0027/portgroup_uuid\u0027, portgroup will be removed. This behavior is not conforms RFC 6902: \"Operations are applied sequentially in the order they appear in the array.\"","commit_id":"94f258d132f6d4da417495a5d1a9c95c16368652"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self._portgroup_uuid \u003d wtypes.Unset"},{"line_number":116,"context_line":"        elif value is None and api_utils.allow_portgroups_subcontrollers():"},{"line_number":117,"context_line":"            # This is to output portgroup_uuid field if API version allows this"},{"line_number":118,"context_line":"            self._portgroup_uuid \u003d None"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    uuid \u003d types.uuid"},{"line_number":121,"context_line":"    \"\"\"Unique UUID for this port\"\"\""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_d9224fb9","line":118,"updated":"2016-11-07 22:27:16.000000000","message":"Remind me. If value is None and no api_utils.allow_portgroups_subcontrollers(), what will the value of self._portgroup_uuid be? wtypes.Unset?","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"eb078b457e9fa5f2a09e8154c16003f428cdeb92","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self._portgroup_uuid \u003d wtypes.Unset"},{"line_number":116,"context_line":"        elif value is None and api_utils.allow_portgroups_subcontrollers():"},{"line_number":117,"context_line":"            # This is to output portgroup_uuid field if API version allows this"},{"line_number":118,"context_line":"            self._portgroup_uuid \u003d None"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    uuid \u003d types.uuid"},{"line_number":121,"context_line":"    \"\"\"Unique UUID for this port\"\"\""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_9cfa5cbc","line":118,"in_reply_to":"9a629dbe_889f834f","updated":"2016-11-08 16:02:53.000000000","message":"Ruby, case of \"If value is None and no api_utils.allow_portgroups_subcontrollers()\" is covered in controller methods rather than here, as you can explicitly create a node with portgroup_uuid \u003d none, and it should take into account the microversion. OTOH, Sam\u0027s suggestion is OK too, just as additional pre-caution.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self._portgroup_uuid \u003d wtypes.Unset"},{"line_number":116,"context_line":"        elif value is None and api_utils.allow_portgroups_subcontrollers():"},{"line_number":117,"context_line":"            # This is to output portgroup_uuid field if API version allows this"},{"line_number":118,"context_line":"            self._portgroup_uuid \u003d None"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    uuid \u003d types.uuid"},{"line_number":121,"context_line":"    \"\"\"Unique UUID for this port\"\"\""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_889f834f","line":118,"in_reply_to":"9a629dbe_d9224fb9","updated":"2016-11-08 15:06:07.000000000","message":"I don\u0027t think that is covered properly in this function, I think perhaps this function can be cleaned up like:\n\nif not api_utils.allow_portgroups_subcontrollers() or value \u003d\u003d wtypes.Unset:\n    self._portgroup_uuid \u003d wtypes.Unset\nelif value is None:\n    self._portgroup_uuid \u003d None\nelif value and self._portgroup_uuid !\u003d value:\n    try:\n        ...","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self._portgroup_uuid \u003d wtypes.Unset"},{"line_number":116,"context_line":"        elif value is None and api_utils.allow_portgroups_subcontrollers():"},{"line_number":117,"context_line":"            # This is to output portgroup_uuid field if API version allows this"},{"line_number":118,"context_line":"            self._portgroup_uuid \u003d None"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    uuid \u003d types.uuid"},{"line_number":121,"context_line":"    \"\"\"Unique UUID for this port\"\"\""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_a25aad81","line":118,"in_reply_to":"9a629dbe_d9224fb9","updated":"2016-11-08 17:41:04.000000000","message":"Situation when \u0027not api_utils.allow_portgroups_subcontrollers() and value\u003dNone\u0027 is not possible. We will fail earlier with NotAcceptable error (https://review.openstack.org/#/c/332177/32/ironic/api/controllers/v1/port.py@397)\n\nEven if this happen somehow the value will be not set.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":311,"context_line":"                                                 node.id, limit, marker_obj,"},{"line_number":312,"context_line":"                                                 sort_key\u003dsort_key,"},{"line_number":313,"context_line":"                                                 sort_dir\u003dsort_dir)"},{"line_number":314,"context_line":"        elif portgroup_ident:"},{"line_number":315,"context_line":"            # FIXME: Since all we need is the portgroup ID, we can"},{"line_number":316,"context_line":"            #                 make this more efficient by only querying"},{"line_number":317,"context_line":"            #                 for that column. This will get cleaned up"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_5ca0edf4","line":314,"updated":"2016-11-07 22:27:16.000000000","message":"can you get a list of ports that is \u0027filtered\u0027 by node AND portgroup? A portgroup has to be part of a node so would it make more sense to get ports by portgroup, instead of node, if they are both specified?","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"eb078b457e9fa5f2a09e8154c16003f428cdeb92","unresolved":false,"context_lines":[{"line_number":311,"context_line":"                                                 node.id, limit, marker_obj,"},{"line_number":312,"context_line":"                                                 sort_key\u003dsort_key,"},{"line_number":313,"context_line":"                                                 sort_dir\u003dsort_dir)"},{"line_number":314,"context_line":"        elif portgroup_ident:"},{"line_number":315,"context_line":"            # FIXME: Since all we need is the portgroup ID, we can"},{"line_number":316,"context_line":"            #                 make this more efficient by only querying"},{"line_number":317,"context_line":"            #                 for that column. This will get cleaned up"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_3cd79024","line":314,"in_reply_to":"9a629dbe_33d268d3","updated":"2016-11-08 16:02:53.000000000","message":"++ I agree with that, specifying both is kind of strange.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":311,"context_line":"                                                 node.id, limit, marker_obj,"},{"line_number":312,"context_line":"                                                 sort_key\u003dsort_key,"},{"line_number":313,"context_line":"                                                 sort_dir\u003dsort_dir)"},{"line_number":314,"context_line":"        elif portgroup_ident:"},{"line_number":315,"context_line":"            # FIXME: Since all we need is the portgroup ID, we can"},{"line_number":316,"context_line":"            #                 make this more efficient by only querying"},{"line_number":317,"context_line":"            #                 for that column. This will get cleaned up"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_b26e6994","line":314,"in_reply_to":"9a629dbe_33d268d3","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":311,"context_line":"                                                 node.id, limit, marker_obj,"},{"line_number":312,"context_line":"                                                 sort_key\u003dsort_key,"},{"line_number":313,"context_line":"                                                 sort_dir\u003dsort_dir)"},{"line_number":314,"context_line":"        elif portgroup_ident:"},{"line_number":315,"context_line":"            # FIXME: Since all we need is the portgroup ID, we can"},{"line_number":316,"context_line":"            #                 make this more efficient by only querying"},{"line_number":317,"context_line":"            #                 for that column. This will get cleaned up"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_d26d9d99","line":314,"in_reply_to":"9a629dbe_3cd79024","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":311,"context_line":"                                                 node.id, limit, marker_obj,"},{"line_number":312,"context_line":"                                                 sort_key\u003dsort_key,"},{"line_number":313,"context_line":"                                                 sort_dir\u003dsort_dir)"},{"line_number":314,"context_line":"        elif portgroup_ident:"},{"line_number":315,"context_line":"            # FIXME: Since all we need is the portgroup ID, we can"},{"line_number":316,"context_line":"            #                 make this more efficient by only querying"},{"line_number":317,"context_line":"            #                 for that column. This will get cleaned up"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_725cd1ed","line":314,"in_reply_to":"9a629dbe_5ca0edf4","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":311,"context_line":"                                                 node.id, limit, marker_obj,"},{"line_number":312,"context_line":"                                                 sort_key\u003dsort_key,"},{"line_number":313,"context_line":"                                                 sort_dir\u003dsort_dir)"},{"line_number":314,"context_line":"        elif portgroup_ident:"},{"line_number":315,"context_line":"            # FIXME: Since all we need is the portgroup ID, we can"},{"line_number":316,"context_line":"            #                 make this more efficient by only querying"},{"line_number":317,"context_line":"            #                 for that column. This will get cleaned up"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_33d268d3","line":314,"in_reply_to":"9a629dbe_5ca0edf4","updated":"2016-11-08 15:06:07.000000000","message":"I agree that it makes more sense for the portgroup to take priority over node because a portgroup is already tied to a node so the node filter becomes redundant.\n\nI also think we maybe we should prevent both portgroup_ident and node_ident being specified, because you might end up with a scenario where the node_ident isn\u0027t the portgroup specified\u0027s node, which results in a contradiction.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":396,"context_line":"                    api_utils.allow_portgroups_subcontrollers()):"},{"line_number":397,"context_line":"                    raise exception.NotAcceptable()"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        if portgroup and not api_utils.allow_port_advanced_net_fields():"},{"line_number":400,"context_line":"            raise exception.NotAcceptable()"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        if fields is None:"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_47badae2","line":399,"updated":"2016-11-07 22:27:16.000000000","message":"shouldn\u0027t this be api_utils.allow_portgroups_subcontrollers()?","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":396,"context_line":"                    api_utils.allow_portgroups_subcontrollers()):"},{"line_number":397,"context_line":"                    raise exception.NotAcceptable()"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        if portgroup and not api_utils.allow_port_advanced_net_fields():"},{"line_number":400,"context_line":"            raise exception.NotAcceptable()"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        if fields is None:"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_bdec8cc8","line":399,"in_reply_to":"9a629dbe_47badae2","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        \"\"\""},{"line_number":445,"context_line":"        cdict \u003d pecan.request.context.to_dict()"},{"line_number":446,"context_line":"        policy.authorize(\u0027baremetal:port:get\u0027, cdict, cdict)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        if portgroup and not api_utils.allow_portgroups_subcontrollers():"},{"line_number":449,"context_line":"            raise exception.NotAcceptable()"},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_c7a34a9d","line":447,"updated":"2016-11-07 22:27:16.000000000","message":"Do we need to check for self.parent_portgroup_ident and not allow portgroups...?","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9392e56c33d99b419fdabc1efcb4d7b0237326fb","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        \"\"\""},{"line_number":445,"context_line":"        cdict \u003d pecan.request.context.to_dict()"},{"line_number":446,"context_line":"        policy.authorize(\u0027baremetal:port:get\u0027, cdict, cdict)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        if portgroup and not api_utils.allow_portgroups_subcontrollers():"},{"line_number":449,"context_line":"            raise exception.NotAcceptable()"},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_d463c83f","line":447,"in_reply_to":"9a629dbe_0e9ffbb4","updated":"2016-11-08 17:44:56.000000000","message":"Got it. thx.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        \"\"\""},{"line_number":445,"context_line":"        cdict \u003d pecan.request.context.to_dict()"},{"line_number":446,"context_line":"        policy.authorize(\u0027baremetal:port:get\u0027, cdict, cdict)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        if portgroup and not api_utils.allow_portgroups_subcontrollers():"},{"line_number":449,"context_line":"            raise exception.NotAcceptable()"},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_3d2ddca7","line":447,"in_reply_to":"9a629dbe_c7a34a9d","updated":"2016-11-08 17:41:04.000000000","message":"We will fail earlier whole /portgroups/(portgroup_ident)/ports/ subcontroller will be not accessible.\n\nhttps://review.openstack.org/#/c/332177/32/ironic/api/controllers/v1/portgroup.py@235","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        \"\"\""},{"line_number":445,"context_line":"        cdict \u003d pecan.request.context.to_dict()"},{"line_number":446,"context_line":"        policy.authorize(\u0027baremetal:port:get\u0027, cdict, cdict)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        if portgroup and not api_utils.allow_portgroups_subcontrollers():"},{"line_number":449,"context_line":"            raise exception.NotAcceptable()"},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_0e9ffbb4","line":447,"in_reply_to":"9a629dbe_c7a34a9d","updated":"2016-11-08 15:06:07.000000000","message":"self.parent_portgroup_ident should only be set if you\u0027ve gone through the portgroups controller, eg. v1/portgroups/\u003cuuid\u003e/ports?detail\u003dTrue which should have already blown up before even calling to the subcontroller.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            not api_utils.allow_portgroups_subcontrollers()):"},{"line_number":484,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":487,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"        api_utils.check_allow_specify_fields(fields)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_67e27ed7","line":486,"updated":"2016-11-07 22:27:16.000000000","message":"I wonder if we really want the if at line 482. So someone issues this request but forgets to specify the right version and they get HTTPNotFound. They manage to figure out that they have the wrong version so specify the right version, then they get this exception instead.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            not api_utils.allow_portgroups_subcontrollers()):"},{"line_number":484,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":487,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"        api_utils.check_allow_specify_fields(fields)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_6ea4f7a5","line":486,"in_reply_to":"9a629dbe_67e27ed7","updated":"2016-11-08 15:06:07.000000000","message":"Similarly to my reply above I think the if statement at 482 shouldn\u0027t need to be here and should be caught in the portgroups controller before reaching this point.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            not api_utils.allow_portgroups_subcontrollers()):"},{"line_number":484,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":487,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"        api_utils.check_allow_specify_fields(fields)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_53ba81e2","line":486,"in_reply_to":"9a629dbe_67e27ed7","updated":"2016-11-08 17:41:04.000000000","message":"When user tries to access to non-existed endpoint (request with old api version) no matter if the syntax is right or not, he should receive 404.\n\nBut instead having this in get_all(), get_one(), post(), patch(), detail() ...\nwe may put it https://review.openstack.org/#/c/332177/32/ironic/api/controllers/v1/portgroup.py@229\n\n+if not api_utils.allow_portgroups():\n+            pecan.abort(http_client.NOT_FOUND)","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":483,"context_line":"            not api_utils.allow_portgroups_subcontrollers()):"},{"line_number":484,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":487,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":488,"context_line":""},{"line_number":489,"context_line":"        api_utils.check_allow_specify_fields(fields)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_d204bdc1","line":486,"in_reply_to":"9a629dbe_6ea4f7a5","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":504,"context_line":""},{"line_number":505,"context_line":"        if (not api_utils.allow_portgroups_subcontrollers() and"},{"line_number":506,"context_line":"            self.parent_portgroup_ident):"},{"line_number":507,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":510,"context_line":"            raise exception.OperationNotPermitted()"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_6ecb1754","line":507,"updated":"2016-11-08 15:06:07.000000000","message":"ditto","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":504,"context_line":""},{"line_number":505,"context_line":"        if (not api_utils.allow_portgroups_subcontrollers() and"},{"line_number":506,"context_line":"            self.parent_portgroup_ident):"},{"line_number":507,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":510,"context_line":"            raise exception.OperationNotPermitted()"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_3230999e","line":507,"in_reply_to":"9a629dbe_6ecb1754","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":506,"context_line":"            self.parent_portgroup_ident):"},{"line_number":507,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":510,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        pdict \u003d port.as_dict()"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_07dc6211","line":509,"updated":"2016-11-07 22:27:16.000000000","message":"similar thought to above. I\u0027m not sure what is \u0027right\u0027, but it seems like it could be annoying to the user.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"eb078b457e9fa5f2a09e8154c16003f428cdeb92","unresolved":false,"context_lines":[{"line_number":506,"context_line":"            self.parent_portgroup_ident):"},{"line_number":507,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":510,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        pdict \u003d port.as_dict()"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_dcc5b43c","line":509,"in_reply_to":"9a629dbe_07dc6211","updated":"2016-11-08 16:02:53.000000000","message":"Otherwise they will be getting operation not permitted on \"non-existing\" endpoint, which seems more confusing to me.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":506,"context_line":"            self.parent_portgroup_ident):"},{"line_number":507,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":510,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        pdict \u003d port.as_dict()"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_13a564b4","line":509,"in_reply_to":"9a629dbe_07dc6211","updated":"2016-11-08 17:41:04.000000000","message":"We do not allow to modify resources via subcontrollers, ie\nPOST|PATCH are not allowed to /portgroups/()/ports/() and /nodes/()/portgroups/(). But if user perform non-valid request to endpoint that shouldn\u0027t exist, he first should receive 404 and only when right API version is used request should be validated.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":540,"context_line":""},{"line_number":541,"context_line":"        if (not api_utils.allow_portgroups_subcontrollers() and"},{"line_number":542,"context_line":"            self.parent_portgroup_ident):"},{"line_number":543,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":546,"context_line":"            raise exception.OperationNotPermitted()"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_aec52f3d","line":543,"updated":"2016-11-08 15:06:07.000000000","message":"ditto","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":540,"context_line":""},{"line_number":541,"context_line":"        if (not api_utils.allow_portgroups_subcontrollers() and"},{"line_number":542,"context_line":"            self.parent_portgroup_ident):"},{"line_number":543,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":546,"context_line":"            raise exception.OperationNotPermitted()"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_92216550","line":543,"in_reply_to":"9a629dbe_aec52f3d","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":556,"context_line":"            raise exception.NotAcceptable()"},{"line_number":557,"context_line":"        if (\u0027portgroup_uuid\u0027 in fields_to_check and"},{"line_number":558,"context_line":"                not api_utils.allow_portgroups_subcontrollers()):"},{"line_number":559,"context_line":"            raise exception.NotAcceptable()"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"        rpc_port \u003d objects.Port.get_by_uuid(pecan.request.context, port_uuid)"},{"line_number":562,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_c7db4aec","line":559,"updated":"2016-11-07 22:27:16.000000000","message":"What do you think about turning this around, eg:\n    fields_to_check \u003d set()\n    if not api_utils.allow_portgroups_subcontrollers():\n        fields_to_check.add(\u0027portgroup_uuid\u0027)\n    if not api_utils.allow_port_advanced_net_fields():\n        fields_to_check.add(self.advanced_net_fields)\n    for field in fields_to_check:\n        ...... raise exception.NotAcceptable()","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":612,"context_line":""},{"line_number":613,"context_line":"        if (not api_utils.allow_portgroups_subcontrollers() and"},{"line_number":614,"context_line":"            self.parent_portgroup_ident):"},{"line_number":615,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":616,"context_line":""},{"line_number":617,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":618,"context_line":"            raise exception.OperationNotPermitted()"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_6ed23702","line":615,"updated":"2016-11-08 15:06:07.000000000","message":"ditto","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":612,"context_line":""},{"line_number":613,"context_line":"        if (not api_utils.allow_portgroups_subcontrollers() and"},{"line_number":614,"context_line":"            self.parent_portgroup_ident):"},{"line_number":615,"context_line":"            raise exception.HTTPNotFound()"},{"line_number":616,"context_line":""},{"line_number":617,"context_line":"        if self.parent_node_ident or self.parent_portgroup_ident:"},{"line_number":618,"context_line":"            raise exception.OperationNotPermitted()"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_d21bdd19","line":615,"in_reply_to":"9a629dbe_6ed23702","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ca29ecd56a6d1a5adabb70aee17f54f3e7097635","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        portgroup_ident \u003d self.parent_portgroup_ident or portgroup_ident"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        if node_ident and portgroup_ident:"},{"line_number":305,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        if portgroup_ident:"},{"line_number":308,"context_line":"            # FIXME: Since all we need is the portgroup ID, we can"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a629dbe_305b2730","line":305,"updated":"2016-11-08 21:18:31.000000000","message":"should we put a meaningful message there?","commit_id":"a8664102eea53545ecc2d9d682adfa567d34f635"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"beaf19316155b313ca8fe5702098217d4aac7b18","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        portgroup_ident \u003d self.parent_portgroup_ident or portgroup_ident"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"        if node_ident and portgroup_ident:"},{"line_number":305,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        if portgroup_ident:"},{"line_number":308,"context_line":"            # FIXME: Since all we need is the portgroup ID, we can"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a629dbe_c9b874e8","line":305,"in_reply_to":"9a629dbe_305b2730","updated":"2016-11-09 11:39:12.000000000","message":"We don\u0027t put any message except \"Operation not permitted.\" when access to API is blocked with FORBIDDEN in other cases. There are not so much places, but if we decide to provide message I think we should do it everywhere.","commit_id":"a8664102eea53545ecc2d9d682adfa567d34f635"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"dd7c650cb8902e7f66342f92b774135fce27bb20","unresolved":false,"context_lines":[{"line_number":431,"context_line":"        :param address: MAC address of a port, to get the port which has"},{"line_number":432,"context_line":"                        this MAC address."},{"line_number":433,"context_line":"        :param portgroup: UUID or name of a portgroup, to get only ports"},{"line_number":434,"context_line":"                           for that portgroup."},{"line_number":435,"context_line":"        :param marker: pagination marker for large data sets."},{"line_number":436,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":437,"context_line":"                      This value cannot be larger than the value of max_limit"}],"source_content_type":"text/x-python","patch_set":35,"id":"9a629dbe_5ce5e9d9","line":434,"range":{"start_line":434,"start_character":26,"end_line":434,"end_character":27},"updated":"2016-11-09 18:04:23.000000000","message":"Super nit: single excess space.","commit_id":"dd57ed5a2d2c42abc72ac13ce7eb491c27b7468a"}],"ironic/api/controllers/v1/portgroup.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7743a51939489b73069b6b60a24b57885f4a4472","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        subcontroller \u003d self._subcontroller_map.get(subres)"},{"line_number":223,"context_line":"        if subcontroller:"},{"line_number":224,"context_line":"            if api_utils.allow_portgroups():"},{"line_number":225,"context_line":"                return subcontroller(portgroup_id\u003dident), remainder"},{"line_number":226,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def __init__(self, node_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ac06dbe_8a54a654","line":225,"range":{"start_line":225,"start_character":37,"end_line":225,"end_character":49},"updated":"2016-08-25 10:09:46.000000000","message":"should be portgroup_ident now","commit_id":"4a2130b9091fecd6a24b332caa076c7dc2e06dda"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"fddad7fef490d2dcea07a84b9b33da7997db188c","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        ident \u003d types.uuid_or_name.validate(ident)"},{"line_number":227,"context_line":"        subcontroller \u003d self._subcontroller_map.get(subres)"},{"line_number":228,"context_line":"        if subcontroller:"},{"line_number":229,"context_line":"            if api_utils.allow_portgroups():"},{"line_number":230,"context_line":"                return subcontroller(portgroup_ident\u003dident), remainder"},{"line_number":231,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_a2caa19f","line":229,"range":{"start_line":229,"start_character":25,"end_line":229,"end_character":41},"updated":"2016-08-26 16:28:36.000000000","message":"allow_portgroups_subcontrollers","commit_id":"66148f7c3d4ad79b3eeb46483afdb3ceb6ba58a1"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"fddad7fef490d2dcea07a84b9b33da7997db188c","unresolved":false,"context_lines":[{"line_number":370,"context_line":"        policy.authorize(\u0027baremetal:portgroup:get\u0027, cdict, cdict)"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"        if self.parent_node_ident:"},{"line_number":373,"context_line":"            raise exception.OperationNotPermitted()"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        rpc_portgroup \u003d api_utils.get_rpc_portgroup(portgroup_ident)"},{"line_number":376,"context_line":"        return Portgroup.convert_with_links(rpc_portgroup, fields\u003dfields)"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_226db198","line":373,"updated":"2016-08-26 16:28:36.000000000","message":"same problem here, we first need to check if the subcontrollers are allowed at all, and only if they are, do this, otherwise it should be 404","commit_id":"66148f7c3d4ad79b3eeb46483afdb3ceb6ba58a1"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"5dafa12ba40806cbf7df0bc0873da11db3ad45b2","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @pecan.expose()"},{"line_number":228,"context_line":"    def _lookup(self, ident, subres, *remainder):"},{"line_number":229,"context_line":"        ident \u003d types.uuid_or_name.validate(ident)"},{"line_number":230,"context_line":"        subcontroller \u003d self._subcontroller_map.get(subres)"},{"line_number":231,"context_line":"        if subcontroller:"},{"line_number":232,"context_line":"            if api_utils.allow_portgroups():"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa7ab95a_93ab0789","line":229,"range":{"start_line":229,"start_character":8,"end_line":229,"end_character":50},"updated":"2016-09-01 11:29:16.000000000","message":"Need to wrap this the same way as here - https://review.openstack.org/364222","commit_id":"ae5d0bfd4118c6eb4bf3cb6cdb7b1bf97601d13a"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"cf3b930563434410f199a8c6d13a0d2acc2a1771","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @pecan.expose()"},{"line_number":228,"context_line":"    def _lookup(self, ident, subres, *remainder):"},{"line_number":229,"context_line":"        ident \u003d types.uuid_or_name.validate(ident)"},{"line_number":230,"context_line":"        subcontroller \u003d self._subcontroller_map.get(subres)"},{"line_number":231,"context_line":"        if subcontroller:"},{"line_number":232,"context_line":"            if api_utils.allow_portgroups():"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa7ab95a_3e74b79a","line":229,"range":{"start_line":229,"start_character":8,"end_line":229,"end_character":50},"in_reply_to":"fa7ab95a_93ab0789","updated":"2016-09-01 14:04:57.000000000","message":"Done","commit_id":"ae5d0bfd4118c6eb4bf3cb6cdb7b1bf97601d13a"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            pecan.abort(http_client.BAD_REQUEST, e.args[0])"},{"line_number":233,"context_line":"        subcontroller \u003d self._subcontroller_map.get(subres)"},{"line_number":234,"context_line":"        if subcontroller:"},{"line_number":235,"context_line":"            if api_utils.allow_portgroups():"},{"line_number":236,"context_line":"                return subcontroller(portgroup_ident\u003dident), remainder"},{"line_number":237,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":238,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_ae07ef1a","line":235,"updated":"2016-11-08 15:06:07.000000000","message":"we should also be checking api_utils.allow_portgroups_subcontrollers() here to avoid having to handle it in everycase in the ports controller.\n\nAdditionally if self.parent_node_ident is set, should be pass that through to the port controller too?","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"9f0816f97f11659c6c98532db211d5477529e459","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            pecan.abort(http_client.BAD_REQUEST, e.args[0])"},{"line_number":233,"context_line":"        subcontroller \u003d self._subcontroller_map.get(subres)"},{"line_number":234,"context_line":"        if subcontroller:"},{"line_number":235,"context_line":"            if api_utils.allow_portgroups():"},{"line_number":236,"context_line":"                return subcontroller(portgroup_ident\u003dident), remainder"},{"line_number":237,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":238,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_345fa442","line":235,"in_reply_to":"9a629dbe_34032444","updated":"2016-11-08 17:49:01.000000000","message":"Well, the intent is to have fully functional ironic on any master commit, and as there were two commits, these should be separate microversions I think. Otherwise someone on the commit 1 will have a different behavior from someone on commit 2, while still having identical API microversion.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"6aa79ded3537c02766e4de1386fbf0e8b995afd3","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            pecan.abort(http_client.BAD_REQUEST, e.args[0])"},{"line_number":233,"context_line":"        subcontroller \u003d self._subcontroller_map.get(subres)"},{"line_number":234,"context_line":"        if subcontroller:"},{"line_number":235,"context_line":"            if api_utils.allow_portgroups():"},{"line_number":236,"context_line":"                return subcontroller(portgroup_ident\u003dident), remainder"},{"line_number":237,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":238,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_30f7a7f6","line":235,"in_reply_to":"9a629dbe_345fa442","updated":"2016-11-08 21:18:57.000000000","message":"right. That\u0027s why we could have put the two patches into one patch, or NOT land the first patch until this second patch was ready and land them both at the same time. Like I said, in hindsight :-) Something to consider in the future.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            pecan.abort(http_client.BAD_REQUEST, e.args[0])"},{"line_number":233,"context_line":"        subcontroller \u003d self._subcontroller_map.get(subres)"},{"line_number":234,"context_line":"        if subcontroller:"},{"line_number":235,"context_line":"            if api_utils.allow_portgroups():"},{"line_number":236,"context_line":"                return subcontroller(portgroup_ident\u003dident), remainder"},{"line_number":237,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":238,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_32a5f9b4","line":235,"in_reply_to":"9a629dbe_5cffe466","updated":"2016-11-08 17:41:04.000000000","message":"Done on ports side.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9392e56c33d99b419fdabc1efcb4d7b0237326fb","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            pecan.abort(http_client.BAD_REQUEST, e.args[0])"},{"line_number":233,"context_line":"        subcontroller \u003d self._subcontroller_map.get(subres)"},{"line_number":234,"context_line":"        if subcontroller:"},{"line_number":235,"context_line":"            if api_utils.allow_portgroups():"},{"line_number":236,"context_line":"                return subcontroller(portgroup_ident\u003dident), remainder"},{"line_number":237,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":238,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_34032444","line":235,"in_reply_to":"9a629dbe_5cffe466","updated":"2016-11-08 17:44:56.000000000","message":"in hindsight (or if I had actually looked at this patch before approving the previous one), we should have put this all in one patch/microversion. Having to distinguish .allow_portgroups() \u0026 .allow_portgroup_subcontrollers() can lead to program errors. (And .allow_porgroup_subcontrollers() actually allows a few other things).","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"eb078b457e9fa5f2a09e8154c16003f428cdeb92","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            pecan.abort(http_client.BAD_REQUEST, e.args[0])"},{"line_number":233,"context_line":"        subcontroller \u003d self._subcontroller_map.get(subres)"},{"line_number":234,"context_line":"        if subcontroller:"},{"line_number":235,"context_line":"            if api_utils.allow_portgroups():"},{"line_number":236,"context_line":"                return subcontroller(portgroup_ident\u003dident), remainder"},{"line_number":237,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":238,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_5cffe466","line":235,"in_reply_to":"9a629dbe_ae07ef1a","updated":"2016-11-08 16:02:53.000000000","message":"++, we can pass parent_node_ident always, it is None by default, and if both parent node and parent portgroup exist, raise.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            pecan.abort(http_client.BAD_REQUEST, e.args[0])"},{"line_number":233,"context_line":"        subcontroller \u003d self._subcontroller_map.get(subres)"},{"line_number":234,"context_line":"        if subcontroller:"},{"line_number":235,"context_line":"            if api_utils.allow_portgroups():"},{"line_number":236,"context_line":"                return subcontroller(portgroup_ident\u003dident), remainder"},{"line_number":237,"context_line":"            pecan.abort(http_client.NOT_FOUND)"},{"line_number":238,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_4bb1e0e0","line":235,"in_reply_to":"9a629dbe_ae07ef1a","updated":"2016-11-08 17:41:04.000000000","message":"yes, here should be api_utils.allow_portgroups_subcontrollers(), I\u0027ve found issue with this when resolved Ruby comments.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":397,"context_line":"            if api_utils.allow_portgroups_subcontrollers():"},{"line_number":398,"context_line":"                raise exception.OperationNotPermitted()"},{"line_number":399,"context_line":"            else:"},{"line_number":400,"context_line":"                raise exception.HTTPNotFound()"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        rpc_portgroup \u003d api_utils.get_rpc_portgroup(portgroup_ident)"},{"line_number":403,"context_line":"        return Portgroup.convert_with_links(rpc_portgroup, fields\u003dfields)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_d9d78beb","line":400,"updated":"2016-11-08 15:06:07.000000000","message":"similarly I think this should be handled in the nodes controller instead of having to replicate this in every function.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":397,"context_line":"            if api_utils.allow_portgroups_subcontrollers():"},{"line_number":398,"context_line":"                raise exception.OperationNotPermitted()"},{"line_number":399,"context_line":"            else:"},{"line_number":400,"context_line":"                raise exception.HTTPNotFound()"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        rpc_portgroup \u003d api_utils.get_rpc_portgroup(portgroup_ident)"},{"line_number":403,"context_line":"        return Portgroup.convert_with_links(rpc_portgroup, fields\u003dfields)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_0dea980f","line":400,"in_reply_to":"9a629dbe_1c61ec39","updated":"2016-11-08 17:41:04.000000000","message":"I think Sam mentioned that we may left here \n\nif self.parent_node_ident:\n    raise exception.OperationNotPermitted()\n\nwith moving to _lookup() from node.py\n\nif (remainder[0] \u003d\u003d \u0027portgroups\u0027 and\n        not api_utils.allow_portgroups_subcontrollers()):\n    pecan.abort(http_client.NOT_FOUND)","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"eb078b457e9fa5f2a09e8154c16003f428cdeb92","unresolved":false,"context_lines":[{"line_number":397,"context_line":"            if api_utils.allow_portgroups_subcontrollers():"},{"line_number":398,"context_line":"                raise exception.OperationNotPermitted()"},{"line_number":399,"context_line":"            else:"},{"line_number":400,"context_line":"                raise exception.HTTPNotFound()"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        rpc_portgroup \u003d api_utils.get_rpc_portgroup(portgroup_ident)"},{"line_number":403,"context_line":"        return Portgroup.convert_with_links(rpc_portgroup, fields\u003dfields)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_1c61ec39","line":400,"in_reply_to":"9a629dbe_d9d78beb","updated":"2016-11-08 16:02:53.000000000","message":"H, the problem is, it is not for every function, get_all and detail do not need this, and adding a bunch of logic into node controllers _lookup will complicate it even more... If I understand correctly what you\u0027re suggesting.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":11929,"name":"Michael Turek","email":"mjturek@linux.vnet.ibm.com","username":"mjturek"},"change_message_id":"b4f0a04ad43cdcbd9469544aa89d9d4ecbde75dc","unresolved":false,"context_lines":[{"line_number":397,"context_line":"            versions.MINOR_20_NETWORK_INTERFACE)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"\u003c\u003c\u003c\u003c\u003c\u003c\u003c 7bf6936cf7dcfdb9b7570feb42f3d9e735bf873a"},{"line_number":401,"context_line":"def allow_resource_class():"},{"line_number":402,"context_line":"    \"\"\"Check if we should support resource_class node field."},{"line_number":403,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_f10fc536","line":400,"range":{"start_line":400,"start_character":8,"end_line":400,"end_character":48},"updated":"2016-08-04 20:11:21.000000000","message":"missed this while rebasing, whoops.","commit_id":"97fe1658564bf02cad59e9cd8c1285c5a2af0520"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e5f662a0e33ea9c2f648db65287fa0ada417aea1","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    if utils.is_valid_logical_name(portgroup_ident):"},{"line_number":162,"context_line":"        return objects.Portgroup.get_by_name(pecan.request.context,"},{"line_number":163,"context_line":"                                             portgroup_ident)"},{"line_number":164,"context_line":"    raise exception.InvalidUuidOrName(name\u003dportgroup_ident)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"def is_valid_node_name(name):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ac06dbe_23ab1820","line":164,"updated":"2016-08-25 12:13:35.000000000","message":"huh, I commented this on the previous patch, it should go there :)","commit_id":"4a2130b9091fecd6a24b332caa076c7dc2e06dda"}],"ironic/api/controllers/v1/versions.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":53,"context_line":"# v1.21: Add node.resource_class"},{"line_number":54,"context_line":"# v1.22: Ramdisk lookup and heartbeat endpoints."},{"line_number":55,"context_line":"# v1.23: Add portgroup support."},{"line_number":56,"context_line":"# v1.24: Add portgroup subcontrollers."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":59,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_e2375ce1","line":56,"updated":"2016-11-07 22:27:16.000000000","message":"i wonder if we should elaborate, it is node.portgroup subcontroller, portgroup.port subcontroller, and port.portgroup_uuid field.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":53,"context_line":"# v1.21: Add node.resource_class"},{"line_number":54,"context_line":"# v1.22: Ramdisk lookup and heartbeat endpoints."},{"line_number":55,"context_line":"# v1.23: Add portgroup support."},{"line_number":56,"context_line":"# v1.24: Add portgroup subcontrollers."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":59,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_d3a68c52","line":56,"in_reply_to":"9a629dbe_e2375ce1","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ca29ecd56a6d1a5adabb70aee17f54f3e7097635","unresolved":false,"context_lines":[{"line_number":53,"context_line":"# v1.21: Add node.resource_class"},{"line_number":54,"context_line":"# v1.22: Ramdisk lookup and heartbeat endpoints."},{"line_number":55,"context_line":"# v1.23: Add portgroup support."},{"line_number":56,"context_line":"# v1.24: Add portgroup subcontrollers: node.portgroup, portgroup.ports."},{"line_number":57,"context_line":"#        Add port.portgroup_uuid field."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"MINOR_0_JUNO \u003d 0"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a629dbe_1042a310","line":56,"updated":"2016-11-08 21:18:31.000000000","message":"s/Add portgroup/Add/","commit_id":"a8664102eea53545ecc2d9d682adfa567d34f635"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"beaf19316155b313ca8fe5702098217d4aac7b18","unresolved":false,"context_lines":[{"line_number":53,"context_line":"# v1.21: Add node.resource_class"},{"line_number":54,"context_line":"# v1.22: Ramdisk lookup and heartbeat endpoints."},{"line_number":55,"context_line":"# v1.23: Add portgroup support."},{"line_number":56,"context_line":"# v1.24: Add portgroup subcontrollers: node.portgroup, portgroup.ports."},{"line_number":57,"context_line":"#        Add port.portgroup_uuid field."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"MINOR_0_JUNO \u003d 0"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a629dbe_ee6e1e2e","line":56,"in_reply_to":"9a629dbe_1042a310","updated":"2016-11-09 11:39:12.000000000","message":"Done","commit_id":"a8664102eea53545ecc2d9d682adfa567d34f635"}],"ironic/tests/unit/api/test_root.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"69e28cb4f444b6af7f1edf7e57c2154e06d7c813","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    def test_get_v1_23_root(self):"},{"line_number":82,"context_line":"        self._test_get_root(headers\u003d{\u0027X-OpenStack-Ironic-API-Version\u0027: \u00271.23\u0027},"},{"line_number":83,"context_line":"                            additional_expected_resources\u003d[\u0027heartbeat\u0027,"},{"line_number":84,"context_line":"                                                           \u0027lookup\u0027, \u0027portgroups\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ac371cc_c977ce38","line":84,"updated":"2016-08-16 05:09:27.000000000","message":"Pep8 failure still remains here.\n\n./ironic/tests/unit/api/test_root.py:84:80: E501 line too long (83 \u003e 79 characters)","commit_id":"3c817a8a83b9c93f5c1797f183fbec18a2ae917b"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e5f662a0e33ea9c2f648db65287fa0ada417aea1","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.assertIn({\u0027type\u0027: \u0027application/vnd.openstack.ironic.v1+json\u0027,"},{"line_number":59,"context_line":"                       \u0027base\u0027: \u0027application/json\u0027}, data[\u0027media_types\u0027])"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def test_get_v1_root_version_1_22(self):"},{"line_number":62,"context_line":"        headers \u003d {api_base.Version.string: \u00271.22\u0027}"},{"line_number":63,"context_line":"        data \u003d self.get_json(\u0027/\u0027, headers\u003dheaders)"},{"line_number":64,"context_line":"        self.assertEqual(\u0027v1\u0027, data[\u0027id\u0027])"},{"line_number":65,"context_line":"        # Check fields are not empty"},{"line_number":66,"context_line":"        for f in data:"},{"line_number":67,"context_line":"            self.assertNotIn(f, [\u0027\u0027, []])"},{"line_number":68,"context_line":"        # Check if all known resources are present and there are no extra ones."},{"line_number":69,"context_line":"        not_resources \u003d (\u0027id\u0027, \u0027links\u0027, \u0027media_types\u0027)"},{"line_number":70,"context_line":"        actual_resources \u003d tuple(set(data.keys()) - set(not_resources))"},{"line_number":71,"context_line":"        expected_resources \u003d (\u0027chassis\u0027, \u0027drivers\u0027, \u0027heartbeat\u0027,"},{"line_number":72,"context_line":"                              \u0027lookup\u0027, \u0027nodes\u0027, \u0027ports\u0027)"},{"line_number":73,"context_line":"        self.assertEqual(sorted(expected_resources), sorted(actual_resources))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        self.assertIn({\u0027type\u0027: \u0027application/vnd.openstack.ironic.v1+json\u0027,"},{"line_number":76,"context_line":"                       \u0027base\u0027: \u0027application/json\u0027}, data[\u0027media_types\u0027])"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def test_get_v1_root(self):"},{"line_number":79,"context_line":"        self._test_get_root()"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ac06dbe_c330440a","line":76,"range":{"start_line":61,"start_character":4,"end_line":76,"end_character":72},"updated":"2016-08-25 12:13:35.000000000","message":"can be refactored too now.","commit_id":"4a2130b9091fecd6a24b332caa076c7dc2e06dda"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"fddad7fef490d2dcea07a84b9b33da7997db188c","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def test_get_v1_23_root(self):"},{"line_number":82,"context_line":"        self._test_get_root(headers\u003d{\u0027X-OpenStack-Ironic-API-Version\u0027: \u00271.23\u0027},"},{"line_number":83,"context_line":"                            additional_expected_resources\u003d[\u0027heartbeat\u0027,"},{"line_number":84,"context_line":"                                                           \u0027lookup\u0027,"},{"line_number":85,"context_line":"                                                           \u0027portgroups\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_2204d1be","line":83,"updated":"2016-08-26 16:28:36.000000000","message":"Please move this to the previous one too.","commit_id":"66148f7c3d4ad79b3eeb46483afdb3ceb6ba58a1"}],"ironic/tests/unit/api/v1/test_nodes.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":473,"context_line":"            headers\u003d{\u0027X-OpenStack-Ironic-API-Version\u0027: \u00271.20\u0027})"},{"line_number":474,"context_line":"        self.assertNotIn(\u0027portgroups\u0027, data.keys())"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    def test_ports_subresource(self):"},{"line_number":477,"context_line":"        node \u003d obj_utils.create_test_node(self.context)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        for id_ in range(2):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_e2dafc77","line":476,"updated":"2016-11-07 22:27:16.000000000","message":"do we want similar tests for portgroups? This one looks like it might be useful, not sure about the following three.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":473,"context_line":"            headers\u003d{\u0027X-OpenStack-Ironic-API-Version\u0027: \u00271.20\u0027})"},{"line_number":474,"context_line":"        self.assertNotIn(\u0027portgroups\u0027, data.keys())"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    def test_ports_subresource(self):"},{"line_number":477,"context_line":"        node \u003d obj_utils.create_test_node(self.context)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        for id_ in range(2):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_945eb010","line":476,"in_reply_to":"9a629dbe_d91cebc3","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":473,"context_line":"            headers\u003d{\u0027X-OpenStack-Ironic-API-Version\u0027: \u00271.20\u0027})"},{"line_number":474,"context_line":"        self.assertNotIn(\u0027portgroups\u0027, data.keys())"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    def test_ports_subresource(self):"},{"line_number":477,"context_line":"        node \u003d obj_utils.create_test_node(self.context)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        for id_ in range(2):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_79967f4d","line":476,"in_reply_to":"9a629dbe_e2dafc77","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":473,"context_line":"            headers\u003d{\u0027X-OpenStack-Ironic-API-Version\u0027: \u00271.20\u0027})"},{"line_number":474,"context_line":"        self.assertNotIn(\u0027portgroups\u0027, data.keys())"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":"    def test_ports_subresource(self):"},{"line_number":477,"context_line":"        node \u003d obj_utils.create_test_node(self.context)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        for id_ in range(2):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_d91cebc3","line":476,"in_reply_to":"9a629dbe_e2dafc77","updated":"2016-11-08 15:06:07.000000000","message":"I think we need to add tests here for: \n\n/nodes/\u003cident\u003e/portgroups\n/nodes/\u003cident\u003e/portgroups/\u003cuuid\u003e/ports","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"}],"ironic/tests/unit/api/v1/test_portgroups.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        data \u003d self.get_json(\u0027/portgroups/%s/ports\u0027 % pg.uuid,"},{"line_number":271,"context_line":"                             headers\u003d{api_base.Version.string: \u00271.24\u0027})"},{"line_number":272,"context_line":"        self.assertEqual(port.uuid, data[\u0027ports\u0027][0][\u0027uuid\u0027])"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def test_ports_subresource_portgroup_not_found(self):"},{"line_number":275,"context_line":"        non_existent_uuid \u003d \u0027eeeeeeee-cccc-aaaa-bbbb-cccccccccccc\u0027"},{"line_number":276,"context_line":"        response \u003d self.get_json(\u0027/portgroups/%s/ports\u0027 % non_existent_uuid,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_c2e7b810","line":273,"updated":"2016-11-07 22:27:16.000000000","message":"do we want tests to show that if the version is \u003c 1.24, it isn\u0027t possible to get the ports via the portgroup?","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        data \u003d self.get_json(\u0027/portgroups/%s/ports\u0027 % pg.uuid,"},{"line_number":271,"context_line":"                             headers\u003d{api_base.Version.string: \u00271.24\u0027})"},{"line_number":272,"context_line":"        self.assertEqual(port.uuid, data[\u0027ports\u0027][0][\u0027uuid\u0027])"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def test_ports_subresource_portgroup_not_found(self):"},{"line_number":275,"context_line":"        non_existent_uuid \u003d \u0027eeeeeeee-cccc-aaaa-bbbb-cccccccccccc\u0027"},{"line_number":276,"context_line":"        response \u003d self.get_json(\u0027/portgroups/%s/ports\u0027 % non_existent_uuid,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_b4e81e12","line":273,"in_reply_to":"9a629dbe_c2e7b810","updated":"2016-11-08 15:06:07.000000000","message":"+1","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        data \u003d self.get_json(\u0027/portgroups/%s/ports\u0027 % pg.uuid,"},{"line_number":271,"context_line":"                             headers\u003d{api_base.Version.string: \u00271.24\u0027})"},{"line_number":272,"context_line":"        self.assertEqual(port.uuid, data[\u0027ports\u0027][0][\u0027uuid\u0027])"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def test_ports_subresource_portgroup_not_found(self):"},{"line_number":275,"context_line":"        non_existent_uuid \u003d \u0027eeeeeeee-cccc-aaaa-bbbb-cccccccccccc\u0027"},{"line_number":276,"context_line":"        response \u003d self.get_json(\u0027/portgroups/%s/ports\u0027 % non_existent_uuid,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_e802ba0a","line":273,"in_reply_to":"9a629dbe_c2e7b810","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ca29ecd56a6d1a5adabb70aee17f54f3e7097635","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        response \u003d self.get_json(\u0027/portgroups/%s/ports\u0027 % pg.uuid,"},{"line_number":292,"context_line":"                                 expect_errors\u003dTrue,"},{"line_number":293,"context_line":"                                 headers\u003d{api_base.Version.string: \u00271.23\u0027})"},{"line_number":294,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def test_ports_subresource_portgroup_not_found(self):"},{"line_number":297,"context_line":"        non_existent_uuid \u003d \u0027eeeeeeee-cccc-aaaa-bbbb-cccccccccccc\u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a629dbe_70c67f4a","line":294,"updated":"2016-11-08 21:18:31.000000000","message":"if you look at the next test, that also returns the same .NOT_FOUND. So the user doesn\u0027t easily know what the problem is, that the version is not right, or that the portgroup UUID is incorrect :-(","commit_id":"a8664102eea53545ecc2d9d682adfa567d34f635"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"beaf19316155b313ca8fe5702098217d4aac7b18","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        response \u003d self.get_json(\u0027/portgroups/%s/ports\u0027 % pg.uuid,"},{"line_number":292,"context_line":"                                 expect_errors\u003dTrue,"},{"line_number":293,"context_line":"                                 headers\u003d{api_base.Version.string: \u00271.23\u0027})"},{"line_number":294,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def test_ports_subresource_portgroup_not_found(self):"},{"line_number":297,"context_line":"        non_existent_uuid \u003d \u0027eeeeeeee-cccc-aaaa-bbbb-cccccccccccc\u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a629dbe_8903dc0c","line":294,"in_reply_to":"9a629dbe_70c67f4a","updated":"2016-11-09 11:39:12.000000000","message":"User also will receive an error message. In first case message will be \"The resource could not be found.\", in second:\n\"Portgroup %s could not be found.\"\nI\u0027ve added check for error message in the tests.","commit_id":"a8664102eea53545ecc2d9d682adfa567d34f635"}],"ironic/tests/unit/api/v1/test_ports.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.assertEqual(port.uuid, data[\u0027uuid\u0027])"},{"line_number":101,"context_line":"        self.assertIn(\u0027extra\u0027, data)"},{"line_number":102,"context_line":"        self.assertIn(\u0027node_uuid\u0027, data)"},{"line_number":103,"context_line":"        # never expose the node_id"},{"line_number":104,"context_line":"        self.assertNotIn(\u0027node_id\u0027, data)"},{"line_number":105,"context_line":"        self.assertIn(\u0027portgroup_uuid\u0027, data)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_628d0c31","line":103,"updated":"2016-11-07 22:27:16.000000000","message":"or port id?","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.assertEqual(port.uuid, data[\u0027uuid\u0027])"},{"line_number":101,"context_line":"        self.assertIn(\u0027extra\u0027, data)"},{"line_number":102,"context_line":"        self.assertIn(\u0027node_uuid\u0027, data)"},{"line_number":103,"context_line":"        # never expose the node_id"},{"line_number":104,"context_line":"        self.assertNotIn(\u0027node_id\u0027, data)"},{"line_number":105,"context_line":"        self.assertIn(\u0027portgroup_uuid\u0027, data)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_88dcdee5","line":103,"in_reply_to":"9a629dbe_628d0c31","updated":"2016-11-08 15:06:07.000000000","message":"we should check both node_id and portgroup_id are not returned as both should be hidden by the API.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.assertEqual(port.uuid, data[\u0027uuid\u0027])"},{"line_number":101,"context_line":"        self.assertIn(\u0027extra\u0027, data)"},{"line_number":102,"context_line":"        self.assertIn(\u0027node_uuid\u0027, data)"},{"line_number":103,"context_line":"        # never expose the node_id"},{"line_number":104,"context_line":"        self.assertNotIn(\u0027node_id\u0027, data)"},{"line_number":105,"context_line":"        self.assertIn(\u0027portgroup_uuid\u0027, data)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a629dbe_9ef5f4cc","line":103,"in_reply_to":"9a629dbe_88dcdee5","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"ca29ecd56a6d1a5adabb70aee17f54f3e7097635","unresolved":false,"context_lines":[{"line_number":915,"context_line":"                                          uuid\u003duuidutils.generate_uuid(),"},{"line_number":916,"context_line":"                                          portgroup_id\u003dportgroup.id,"},{"line_number":917,"context_line":"                                          address\u003d\u002752:55:00:cf:2d:31\u0027)"},{"line_number":918,"context_line":"        headers \u003d {api_base.Version.string: \u00271.25\u0027}"},{"line_number":919,"context_line":"        response \u003d self.patch_json("},{"line_number":920,"context_line":"            \u0027/portgroups/%(portgroup)s/ports/%(port)s\u0027 %"},{"line_number":921,"context_line":"            {\u0027portgroup\u0027: portgroup.uuid, \u0027port\u0027: port.uuid},"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a629dbe_b0ee57b2","line":918,"updated":"2016-11-08 21:18:31.000000000","message":"shouldn\u0027t this be 1.24? Won\u0027t 1.25 return an error cuz that version doesn\u0027t exist?","commit_id":"a8664102eea53545ecc2d9d682adfa567d34f635"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"beaf19316155b313ca8fe5702098217d4aac7b18","unresolved":false,"context_lines":[{"line_number":915,"context_line":"                                          uuid\u003duuidutils.generate_uuid(),"},{"line_number":916,"context_line":"                                          portgroup_id\u003dportgroup.id,"},{"line_number":917,"context_line":"                                          address\u003d\u002752:55:00:cf:2d:31\u0027)"},{"line_number":918,"context_line":"        headers \u003d {api_base.Version.string: \u00271.25\u0027}"},{"line_number":919,"context_line":"        response \u003d self.patch_json("},{"line_number":920,"context_line":"            \u0027/portgroups/%(portgroup)s/ports/%(port)s\u0027 %"},{"line_number":921,"context_line":"            {\u0027portgroup\u0027: portgroup.uuid, \u0027port\u0027: port.uuid},"}],"source_content_type":"text/x-python","patch_set":34,"id":"9a629dbe_692768b6","line":918,"in_reply_to":"9a629dbe_b0ee57b2","updated":"2016-11-09 11:39:12.000000000","message":"Done","commit_id":"a8664102eea53545ecc2d9d682adfa567d34f635"}],"ironic/tests/unit/api/v1/test_utils.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"e5f662a0e33ea9c2f648db65287fa0ada417aea1","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        self.assertFalse(utils.allow_resource_class())"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    @mock.patch.object(pecan, \u0027request\u0027, spec_set\u003d[\u0027version\u0027])"},{"line_number":289,"context_line":"    def test_allow_portgroups(self, mock_request):"},{"line_number":290,"context_line":"        mock_request.version.minor \u003d 23"},{"line_number":291,"context_line":"        self.assertTrue(utils.allow_portgroups())"},{"line_number":292,"context_line":"        mock_request.version.minor \u003d 22"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ac06dbe_40dd6a6f","line":289,"updated":"2016-08-25 12:13:35.000000000","message":"All changes in this file should be moved to the previous patch.","commit_id":"4a2130b9091fecd6a24b332caa076c7dc2e06dda"}],"releasenotes/notes/add-portgroups-subcontroller-9039f59bcf48b3e0.yaml":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7a01547a831217839ca6f1cc91d8a43b19da6654","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"9a629dbe_c2f8987f","line":12,"updated":"2016-11-07 22:27:16.000000000","message":"I\u0027m not sure that folks will understand what \u0027portgroups subcontroller\u0027 means. How about:\n\nAdds, starting with REST API version 1.24:\n  * the new endpoint `v1/nodes/\u003cnode\u003e/portgroups`\n  * the new endpoint `v1/portgroups/\u003cportgroup\u003e/ports`\n  * the new field `portgroup_uuid` to a port. This is the UUID of a port group that this port belongs to, or None if it doesn\u0027t belong to any port group.","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"d19147a57679a8aa3a5b3c0ae3abb020e3eb79ed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"9a629dbe_cb1ed062","line":12,"in_reply_to":"9a629dbe_c2f8987f","updated":"2016-11-08 15:06:07.000000000","message":"+1 do we also want to include the endpoint:\n\nv1/nodes/\u003cident\u003e/portgroups/\u003cuuid\u003e/ports?","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"9a629dbe_7e6e6030","line":12,"in_reply_to":"9a629dbe_c2f8987f","updated":"2016-11-08 17:41:04.000000000","message":"Done","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"47798eebc8cc0aed4cceb2bd8c3471be8e1efd48","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"9a629dbe_cbc5f03c","line":12,"in_reply_to":"9a629dbe_cb1ed062","updated":"2016-11-08 15:14:02.000000000","message":"OMG. I\u0027d rather prevent that from being possible...","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"02c5bc7037fb069e47930e572ab3a05ed4c7f373","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"9a629dbe_b12bc6ea","line":12,"in_reply_to":"9a629dbe_cbc5f03c","updated":"2016-11-08 17:41:04.000000000","message":"was decided in IRC to block access to v1/nodes/\u003cident\u003e/portgroups/\u003cuuid\u003e/ports\n\nhttp://eavesdrop.openstack.org/irclogs/%23openstack-ironic/%23openstack-ironic.2016-11-08.log.html#t2016-11-08T15:58:35","commit_id":"0a9725ea26b5b9fbdaf74ef1690dee99cb0d5757"}]}
