)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13997,"name":"SHIGEMATSU Mitsuhiro","email":"shigematsu.mitsuhiro@lab.ntt.co.jp","username":"pshige"},"change_message_id":"5df55eabf75735b99b2586ba60aa71fd533e7855","unresolved":false,"context_lines":[{"line_number":10,"context_line":"of them) and only need a particular subset of fields for a particular"},{"line_number":11,"context_line":"operation. This can save a lot of bandwidth depending on the information"},{"line_number":12,"context_line":"contained in the nodes, for example, a node which contains a config drive"},{"line_number":13,"context_line":"bsae64 enconded in it\u0027s instance_info field can be pretty heavy (a"},{"line_number":14,"context_line":"collection of them ...)"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This patch allows users to specify a list of fields that will be returned"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7a016987_a8cdef5e","line":13,"updated":"2015-05-15 14:46:20.000000000","message":"s/enconded/encoded/","commit_id":"50f9a88cece0c2ac200d002d7b1a43ba64d5b0e7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"fb4f94326d4add36df61655796c12c85bae83751","unresolved":false,"context_lines":[{"line_number":10,"context_line":"of them) and only need a particular subset of fields for a particular"},{"line_number":11,"context_line":"operation. This can save a lot of bandwidth depending on the information"},{"line_number":12,"context_line":"contained in the nodes, for example, a node which contains a config drive"},{"line_number":13,"context_line":"bsae64 enconded in it\u0027s instance_info field can be pretty heavy (a"},{"line_number":14,"context_line":"collection of them ...)"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This patch allows users to specify a list of fields that will be returned"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7a016987_5a75702f","line":13,"in_reply_to":"7a016987_a8cdef5e","updated":"2015-05-25 09:39:32.000000000","message":"Done","commit_id":"50f9a88cece0c2ac200d002d7b1a43ba64d5b0e7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3f37096e38069781b50982c4e70e6e3b253d3941","unresolved":false,"context_lines":[{"line_number":34,"context_line":"Since we are introducing a new feature in the API this patch bumps the"},{"line_number":35,"context_line":"micro version to 1.7"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Related-Bug: #1458934"},{"line_number":38,"context_line":"Change-Id: Iee3b8821afeb670848d4030a5d1a29b356bb5559"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"fa32b979_ca50d034","line":37,"updated":"2015-06-18 09:23:34.000000000","message":"A bug in our bug tracker? Right yeah I can open it\n\n+1 for the tag","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"53b6816aca01c36abdd27e9cb8d14d60e7737dfc","unresolved":false,"context_lines":[{"line_number":34,"context_line":"Since we are introducing a new feature in the API this patch bumps the"},{"line_number":35,"context_line":"micro version to 1.7"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Related-Bug: #1458934"},{"line_number":38,"context_line":"Change-Id: Iee3b8821afeb670848d4030a5d1a29b356bb5559"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"fa32b979_f1a280fb","line":37,"updated":"2015-06-17 20:06:50.000000000","message":"I have to ask (sorry). This is a change to the API and we only have a nova bug that is related to this change. Seems like we should have, at the very least, a bug for it?\n\nDo we need to put an APIImpact[1] tag?\n\n[1] https://wiki.openstack.org/wiki/GitCommitMessages#Including_external_references","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"780febeb38efc90f3d0fc18cf6aad0bed9b74d42","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Since we are introducing a new feature in the API this patch bumps the"},{"line_number":35,"context_line":"micro version to 1.7"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Partial-Bug: #1466495"},{"line_number":38,"context_line":"Related-Bug: #1458934"},{"line_number":39,"context_line":"Change-Id: Iee3b8821afeb670848d4030a5d1a29b356bb5559"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"fa32b979_09a1d145","line":36,"updated":"2015-06-18 16:43:24.000000000","message":"Don\u0027t forget APIImpact tag.","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7c19eb7a85ff4f6ce68c35a7d0831464f4bcd444","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Since we are introducing a new feature in the API this patch bumps the"},{"line_number":35,"context_line":"micro version to 1.7"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Partial-Bug: #1466495"},{"line_number":38,"context_line":"Related-Bug: #1458934"},{"line_number":39,"context_line":"Change-Id: Iee3b8821afeb670848d4030a5d1a29b356bb5559"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"fa32b979_7cd039f8","line":36,"in_reply_to":"fa32b979_09a1d145","updated":"2015-06-19 11:19:05.000000000","message":"Oops, done!","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"}],"ironic/api/controllers/v1/__init__.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"780febeb38efc90f3d0fc18cf6aad0bed9b74d42","unresolved":false,"context_lines":[{"line_number":61,"context_line":"# v1.4: Add MANAGEABLE state"},{"line_number":62,"context_line":"# v1.5: Add logical node names"},{"line_number":63,"context_line":"# v1.6: Add INSPECT* states"},{"line_number":64,"context_line":"# v1.7: Allow returning a subset of the resources attributes"},{"line_number":65,"context_line":"MAX_VER_STR \u003d \u00271.7\u0027"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_8c664fb9","line":64,"updated":"2015-06-18 16:43:24.000000000","message":"I thought I had added a comment about this; must have forgotten to save it\n\nI think my suggestion was something like -- how about \u0027Add ability to return a subset of resource attributes (or fields)\u0027\n\nThe code uses the term \u0027fields\u0027, although \u0027attributes\u0027 is probably more correct (in Python anyway). I think from the user\u0027s point of view, they are considered \u0027fields\u0027?\n\nAnyway, this is a nit.","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7c19eb7a85ff4f6ce68c35a7d0831464f4bcd444","unresolved":false,"context_lines":[{"line_number":61,"context_line":"# v1.4: Add MANAGEABLE state"},{"line_number":62,"context_line":"# v1.5: Add logical node names"},{"line_number":63,"context_line":"# v1.6: Add INSPECT* states"},{"line_number":64,"context_line":"# v1.7: Allow returning a subset of the resources attributes"},{"line_number":65,"context_line":"MAX_VER_STR \u003d \u00271.7\u0027"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_5c4535b1","line":64,"in_reply_to":"fa32b979_8c664fb9","updated":"2015-06-19 11:19:05.000000000","message":"Yeah, terminology is not great. I will stick with \"fields\". Because for an object I would say attributes, but for a json (what the user gets from API) I would call them fields.","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"}],"ironic/api/controllers/v1/node.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"81e2a3eec8190754d5fae16175f2371bfa50857b","unresolved":false,"context_lines":[{"line_number":55,"context_line":"_VENDOR_METHODS \u003d {}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"DEFAULT_COLLECTION_FIELDS \u003d [\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":59,"context_line":"                             \u0027provision_state\u0027, \u0027uuid\u0027, \u0027name\u0027]"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_11d79624","line":58,"updated":"2015-05-15 12:38:30.000000000","message":"Used only in this module, please rename to \t_DEFAULT_COLLECTION_FIELDS","commit_id":"bd1f41619fcc4ab683ccac1aaab2c84ac735802d"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"5440300e3df6c1588aff6ec173a0ed8bb44b134a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"_VENDOR_METHODS \u003d {}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"DEFAULT_COLLECTION_FIELDS \u003d [\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":59,"context_line":"                             \u0027provision_state\u0027, \u0027uuid\u0027, \u0027name\u0027]"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_027d026e","line":58,"in_reply_to":"7a016987_11d79624","updated":"2015-05-15 14:05:05.000000000","message":"Done","commit_id":"bd1f41619fcc4ab683ccac1aaab2c84ac735802d"},{"author":{"_account_id":14923,"name":"Sinval Vieira Mendes Neto","email":"sinvalneto01@gmail.com","username":"sinvalvieira"},"change_message_id":"11b0e0cdce6076fae9aa169387352764ea999fae","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def _get_default_collection_fields():"},{"line_number":59,"context_line":"    fields \u003d [\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":60,"context_line":"              \u0027provision_state\u0027, \u0027uuid\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    if api_utils.allow_node_logical_names():"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_2f051410","line":59,"updated":"2015-06-01 18:48:18.000000000","message":"I noticed that this same list appears on line 676, the difference is that in this method you decide if the \u0027name\u0027 field enter or not, right? What do you think of putting the entire list as a static attribute (_DEFAULT_FIELDS), and this method you make the inverted condition to remove \u0027name\u0027 of the local list method? Thus would have less redundancy, since the list is in one place the file, and specific methods you need to manipulate it became smaller and simpler.\n\nIt would look something like this:\n_DEFAULT_FIELDS \u003d [\u0027Instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027\n\u0027Provision_state\u0027, \u0027uuid\u0027, \u0027name\u0027]\n\ndef _get_default_collection_fields ():\n    _DEFAULT_FIELDS fields \u003d [:]\n    if not api_utils.allow_node_logical_names ():\n        fields.remove (\u0027name\u0027)\n    return fields\n\nAnd in line 676, the list containing the statement \u0027name\u0027 is removed, and you can reuse the static list, something like this:\n\nnode \u003d Node.sample (fields \u003d _DEFAULT_FIELDS)\n\nSeparate the list in a static attribute is useful if case in the future new default fields are added or removed, this ensures that you have less work to enter this change, if necessary.","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e118c05db8c87b001d7f12d708a1bb7a29a73d93","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def _get_default_collection_fields():"},{"line_number":59,"context_line":"    fields \u003d [\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":60,"context_line":"              \u0027provision_state\u0027, \u0027uuid\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    if api_utils.allow_node_logical_names():"}],"source_content_type":"text/x-python","patch_set":6,"id":"5afe65bd_819357fa","line":59,"in_reply_to":"7a016987_2f051410","updated":"2015-06-02 09:49:22.000000000","message":"++","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"0750284a71bee91e30a207745367b2b8e325d7cb","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    fields \u003d [\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":60,"context_line":"              \u0027provision_state\u0027, \u0027uuid\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    if api_utils.allow_node_logical_names():"},{"line_number":63,"context_line":"        fields.append(\u0027name\u0027)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    return fields"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_142ca797","line":62,"updated":"2015-05-30 04:37:17.000000000","message":"Doesn\u0027t matter much, but isn\u0027t this redundant ? We call hide_fields_in_newer_versions() anyway.  We can just add \u0027name\u0027 to the list above.  Unit tests seem to pass that way.","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e118c05db8c87b001d7f12d708a1bb7a29a73d93","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    fields \u003d [\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":60,"context_line":"              \u0027provision_state\u0027, \u0027uuid\u0027]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    if api_utils.allow_node_logical_names():"},{"line_number":63,"context_line":"        fields.append(\u0027name\u0027)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    return fields"}],"source_content_type":"text/x-python","patch_set":6,"id":"5afe65bd_617e1bb0","line":62,"in_reply_to":"7a016987_142ca797","updated":"2015-06-02 09:49:22.000000000","message":"We call hide it when we return, but that\u0027s misguided. Cause the user will be able to filter the \"name\" attribute in an old version of the API (where it didn\u0027t exist), and the API will return success but the field he explicitly asked for filtering is not present in the response.","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"2b6b81c167414471bcb4a138b9718ea79beb4665","unresolved":false,"context_lines":[{"line_number":587,"context_line":"        # fields the \"uuid\" can be unset, so we need to save it in another"},{"line_number":588,"context_line":"        # variable to use when building the links"},{"line_number":589,"context_line":"        node_uuid \u003d node.uuid"},{"line_number":590,"context_line":"        if fields:"},{"line_number":591,"context_line":"            node.unset_fields_except(fields)"},{"line_number":592,"context_line":"        else:"},{"line_number":593,"context_line":"            if not show_password:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_44605c01","line":590,"updated":"2015-05-28 23:52:34.000000000","message":"nit: I like but feel free to ignore\n\n if fields is not None:\n\nI notice it was done that way on line 619","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e118c05db8c87b001d7f12d708a1bb7a29a73d93","unresolved":false,"context_lines":[{"line_number":587,"context_line":"        # fields the \"uuid\" can be unset, so we need to save it in another"},{"line_number":588,"context_line":"        # variable to use when building the links"},{"line_number":589,"context_line":"        node_uuid \u003d node.uuid"},{"line_number":590,"context_line":"        if fields:"},{"line_number":591,"context_line":"            node.unset_fields_except(fields)"},{"line_number":592,"context_line":"        else:"},{"line_number":593,"context_line":"            if not show_password:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5afe65bd_a109b333","line":590,"in_reply_to":"7a016987_44605c01","updated":"2015-06-02 09:49:22.000000000","message":"Done","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"2b6b81c167414471bcb4a138b9718ea79beb4665","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        hide_fields_in_newer_versions(node)"},{"line_number":625,"context_line":"        return cls._convert_with_links(node, pecan.request.host_url,"},{"line_number":626,"context_line":"                                       fields,"},{"line_number":627,"context_line":"                                       pecan.request.context.show_password)"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"    @classmethod"},{"line_number":630,"context_line":"    def sample(cls, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_e4006804","line":627,"updated":"2015-05-28 23:52:34.000000000","message":"I wonder if fields\u003dfields and show_password\u003dpecan.request... would be better?  I\u0027m undecided....","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"2b6b81c167414471bcb4a138b9718ea79beb4665","unresolved":false,"context_lines":[{"line_number":648,"context_line":"        # NOTE(matty_dubs): The chassis_uuid getter() is based on the"},{"line_number":649,"context_line":"        # _chassis_uuid variable:"},{"line_number":650,"context_line":"        sample._chassis_uuid \u003d \u0027edcad704-b2da-41d5-96d9-afd580ecfa12\u0027"},{"line_number":651,"context_line":"        return cls._convert_with_links(sample, \u0027http://localhost:6385\u0027, fields)"},{"line_number":652,"context_line":""},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"class NodeCollection(collection.Collection):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_670b5a25","line":651,"updated":"2015-05-28 23:52:34.000000000","message":"nit: fields\u003dfields seems safer/better","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e118c05db8c87b001d7f12d708a1bb7a29a73d93","unresolved":false,"context_lines":[{"line_number":648,"context_line":"        # NOTE(matty_dubs): The chassis_uuid getter() is based on the"},{"line_number":649,"context_line":"        # _chassis_uuid variable:"},{"line_number":650,"context_line":"        sample._chassis_uuid \u003d \u0027edcad704-b2da-41d5-96d9-afd580ecfa12\u0027"},{"line_number":651,"context_line":"        return cls._convert_with_links(sample, \u0027http://localhost:6385\u0027, fields)"},{"line_number":652,"context_line":""},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"class NodeCollection(collection.Collection):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5afe65bd_8926ddb8","line":651,"in_reply_to":"7a016987_670b5a25","updated":"2015-06-02 09:49:22.000000000","message":"Done","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"2b6b81c167414471bcb4a138b9718ea79beb4665","unresolved":false,"context_lines":[{"line_number":663,"context_line":"    @staticmethod"},{"line_number":664,"context_line":"    def convert_with_links(nodes, limit, url\u003dNone, fields\u003dNone, **kwargs):"},{"line_number":665,"context_line":"        collection \u003d NodeCollection()"},{"line_number":666,"context_line":"        collection.nodes \u003d [Node.convert_with_links(n, fields) for n in nodes]"},{"line_number":667,"context_line":"        collection.next \u003d collection.get_next(limit, url\u003durl, **kwargs)"},{"line_number":668,"context_line":"        return collection"},{"line_number":669,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_4715fe3d","line":666,"updated":"2015-05-28 23:52:34.000000000","message":"nit: fields\u003dfields seems safer/better","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e118c05db8c87b001d7f12d708a1bb7a29a73d93","unresolved":false,"context_lines":[{"line_number":663,"context_line":"    @staticmethod"},{"line_number":664,"context_line":"    def convert_with_links(nodes, limit, url\u003dNone, fields\u003dNone, **kwargs):"},{"line_number":665,"context_line":"        collection \u003d NodeCollection()"},{"line_number":666,"context_line":"        collection.nodes \u003d [Node.convert_with_links(n, fields) for n in nodes]"},{"line_number":667,"context_line":"        collection.next \u003d collection.get_next(limit, url\u003durl, **kwargs)"},{"line_number":668,"context_line":"        return collection"},{"line_number":669,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5afe65bd_692ba183","line":666,"in_reply_to":"7a016987_4715fe3d","updated":"2015-06-02 09:49:22.000000000","message":"Done","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"0750284a71bee91e30a207745367b2b8e325d7cb","unresolved":false,"context_lines":[{"line_number":670,"context_line":"    @classmethod"},{"line_number":671,"context_line":"    def sample(cls):"},{"line_number":672,"context_line":"        sample \u003d cls()"},{"line_number":673,"context_line":"        # NOTE(lucasagomes): We can\u0027t use _get_default_collection_fields()"},{"line_number":674,"context_line":"        # here because it tries to access pecan.request.version.minor when"},{"line_number":675,"context_line":"        # generating the documentation"},{"line_number":676,"context_line":"        fields \u003d [\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_09acdb33","line":673,"updated":"2015-05-30 04:37:17.000000000","message":"I think sometime back we wondered why do we need to catch try/except AttributeError in allow_node_logical_names() and may be this is the reason why :)\n\nThis can be removed if we add \u0027name\u0027 directly in _get_default_collection_fields()","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":14923,"name":"Sinval Vieira Mendes Neto","email":"sinvalneto01@gmail.com","username":"sinvalvieira"},"change_message_id":"11b0e0cdce6076fae9aa169387352764ea999fae","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        # NOTE(lucasagomes): We can\u0027t use _get_default_collection_fields()"},{"line_number":674,"context_line":"        # here because it tries to access pecan.request.version.minor when"},{"line_number":675,"context_line":"        # generating the documentation"},{"line_number":676,"context_line":"        fields \u003d [\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":677,"context_line":"                  \u0027provision_state\u0027, \u0027uuid\u0027, \u0027name\u0027]"},{"line_number":678,"context_line":"        node \u003d Node.sample(fields\u003dfields)"},{"line_number":679,"context_line":"        sample.nodes \u003d [node]"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_2f53d418","line":676,"updated":"2015-06-01 18:48:18.000000000","message":"Here, you only need to reuse the _DEFAULT_FIELDS list.\n\nnode \u003d Node.sample (fields \u003d _DEFAULT_FIELDS)","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e118c05db8c87b001d7f12d708a1bb7a29a73d93","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        # NOTE(lucasagomes): We can\u0027t use _get_default_collection_fields()"},{"line_number":674,"context_line":"        # here because it tries to access pecan.request.version.minor when"},{"line_number":675,"context_line":"        # generating the documentation"},{"line_number":676,"context_line":"        fields \u003d [\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":677,"context_line":"                  \u0027provision_state\u0027, \u0027uuid\u0027, \u0027name\u0027]"},{"line_number":678,"context_line":"        node \u003d Node.sample(fields\u003dfields)"},{"line_number":679,"context_line":"        sample.nodes \u003d [node]"}],"source_content_type":"text/x-python","patch_set":6,"id":"5afe65bd_e93791e1","line":676,"in_reply_to":"7a016987_2f53d418","updated":"2015-06-02 09:49:22.000000000","message":"Done","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"2b6b81c167414471bcb4a138b9718ea79beb4665","unresolved":false,"context_lines":[{"line_number":969,"context_line":"            raise exception.OperationNotPermitted"},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":972,"context_line":"        return Node.convert_with_links(rpc_node, fields)"},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"    @expose.expose(Node, body\u003dNode, status_code\u003d201)"},{"line_number":975,"context_line":"    def post(self, node):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_6770faa4","line":972,"updated":"2015-05-28 23:52:34.000000000","message":"nit: fields\u003dfields seems safer/better","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e118c05db8c87b001d7f12d708a1bb7a29a73d93","unresolved":false,"context_lines":[{"line_number":969,"context_line":"            raise exception.OperationNotPermitted"},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"        rpc_node \u003d api_utils.get_rpc_node(node_ident)"},{"line_number":972,"context_line":"        return Node.convert_with_links(rpc_node, fields)"},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"    @expose.expose(Node, body\u003dNode, status_code\u003d201)"},{"line_number":975,"context_line":"    def post(self, node):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5afe65bd_a93199ee","line":972,"in_reply_to":"7a016987_6770faa4","updated":"2015-06-02 09:49:22.000000000","message":"Done","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"de2ad4e5646f5c0e7968214416fd9e1a9dba84b7","unresolved":false,"context_lines":[{"line_number":54,"context_line":"# versions, the API service should be restarted."},{"line_number":55,"context_line":"_VENDOR_METHODS \u003d {}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"_DEFAULT_COLLECTION_FIELDS \u003d [\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":58,"context_line":"                              \u0027provision_state\u0027, \u0027uuid\u0027, \u0027name\u0027]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5afe65bd_21a32751","line":57,"updated":"2015-06-04 03:18:30.000000000","message":"nit: Could be a tuple, to help ensure constness","commit_id":"b3b794cd270bd89c5491777051532886f74affe2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"79f76f51707199de6f92bc793c3b0004bffd81d8","unresolved":false,"context_lines":[{"line_number":54,"context_line":"# versions, the API service should be restarted."},{"line_number":55,"context_line":"_VENDOR_METHODS \u003d {}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"_DEFAULT_COLLECTION_FIELDS \u003d [\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":58,"context_line":"                              \u0027provision_state\u0027, \u0027uuid\u0027, \u0027name\u0027]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5afe65bd_bb74df35","line":57,"in_reply_to":"5afe65bd_21a32751","updated":"2015-06-04 08:34:13.000000000","message":"Done","commit_id":"b3b794cd270bd89c5491777051532886f74affe2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6389edde393114e5ea67594751486723579b5e7c","unresolved":false,"context_lines":[{"line_number":619,"context_line":"        node_dict \u003d rpc_node.as_dict()"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"        if fields is not None:"},{"line_number":622,"context_line":"            api_utils.check_for_invalid_fields(fields, node_dict)"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"        node \u003d Node(**node_dict)"},{"line_number":625,"context_line":"        assert_juno_provision_state_name(node)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5afe65bd_f2ac1aef","line":622,"updated":"2015-06-02 11:25:02.000000000","message":"It seems that there is a problem here with chassis_id. If chassis_id is requested here, this check will pass, as it is set in rpc_node, but is not set in API node. So, maybe leave L619 as it was before and add this check after it?","commit_id":"b3b794cd270bd89c5491777051532886f74affe2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"79f76f51707199de6f92bc793c3b0004bffd81d8","unresolved":false,"context_lines":[{"line_number":619,"context_line":"        node_dict \u003d rpc_node.as_dict()"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"        if fields is not None:"},{"line_number":622,"context_line":"            api_utils.check_for_invalid_fields(fields, node_dict)"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"        node \u003d Node(**node_dict)"},{"line_number":625,"context_line":"        assert_juno_provision_state_name(node)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5afe65bd_9bb48335","line":622,"in_reply_to":"5afe65bd_f2ac1aef","updated":"2015-06-04 08:34:13.000000000","message":"Done","commit_id":"b3b794cd270bd89c5491777051532886f74affe2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"6389edde393114e5ea67594751486723579b5e7c","unresolved":false,"context_lines":[{"line_number":630,"context_line":"                                       show_password\u003dshow_password)"},{"line_number":631,"context_line":""},{"line_number":632,"context_line":"    @classmethod"},{"line_number":633,"context_line":"    def sample(cls, fields\u003dNone):"},{"line_number":634,"context_line":"        time \u003d datetime.datetime(2000, 1, 1, 12, 0, 0)"},{"line_number":635,"context_line":"        node_uuid \u003d \u00271be26c0b-03f2-4d2e-ae87-c02d7f33c123\u0027"},{"line_number":636,"context_line":"        instance_uuid \u003d \u0027dcf1fbc5-93fc-4596-9395-b80572f6267b\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"5afe65bd_0f8aedbf","line":633,"updated":"2015-06-02 11:25:02.000000000","message":"Should it be added for sample methods? If it\u0027s used only for docs, it seems to be more like \u0027detail\u0027 call for a node, for which fields parameter is not added. Maybe it can be left as is (expand\u003dtrue/false), and if expand\u003dfalse we set fields to be _DEFAULT_COLLECTION_FIELDS in call on L655.","commit_id":"b3b794cd270bd89c5491777051532886f74affe2"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"79f76f51707199de6f92bc793c3b0004bffd81d8","unresolved":false,"context_lines":[{"line_number":630,"context_line":"                                       show_password\u003dshow_password)"},{"line_number":631,"context_line":""},{"line_number":632,"context_line":"    @classmethod"},{"line_number":633,"context_line":"    def sample(cls, fields\u003dNone):"},{"line_number":634,"context_line":"        time \u003d datetime.datetime(2000, 1, 1, 12, 0, 0)"},{"line_number":635,"context_line":"        node_uuid \u003d \u00271be26c0b-03f2-4d2e-ae87-c02d7f33c123\u0027"},{"line_number":636,"context_line":"        instance_uuid \u003d \u0027dcf1fbc5-93fc-4596-9395-b80572f6267b\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"5afe65bd_db7b1b27","line":633,"in_reply_to":"5afe65bd_0f8aedbf","updated":"2015-06-04 08:34:13.000000000","message":"It\u0027s added because depends on the classes calling sample(), see that for the Nodes object class it will call sample with fields\u003dNone so it will return all the attributes of the object.\n\nFor NodeCollection object class it will pass the default fields, because that\u0027s what the API does by default (without the /detail).\n\nYeah we could change it back to expand\u003dTrue/False, but I don\u0027t see the benefit of it over having fields. Slightly simpler maybe?","commit_id":"b3b794cd270bd89c5491777051532886f74affe2"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"53b6816aca01c36abdd27e9cb8d14d60e7737dfc","unresolved":false,"context_lines":[{"line_number":54,"context_line":"# versions, the API service should be restarted."},{"line_number":55,"context_line":"_VENDOR_METHODS \u003d {}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"_DEFAULT_COLLECTION_FIELDS \u003d (\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":58,"context_line":"                              \u0027provision_state\u0027, \u0027uuid\u0027, \u0027name\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_56324260","line":57,"updated":"2015-06-17 20:06:50.000000000","message":"I was wondering why \u0027collection\u0027. Aren\u0027t these the default node fields to return to the user? Would \u0027default_return_fields\u0027 be clearer? default_request_fields? default_display_fields? (And/or a docstring to describe this.)","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3f37096e38069781b50982c4e70e6e3b253d3941","unresolved":false,"context_lines":[{"line_number":54,"context_line":"# versions, the API service should be restarted."},{"line_number":55,"context_line":"_VENDOR_METHODS \u003d {}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"_DEFAULT_COLLECTION_FIELDS \u003d (\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":58,"context_line":"                              \u0027provision_state\u0027, \u0027uuid\u0027, \u0027name\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_a5cc9dbb","line":57,"in_reply_to":"fa32b979_56324260","updated":"2015-06-18 09:23:34.000000000","message":"I called it collection because when it\u0027s a single field (GET v1/nodes/\u003cuuid\u003e || node-show \u003cuuid\u003e) it will return the full representation of the node, all attributes.\n\nWhen it\u0027s a collection  (GET v1/nodes || node-list ) it will return the fields specified here as before.\n\nI\u0027m OK changing the name to \u0027default_return_fields\u0027 or others but I think collection is accurate.","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f730776258091b824f6c56617de15e672a2efd6f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"# versions, the API service should be restarted."},{"line_number":55,"context_line":"_VENDOR_METHODS \u003d {}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"_DEFAULT_COLLECTION_FIELDS \u003d (\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":58,"context_line":"                              \u0027provision_state\u0027, \u0027uuid\u0027, \u0027name\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_ffea2ada","line":57,"in_reply_to":"fa32b979_a5cc9dbb","updated":"2015-06-18 13:20:37.000000000","message":"Ah. How about adding a docstring then, something like what you said above , eg \u0027For a collection of nodes, the default fields to return for each node\u0027.","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"740157d35f48203f83171158462698b35a8199c9","unresolved":false,"context_lines":[{"line_number":54,"context_line":"# versions, the API service should be restarted."},{"line_number":55,"context_line":"_VENDOR_METHODS \u003d {}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"_DEFAULT_COLLECTION_FIELDS \u003d (\u0027instance_uuid\u0027, \u0027maintenance\u0027, \u0027power_state\u0027,"},{"line_number":58,"context_line":"                              \u0027provision_state\u0027, \u0027uuid\u0027, \u0027name\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_421fb95a","line":57,"in_reply_to":"fa32b979_ffea2ada","updated":"2015-06-18 13:32:04.000000000","message":"On the next patch-set I\u0027ve changed the name of this tuple to _DEFAULT_RETURN_FIELDS","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"53b6816aca01c36abdd27e9cb8d14d60e7737dfc","unresolved":false,"context_lines":[{"line_number":585,"context_line":""},{"line_number":586,"context_line":"    @staticmethod"},{"line_number":587,"context_line":"    def _convert_with_links(node, url, fields\u003dNone, show_password\u003dTrue):"},{"line_number":588,"context_line":"        # NOTE(lucasagomes): Since we are able to return any custom"},{"line_number":589,"context_line":"        # fields the \"uuid\" can be unset, so we need to save it in another"},{"line_number":590,"context_line":"        # variable to use when building the links"},{"line_number":591,"context_line":"        node_uuid \u003d node.uuid"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_ff3811f0","line":588,"updated":"2015-06-17 20:06:50.000000000","message":"the fields aren\u0027t custom fields (ie, can\u0027t make new fields). I think you mean something like \u0027return a specified set of fields\u0027?\n\nI know this is an internal method, but i think it would be useful if there was documentation. fields are the fields of the node that will be returned?","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3f37096e38069781b50982c4e70e6e3b253d3941","unresolved":false,"context_lines":[{"line_number":585,"context_line":""},{"line_number":586,"context_line":"    @staticmethod"},{"line_number":587,"context_line":"    def _convert_with_links(node, url, fields\u003dNone, show_password\u003dTrue):"},{"line_number":588,"context_line":"        # NOTE(lucasagomes): Since we are able to return any custom"},{"line_number":589,"context_line":"        # fields the \"uuid\" can be unset, so we need to save it in another"},{"line_number":590,"context_line":"        # variable to use when building the links"},{"line_number":591,"context_line":"        node_uuid \u003d node.uuid"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_65a2159b","line":588,"in_reply_to":"fa32b979_ff3811f0","updated":"2015-06-18 09:23:34.000000000","message":"+1","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"53b6816aca01c36abdd27e9cb8d14d60e7737dfc","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        if fields is not None:"},{"line_number":593,"context_line":"            node.unset_fields_except(fields)"},{"line_number":594,"context_line":"        else:"},{"line_number":595,"context_line":"            if not show_password:"},{"line_number":596,"context_line":"                node.driver_info \u003d ast.literal_eval(strutils.mask_password("},{"line_number":597,"context_line":"                                                    node.driver_info,"},{"line_number":598,"context_line":"                                                    \"******\"))"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_f606f61a","line":595,"updated":"2015-06-17 20:06:50.000000000","message":"I don\u0027t think this should be in an else (L594). Shouldn\u0027t it be something like \u0027if not show_password and node.driver_info !\u003d wstypes.Unset:\u0027","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3f37096e38069781b50982c4e70e6e3b253d3941","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        if fields is not None:"},{"line_number":593,"context_line":"            node.unset_fields_except(fields)"},{"line_number":594,"context_line":"        else:"},{"line_number":595,"context_line":"            if not show_password:"},{"line_number":596,"context_line":"                node.driver_info \u003d ast.literal_eval(strutils.mask_password("},{"line_number":597,"context_line":"                                                    node.driver_info,"},{"line_number":598,"context_line":"                                                    \"******\"))"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_05c4693d","line":595,"in_reply_to":"fa32b979_f606f61a","updated":"2015-06-18 09:23:34.000000000","message":"Done","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"53b6816aca01c36abdd27e9cb8d14d60e7737dfc","unresolved":false,"context_lines":[{"line_number":619,"context_line":"        node \u003d Node(**rpc_node.as_dict())"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"        if fields is not None:"},{"line_number":622,"context_line":"            api_utils.check_for_invalid_fields(fields, node.as_dict())"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"        assert_juno_provision_state_name(node)"},{"line_number":625,"context_line":"        hide_fields_in_newer_versions(node)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_2bdf170e","line":622,"updated":"2015-06-17 20:06:50.000000000","message":"I was wondering why this check is here (after getting the node(s)) from the db, instead of when the request comes in.","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3f37096e38069781b50982c4e70e6e3b253d3941","unresolved":false,"context_lines":[{"line_number":619,"context_line":"        node \u003d Node(**rpc_node.as_dict())"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"        if fields is not None:"},{"line_number":622,"context_line":"            api_utils.check_for_invalid_fields(fields, node.as_dict())"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"        assert_juno_provision_state_name(node)"},{"line_number":625,"context_line":"        hide_fields_in_newer_versions(node)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_45a7d1a9","line":622,"in_reply_to":"fa32b979_2bdf170e","updated":"2015-06-18 09:23:34.000000000","message":"That\u0027s because we have differences between a RPC object and an API object.\n\nFor example \"chassis_id\", this attribute only exists in the RPC object and not in the API. So if I don\u0027t convert it to an API object before someone can request \"chassis_id\" via the API and it will pass this check.","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f730776258091b824f6c56617de15e672a2efd6f","unresolved":false,"context_lines":[{"line_number":619,"context_line":"        node \u003d Node(**rpc_node.as_dict())"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"        if fields is not None:"},{"line_number":622,"context_line":"            api_utils.check_for_invalid_fields(fields, node.as_dict())"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"        assert_juno_provision_state_name(node)"},{"line_number":625,"context_line":"        hide_fields_in_newer_versions(node)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_7f07fa81","line":622,"in_reply_to":"fa32b979_45a7d1a9","updated":"2015-06-18 13:20:37.000000000","message":"That chassis_id is a PITA!\n\nCan\u0027t we check against an RPC object and have a special check that \u0027chassis_id\u0027 isn\u0027t in fields? I think that would be easier to understand (and even indicate where we have to make exceptions due to chassis_id).\n\nIt just makes sense to me to check the input parameters before actually proceeding with the request. And if the fields are incorrect, we would save on not making a DB request.","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"740157d35f48203f83171158462698b35a8199c9","unresolved":false,"context_lines":[{"line_number":619,"context_line":"        node \u003d Node(**rpc_node.as_dict())"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"        if fields is not None:"},{"line_number":622,"context_line":"            api_utils.check_for_invalid_fields(fields, node.as_dict())"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"        assert_juno_provision_state_name(node)"},{"line_number":625,"context_line":"        hide_fields_in_newer_versions(node)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_9f375efe","line":622,"in_reply_to":"fa32b979_7f07fa81","updated":"2015-06-18 13:32:04.000000000","message":"Yeah, it\u0027s a PITA.\n\nBut if you keep in mind that RPC objects vs API objects needs conversion you can get ur head around the API code. \n\nIndeed it\u0027s a PITA if it happens to me to add a new patch-set I will comment on this","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"53b6816aca01c36abdd27e9cb8d14d60e7737dfc","unresolved":false,"context_lines":[{"line_number":891,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":892,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":893,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":894,"context_line":"        :param fields: Optional, a comma separated string of fields to"},{"line_number":895,"context_line":"                       be returned."},{"line_number":896,"context_line":"        \"\"\""},{"line_number":897,"context_line":"        api_utils.check_allow_fields(fields)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_ab4d673f","line":894,"updated":"2015-06-17 20:06:50.000000000","message":"a list, not a string?","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f730776258091b824f6c56617de15e672a2efd6f","unresolved":false,"context_lines":[{"line_number":891,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":892,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":893,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":894,"context_line":"        :param fields: Optional, a comma separated string of fields to"},{"line_number":895,"context_line":"                       be returned."},{"line_number":896,"context_line":"        \"\"\""},{"line_number":897,"context_line":"        api_utils.check_allow_fields(fields)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_ff578a55","line":894,"in_reply_to":"fa32b979_856dd9cd","updated":"2015-06-18 13:20:37.000000000","message":"Oh. That is confusing. We should probably clean this all up (outside this patch). Ie, either they all reflect the values *after* being converted by types.* (and we document that in the docstring), or we reword it so that these are all strings (and document that they get converted by types.*)","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3f37096e38069781b50982c4e70e6e3b253d3941","unresolved":false,"context_lines":[{"line_number":891,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":892,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":893,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":894,"context_line":"        :param fields: Optional, a comma separated string of fields to"},{"line_number":895,"context_line":"                       be returned."},{"line_number":896,"context_line":"        \"\"\""},{"line_number":897,"context_line":"        api_utils.check_allow_fields(fields)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_856dd9cd","line":894,"in_reply_to":"fa32b979_ab4d673f","updated":"2015-06-18 09:23:34.000000000","message":"The user input is a string like \u0027field1,field2,field3\u0027 and the types.listtype will automatically convert it to a list.\n\nBut I can see other fields such as associated says \"boolean value\", but in reality it\u0027s also a string that will get converted to boolean by types.boolean.\n\nYeah, I will change it to list  to be consistent with the rest of the docstring.\n\nThanks","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"740157d35f48203f83171158462698b35a8199c9","unresolved":false,"context_lines":[{"line_number":891,"context_line":"        :param limit: maximum number of resources to return in a single result."},{"line_number":892,"context_line":"        :param sort_key: column to sort results by. Default: id."},{"line_number":893,"context_line":"        :param sort_dir: direction to sort. \"asc\" or \"desc\". Default: asc."},{"line_number":894,"context_line":"        :param fields: Optional, a comma separated string of fields to"},{"line_number":895,"context_line":"                       be returned."},{"line_number":896,"context_line":"        \"\"\""},{"line_number":897,"context_line":"        api_utils.check_allow_fields(fields)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_5f14764b","line":894,"in_reply_to":"fa32b979_ff578a55","updated":"2015-06-18 13:32:04.000000000","message":"+1 to fix it all in another patch","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"53b6816aca01c36abdd27e9cb8d14d60e7737dfc","unresolved":false,"context_lines":[{"line_number":896,"context_line":"        \"\"\""},{"line_number":897,"context_line":"        api_utils.check_allow_fields(fields)"},{"line_number":898,"context_line":"        if fields is None:"},{"line_number":899,"context_line":"            fields \u003d _get_default_collection_fields()"},{"line_number":900,"context_line":"        return self._get_nodes_collection(chassis_uuid, instance_uuid,"},{"line_number":901,"context_line":"                                          associated, maintenance, marker,"},{"line_number":902,"context_line":"                                          limit, sort_key, sort_dir,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_760186ae","line":899,"updated":"2015-06-17 20:06:50.000000000","message":"I was wondering why you needed _get_default_collection_fields(). If \u0027name\u0027 is in here, it will be removed in Node.convert_with_links() (call to hide_fields_in_newer_versions()).","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3f37096e38069781b50982c4e70e6e3b253d3941","unresolved":false,"context_lines":[{"line_number":896,"context_line":"        \"\"\""},{"line_number":897,"context_line":"        api_utils.check_allow_fields(fields)"},{"line_number":898,"context_line":"        if fields is None:"},{"line_number":899,"context_line":"            fields \u003d _get_default_collection_fields()"},{"line_number":900,"context_line":"        return self._get_nodes_collection(chassis_uuid, instance_uuid,"},{"line_number":901,"context_line":"                                          associated, maintenance, marker,"},{"line_number":902,"context_line":"                                          limit, sort_key, sort_dir,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_a0a7ab09","line":899,"in_reply_to":"fa32b979_760186ae","updated":"2015-06-18 09:23:34.000000000","message":"Yeah fair enough, this was before I\u0027ve bumped the micro version within this patch.\n\nBefore I needed this to be removed from the _DEFAULT_COLLECTION_FIELDS so if someone requested for name, but it wasn\u0027t supported it will fail out.\n\nBut now since we bump\u0027d the API version we can ensure that if getting a sublist of fields is allowed the \u0027name\u0027 attribute will be too (since it\u0027s a version before)","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"53b6816aca01c36abdd27e9cb8d14d60e7737dfc","unresolved":false,"context_lines":[{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        :param node_ident: UUID or logical name of a node."},{"line_number":966,"context_line":"        :param fields: Optional, a comma separated string of fields to"},{"line_number":967,"context_line":"                       be returned."},{"line_number":968,"context_line":"        \"\"\""},{"line_number":969,"context_line":"        if self.from_chassis:"},{"line_number":970,"context_line":"            raise exception.OperationNotPermitted"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_2bd2b75c","line":967,"updated":"2015-06-17 20:06:50.000000000","message":"it is a list, not a string, right?","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3f37096e38069781b50982c4e70e6e3b253d3941","unresolved":false,"context_lines":[{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        :param node_ident: UUID or logical name of a node."},{"line_number":966,"context_line":"        :param fields: Optional, a comma separated string of fields to"},{"line_number":967,"context_line":"                       be returned."},{"line_number":968,"context_line":"        \"\"\""},{"line_number":969,"context_line":"        if self.from_chassis:"},{"line_number":970,"context_line":"            raise exception.OperationNotPermitted"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_85e639e6","line":967,"in_reply_to":"fa32b979_2bd2b75c","updated":"2015-06-18 09:23:34.000000000","message":"ditto L894","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"780febeb38efc90f3d0fc18cf6aad0bed9b74d42","unresolved":false,"context_lines":[{"line_number":583,"context_line":"        if fields is not None:"},{"line_number":584,"context_line":"            node.unset_fields_except(fields)"},{"line_number":585,"context_line":"        else:"},{"line_number":586,"context_line":"            node.ports \u003d [link.Link.make_link(\u0027self\u0027, url, \u0027nodes\u0027,"},{"line_number":587,"context_line":"                                              node_uuid + \"/ports\"),"},{"line_number":588,"context_line":"                          link.Link.make_link(\u0027bookmark\u0027, url, \u0027nodes\u0027,"},{"line_number":589,"context_line":"                                              node_uuid + \"/ports\","}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_4f3279a8","line":586,"updated":"2015-06-18 16:43:24.000000000","message":"Do you know why we add this? From the CLI, you cannot see this information (if that is an issue, it is a separate issue from this patch). I\u0027m wondering whether \u0027ports\u0027 is a valid field that can be specified. Otherwise, the only way to get this info is with all details.","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7c19eb7a85ff4f6ce68c35a7d0831464f4bcd444","unresolved":false,"context_lines":[{"line_number":583,"context_line":"        if fields is not None:"},{"line_number":584,"context_line":"            node.unset_fields_except(fields)"},{"line_number":585,"context_line":"        else:"},{"line_number":586,"context_line":"            node.ports \u003d [link.Link.make_link(\u0027self\u0027, url, \u0027nodes\u0027,"},{"line_number":587,"context_line":"                                              node_uuid + \"/ports\"),"},{"line_number":588,"context_line":"                          link.Link.make_link(\u0027bookmark\u0027, url, \u0027nodes\u0027,"},{"line_number":589,"context_line":"                                              node_uuid + \"/ports\","}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_5c73f515","line":586,"in_reply_to":"fa32b979_4f3279a8","updated":"2015-06-19 11:19:05.000000000","message":"I don\u0027t remember the exactly reason, it\u0027s been here for a while. But it seems that it is a good practice to add reference links to the sub-resources.\n\nre CLI, we have to think how best represent this on the output, whether put the link there, or follow it and get the representation of the ports that belongs to the node or something else","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"780febeb38efc90f3d0fc18cf6aad0bed9b74d42","unresolved":false,"context_lines":[{"line_number":886,"context_line":"        :param fields: Optional, a list with a specified set of fields"},{"line_number":887,"context_line":"            of the resource to be returned."},{"line_number":888,"context_line":"        \"\"\""},{"line_number":889,"context_line":"        api_utils.check_allow_specify_fields(fields)"},{"line_number":890,"context_line":"        if fields is None:"},{"line_number":891,"context_line":"            fields \u003d _DEFAULT_RETURN_FIELDS"},{"line_number":892,"context_line":"        return self._get_nodes_collection(chassis_uuid, instance_uuid,"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_7a6b7d85","line":889,"updated":"2015-06-18 16:43:24.000000000","message":"i suppose you could put this in an else: (after the \u0027if fields is None\u0027 below)","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7c19eb7a85ff4f6ce68c35a7d0831464f4bcd444","unresolved":false,"context_lines":[{"line_number":886,"context_line":"        :param fields: Optional, a list with a specified set of fields"},{"line_number":887,"context_line":"            of the resource to be returned."},{"line_number":888,"context_line":"        \"\"\""},{"line_number":889,"context_line":"        api_utils.check_allow_specify_fields(fields)"},{"line_number":890,"context_line":"        if fields is None:"},{"line_number":891,"context_line":"            fields \u003d _DEFAULT_RETURN_FIELDS"},{"line_number":892,"context_line":"        return self._get_nodes_collection(chassis_uuid, instance_uuid,"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_bc10015b","line":889,"in_reply_to":"fa32b979_7a6b7d85","updated":"2015-06-19 11:19:05.000000000","message":"Is it needed? Because the check_allow_specify_fields() method already checks if fields is None.\n\n\u003csnippet\u003e\n\n if fields is not None and pecan.request.version.minor \u003c 7:\n     raise exception.NotAcceptable() \n\n\u003c/snippet\u003e","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7655bcc765163e13f442c0bf0b0c6485f720ec0b","unresolved":false,"context_lines":[{"line_number":886,"context_line":"        :param fields: Optional, a list with a specified set of fields"},{"line_number":887,"context_line":"            of the resource to be returned."},{"line_number":888,"context_line":"        \"\"\""},{"line_number":889,"context_line":"        api_utils.check_allow_specify_fields(fields)"},{"line_number":890,"context_line":"        if fields is None:"},{"line_number":891,"context_line":"            fields \u003d _DEFAULT_RETURN_FIELDS"},{"line_number":892,"context_line":"        return self._get_nodes_collection(chassis_uuid, instance_uuid,"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_72724f13","line":889,"in_reply_to":"fa32b979_bc10015b","updated":"2015-06-22 18:14:39.000000000","message":"Not needed; just a bit more efficient, cuz if fields is None (and we\u0027re doing that \u0027if\u0027 anyway), wouldn\u0027t need to call this method. No big deal.","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"}],"ironic/api/controllers/v1/types.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"81e2a3eec8190754d5fae16175f2371bfa50857b","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    def validate(value):"},{"line_number":195,"context_line":"        try:"},{"line_number":196,"context_line":"            return [v.strip().lower() for v in six.text_type(value).split(\u0027,\u0027)]"},{"line_number":197,"context_line":"        except Exception as e:"},{"line_number":198,"context_line":"            # raise Invalid to return 400 (BadRequest) in the API"},{"line_number":199,"context_line":"            raise exception.Invalid(e)"},{"line_number":200,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_71f24ad4","line":197,"updated":"2015-05-15 12:38:30.000000000","message":"Please add a test to test_types with value that produces exception.","commit_id":"bd1f41619fcc4ab683ccac1aaab2c84ac735802d"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"5440300e3df6c1588aff6ec173a0ed8bb44b134a","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    def validate(value):"},{"line_number":195,"context_line":"        try:"},{"line_number":196,"context_line":"            return [v.strip().lower() for v in six.text_type(value).split(\u0027,\u0027)]"},{"line_number":197,"context_line":"        except Exception as e:"},{"line_number":198,"context_line":"            # raise Invalid to return 400 (BadRequest) in the API"},{"line_number":199,"context_line":"            raise exception.Invalid(e)"},{"line_number":200,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_02de223f","line":197,"in_reply_to":"7a016987_71f24ad4","updated":"2015-05-15 14:05:05.000000000","message":"Yeah I was wondering how we can generate an exception for this code... Perhaps I don\u0027t need this try...except block, I put it as a safe guard","commit_id":"bd1f41619fcc4ab683ccac1aaab2c84ac735802d"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"0750284a71bee91e30a207745367b2b8e325d7cb","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    @staticmethod"},{"line_number":194,"context_line":"    def validate(value):"},{"line_number":195,"context_line":"        return [v.strip().lower() for v in six.text_type(value).split(\u0027,\u0027)]"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    @staticmethod"},{"line_number":198,"context_line":"    def frombasetype(value):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_495d3378","line":195,"updated":"2015-05-30 04:37:17.000000000","message":"Wondering if it was better removing lower() here as this is a generic ListType and every consumer of this ListType might not be case-insensitive.  \n\nBut downside is we need to do lower() everywhere else. :(","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e118c05db8c87b001d7f12d708a1bb7a29a73d93","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    @staticmethod"},{"line_number":194,"context_line":"    def validate(value):"},{"line_number":195,"context_line":"        return [v.strip().lower() for v in six.text_type(value).split(\u0027,\u0027)]"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    @staticmethod"},{"line_number":198,"context_line":"    def frombasetype(value):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5afe65bd_c9b97530","line":195,"in_reply_to":"7a016987_495d3378","updated":"2015-06-02 09:49:22.000000000","message":"hmmm right...\n\nYeah, I will keep it for now.","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"53b6816aca01c36abdd27e9cb8d14d60e7737dfc","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    @staticmethod"},{"line_number":194,"context_line":"    def validate(value):"},{"line_number":195,"context_line":"        return [v.strip().lower() for v in six.text_type(value).split(\u0027,\u0027)]"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    @staticmethod"},{"line_number":198,"context_line":"    def frombasetype(value):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_ebf04fff","line":195,"updated":"2015-06-17 20:06:50.000000000","message":"I think it would be useful (if I understand this) to document that \u0027value\u0027 is a string of comma-separated values and that this returns a list of those values.","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3f37096e38069781b50982c4e70e6e3b253d3941","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    @staticmethod"},{"line_number":194,"context_line":"    def validate(value):"},{"line_number":195,"context_line":"        return [v.strip().lower() for v in six.text_type(value).split(\u0027,\u0027)]"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    @staticmethod"},{"line_number":198,"context_line":"    def frombasetype(value):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_00b9b72d","line":195,"in_reply_to":"fa32b979_ebf04fff","updated":"2015-06-18 09:23:34.000000000","message":"+1","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"}],"ironic/api/controllers/v1/utils.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"2b6b81c167414471bcb4a138b9718ea79beb4665","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    return utils.is_hostname_safe(name) and (not uuidutils.is_uuid_like(name))"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def check_for_invalid_fields(fields, object_fields):"},{"line_number":111,"context_line":"    \"\"\"Check for requested invalid fields."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    Check if the user requested non-existent or non-supported (depending"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_4404dc48","line":110,"updated":"2015-05-28 23:52:34.000000000","message":"Can a unit test be added for this function?","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e118c05db8c87b001d7f12d708a1bb7a29a73d93","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    return utils.is_hostname_safe(name) and (not uuidutils.is_uuid_like(name))"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def check_for_invalid_fields(fields, object_fields):"},{"line_number":111,"context_line":"    \"\"\"Check for requested invalid fields."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    Check if the user requested non-existent or non-supported (depending"}],"source_content_type":"text/x-python","patch_set":6,"id":"5afe65bd_69872162","line":110,"in_reply_to":"7a016987_4404dc48","updated":"2015-06-02 09:49:22.000000000","message":"Done","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"53b6816aca01c36abdd27e9cb8d14d60e7737dfc","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    \"\"\"Check for requested invalid fields."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    Check if the user requested non-existent or non-supported (depending"},{"line_number":114,"context_line":"    on the API microversion) fields."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    :param fields: A list of fields requested by the user"},{"line_number":117,"context_line":"    :object_fields: A list of fields supported by the object."}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_e2cdd485","line":114,"updated":"2015-06-17 20:06:50.000000000","message":"where is the check based on API microversion-ed fields? Does object_fields only include api-microversioned fields?","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3f37096e38069781b50982c4e70e6e3b253d3941","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    \"\"\"Check for requested invalid fields."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    Check if the user requested non-existent or non-supported (depending"},{"line_number":114,"context_line":"    on the API microversion) fields."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    :param fields: A list of fields requested by the user"},{"line_number":117,"context_line":"    :object_fields: A list of fields supported by the object."}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_00e77740","line":114,"in_reply_to":"fa32b979_e2cdd485","updated":"2015-06-18 09:23:34.000000000","message":"This was prior to the micro versioning bump, I need to change this string (before I was assuming that we only bump the micro version when it\u0027s non backwards compat, and this patch is backward compat. But now things have changed)","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"53b6816aca01c36abdd27e9cb8d14d60e7737dfc","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            _(\u0027Field(s) \"%s\" are not valid\u0027) % \u0027, \u0027.join(invalid_fields))"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"def check_allow_fields(fields):"},{"line_number":128,"context_line":"    \"\"\"Check if fetching a subset of the resource attributes is allowed."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    Version 1.7 of the API allows fetching a subset of the resource"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_103e02da","line":127,"updated":"2015-06-17 20:06:50.000000000","message":"I see that we have \u0027allow_node_logical_names()\u0027, and it returns true/false.\n\nI don\u0027t know if a \u0027check_xxx\u0027 or a \u0027allow_xxx\u0027 is better, but it would be nice if we were somewhat consistent in how we\u0027re dealing with this. (As a template for future check/allow methods). What do you think?\n\nAlso, I thought (before looking at the code) that this method was checking if the fields in \u0027fields\u0027 were allowed. Maybe something like \u0027check_allow_specify_fields\u0027?","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3f37096e38069781b50982c4e70e6e3b253d3941","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            _(\u0027Field(s) \"%s\" are not valid\u0027) % \u0027, \u0027.join(invalid_fields))"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"def check_allow_fields(fields):"},{"line_number":128,"context_line":"    \"\"\"Check if fetching a subset of the resource attributes is allowed."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    Version 1.7 of the API allows fetching a subset of the resource"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_c0bd0fd9","line":127,"in_reply_to":"fa32b979_103e02da","updated":"2015-06-18 09:23:34.000000000","message":"+1 for consistency.\n\nTo be consistent with allow_xxx. What about allow_specifying_fields ?","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"f730776258091b824f6c56617de15e672a2efd6f","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            _(\u0027Field(s) \"%s\" are not valid\u0027) % \u0027, \u0027.join(invalid_fields))"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"def check_allow_fields(fields):"},{"line_number":128,"context_line":"    \"\"\"Check if fetching a subset of the resource attributes is allowed."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    Version 1.7 of the API allows fetching a subset of the resource"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa32b979_dff6465c","line":127,"in_reply_to":"fa32b979_c0bd0fd9","updated":"2015-06-18 13:20:37.000000000","message":"I\u0027m good with \u0027allow_specifying_fields\u0027","commit_id":"62b730eb682b2feb010f79448c16688e6b7d3244"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"780febeb38efc90f3d0fc18cf6aad0bed9b74d42","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            _(\u0027Field(s) \"%s\" are not valid\u0027) % \u0027, \u0027.join(invalid_fields))"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"def check_allow_specify_fields(fields):"},{"line_number":127,"context_line":"    \"\"\"Check if fetching a subset of the resource attributes is allowed."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    Version 1.7 of the API allows fetching a subset of the resource"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_8fbe41ac","line":126,"updated":"2015-06-18 16:43:24.000000000","message":"Oh, wrt consistency, I meant that the \u0027allow_node_logical_names()\u0027 returns True/False and doesn\u0027t raise any exceptions.\n\nSo was wondering if we wanted to change this to be \u0027allow_specify_fields()\u0027 to return True/False (instead of raising exception). Maybe not though; in your case you always want to raise an exception.","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7c19eb7a85ff4f6ce68c35a7d0831464f4bcd444","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            _(\u0027Field(s) \"%s\" are not valid\u0027) % \u0027, \u0027.join(invalid_fields))"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"def check_allow_specify_fields(fields):"},{"line_number":127,"context_line":"    \"\"\"Check if fetching a subset of the resource attributes is allowed."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    Version 1.7 of the API allows fetching a subset of the resource"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_d7711eaa","line":126,"in_reply_to":"fa32b979_8fbe41ac","updated":"2015-06-19 11:19:05.000000000","message":"Not sure if there\u0027s a valid reason to return True/False for this one here, since we don\u0027t do any logical conditional according to the return code of this method.\n\nIf fields is not allowed we just want to raise the exception so that the user know that it\u0027s not support for that version of the API.","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"}],"ironic/tests/api/v1/test_nodes.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"f2157e306c7f1bf1e0c8334f76dbbae4c8307c63","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        # never expose the chassis_id"},{"line_number":132,"context_line":"        self.assertNotIn(\u0027chassis_id\u0027, data)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_get_one_custom_fields(self):"},{"line_number":135,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":136,"context_line":"                                          chassis_id\u003dself.chassis.id)"},{"line_number":137,"context_line":"        fields \u003d \u0027uuid,instance_info\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_c2febc6a","line":134,"updated":"2015-05-15 19:39:09.000000000","message":"Can we test getting a non-existent custom field, too?","commit_id":"50f9a88cece0c2ac200d002d7b1a43ba64d5b0e7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e72834a1a7760af0f555b976121e578b7bda7018","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        # never expose the chassis_id"},{"line_number":132,"context_line":"        self.assertNotIn(\u0027chassis_id\u0027, data)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_get_one_custom_fields(self):"},{"line_number":135,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":136,"context_line":"                                          chassis_id\u003dself.chassis.id)"},{"line_number":137,"context_line":"        fields \u003d \u0027uuid,instance_info\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_2d5cbc17","line":134,"in_reply_to":"7a016987_c2febc6a","updated":"2015-05-25 09:48:36.000000000","message":"Oh nice, yeah I will add a check for it","commit_id":"50f9a88cece0c2ac200d002d7b1a43ba64d5b0e7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"561be9b70486084b0ae1e2e3b9b9b7ed4902710a","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                 headers\u003d{api_base.Version.string: str(api_v1.MAX_VER)})"},{"line_number":140,"context_line":"        # We always append \"links\""},{"line_number":141,"context_line":"        self.assertEqual(sorted([\u0027uuid\u0027, \u0027instance_info\u0027, \u0027links\u0027]),"},{"line_number":142,"context_line":"                         sorted(data.keys()))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_get_collection_custom_fields(self):"},{"line_number":145,"context_line":"        fields \u003d \u0027uuid,instance_info\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_3d4ee36f","line":142,"updated":"2015-05-15 13:59:38.000000000","message":"nit: .keys() is redundant","commit_id":"50f9a88cece0c2ac200d002d7b1a43ba64d5b0e7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e72834a1a7760af0f555b976121e578b7bda7018","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                 headers\u003d{api_base.Version.string: str(api_v1.MAX_VER)})"},{"line_number":140,"context_line":"        # We always append \"links\""},{"line_number":141,"context_line":"        self.assertEqual(sorted([\u0027uuid\u0027, \u0027instance_info\u0027, \u0027links\u0027]),"},{"line_number":142,"context_line":"                         sorted(data.keys()))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_get_collection_custom_fields(self):"},{"line_number":145,"context_line":"        fields \u003d \u0027uuid,instance_info\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_0d9ea0b8","line":142,"in_reply_to":"7a016987_3d4ee36f","updated":"2015-05-25 09:48:36.000000000","message":"Done","commit_id":"50f9a88cece0c2ac200d002d7b1a43ba64d5b0e7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"561be9b70486084b0ae1e2e3b9b9b7ed4902710a","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        for node in data[\u0027nodes\u0027]:"},{"line_number":156,"context_line":"            # We always append \"links\""},{"line_number":157,"context_line":"            self.assertEqual(sorted([\u0027uuid\u0027, \u0027instance_info\u0027, \u0027links\u0027]),"},{"line_number":158,"context_line":"                             sorted(node.keys()))"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_detail(self):"},{"line_number":161,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_dd234fa6","line":158,"updated":"2015-05-15 13:59:38.000000000","message":"ditto","commit_id":"50f9a88cece0c2ac200d002d7b1a43ba64d5b0e7"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e72834a1a7760af0f555b976121e578b7bda7018","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        for node in data[\u0027nodes\u0027]:"},{"line_number":156,"context_line":"            # We always append \"links\""},{"line_number":157,"context_line":"            self.assertEqual(sorted([\u0027uuid\u0027, \u0027instance_info\u0027, \u0027links\u0027]),"},{"line_number":158,"context_line":"                             sorted(node.keys()))"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_detail(self):"},{"line_number":161,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_8db2904a","line":158,"in_reply_to":"7a016987_dd234fa6","updated":"2015-05-25 09:48:36.000000000","message":"Done","commit_id":"50f9a88cece0c2ac200d002d7b1a43ba64d5b0e7"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"0750284a71bee91e30a207745367b2b8e325d7cb","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        # never expose the chassis_id"},{"line_number":132,"context_line":"        self.assertNotIn(\u0027chassis_id\u0027, data)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_get_one_custom_fields(self):"},{"line_number":135,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":136,"context_line":"                                          chassis_id\u003dself.chassis.id)"},{"line_number":137,"context_line":"        fields \u003d \u0027uuid,instance_info\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_3932fe10","line":134,"updated":"2015-05-30 04:37:17.000000000","message":"Can we remove uuid from one of these test cases (or add another test case) and make sure we get details even if uuid is not requested (we have a code change to handle that\n\nhttps://review.openstack.org/#/c/183491/6/ironic/api/controllers/v1/node.py L589","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e118c05db8c87b001d7f12d708a1bb7a29a73d93","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        # never expose the chassis_id"},{"line_number":132,"context_line":"        self.assertNotIn(\u0027chassis_id\u0027, data)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_get_one_custom_fields(self):"},{"line_number":135,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":136,"context_line":"                                          chassis_id\u003dself.chassis.id)"},{"line_number":137,"context_line":"        fields \u003d \u0027uuid,instance_info\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5afe65bd_2981294b","line":134,"in_reply_to":"7a016987_3932fe10","updated":"2015-06-02 09:49:22.000000000","message":"Done","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"780febeb38efc90f3d0fc18cf6aad0bed9b74d42","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            headers\u003d{api_base.Version.string: str(api_v1.MIN_VER)},"},{"line_number":180,"context_line":"            expect_errors\u003dTrue)"},{"line_number":181,"context_line":"        self.assertEqual(406, response.status_int)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def test_detail(self):"},{"line_number":184,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":185,"context_line":"                                          chassis_id\u003dself.chassis.id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_fa246d60","line":182,"updated":"2015-06-18 16:43:24.000000000","message":"do we want a test for the show_password/node.driver_info logic?","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7c19eb7a85ff4f6ce68c35a7d0831464f4bcd444","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            headers\u003d{api_base.Version.string: str(api_v1.MIN_VER)},"},{"line_number":180,"context_line":"            expect_errors\u003dTrue)"},{"line_number":181,"context_line":"        self.assertEqual(406, response.status_int)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def test_detail(self):"},{"line_number":184,"context_line":"        node \u003d obj_utils.create_test_node(self.context,"},{"line_number":185,"context_line":"                                          chassis_id\u003dself.chassis.id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_b7a33a00","line":182,"in_reply_to":"fa32b979_fa246d60","updated":"2015-06-19 11:19:05.000000000","message":"Will add","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"}],"ironic/tests/api/v1/test_types.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"2b6b81c167414471bcb4a138b9718ea79beb4665","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def test_list_type(self):"},{"line_number":271,"context_line":"        v \u003d types.ListType()"},{"line_number":272,"context_line":"        self.assertEqual(sorted([\u0027foo\u0027, \u0027bar\u0027]),"},{"line_number":273,"context_line":"                         sorted(v.validate(\"foo,bar\")))"},{"line_number":274,"context_line":"        self.assertEqual(sorted([\u0027cat\u0027, \u0027meow\u0027]),"},{"line_number":275,"context_line":"                         sorted(v.validate(\"cat  ,  meow\")))"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a016987_27f8c2c2","line":272,"updated":"2015-05-28 23:52:34.000000000","message":"Optional: Can use  self.assertItemsEqual()  sorted() is not needed if used.","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e118c05db8c87b001d7f12d708a1bb7a29a73d93","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def test_list_type(self):"},{"line_number":271,"context_line":"        v \u003d types.ListType()"},{"line_number":272,"context_line":"        self.assertEqual(sorted([\u0027foo\u0027, \u0027bar\u0027]),"},{"line_number":273,"context_line":"                         sorted(v.validate(\"foo,bar\")))"},{"line_number":274,"context_line":"        self.assertEqual(sorted([\u0027cat\u0027, \u0027meow\u0027]),"},{"line_number":275,"context_line":"                         sorted(v.validate(\"cat  ,  meow\")))"}],"source_content_type":"text/x-python","patch_set":6,"id":"5afe65bd_89e93d1d","line":272,"in_reply_to":"7a016987_27f8c2c2","updated":"2015-06-02 09:49:22.000000000","message":"Done","commit_id":"a6e10bb5bdfb0eedb763f58e31a21a818e67a05f"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"780febeb38efc90f3d0fc18cf6aad0bed9b74d42","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        self.assertItemsEqual([\u0027foo\u0027, \u0027bar\u0027], v.validate(\u0027foo,bar\u0027))"},{"line_number":273,"context_line":"        self.assertItemsEqual([\u0027cat\u0027, \u0027meow\u0027], v.validate(\"cat  ,  meow\"))"},{"line_number":274,"context_line":"        self.assertItemsEqual([\u0027spongebob\u0027, \u0027squarepants\u0027],"},{"line_number":275,"context_line":"                              v.validate(\"SpongeBob,SquarePants\"))"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_2f15b59a","line":275,"updated":"2015-06-18 16:43:24.000000000","message":"don\u0027t know if we want to show what happens with \u0027foo, foo bar\u0027 or \u0027foo, ,,bar\u0027.","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7c19eb7a85ff4f6ce68c35a7d0831464f4bcd444","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        self.assertItemsEqual([\u0027foo\u0027, \u0027bar\u0027], v.validate(\u0027foo,bar\u0027))"},{"line_number":273,"context_line":"        self.assertItemsEqual([\u0027cat\u0027, \u0027meow\u0027], v.validate(\"cat  ,  meow\"))"},{"line_number":274,"context_line":"        self.assertItemsEqual([\u0027spongebob\u0027, \u0027squarepants\u0027],"},{"line_number":275,"context_line":"                              v.validate(\"SpongeBob,SquarePants\"))"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_f7e78244","line":275,"in_reply_to":"fa32b979_2f15b59a","updated":"2015-06-19 11:19:05.000000000","message":"Done","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"7655bcc765163e13f442c0bf0b0c6485f720ec0b","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        self.assertItemsEqual([\u0027foo\u0027, \u0027bar\u0027], v.validate(\u0027foo,bar\u0027))"},{"line_number":273,"context_line":"        self.assertItemsEqual([\u0027cat\u0027, \u0027meow\u0027], v.validate(\"cat  ,  meow\"))"},{"line_number":274,"context_line":"        self.assertItemsEqual([\u0027spongebob\u0027, \u0027squarepants\u0027],"},{"line_number":275,"context_line":"                              v.validate(\"SpongeBob,SquarePants\"))"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_65460751","line":275,"in_reply_to":"fa32b979_f7e78244","updated":"2015-06-22 18:14:39.000000000","message":"I really was thinking of \u0027foo, foo bar\u0027, but \u0027foo, foo, ..\u0027 was a better test case :)","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"}],"ironic/tests/api/v1/test_utils.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"780febeb38efc90f3d0fc18cf6aad0bed9b74d42","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.assertRaises(exception.InvalidParameterValue,"},{"line_number":65,"context_line":"                          utils.check_for_invalid_fields,"},{"line_number":66,"context_line":"                          requested, supported)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class TestNodeIdent(base.TestCase):"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_4f6919f8","line":67,"updated":"2015-06-18 16:43:24.000000000","message":"we don\u0027t need tests for check_allow_specify_fields(), do we?","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"7c19eb7a85ff4f6ce68c35a7d0831464f4bcd444","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.assertRaises(exception.InvalidParameterValue,"},{"line_number":65,"context_line":"                          utils.check_for_invalid_fields,"},{"line_number":66,"context_line":"                          requested, supported)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"class TestNodeIdent(base.TestCase):"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fa32b979_f75c62f2","line":67,"in_reply_to":"fa32b979_4f6919f8","updated":"2015-06-19 11:19:05.000000000","message":"Done","commit_id":"400029a55df6da8bd3492e5777605b0d16bca44e"}]}
