)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"80aa58a646210e574b463c0b2f790023ca6e8210","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Throw exception if hw:numa_nodes is set to 0"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"As [1] isn\u0027t maintained, I used that patchset to create a new one."},{"line_number":10,"context_line":"This patchset is freshened to the current master bramch."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch introduces InvalidNUMANodesNumber exception, which is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1aa78d24_4051a5d7","line":9,"updated":"2016-07-06 12:09:38.000000000","message":"Please remove that, no need of justification since it has been abandonned","commit_id":"ea0bd4a1541e885e4207d9ab0529b8908fce130a"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"cda30c7f1c0ea7a6fcb2b0f05bef3eb8d9e04429","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Gábor Antal \u003cantal@inf.u-szeged.hu\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-09-02 12:34:41 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Throw exception if hw:numa_nodes is set to 0"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"As [1] is abandoned, I used that patchset to create a new one."},{"line_number":10,"context_line":"This patchset is freshened to the current master branch."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9a89bdaa_50ae0c86","line":7,"range":{"start_line":7,"start_character":36,"end_line":7,"end_character":44},"updated":"2016-09-05 11:42:10.000000000","message":"I think, it would be better to say: \"... is not set to integer greater than 0\"","commit_id":"9961f2eff8e1601c9c66acc466dbe636c34e0157"}],"nova/api/openstack/compute/servers.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"60c200ce8094fd4e394d52113c0313da3626e23c","unresolved":false,"context_lines":[{"line_number":689,"context_line":"                exception.ImageNUMATopologyCPUDuplicates,"},{"line_number":690,"context_line":"                exception.ImageNUMATopologyCPUsUnassigned,"},{"line_number":691,"context_line":"                exception.ImageNUMATopologyMemoryOutOfRange,"},{"line_number":692,"context_line":"                exception.InvalidNUMANodesNumber,"},{"line_number":693,"context_line":"                exception.InstanceGroupNotFound,"},{"line_number":694,"context_line":"                exception.PciRequestAliasNotDefined,"},{"line_number":695,"context_line":"                exception.SnapshotNotFound,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a89bdaa_9f4b735f","line":692,"updated":"2016-09-08 20:07:42.000000000","message":"Can you add this corresponding unit test like https://github.com/openstack/nova/blob/master/nova/tests/unit/api/openstack/compute/test_serversV21.py#L3258\n\n?","commit_id":"c784d56b8b75cf94c16850ee251f174a6552e6c2"}],"nova/exception.py":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"243cdf60ef9201f6f1a1e3808a9444214c568534","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"class InvalidNUMANodesNumber(Invalid):"},{"line_number":374,"context_line":"    msg_fmt \u003d _(\"Image property \u0027hw_numa_nodes\u0027 cannot be \u0027%(nodes)s\u0027\")"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"class InvalidName(Invalid):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_208c59d9","line":374,"updated":"2016-07-06 12:12:16.000000000","message":"Also the message is not good, you are currently testing the value from flavor extra spec. Since you have to test the value from both (extra specs and image properties) I\u0027d recommend to find a message more general and also reflect was are the authorized values (numa node \u003e 0).","commit_id":"ea0bd4a1541e885e4207d9ab0529b8908fce130a"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"5e3417f492a117251f9bda46232523c85cb411bc","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"class InvalidNUMANodesNumber(Invalid):"},{"line_number":374,"context_line":"    msg_fmt \u003d _(\"Image property \u0027hw_numa_nodes\u0027 cannot be \u0027%(nodes)s\u0027\")"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"class InvalidName(Invalid):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_795ac92b","line":374,"updated":"2016-07-11 12:46:15.000000000","message":"The message here is not good, the property can come from flavor or image.","commit_id":"e5d9385770407944a1ce0da22f109f2f6f47e4ae"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"2a4fa013dbd174c397c9598e7f3be61fe5efe4f4","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"class InvalidNUMANodesNumber(Invalid):"},{"line_number":374,"context_line":"    msg_fmt \u003d _(\"Image property \u0027hw_numa_nodes\u0027 cannot be \u0027%(nodes)s\u0027\")"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"class InvalidName(Invalid):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_065639cd","line":374,"in_reply_to":"1aa78d24_795ac92b","updated":"2016-07-13 16:15:13.000000000","message":"Done","commit_id":"e5d9385770407944a1ce0da22f109f2f6f47e4ae"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"98940c084b45ab6cab857b2710454772a20008a0","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"class InvalidNUMANodesNumber(Invalid):"},{"line_number":374,"context_line":"    msg_fmt \u003d _(\"The property \u0027hw_numa_nodes\u0027 cannot be \u0027%(nodes)s\u0027\")"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"class InvalidName(Invalid):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_0ea7970b","line":374,"updated":"2016-09-02 08:11:11.000000000","message":"The name of that option is \u0027hw_numa_nodes\u0027 if it comes from image metadata or \u0027hw:numa_nodes\u0027 from flavor extra-specs so I would only write \u0027numa_nodes\u0027, then to be more explicit you can also explain what is intended: a number greater than 1.","commit_id":"d9d854cb2fde5cfae0dfda68be725aba2d00968d"}],"nova/virt/hardware.py":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"80aa58a646210e574b463c0b2f790023ca6e8210","unresolved":false,"context_lines":[{"line_number":1158,"context_line":"                name\u003d\u0027hw_numa_nodes\u0027)"},{"line_number":1159,"context_line":"        nodes \u003d int(nodes)"},{"line_number":1160,"context_line":"    else:"},{"line_number":1161,"context_line":"        nodes \u003d props.get(\"hw_numa_nodes\")"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"    pagesize \u003d _numa_get_pagesize_constraints("},{"line_number":1164,"context_line":"        flavor, image_meta)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_00f83d7a","side":"PARENT","line":1161,"updated":"2016-07-06 12:09:38.000000000","message":"The NUMA nodes property can also comes from flavor extra specs, we should find an algorithm to verify the value passed from both cases.","commit_id":"2d551ce83d186ad70ca69b1a6f9454906b4b3448"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"5e3417f492a117251f9bda46232523c85cb411bc","unresolved":false,"context_lines":[{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":"    nodes \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\"hw:numa_nodes\")"},{"line_number":1154,"context_line":"    props \u003d image_meta.properties"},{"line_number":1155,"context_line":"    if nodes is not None:"},{"line_number":1156,"context_line":"        if props.obj_attr_is_set(\"hw_numa_nodes\"):"},{"line_number":1157,"context_line":"            raise exception.ImageNUMATopologyForbidden("},{"line_number":1158,"context_line":"                name\u003d\u0027hw_numa_nodes\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_b90ef12f","side":"PARENT","line":1155,"updated":"2016-07-11 12:46:15.000000000","message":"I\u0027d way we should refactor this part a little bit, but that can probably be done on an other changeset.","commit_id":"2d551ce83d186ad70ca69b1a6f9454906b4b3448"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"eac27fa00ba17cdb67c4e55972dee73ae567c744","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"    return numa_topology"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":""},{"line_number":1138,"context_line":"def _validate_nodes(nodes):"},{"line_number":1139,"context_line":"    # We throw an exception if nodes is not a number"},{"line_number":1140,"context_line":"    # or if number is less than 1"},{"line_number":1141,"context_line":"    if nodes is not None and (not strutils.is_int_like(nodes) or"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_99a5f505","line":1138,"updated":"2016-07-11 12:47:29.000000000","message":"Hum this method should be renamed to \u0027_validate_numa_nodes\u0027 so we understand the context.","commit_id":"e5d9385770407944a1ce0da22f109f2f6f47e4ae"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"2a4fa013dbd174c397c9598e7f3be61fe5efe4f4","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"    return numa_topology"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":""},{"line_number":1138,"context_line":"def _validate_nodes(nodes):"},{"line_number":1139,"context_line":"    # We throw an exception if nodes is not a number"},{"line_number":1140,"context_line":"    # or if number is less than 1"},{"line_number":1141,"context_line":"    if nodes is not None and (not strutils.is_int_like(nodes) or"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_2648952c","line":1138,"in_reply_to":"1aa78d24_99a5f505","updated":"2016-07-13 16:15:13.000000000","message":"Done","commit_id":"e5d9385770407944a1ce0da22f109f2f6f47e4ae"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"5e3417f492a117251f9bda46232523c85cb411bc","unresolved":false,"context_lines":[{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":""},{"line_number":1138,"context_line":"def _validate_nodes(nodes):"},{"line_number":1139,"context_line":"    # We throw an exception if nodes is not a number"},{"line_number":1140,"context_line":"    # or if number is less than 1"},{"line_number":1141,"context_line":"    if nodes is not None and (not strutils.is_int_like(nodes) or"},{"line_number":1142,"context_line":"       int(nodes) \u003c 1):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_5926edba","line":1139,"updated":"2016-07-11 12:46:15.000000000","message":"nit: We usually form docstring differently but that can probably be as a simple comment.","commit_id":"e5d9385770407944a1ce0da22f109f2f6f47e4ae"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"2a4fa013dbd174c397c9598e7f3be61fe5efe4f4","unresolved":false,"context_lines":[{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":""},{"line_number":1138,"context_line":"def _validate_nodes(nodes):"},{"line_number":1139,"context_line":"    # We throw an exception if nodes is not a number"},{"line_number":1140,"context_line":"    # or if number is less than 1"},{"line_number":1141,"context_line":"    if nodes is not None and (not strutils.is_int_like(nodes) or"},{"line_number":1142,"context_line":"       int(nodes) \u003c 1):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_865349e1","line":1139,"in_reply_to":"1aa78d24_5926edba","updated":"2016-07-13 16:15:13.000000000","message":"Done","commit_id":"e5d9385770407944a1ce0da22f109f2f6f47e4ae"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"cda30c7f1c0ea7a6fcb2b0f05bef3eb8d9e04429","unresolved":false,"context_lines":[{"line_number":1140,"context_line":""},{"line_number":1141,"context_line":"    :param nodes: The number of NUMA nodes"},{"line_number":1142,"context_line":"    :raises: exception.InvalidNUMANodesNumber if the given"},{"line_number":1143,"context_line":"             parameter is not a number or less then 1"},{"line_number":1144,"context_line":"    \"\"\""},{"line_number":1145,"context_line":"    if nodes is not None and (not strutils.is_int_like(nodes) or"},{"line_number":1146,"context_line":"       int(nodes) \u003c 1):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a89bdaa_f02ba02e","line":1143,"range":{"start_line":1143,"start_character":47,"end_line":1143,"end_character":51},"updated":"2016-09-05 11:42:10.000000000","message":"than","commit_id":"9961f2eff8e1601c9c66acc466dbe636c34e0157"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"c58bd556e693e9c8253f547c71493cad98fb77cd","unresolved":false,"context_lines":[{"line_number":1144,"context_line":"    \"\"\""},{"line_number":1145,"context_line":"    if nodes is not None and (not strutils.is_int_like(nodes) or"},{"line_number":1146,"context_line":"       int(nodes) \u003c 1):"},{"line_number":1147,"context_line":"        raise exception.InvalidNUMANodesNumber(nodes\u003dnodes)"},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":""},{"line_number":1150,"context_line":"# TODO(sahid): Move numa related to hardward/numa.py"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_e62d2547","line":1147,"updated":"2016-09-07 17:33:13.000000000","message":"How about putting LOG.error() here?\nI think a root problem of this is wrong setting of operators and they need to know it from the log.","commit_id":"d151e11510e5320a3792821de6aafae52cbf94b9"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"b1ae3d7a7b97227211de3d7f722369c8e68f412f","unresolved":false,"context_lines":[{"line_number":1144,"context_line":"    \"\"\""},{"line_number":1145,"context_line":"    if nodes is not None and (not strutils.is_int_like(nodes) or"},{"line_number":1146,"context_line":"       int(nodes) \u003c 1):"},{"line_number":1147,"context_line":"        raise exception.InvalidNUMANodesNumber(nodes\u003dnodes)"},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":""},{"line_number":1150,"context_line":"# TODO(sahid): Move numa related to hardward/numa.py"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_33c00e50","line":1147,"in_reply_to":"9a89bdaa_e62d2547","updated":"2016-09-08 08:55:24.000000000","message":"That can come from both, flavor properties (admin related) and image properties which is users related. I don\u0027t think an error related to a bad configuration from the public API should be reported as an error in the log system.","commit_id":"d151e11510e5320a3792821de6aafae52cbf94b9"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"c58bd556e693e9c8253f547c71493cad98fb77cd","unresolved":false,"context_lines":[{"line_number":1154,"context_line":"    :param flavor: Flavor object to read extra specs from"},{"line_number":1155,"context_line":"    :param image_meta: nova.objects.ImageMeta object instance"},{"line_number":1156,"context_line":""},{"line_number":1157,"context_line":"    May raise exception.ImageNUMATopologyIncomplete() if the"},{"line_number":1158,"context_line":"    image properties are not correctly specified, or"},{"line_number":1159,"context_line":"    exception.ImageNUMATopologyForbidden if an attempt is"},{"line_number":1160,"context_line":"    made to override flavor settings with image properties."},{"line_number":1161,"context_line":""},{"line_number":1162,"context_line":"    :returns: InstanceNUMATopology or None"},{"line_number":1163,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_4686d1db","line":1160,"range":{"start_line":1157,"start_character":4,"end_line":1160,"end_character":59},"updated":"2016-09-07 17:33:13.000000000","message":"nit: A new exception needs to be written here.","commit_id":"d151e11510e5320a3792821de6aafae52cbf94b9"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"c58bd556e693e9c8253f547c71493cad98fb77cd","unresolved":false,"context_lines":[{"line_number":1165,"context_line":"    nodes \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\"hw:numa_nodes\")"},{"line_number":1166,"context_line":"    props \u003d image_meta.properties"},{"line_number":1167,"context_line":"    if nodes is not None:"},{"line_number":1168,"context_line":"        _validate_numa_nodes(nodes)"},{"line_number":1169,"context_line":"        if props.obj_attr_is_set(\"hw_numa_nodes\"):"},{"line_number":1170,"context_line":"            raise exception.ImageNUMATopologyForbidden("},{"line_number":1171,"context_line":"                name\u003d\u0027hw_numa_nodes\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_66faf576","line":1168,"range":{"start_line":1168,"start_character":8,"end_line":1168,"end_character":35},"updated":"2016-09-07 17:33:13.000000000","message":"This is not a reason of -1. just question.\n\nA new InvalidNumaNodesNumber is not handled at REST API layer,\nand HTTP500(internal server error) is returned to API users. I feel it is good for me because this is a server side(or operators\u0027 error), but the other exceptions(ImageNUMATopologyForbidden, etc) are handled at the API layer and converted to HTTP400 or something like https://github.com/openstack/nova/blob/master/nova/api/openstack/compute/servers.py#L686\n\nSo is this current behavior(HTTP500) intentional?","commit_id":"d151e11510e5320a3792821de6aafae52cbf94b9"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"b1ae3d7a7b97227211de3d7f722369c8e68f412f","unresolved":false,"context_lines":[{"line_number":1165,"context_line":"    nodes \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\"hw:numa_nodes\")"},{"line_number":1166,"context_line":"    props \u003d image_meta.properties"},{"line_number":1167,"context_line":"    if nodes is not None:"},{"line_number":1168,"context_line":"        _validate_numa_nodes(nodes)"},{"line_number":1169,"context_line":"        if props.obj_attr_is_set(\"hw_numa_nodes\"):"},{"line_number":1170,"context_line":"            raise exception.ImageNUMATopologyForbidden("},{"line_number":1171,"context_line":"                name\u003d\u0027hw_numa_nodes\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_33cd6e31","line":1168,"in_reply_to":"9a89bdaa_66faf576","updated":"2016-09-08 08:55:24.000000000","message":"Yes you made a good point, a 500 is not what we want here. We have to handle it in API layer.","commit_id":"d151e11510e5320a3792821de6aafae52cbf94b9"}]}
