)]}'
{"nova/conf/libvirt.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":""},{"line_number":1286,"context_line":"libvirt_pmem_opts \u003d ["},{"line_number":1287,"context_line":"    cfg.ListOpt(\u0027pmem_namespaces\u0027,"},{"line_number":1288,"context_line":"                item_type\u003dcfg.types.String(),"},{"line_number":1289,"context_line":"                default\u003d[],"},{"line_number":1290,"context_line":"                help\u003d\"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_4de1ffcf","line":1287,"range":{"start_line":1287,"start_character":17,"end_line":1287,"end_character":32},"updated":"2019-08-30 19:17:20.000000000","message":"I don\u0027t like introducing a conf opt that doesn\u0027t do anything yet. It\u0027ll be a little bit awkward, but I think we should move this delta (just this conf/libvirt.py change) later in the series. We can still introduce the parsing code here - see other comments.","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"85f9d4ac9ca464ab5e8e921569f9d3c73f17c44e","unresolved":false,"context_lines":[{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":""},{"line_number":1286,"context_line":"libvirt_pmem_opts \u003d ["},{"line_number":1287,"context_line":"    cfg.ListOpt(\u0027pmem_namespaces\u0027,"},{"line_number":1288,"context_line":"                item_type\u003dcfg.types.String(),"},{"line_number":1289,"context_line":"                default\u003d[],"},{"line_number":1290,"context_line":"                help\u003d\"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_5ec0c72b","line":1287,"range":{"start_line":1287,"start_character":17,"end_line":1287,"end_character":32},"in_reply_to":"7faddb67_4de1ffcf","updated":"2019-08-30 21:08:07.000000000","message":"[Later] Having gotten further up the series, I think this conf needs to be introduced after [1]. And in that same patch, we need docs and a release note.\n\n[1] https://review.opendev.org/#/c/678456/","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":1289,"context_line":"                default\u003d[],"},{"line_number":1290,"context_line":"                help\u003d\"\"\""},{"line_number":1291,"context_line":"Configure persistent memory(pmem) namespaces. These namespaces must"},{"line_number":1292,"context_line":"have been already created on host. This config option is in the"},{"line_number":1293,"context_line":"following format::"},{"line_number":1294,"context_line":""},{"line_number":1295,"context_line":"    \"$LABEL:$NSNAME[|$NSNAME][,$LABEL:$NSNAME[|$NSNAME]]\""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_cacb956f","line":1292,"range":{"start_line":1292,"start_character":26,"end_line":1292,"end_character":28},"updated":"2019-08-30 19:17:20.000000000","message":"on the","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":1295,"context_line":"    \"$LABEL:$NSNAME[|$NSNAME][,$LABEL:$NSNAME[|$NSNAME]]\""},{"line_number":1296,"context_line":""},{"line_number":1297,"context_line":"    * ``$NSNAME`` is the name of the pmem namespace."},{"line_number":1298,"context_line":"    * ``$LABEL`` represents one resouce class, it is a variable part of the"},{"line_number":1299,"context_line":"      resource class name."},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"one configuration example:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_2a890925","line":1298,"range":{"start_line":1298,"start_character":32,"end_line":1298,"end_character":39},"updated":"2019-08-30 19:17:20.000000000","message":"resource","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"197b7e46752fc0c94fc8a37cc6aadfffe0dea945","unresolved":false,"context_lines":[{"line_number":1295,"context_line":"    \"$LABEL:$NSNAME[|$NSNAME][,$LABEL:$NSNAME[|$NSNAME]]\""},{"line_number":1296,"context_line":""},{"line_number":1297,"context_line":"    * ``$NSNAME`` is the name of the pmem namespace."},{"line_number":1298,"context_line":"    * ``$LABEL`` represents one resouce class, it is a variable part of the"},{"line_number":1299,"context_line":"      resource class name."},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"one configuration example:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_9a98811b","line":1298,"range":{"start_line":1298,"start_character":32,"end_line":1298,"end_character":39},"in_reply_to":"7faddb67_2a890925","updated":"2019-09-02 13:01:40.000000000","message":"Done","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":1295,"context_line":"    \"$LABEL:$NSNAME[|$NSNAME][,$LABEL:$NSNAME[|$NSNAME]]\""},{"line_number":1296,"context_line":""},{"line_number":1297,"context_line":"    * ``$NSNAME`` is the name of the pmem namespace."},{"line_number":1298,"context_line":"    * ``$LABEL`` represents one resouce class, it is a variable part of the"},{"line_number":1299,"context_line":"      resource class name."},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"one configuration example:"},{"line_number":1302,"context_line":".. code-block:: ini"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_0a844d0a","line":1299,"range":{"start_line":1298,"start_character":45,"end_line":1299,"end_character":26},"updated":"2019-08-30 19:17:20.000000000","message":"This is used to generate the resource class name as ``CUSTOM_PMEM_NAMESPACE_$LABEL``.","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"197b7e46752fc0c94fc8a37cc6aadfffe0dea945","unresolved":false,"context_lines":[{"line_number":1295,"context_line":"    \"$LABEL:$NSNAME[|$NSNAME][,$LABEL:$NSNAME[|$NSNAME]]\""},{"line_number":1296,"context_line":""},{"line_number":1297,"context_line":"    * ``$NSNAME`` is the name of the pmem namespace."},{"line_number":1298,"context_line":"    * ``$LABEL`` represents one resouce class, it is a variable part of the"},{"line_number":1299,"context_line":"      resource class name."},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"one configuration example:"},{"line_number":1302,"context_line":".. code-block:: ini"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_7a934501","line":1299,"range":{"start_line":1298,"start_character":45,"end_line":1299,"end_character":26},"in_reply_to":"7faddb67_0a844d0a","updated":"2019-09-02 13:01:40.000000000","message":"Done","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":1298,"context_line":"    * ``$LABEL`` represents one resouce class, it is a variable part of the"},{"line_number":1299,"context_line":"      resource class name."},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"one configuration example:"},{"line_number":1302,"context_line":".. code-block:: ini"},{"line_number":1303,"context_line":""},{"line_number":1304,"context_line":"    [libvirt]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_ca79552f","line":1301,"range":{"start_line":1301,"start_character":0,"end_line":1301,"end_character":25},"updated":"2019-08-30 19:17:20.000000000","message":"For example:","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"197b7e46752fc0c94fc8a37cc6aadfffe0dea945","unresolved":false,"context_lines":[{"line_number":1298,"context_line":"    * ``$LABEL`` represents one resouce class, it is a variable part of the"},{"line_number":1299,"context_line":"      resource class name."},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"one configuration example:"},{"line_number":1302,"context_line":".. code-block:: ini"},{"line_number":1303,"context_line":""},{"line_number":1304,"context_line":"    [libvirt]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_3a994d1d","line":1301,"range":{"start_line":1301,"start_character":0,"end_line":1301,"end_character":25},"in_reply_to":"7faddb67_ca79552f","updated":"2019-09-02 13:01:40.000000000","message":"Done","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":1299,"context_line":"      resource class name."},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"one configuration example:"},{"line_number":1302,"context_line":".. code-block:: ini"},{"line_number":1303,"context_line":""},{"line_number":1304,"context_line":"    [libvirt]"},{"line_number":1305,"context_line":"    pmem_namespaces\u003d128G:ns0|ns1|ns2|ns3,262144MB:ns4|ns5,MEDIUM:ns6|ns7"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_2a8ee926","line":1302,"range":{"start_line":1302,"start_character":0,"end_line":1302,"end_character":19},"updated":"2019-08-30 19:17:20.000000000","message":"need an extra newline above this to make it render properly:\n\nhttps://openstack.fortnebula.com:13808/v1/AUTH_e8fd161dc34c421a979a9e6421f823e9/logs_53/678453/10/check/openstack-tox-docs/f194f6a/docs/configuration/config.html#libvirt.pmem_namespaces","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"197b7e46752fc0c94fc8a37cc6aadfffe0dea945","unresolved":false,"context_lines":[{"line_number":1299,"context_line":"      resource class name."},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"one configuration example:"},{"line_number":1302,"context_line":".. code-block:: ini"},{"line_number":1303,"context_line":""},{"line_number":1304,"context_line":"    [libvirt]"},{"line_number":1305,"context_line":"    pmem_namespaces\u003d128G:ns0|ns1|ns2|ns3,262144MB:ns4|ns5,MEDIUM:ns6|ns7"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_5a9e8906","line":1302,"range":{"start_line":1302,"start_character":0,"end_line":1302,"end_character":19},"in_reply_to":"7faddb67_2a8ee926","updated":"2019-09-02 13:01:40.000000000","message":"Done","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"}],"nova/objects/resource.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"05d1b06942becb30ab83829bc505c71670910e37","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    VERSION \u003d \"1.0\""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    fields \u003d {"},{"line_number":82,"context_line":"        \u0027label\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":83,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":84,"context_line":"        \u0027size\u0027: fields.IntegerField(),"},{"line_number":85,"context_line":"        \u0027devpath\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"7faddb67_17aa6d19","line":82,"updated":"2019-08-28 05:57:01.000000000","message":"Please add comments to explain the meanning of those fields.","commit_id":"150e6630bc97fc25b1d27fa07df232e2149cd70e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"15fa00f999006df6ca8d4cf77f89220bdd810cea","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    VERSION \u003d \"1.0\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    fields \u003d {"},{"line_number":78,"context_line":"        \u0027label\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":79,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":80,"context_line":"        \u0027size\u0027: fields.IntegerField(),"},{"line_number":81,"context_line":"        \u0027devpath\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_768f9c2d","line":78,"updated":"2019-09-05 13:31:23.000000000","message":"The label is nullable because we populate the object from the ndctl output first, then go back through and generate the label -- right?\n\nAlso (as Alex requested earlier) please add some short comments explaining what the fields are/do.","commit_id":"ceb63f35d2b7ebbdb4eb393f3b44eba015dbe2ec"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"2e1d6f7e93771913e071979508c881a2e61c6101","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    VERSION \u003d \"1.0\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    fields \u003d {"},{"line_number":78,"context_line":"        \u0027label\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":79,"context_line":"        \u0027name\u0027: fields.StringField(),"},{"line_number":80,"context_line":"        \u0027size\u0027: fields.IntegerField(),"},{"line_number":81,"context_line":"        \u0027devpath\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_3ab6c5db","line":78,"in_reply_to":"7faddb67_768f9c2d","updated":"2019-09-06 10:40:24.000000000","message":"Yes, but like Resource.metedata, we can not set the field at all at first, then set the \u0027label\u0027 field. So I will remove \u0027nullable\u003dTrue\u0027.","commit_id":"ceb63f35d2b7ebbdb4eb393f3b44eba015dbe2ec"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"828f8890d013c9dcbad6ee84f2942f10a11cba3b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        return not (self \u003d\u003d other)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def __hash__(self):"},{"line_number":108,"context_line":"        return hash((self.label, self.name, self.size,"},{"line_number":109,"context_line":"                     self.devpath, self.align))"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_1f8f28cd","line":108,"range":{"start_line":108,"start_character":21,"end_line":108,"end_character":31},"updated":"2019-09-06 23:00:04.000000000","message":"This needs to have the same kind of guard as L56, doesn\u0027t it?\n\nAbstractly, there should technically be such a guard for all the fields. We know name/size/devpath/align will always be set, so we can skip that. But this should be stated in a comment here.\n\n[Later] Actually, the hash isn\u0027t used until we\u0027re sure we have a label, so this should be safe. That\u0027s probably still worth calling out in a comment, especially to warn future consumers of this object to maintain that restriction.","commit_id":"4f4e492f664f36323acdc9ce75a58a1f594fa117"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"f81c22c4066c485f91b85e569211aba34fefc72b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        return not (self \u003d\u003d other)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def __hash__(self):"},{"line_number":108,"context_line":"        return hash((self.label, self.name, self.size,"},{"line_number":109,"context_line":"                     self.devpath, self.align))"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_d23659b5","line":108,"range":{"start_line":108,"start_character":21,"end_line":108,"end_character":31},"in_reply_to":"5faad753_1f8f28cd","updated":"2019-09-09 05:46:07.000000000","message":"Done","commit_id":"4f4e492f664f36323acdc9ce75a58a1f594fa117"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        \u0027align\u0027: fields.IntegerField(),"},{"line_number":99,"context_line":"    }"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def __eq__(self, other):"},{"line_number":102,"context_line":"        return base.all_things_equal(self, other)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def __ne__(self, other):"},{"line_number":105,"context_line":"        return not (self \u003d\u003d other)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def __hash__(self):"},{"line_number":108,"context_line":"        # Be sure all fields are set before using hash method"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_bbeb51da","line":105,"range":{"start_line":101,"start_character":0,"end_line":105,"end_character":34},"updated":"2019-09-10 15:28:54.000000000","message":"nit: just add this to ResourceMetadata","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d083fa960afc5c0caa2d6e0df55f1803f87727be","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        \u0027align\u0027: fields.IntegerField(),"},{"line_number":99,"context_line":"    }"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def __eq__(self, other):"},{"line_number":102,"context_line":"        return base.all_things_equal(self, other)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def __ne__(self, other):"},{"line_number":105,"context_line":"        return not (self \u003d\u003d other)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def __hash__(self):"},{"line_number":108,"context_line":"        # Be sure all fields are set before using hash method"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_587016dd","line":105,"range":{"start_line":101,"start_character":0,"end_line":105,"end_character":34},"in_reply_to":"5faad753_5ebecb65","updated":"2019-09-11 08:13:34.000000000","message":"Done","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bee93320c776122be708327d4afc557f4796ab71","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        \u0027align\u0027: fields.IntegerField(),"},{"line_number":99,"context_line":"    }"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def __eq__(self, other):"},{"line_number":102,"context_line":"        return base.all_things_equal(self, other)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def __ne__(self, other):"},{"line_number":105,"context_line":"        return not (self \u003d\u003d other)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def __hash__(self):"},{"line_number":108,"context_line":"        # Be sure all fields are set before using hash method"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_5ebecb65","line":105,"range":{"start_line":101,"start_character":0,"end_line":105,"end_character":34},"in_reply_to":"5faad753_bbeb51da","updated":"2019-09-10 18:59:30.000000000","message":"++\n\nIt wouldn\u0027t necessarily always apply, but subclasses can override.","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def __hash__(self):"},{"line_number":108,"context_line":"        # Be sure all fields are set before using hash method"},{"line_number":109,"context_line":"        return hash((self.label, self.name, self.size,"},{"line_number":110,"context_line":"                     self.devpath, self.align))"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_bbc4b160","line":110,"range":{"start_line":109,"start_character":0,"end_line":110,"end_character":47},"updated":"2019-09-10 15:28:54.000000000","message":"How about:\n\n  return hash(list(self.fields.values()))\n\nAssuming that\u0027s even necessary. Isn\u0027t this the default behavior?\n\nLater: nope, we need to use the \u0027ComparableVersionedObject\u0027 from o.vo to do this, which is more work than it\u0027s worth rn. I\u0027ll address that later.","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d083fa960afc5c0caa2d6e0df55f1803f87727be","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def __hash__(self):"},{"line_number":108,"context_line":"        # Be sure all fields are set before using hash method"},{"line_number":109,"context_line":"        return hash((self.label, self.name, self.size,"},{"line_number":110,"context_line":"                     self.devpath, self.align))"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_330f7de2","line":110,"range":{"start_line":109,"start_character":0,"end_line":110,"end_character":47},"in_reply_to":"5faad753_bbc4b160","updated":"2019-09-11 08:13:34.000000000","message":"Not sure how the ComparableVersionedObject work, but I test objs using it, and compare them directly, got the result I don\u0027t want.\n\nIn [430]: class Selection(ovo_base.ComparableVersionedObject):\n     ...:     VERSION \u003d \"1.0\"\n     ...:     fields \u003d {\n     ...:     \u0027id\u0027: fields.StringField(),\n     ...:     }\n     ...: \n\nIn [431]: a \u003d Selection()\nIn [432]: b \u003d Selection()\nIn [433]: a.id\u003d\u00271\u0027\nIn [434]: b.id\u003d\u00271\u0027\nIn [435]: a\u003d\u003db\nOut[435]: False","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"43c5484b1287cd3d4d14d523f1da0389dd9a93fc","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":89,"context_line":"class LibvirtVPMEMDevice(ResourceMetadata):"},{"line_number":90,"context_line":"    # Version 1.0: Initial version"},{"line_number":91,"context_line":"    VERSION \u003d \"1.0\""},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_84729710","line":89,"range":{"start_line":89,"start_character":6,"end_line":89,"end_character":13},"updated":"2019-09-11 16:50:17.000000000","message":"Why does this have a Libvirt prefix? The utility that creates this is not libvirt specific, seeing as I have it on my local Fedora machine w/o libvirt. Can we drop this.","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"266e5092de4e23f917d8ccd4d1877d1ec37d0647","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"@base.NovaObjectRegistry.register"},{"line_number":89,"context_line":"class LibvirtVPMEMDevice(ResourceMetadata):"},{"line_number":90,"context_line":"    # Version 1.0: Initial version"},{"line_number":91,"context_line":"    VERSION \u003d \"1.0\""},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_3f772d05","line":89,"range":{"start_line":89,"start_character":6,"end_line":89,"end_character":13},"in_reply_to":"5faad753_84729710","updated":"2019-09-11 17:39:48.000000000","message":"Because for now, it\u0027s only implemented in libvirt, not sure other virt driver will use what uitility or can find pmems by its self. And label here is also libvirt specific configuration.","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"43c5484b1287cd3d4d14d523f1da0389dd9a93fc","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        \u0027devpath\u0027: fields.StringField(),"},{"line_number":103,"context_line":"        # Backend pmem namespace\u0027s alignment"},{"line_number":104,"context_line":"        \u0027align\u0027: fields.IntegerField(),"},{"line_number":105,"context_line":"    }"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def __hash__(self):"},{"line_number":108,"context_line":"        # Be sure all fields are set before using hash method"}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_c4516f64","line":105,"updated":"2019-09-11 16:50:17.000000000","message":"You don\u0027t use it yet, but any reason you\u0027re not storing the \u0027node\u0027 attribute here. You\u0027re going to need it in the future, right?","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"266e5092de4e23f917d8ccd4d1877d1ec37d0647","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        \u0027devpath\u0027: fields.StringField(),"},{"line_number":103,"context_line":"        # Backend pmem namespace\u0027s alignment"},{"line_number":104,"context_line":"        \u0027align\u0027: fields.IntegerField(),"},{"line_number":105,"context_line":"    }"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def __hash__(self):"},{"line_number":108,"context_line":"        # Be sure all fields are set before using hash method"}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_7f3fe524","line":105,"in_reply_to":"5faad753_c4516f64","updated":"2019-09-11 17:39:48.000000000","message":"right, when support numa affinity.","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"}],"nova/privsep/libvirt.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"@nova.privsep.sys_admin_pctxt.entrypoint"},{"line_number":252,"context_line":"def get_pmem_namespaces():"},{"line_number":253,"context_line":"    ndctl_cmd \u003d [\u0027ndctl\u0027, \u0027list\u0027, \u0027-X\u0027]"},{"line_number":254,"context_line":"    nss_info \u003d processutils.execute(*ndctl_cmd)[0]"},{"line_number":255,"context_line":"    return nss_info if nss_info else \u0027[]\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_5d9e6d54","line":253,"range":{"start_line":253,"start_character":18,"end_line":253,"end_character":23},"updated":"2019-09-10 15:28:54.000000000","message":"first time I\u0027ve head of this \\o/","commit_id":"da907f17e6cb50c2c6e8e93c725f4d1f21b6b7a9"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":252,"context_line":"def get_pmem_namespaces():"},{"line_number":253,"context_line":"    ndctl_cmd \u003d [\u0027ndctl\u0027, \u0027list\u0027, \u0027-X\u0027]"},{"line_number":254,"context_line":"    nss_info \u003d processutils.execute(*ndctl_cmd)[0]"},{"line_number":255,"context_line":"    return nss_info if nss_info else \u0027[]\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_fb78e92b","line":255,"range":{"start_line":255,"start_character":11,"end_line":255,"end_character":41},"updated":"2019-09-10 15:28:54.000000000","message":"nit: nss_info or \u0027[]\u0027\n\nAs an aside, it\u0027s very weird that we return \u0027[]\u0027. Can you add a comment explaining why we do this (I suspect we\u0027re parsing this elsewhere and don\u0027t want to do pollute this file with that parsing)\n\nLater: yup, this goes through \u0027jsonutils.loads\u0027 which won\u0027t take \u0027[]\u0027. With that said, given that do the \u0027jsonutils.loads\u0027 elsewhere, I wonder if we should simply change that so it checks if this is set first?","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d083fa960afc5c0caa2d6e0df55f1803f87727be","unresolved":false,"context_lines":[{"line_number":252,"context_line":"def get_pmem_namespaces():"},{"line_number":253,"context_line":"    ndctl_cmd \u003d [\u0027ndctl\u0027, \u0027list\u0027, \u0027-X\u0027]"},{"line_number":254,"context_line":"    nss_info \u003d processutils.execute(*ndctl_cmd)[0]"},{"line_number":255,"context_line":"    return nss_info if nss_info else \u0027[]\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_f8030241","line":255,"range":{"start_line":255,"start_character":11,"end_line":255,"end_character":41},"in_reply_to":"5faad753_a1e6c043","updated":"2019-09-11 08:13:34.000000000","message":"ndctl will return a json array or \u0027\u0027.","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"bee93320c776122be708327d4afc557f4796ab71","unresolved":false,"context_lines":[{"line_number":252,"context_line":"def get_pmem_namespaces():"},{"line_number":253,"context_line":"    ndctl_cmd \u003d [\u0027ndctl\u0027, \u0027list\u0027, \u0027-X\u0027]"},{"line_number":254,"context_line":"    nss_info \u003d processutils.execute(*ndctl_cmd)[0]"},{"line_number":255,"context_line":"    return nss_info if nss_info else \u0027[]\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_a1e6c043","line":255,"range":{"start_line":255,"start_character":11,"end_line":255,"end_character":41},"in_reply_to":"5faad753_fb78e92b","updated":"2019-09-10 18:59:30.000000000","message":"\u003e Later: yup, this goes through \u0027jsonutils.loads\u0027 which won\u0027t take\n \u003e \u0027[]\u0027.\n\nWha?\n\n In [3]: jsonutils.loads(\u0027[]\u0027)\n Out[3]: []\n\n\n \u003e With that said, given that do the \u0027jsonutils.loads\u0027\n \u003e elsewhere, I wonder if we should simply change that so it checks if\n \u003e this is set first?\n\nCould do. Either way.","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"43c5484b1287cd3d4d14d523f1da0389dd9a93fc","unresolved":false,"context_lines":[{"line_number":252,"context_line":"def get_pmem_namespaces():"},{"line_number":253,"context_line":"    ndctl_cmd \u003d [\u0027ndctl\u0027, \u0027list\u0027, \u0027-X\u0027]"},{"line_number":254,"context_line":"    nss_info \u003d processutils.execute(*ndctl_cmd)[0]"},{"line_number":255,"context_line":"    return nss_info if nss_info else \u0027[]\u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_04eea787","line":255,"range":{"start_line":255,"start_character":0,"end_line":255,"end_character":41},"updated":"2019-09-11 16:50:17.000000000","message":"as noted previously [1], we could simply return whatever this gives us and handle the check to see if it\u0027s set at the caller. I think I\u0027d prefer that since it\u0027s more obvious. If you rework, can you do this instead, please\n\n[1] https://review.opendev.org/#/c/678453/24/nova/privsep/libvirt.py@255","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"12295d7b374a9c0cc1929145ddc2d893698e4bf3","unresolved":false,"context_lines":[{"line_number":252,"context_line":"def get_pmem_namespaces():"},{"line_number":253,"context_line":"    ndctl_cmd \u003d [\u0027ndctl\u0027, \u0027list\u0027, \u0027-X\u0027]"},{"line_number":254,"context_line":"    nss_info \u003d processutils.execute(*ndctl_cmd)[0]"},{"line_number":255,"context_line":"    return nss_info if nss_info else \u0027[]\u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_a2f462d0","line":255,"range":{"start_line":255,"start_character":0,"end_line":255,"end_character":41},"in_reply_to":"5faad753_04eea787","updated":"2019-09-11 18:57:01.000000000","message":"Done","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"03c86284ece616b6d18e08c4cc2a8cc058ef4d4e","unresolved":false,"context_lines":[{"line_number":252,"context_line":"def get_pmem_namespaces():"},{"line_number":253,"context_line":"    ndctl_cmd \u003d [\u0027ndctl\u0027, \u0027list\u0027, \u0027-X\u0027]"},{"line_number":254,"context_line":"    nss_info \u003d processutils.execute(*ndctl_cmd)[0]"},{"line_number":255,"context_line":"    return nss_info if nss_info else \u0027[]\u0027"}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_dfea9a73","line":255,"range":{"start_line":255,"start_character":0,"end_line":255,"end_character":41},"in_reply_to":"5faad753_04eea787","updated":"2019-09-11 17:08:04.000000000","message":"Okay, it wasn\u0027t clear to me what you were asking for there. I think I understand now.","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"}],"nova/tests/unit/objects/test_objects.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"29d4c372e179c26d30f6a4f88809c901b0d1665b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"5faad753_e6324e5e","updated":"2019-09-12 21:02:43.000000000","message":"This is to preemptively avoid merge conflict with [1]. Will move this back to its proper place after FF.\n\n[1] https://review.opendev.org/#/c/634827/60/nova/tests/unit/objects/test_objects.py","commit_id":"bf004ccd6e14c780a19764fe6a7be6f49ccf3d95"}],"nova/tests/unit/objects/test_resource.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"828f8890d013c9dcbad6ee84f2942f10a11cba3b","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                                       resource_class\u003d\u0027bar\u0027,"},{"line_number":82,"context_line":"                                       identifier\u003d\u0027foo\u0027,"},{"line_number":83,"context_line":"                                       metadata\u003dvpmem_1)"},{"line_number":84,"context_line":"        self.assertEqual(resource_0, resource_1)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class _TestResourceListObject(object):"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_5f004035","line":84,"updated":"2019-09-06 23:00:04.000000000","message":"How about a couple of not-equal test cases? Including one where Resource.metadata is set on one and unset on another. I assume we want that to evaluate not equal?","commit_id":"4f4e492f664f36323acdc9ce75a58a1f594fa117"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"f81c22c4066c485f91b85e569211aba34fefc72b","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                                       resource_class\u003d\u0027bar\u0027,"},{"line_number":82,"context_line":"                                       identifier\u003d\u0027foo\u0027,"},{"line_number":83,"context_line":"                                       metadata\u003dvpmem_1)"},{"line_number":84,"context_line":"        self.assertEqual(resource_0, resource_1)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class _TestResourceListObject(object):"}],"source_content_type":"text/x-python","patch_set":21,"id":"5faad753_f23b5599","line":84,"in_reply_to":"5faad753_5f004035","updated":"2019-09-09 05:46:07.000000000","message":"Done","commit_id":"4f4e492f664f36323acdc9ce75a58a1f594fa117"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    resource.Resource(provider_uuid\u003duuids.rp, resource_class\u003d\u0027CUSTOM_RESOURCE\u0027,"},{"line_number":26,"context_line":"                      identifier\u003d\u0027bar\u0027)])"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"fake_vpmems \u003d [resource.LibvirtVPMEMDevice("},{"line_number":29,"context_line":"                    label\u003d\u00274GB\u0027, name\u003d\u0027ns_0\u0027, devpath\u003d\u0027/dev/dax0.0\u0027,"},{"line_number":30,"context_line":"                    size\u003d4292870144, align\u003d2097152),"},{"line_number":31,"context_line":"               resource.LibvirtVPMEMDevice("}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_3b70c1dc","line":28,"range":{"start_line":28,"start_character":15,"end_line":28,"end_character":16},"updated":"2019-09-10 15:28:54.000000000","message":"nit: could you put these onto their own line?\n\n  fake_vpmems \u003d [\n      resource.LibvirtVPMEMDevice(\n          label\u003d\u00274GB\u0027, name\u003d\u0027ns_0\u0027, devpath\u003d\u0027/dev/dax0.0\u0027,\n          ...\n  ]","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d083fa960afc5c0caa2d6e0df55f1803f87727be","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    resource.Resource(provider_uuid\u003duuids.rp, resource_class\u003d\u0027CUSTOM_RESOURCE\u0027,"},{"line_number":26,"context_line":"                      identifier\u003d\u0027bar\u0027)])"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"fake_vpmems \u003d [resource.LibvirtVPMEMDevice("},{"line_number":29,"context_line":"                    label\u003d\u00274GB\u0027, name\u003d\u0027ns_0\u0027, devpath\u003d\u0027/dev/dax0.0\u0027,"},{"line_number":30,"context_line":"                    size\u003d4292870144, align\u003d2097152),"},{"line_number":31,"context_line":"               resource.LibvirtVPMEMDevice("}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_9898ce1b","line":28,"range":{"start_line":28,"start_character":15,"end_line":28,"end_character":16},"in_reply_to":"5faad753_3b70c1dc","updated":"2019-09-11 08:13:34.000000000","message":"Done","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":23470,"context_line":"            \"map\":\"mem\","},{"line_number":23471,"context_line":"            \"size\":4292870144,"},{"line_number":23472,"context_line":"            \"uuid\":\"ac64fe52-de38-465b-b32b-947a6773ac66\","},{"line_number":23473,"context_line":"            \"daxregion\":{\"id\": 0, \"size\": 4292870144,\"align\": 2097152,"},{"line_number":23474,"context_line":"            \"devices\":[{\"chardev\":\"dax0.1\","},{"line_number":23475,"context_line":"            \"size\":4292870144}]},"},{"line_number":23476,"context_line":"            \"name\":\"ns_1\","}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_2d04c3c5","line":23473,"range":{"start_line":23473,"start_character":34,"end_line":23473,"end_character":70},"updated":"2019-08-30 19:17:20.000000000","message":"be nice to make these different on different namespaces so we can prove we got the right values","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":23485,"context_line":"            \"size\":4292870144}]},"},{"line_number":23486,"context_line":"            \"name\":\"ns_2\","},{"line_number":23487,"context_line":"            \"numa_node\":0}]\u0027\u0027\u0027"},{"line_number":23488,"context_line":"        CONF.set_override(\"pmem_namespaces\","},{"line_number":23489,"context_line":"                          [\u00274GB:ns_0\u0027, \u0027SMALL:ns_1|ns_2\u0027],"},{"line_number":23490,"context_line":"                          group\u003d\u0027libvirt\u0027)"},{"line_number":23491,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_cdcc0f63","line":23488,"range":{"start_line":23488,"start_character":8,"end_line":23488,"end_character":25},"updated":"2019-08-30 19:17:20.000000000","message":"I think we spell this\n\n self.flags","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":23502,"context_line":"    @mock.patch(\u0027nova.privsep.libvirt.get_pmem_namespaces\u0027)"},{"line_number":23503,"context_line":"    def test_get_vpmems_failed(self, mock_get, mock_has_version):"},{"line_number":23504,"context_line":"        mock_get.return_value \u003d \u0027\u0027\u0027[]\u0027\u0027\u0027"},{"line_number":23505,"context_line":"        CONF.set_override(\"pmem_namespaces\", [\u00274GB:ns_0\u0027],"},{"line_number":23506,"context_line":"                          group\u003d\u0027libvirt\u0027)"},{"line_number":23507,"context_line":"        self.assertRaises(exception.PMEMNamespaceConfigInvalid,"},{"line_number":23508,"context_line":"                          libvirt_driver.LibvirtDriver,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_8dd297fc","line":23505,"range":{"start_line":23505,"start_character":8,"end_line":23505,"end_character":25},"updated":"2019-08-30 19:17:20.000000000","message":"self.flags","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":23529,"context_line":"            \"numa_node\":0}]\u0027\u0027\u0027"},{"line_number":23530,"context_line":""},{"line_number":23531,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.host.Host.has_min_version\u0027,"},{"line_number":23532,"context_line":"                return_value\u003dTrue)"},{"line_number":23533,"context_line":"    @mock.patch(\u0027nova.privsep.libvirt.get_pmem_namespaces\u0027)"},{"line_number":23534,"context_line":"    def test_discover_vpmems(self, mock_get, mock_has_version):"},{"line_number":23535,"context_line":"        mock_get.return_value \u003d self.pmem_namespaces"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_9b9215f6","line":23532,"range":{"start_line":23532,"start_character":16,"end_line":23532,"end_character":33},"updated":"2019-09-10 15:28:54.000000000","message":"new\u003dmock.Mock(return_value\u003dTrue)","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        self._vpmems_by_name \u003d self._get_vpmems_by_name()"},{"line_number":430,"context_line":"        self._vpmems_by_rc \u003d self._get_vpmems_by_rc()"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def _get_vpmems_by_rc(self):"},{"line_number":433,"context_line":"        vpmems_by_rc \u003d collections.defaultdict(list)"},{"line_number":434,"context_line":"        for name, vpmem in self._vpmems_by_name.items():"},{"line_number":435,"context_line":"            rc \u003d \"CUSTOM_PMEM_NAMESPACE_%s\" % vpmem.label"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_2d892325","line":432,"range":{"start_line":432,"start_character":8,"end_line":432,"end_character":25},"updated":"2019-08-30 19:17:20.000000000","message":"need test for this","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def _get_vpmems_by_rc(self):"},{"line_number":433,"context_line":"        vpmems_by_rc \u003d collections.defaultdict(list)"},{"line_number":434,"context_line":"        for name, vpmem in self._vpmems_by_name.items():"},{"line_number":435,"context_line":"            rc \u003d \"CUSTOM_PMEM_NAMESPACE_%s\" % vpmem.label"},{"line_number":436,"context_line":"            vpmems_by_rc[rc].append(vpmem)"},{"line_number":437,"context_line":"        return vpmems_by_rc"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_adcaf34b","line":434,"range":{"start_line":434,"start_character":12,"end_line":434,"end_character":16},"updated":"2019-08-30 19:17:20.000000000","message":"not using this, so may as well just do\n\n for vpmem in self._vpmems_by_name.values():\n\n[Later] Actually, there\u0027s no reason to do this separately. Why not just rename _get_vpmems_by_name to something like _discover_vpmems and have it populate both of the dicts?","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"197b7e46752fc0c94fc8a37cc6aadfffe0dea945","unresolved":false,"context_lines":[{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def _get_vpmems_by_rc(self):"},{"line_number":433,"context_line":"        vpmems_by_rc \u003d collections.defaultdict(list)"},{"line_number":434,"context_line":"        for name, vpmem in self._vpmems_by_name.items():"},{"line_number":435,"context_line":"            rc \u003d \"CUSTOM_PMEM_NAMESPACE_%s\" % vpmem.label"},{"line_number":436,"context_line":"            vpmems_by_rc[rc].append(vpmem)"},{"line_number":437,"context_line":"        return vpmems_by_rc"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_fda08f93","line":434,"range":{"start_line":434,"start_character":12,"end_line":434,"end_character":16},"in_reply_to":"7faddb67_adcaf34b","updated":"2019-09-02 13:01:40.000000000","message":"Done","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8cb3848b533fc9fc56b5154a74f1d12b2f29d4e3","unresolved":false,"context_lines":[{"line_number":432,"context_line":"    def _get_vpmems_by_rc(self):"},{"line_number":433,"context_line":"        vpmems_by_rc \u003d collections.defaultdict(list)"},{"line_number":434,"context_line":"        for name, vpmem in self._vpmems_by_name.items():"},{"line_number":435,"context_line":"            rc \u003d \"CUSTOM_PMEM_NAMESPACE_%s\" % vpmem.label"},{"line_number":436,"context_line":"            vpmems_by_rc[rc].append(vpmem)"},{"line_number":437,"context_line":"        return vpmems_by_rc"},{"line_number":438,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_bed8db7e","line":435,"range":{"start_line":435,"start_character":17,"end_line":435,"end_character":57},"updated":"2019-08-30 20:44:56.000000000","message":"This should be done as:\n\n os_traits.normalize_name(\u0027PMEM_NAMESPACE_%s\u0027 % vpmem.label)\n\nThat will ensure the label is scrubbed for proper capitalization and legal characters etc.","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"197b7e46752fc0c94fc8a37cc6aadfffe0dea945","unresolved":false,"context_lines":[{"line_number":432,"context_line":"    def _get_vpmems_by_rc(self):"},{"line_number":433,"context_line":"        vpmems_by_rc \u003d collections.defaultdict(list)"},{"line_number":434,"context_line":"        for name, vpmem in self._vpmems_by_name.items():"},{"line_number":435,"context_line":"            rc \u003d \"CUSTOM_PMEM_NAMESPACE_%s\" % vpmem.label"},{"line_number":436,"context_line":"            vpmems_by_rc[rc].append(vpmem)"},{"line_number":437,"context_line":"        return vpmems_by_rc"},{"line_number":438,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_5d98c367","line":435,"range":{"start_line":435,"start_character":17,"end_line":435,"end_character":57},"in_reply_to":"7faddb67_bed8db7e","updated":"2019-09-02 13:01:40.000000000","message":"Done","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":437,"context_line":"        return vpmems_by_rc"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def _get_vpmems_by_name(self):"},{"line_number":440,"context_line":"        if not CONF.libvirt.pmem_namespaces:"},{"line_number":441,"context_line":"            return {}"},{"line_number":442,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":443,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_cd3acf32","line":440,"range":{"start_line":440,"start_character":8,"end_line":440,"end_character":43},"updated":"2019-08-30 19:17:20.000000000","message":"Following on from comment about moving the conf out of this patch...\n\nWe can change this to a param instead of getting it from conf.\n\nThat way you can still test all the code exactly as you are, but without the actual CONF involved.\n\nYou can remove the invocation from __init__, since you\u0027re not doing anything with those attrs anyway in this patch. And then in your \"master switch\" patch, you can introduce the conf and add that invocation, passing the CONF var as the parameter.","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"197b7e46752fc0c94fc8a37cc6aadfffe0dea945","unresolved":false,"context_lines":[{"line_number":437,"context_line":"        return vpmems_by_rc"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def _get_vpmems_by_name(self):"},{"line_number":440,"context_line":"        if not CONF.libvirt.pmem_namespaces:"},{"line_number":441,"context_line":"            return {}"},{"line_number":442,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":443,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_bda697ab","line":440,"range":{"start_line":440,"start_character":8,"end_line":440,"end_character":43},"in_reply_to":"7faddb67_cd3acf32","updated":"2019-09-02 13:01:40.000000000","message":"Done","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":444,"context_line":"            raise exception.InternalError("},{"line_number":445,"context_line":"                _(\u0027Nova requires QEMU version %(qemu)s or greater \u0027"},{"line_number":446,"context_line":"                  \u0027and Libvirt version %(libvirt)s or greater \u0027"},{"line_number":447,"context_line":"                  \u0027for NVDIMM (Persistent Memorry) support.\u0027) % {"},{"line_number":448,"context_line":"                \u0027qemu\u0027: libvirt_utils.version_to_string("},{"line_number":449,"context_line":"                    MIN_QEMU_PMEM_SUPPORT),"},{"line_number":450,"context_line":"                \u0027libvirt\u0027: libvirt_utils.version_to_string("}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_8dfa97b7","line":447,"range":{"start_line":447,"start_character":42,"end_line":447,"end_character":49},"updated":"2019-08-30 19:17:20.000000000","message":"Memory","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":458,"context_line":"                ns_label, ns_names \u003d ns_conf.split(\":\", 1)"},{"line_number":459,"context_line":"            except ValueError:"},{"line_number":460,"context_line":"                reason \u003d _(\"The configuration doesn\u0027t follow the format\")"},{"line_number":461,"context_line":"                raise exception.PMEMNamespaceConfigInvalid("},{"line_number":462,"context_line":"                        reason\u003dreason)"},{"line_number":463,"context_line":"            ns_names \u003d ns_names.split(\"|\")"},{"line_number":464,"context_line":"            for ns_name in ns_names:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_4dc01f51","line":461,"range":{"start_line":461,"start_character":32,"end_line":461,"end_character":58},"updated":"2019-08-30 19:17:20.000000000","message":"need a test for this path","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"197b7e46752fc0c94fc8a37cc6aadfffe0dea945","unresolved":false,"context_lines":[{"line_number":458,"context_line":"                ns_label, ns_names \u003d ns_conf.split(\":\", 1)"},{"line_number":459,"context_line":"            except ValueError:"},{"line_number":460,"context_line":"                reason \u003d _(\"The configuration doesn\u0027t follow the format\")"},{"line_number":461,"context_line":"                raise exception.PMEMNamespaceConfigInvalid("},{"line_number":462,"context_line":"                        reason\u003dreason)"},{"line_number":463,"context_line":"            ns_names \u003d ns_names.split(\"|\")"},{"line_number":464,"context_line":"            for ns_name in ns_names:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_dda3539a","line":461,"range":{"start_line":461,"start_character":32,"end_line":461,"end_character":58},"in_reply_to":"7faddb67_4dc01f51","updated":"2019-09-02 13:01:40.000000000","message":"Done","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                    raise exception.PMEMNamespaceConfigInvalid("},{"line_number":468,"context_line":"                            reason\u003dreason)"},{"line_number":469,"context_line":"                if ns_name in vpmems_by_name:"},{"line_number":470,"context_line":"                    reason \u003d _(\"Duplicated pmem namespaces configured\")"},{"line_number":471,"context_line":"                    raise exception.PMEMNamespaceConfigInvalid("},{"line_number":472,"context_line":"                            reason\u003dreason)"},{"line_number":473,"context_line":"                pmem_ns_updated \u003d vpmems_host[ns_name]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_cde2cf01","line":470,"range":{"start_line":470,"start_character":48,"end_line":470,"end_character":58},"updated":"2019-08-30 19:17:20.000000000","message":"\"...namespace %s...\" % ns_name","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"197b7e46752fc0c94fc8a37cc6aadfffe0dea945","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                    raise exception.PMEMNamespaceConfigInvalid("},{"line_number":468,"context_line":"                            reason\u003dreason)"},{"line_number":469,"context_line":"                if ns_name in vpmems_by_name:"},{"line_number":470,"context_line":"                    reason \u003d _(\"Duplicated pmem namespaces configured\")"},{"line_number":471,"context_line":"                    raise exception.PMEMNamespaceConfigInvalid("},{"line_number":472,"context_line":"                            reason\u003dreason)"},{"line_number":473,"context_line":"                pmem_ns_updated \u003d vpmems_host[ns_name]"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_bd1bf7c8","line":470,"range":{"start_line":470,"start_character":48,"end_line":470,"end_character":58},"in_reply_to":"7faddb67_cde2cf01","updated":"2019-09-02 13:01:40.000000000","message":"Done","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                            reason\u003dreason)"},{"line_number":469,"context_line":"                if ns_name in vpmems_by_name:"},{"line_number":470,"context_line":"                    reason \u003d _(\"Duplicated pmem namespaces configured\")"},{"line_number":471,"context_line":"                    raise exception.PMEMNamespaceConfigInvalid("},{"line_number":472,"context_line":"                            reason\u003dreason)"},{"line_number":473,"context_line":"                pmem_ns_updated \u003d vpmems_host[ns_name]"},{"line_number":474,"context_line":"                pmem_ns_updated.label \u003d ns_label"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_edb0ebff","line":471,"range":{"start_line":471,"start_character":36,"end_line":471,"end_character":62},"updated":"2019-08-30 19:17:20.000000000","message":"need a test for this path","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"197b7e46752fc0c94fc8a37cc6aadfffe0dea945","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                            reason\u003dreason)"},{"line_number":469,"context_line":"                if ns_name in vpmems_by_name:"},{"line_number":470,"context_line":"                    reason \u003d _(\"Duplicated pmem namespaces configured\")"},{"line_number":471,"context_line":"                    raise exception.PMEMNamespaceConfigInvalid("},{"line_number":472,"context_line":"                            reason\u003dreason)"},{"line_number":473,"context_line":"                pmem_ns_updated \u003d vpmems_host[ns_name]"},{"line_number":474,"context_line":"                pmem_ns_updated.label \u003d ns_label"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_1d232b07","line":471,"range":{"start_line":471,"start_character":36,"end_line":471,"end_character":62},"in_reply_to":"7faddb67_edb0ebff","updated":"2019-09-02 13:01:40.000000000","message":"Done","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c6d42b760e932513fae690f3c97e2faa6f8b25c7","unresolved":false,"context_lines":[{"line_number":478,"context_line":"    def _get_vpmems_on_host(self):"},{"line_number":479,"context_line":"        vpmems_host \u003d {}"},{"line_number":480,"context_line":"        namespaces \u003d jsonutils.loads("},{"line_number":481,"context_line":"            nova.privsep.libvirt.get_pmem_namespaces())"},{"line_number":482,"context_line":"        for ns in namespaces:"},{"line_number":483,"context_line":"            if not ns.get(\u0027name\u0027):"},{"line_number":484,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_ad93d35b","line":481,"range":{"start_line":481,"start_character":33,"end_line":481,"end_character":52},"updated":"2019-08-30 19:17:20.000000000","message":"I don\u0027t have a system where I can play around with ndctl. What will happen if the command isn\u0027t available? Or if the namespaces aren\u0027t set up in devdax mode? I assume either the privsep method will raise an exception or you\u0027ll get some kind of Type/Value/KeyError below. Are those acceptable ways for things to blow up, or should we try to wrap such cases in a prettier exception?","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"197b7e46752fc0c94fc8a37cc6aadfffe0dea945","unresolved":false,"context_lines":[{"line_number":478,"context_line":"    def _get_vpmems_on_host(self):"},{"line_number":479,"context_line":"        vpmems_host \u003d {}"},{"line_number":480,"context_line":"        namespaces \u003d jsonutils.loads("},{"line_number":481,"context_line":"            nova.privsep.libvirt.get_pmem_namespaces())"},{"line_number":482,"context_line":"        for ns in namespaces:"},{"line_number":483,"context_line":"            if not ns.get(\u0027name\u0027):"},{"line_number":484,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_bd49b7b8","line":481,"range":{"start_line":481,"start_character":33,"end_line":481,"end_character":52},"in_reply_to":"7faddb67_ad93d35b","updated":"2019-09-02 13:01:40.000000000","message":"Done","commit_id":"c15656e1bf7876e408a67b82d81f254044123731"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1bd5b75eafd29956acdf5738c5ddcbe3c6afe87a","unresolved":false,"context_lines":[{"line_number":479,"context_line":"        # {\u0027RC_0\u0027: [objects.LibvirtVPMEMDevice, ...], \u0027RC_1\u0027: [...]}"},{"line_number":480,"context_line":"        vpmems_by_rc \u003d collections.defaultdict(list)"},{"line_number":481,"context_line":"        for vpmem in vpmems_by_name.values():"},{"line_number":482,"context_line":"            rc \u003d os_traits.normalize_name(\"PMEM_NAMESPACE_%s\" % vpmem.label)"},{"line_number":483,"context_line":"            vpmems_by_rc[rc].append(vpmem)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"        return vpmems_by_name, vpmems_by_rc"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_477c33b5","line":482,"range":{"start_line":482,"start_character":17,"end_line":482,"end_character":26},"updated":"2019-09-05 06:49:00.000000000","message":"os_resource_class","commit_id":"796b1e87189a487817abdba1115a1e584c42f3f1"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"7d328ad0f26cc17dacb4deffbe3b633c906bfd3e","unresolved":false,"context_lines":[{"line_number":479,"context_line":"        # {\u0027RC_0\u0027: [objects.LibvirtVPMEMDevice, ...], \u0027RC_1\u0027: [...]}"},{"line_number":480,"context_line":"        vpmems_by_rc \u003d collections.defaultdict(list)"},{"line_number":481,"context_line":"        for vpmem in vpmems_by_name.values():"},{"line_number":482,"context_line":"            rc \u003d os_traits.normalize_name(\"PMEM_NAMESPACE_%s\" % vpmem.label)"},{"line_number":483,"context_line":"            vpmems_by_rc[rc].append(vpmem)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"        return vpmems_by_name, vpmems_by_rc"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_e2642a4b","line":482,"range":{"start_line":482,"start_character":17,"end_line":482,"end_character":26},"in_reply_to":"7faddb67_477c33b5","updated":"2019-09-05 10:35:16.000000000","message":"Done","commit_id":"796b1e87189a487817abdba1115a1e584c42f3f1"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"15fa00f999006df6ca8d4cf77f89220bdd810cea","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        # vpmem list keyed by resource class"},{"line_number":479,"context_line":"        # {\u0027RC_0\u0027: [objects.LibvirtVPMEMDevice, ...], \u0027RC_1\u0027: [...]}"},{"line_number":480,"context_line":"        vpmems_by_rc \u003d collections.defaultdict(list)"},{"line_number":481,"context_line":"        for vpmem in vpmems_by_name.values():"},{"line_number":482,"context_line":"            rc \u003d os_resource_classes.normalize_name("},{"line_number":483,"context_line":"                    \"PMEM_NAMESPACE_%s\" % vpmem.label)"},{"line_number":484,"context_line":"            vpmems_by_rc[rc].append(vpmem)"}],"source_content_type":"text/x-python","patch_set":19,"id":"7faddb67_16c5085c","line":481,"range":{"start_line":481,"start_character":0,"end_line":481,"end_character":45},"updated":"2019-09-05 13:31:23.000000000","message":"nit, you could still fold this into the loop above","commit_id":"ceb63f35d2b7ebbdb4eb393f3b44eba015dbe2ec"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"2e1d6f7e93771913e071979508c881a2e61c6101","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        # vpmem list keyed by resource class"},{"line_number":479,"context_line":"        # {\u0027RC_0\u0027: [objects.LibvirtVPMEMDevice, ...], \u0027RC_1\u0027: [...]}"},{"line_number":480,"context_line":"        vpmems_by_rc \u003d collections.defaultdict(list)"},{"line_number":481,"context_line":"        for vpmem in vpmems_by_name.values():"},{"line_number":482,"context_line":"            rc \u003d os_resource_classes.normalize_name("},{"line_number":483,"context_line":"                    \"PMEM_NAMESPACE_%s\" % vpmem.label)"},{"line_number":484,"context_line":"            vpmems_by_rc[rc].append(vpmem)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5faad753_6e4c7e76","line":481,"range":{"start_line":481,"start_character":0,"end_line":481,"end_character":45},"in_reply_to":"7faddb67_16c5085c","updated":"2019-09-06 10:40:24.000000000","message":"Done","commit_id":"ceb63f35d2b7ebbdb4eb393f3b44eba015dbe2ec"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":36,"context_line":"import itertools"},{"line_number":37,"context_line":"import operator"},{"line_number":38,"context_line":"import os"},{"line_number":39,"context_line":"import os_resource_classes"},{"line_number":40,"context_line":"import pwd"},{"line_number":41,"context_line":"import random"},{"line_number":42,"context_line":"import shutil"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_fbf46989","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":26},"updated":"2019-09-10 15:28:54.000000000","message":"This is already done","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d083fa960afc5c0caa2d6e0df55f1803f87727be","unresolved":false,"context_lines":[{"line_number":36,"context_line":"import itertools"},{"line_number":37,"context_line":"import operator"},{"line_number":38,"context_line":"import os"},{"line_number":39,"context_line":"import os_resource_classes"},{"line_number":40,"context_line":"import pwd"},{"line_number":41,"context_line":"import random"},{"line_number":42,"context_line":"import shutil"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_133cc1bd","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":26},"in_reply_to":"5faad753_fbf46989","updated":"2019-09-11 08:13:34.000000000","message":"Done","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":54,"context_line":"from os_brick.encryptors import luks as luks_encryptor"},{"line_number":55,"context_line":"from os_brick import exception as brick_exception"},{"line_number":56,"context_line":"from os_brick.initiator import connector"},{"line_number":57,"context_line":"import os_resource_classes as orc"},{"line_number":58,"context_line":"import os_traits as ot"},{"line_number":59,"context_line":"from oslo_concurrency import processutils"},{"line_number":60,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_5b2b3dea","line":57,"range":{"start_line":57,"start_character":0,"end_line":57,"end_character":33},"updated":"2019-09-10 15:28:54.000000000","message":"here","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        self._vpmems_by_name, self._vpmems_by_rc \u003d self._discover_vpmems()"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    def _discover_vpmems(self, vpmem_conf\u003dNone):"},{"line_number":434,"context_line":"        \"\"\"Discover vpmems on host and configuration."},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        :param vpmem_conf: pmem namespaces configuration from CONF"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_5b06dd88","line":433,"range":{"start_line":433,"start_character":31,"end_line":433,"end_character":47},"updated":"2019-09-10 15:28:54.000000000","message":"Was going to say this needs to be populated, but you\u0027re turning it on later. You should call that out in the commit message","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"7b134e09c830d7f7b06f205611072d4d76fe4187","unresolved":false,"context_lines":[{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        self._vpmems_by_name, self._vpmems_by_rc \u003d self._discover_vpmems()"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    def _discover_vpmems(self, vpmem_conf\u003dNone):"},{"line_number":434,"context_line":"        \"\"\"Discover vpmems on host and configuration."},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"        :param vpmem_conf: pmem namespaces configuration from CONF"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_c03f2423","line":433,"range":{"start_line":433,"start_character":31,"end_line":433,"end_character":47},"in_reply_to":"5faad753_5b06dd88","updated":"2019-09-11 11:38:30.000000000","message":"Done","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        :param vpmem_conf: pmem namespaces configuration from CONF"},{"line_number":437,"context_line":"        :returns: a dict of vpmem keyed by name, and"},{"line_number":438,"context_line":"                  a dict of vpmem list keyed by resource class"},{"line_number":439,"context_line":"        \"\"\""},{"line_number":440,"context_line":"        if not vpmem_conf:"},{"line_number":441,"context_line":"            return {}, {}"},{"line_number":442,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_db3e4d28","line":439,"updated":"2019-09-10 15:28:54.000000000","message":"Add\n\n  :raises: exception.InternalError if ...","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d083fa960afc5c0caa2d6e0df55f1803f87727be","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        :param vpmem_conf: pmem namespaces configuration from CONF"},{"line_number":437,"context_line":"        :returns: a dict of vpmem keyed by name, and"},{"line_number":438,"context_line":"                  a dict of vpmem list keyed by resource class"},{"line_number":439,"context_line":"        \"\"\""},{"line_number":440,"context_line":"        if not vpmem_conf:"},{"line_number":441,"context_line":"            return {}, {}"},{"line_number":442,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_383bdaeb","line":439,"in_reply_to":"5faad753_db3e4d28","updated":"2019-09-11 08:13:34.000000000","message":"Done","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":438,"context_line":"                  a dict of vpmem list keyed by resource class"},{"line_number":439,"context_line":"        \"\"\""},{"line_number":440,"context_line":"        if not vpmem_conf:"},{"line_number":441,"context_line":"            return {}, {}"},{"line_number":442,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":443,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"},{"line_number":444,"context_line":"            raise exception.InternalError("}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_3b38c13b","line":441,"updated":"2019-09-10 15:28:54.000000000","message":"nit: can you add a newline under here","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d083fa960afc5c0caa2d6e0df55f1803f87727be","unresolved":false,"context_lines":[{"line_number":438,"context_line":"                  a dict of vpmem list keyed by resource class"},{"line_number":439,"context_line":"        \"\"\""},{"line_number":440,"context_line":"        if not vpmem_conf:"},{"line_number":441,"context_line":"            return {}, {}"},{"line_number":442,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":443,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"},{"line_number":444,"context_line":"            raise exception.InternalError("}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_583ed6da","line":441,"in_reply_to":"5faad753_3b38c13b","updated":"2019-09-11 08:13:34.000000000","message":"Done","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":441,"context_line":"            return {}, {}"},{"line_number":442,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":443,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"},{"line_number":444,"context_line":"            raise exception.InternalError("},{"line_number":445,"context_line":"                _(\u0027Nova requires QEMU version %(qemu)s or greater \u0027"},{"line_number":446,"context_line":"                  \u0027and Libvirt version %(libvirt)s or greater \u0027"},{"line_number":447,"context_line":"                  \u0027for NVDIMM (Persistent Memory) support.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_7b1719a5","line":444,"range":{"start_line":444,"start_character":18,"end_line":444,"end_character":41},"updated":"2019-09-10 15:28:54.000000000","message":"sean-k-mooney called this out in a review of mine, but shouldn\u0027t this be InvalidConfig since it\u0027s a user configuration issue (they\u0027re trying to use a feature with a libvirt/QEMU version that doesn\u0027t support it)","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"7b134e09c830d7f7b06f205611072d4d76fe4187","unresolved":false,"context_lines":[{"line_number":441,"context_line":"            return {}, {}"},{"line_number":442,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":443,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"},{"line_number":444,"context_line":"            raise exception.InternalError("},{"line_number":445,"context_line":"                _(\u0027Nova requires QEMU version %(qemu)s or greater \u0027"},{"line_number":446,"context_line":"                  \u0027and Libvirt version %(libvirt)s or greater \u0027"},{"line_number":447,"context_line":"                  \u0027for NVDIMM (Persistent Memory) support.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_ebaa41d0","line":444,"range":{"start_line":444,"start_character":18,"end_line":444,"end_character":41},"in_reply_to":"5faad753_3ac8a920","updated":"2019-09-11 11:38:30.000000000","message":"Okay, Done","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c25935240981ac01b2fbc25cf16ab98dd4fcb6ca","unresolved":false,"context_lines":[{"line_number":441,"context_line":"            return {}, {}"},{"line_number":442,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":443,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"},{"line_number":444,"context_line":"            raise exception.InternalError("},{"line_number":445,"context_line":"                _(\u0027Nova requires QEMU version %(qemu)s or greater \u0027"},{"line_number":446,"context_line":"                  \u0027and Libvirt version %(libvirt)s or greater \u0027"},{"line_number":447,"context_line":"                  \u0027for NVDIMM (Persistent Memory) support.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_3ac8a920","line":444,"range":{"start_line":444,"start_character":18,"end_line":444,"end_character":41},"in_reply_to":"5faad753_74adda86","updated":"2019-09-11 09:51:20.000000000","message":"Yeah, see https://review.opendev.org/#/c/678453/24/nova/virt/libvirt/driver.py@644 below. If these should be InvalidConfig, they should all be changed, and that should be done later.","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d083fa960afc5c0caa2d6e0df55f1803f87727be","unresolved":false,"context_lines":[{"line_number":441,"context_line":"            return {}, {}"},{"line_number":442,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":443,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"},{"line_number":444,"context_line":"            raise exception.InternalError("},{"line_number":445,"context_line":"                _(\u0027Nova requires QEMU version %(qemu)s or greater \u0027"},{"line_number":446,"context_line":"                  \u0027and Libvirt version %(libvirt)s or greater \u0027"},{"line_number":447,"context_line":"                  \u0027for NVDIMM (Persistent Memory) support.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_f369e5bd","line":444,"range":{"start_line":444,"start_character":18,"end_line":444,"end_character":41},"in_reply_to":"5faad753_7b1719a5","updated":"2019-09-11 08:13:34.000000000","message":"I saw all exception about QEMU and Libvirt are all InteralError, and why tring to use the feature with wrong Libvirt/QEMU version, does it make sense?","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"23d2e009cb2f22b3f7057dd78c0a221182bbd785","unresolved":false,"context_lines":[{"line_number":441,"context_line":"            return {}, {}"},{"line_number":442,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":443,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"},{"line_number":444,"context_line":"            raise exception.InternalError("},{"line_number":445,"context_line":"                _(\u0027Nova requires QEMU version %(qemu)s or greater \u0027"},{"line_number":446,"context_line":"                  \u0027and Libvirt version %(libvirt)s or greater \u0027"},{"line_number":447,"context_line":"                  \u0027for NVDIMM (Persistent Memory) support.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_74adda86","line":444,"range":{"start_line":444,"start_character":18,"end_line":444,"end_character":41},"in_reply_to":"5faad753_f369e5bd","updated":"2019-09-11 08:32:40.000000000","message":"\u003e I saw all exception about QEMU and Libvirt are all InteralError,\n \u003e and why tring to use the feature with wrong Libvirt/QEMU version,\n \u003e does it make sense?\n\nUsers might not voluntarily use a wrong version, but it can be case that they can\u0027t upgrade to a newer libvirt/QEMU version for any number of reasons. :-)","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":450,"context_line":"                \u0027libvirt\u0027: libvirt_utils.version_to_string("},{"line_number":451,"context_line":"                    MIN_LIBVIRT_PMEM_SUPPORT)})"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"        # vpmem keyed by name {name: objects.LibvirtVPMEMDevice,...}"},{"line_number":454,"context_line":"        vpmems_by_name \u003d {}"},{"line_number":455,"context_line":"        # vpmem list keyed by resource class"},{"line_number":456,"context_line":"        # {\u0027RC_0\u0027: [objects.LibvirtVPMEMDevice, ...], \u0027RC_1\u0027: [...]}"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_fb222901","line":453,"updated":"2019-09-10 15:28:54.000000000","message":"++ more of these comments","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":459,"context_line":"        vpmems_host \u003d self._get_vpmems_on_host()"},{"line_number":460,"context_line":"        for ns_conf in vpmem_conf:"},{"line_number":461,"context_line":"            try:"},{"line_number":462,"context_line":"                ns_label, ns_names \u003d ns_conf.split(\":\", 1)"},{"line_number":463,"context_line":"            except ValueError:"},{"line_number":464,"context_line":"                reason \u003d _(\"The configuration doesn\u0027t follow the format\")"},{"line_number":465,"context_line":"                raise exception.PMEMNamespaceConfigInvalid("}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_9b769506","line":462,"range":{"start_line":462,"start_character":56,"end_line":462,"end_character":57},"updated":"2019-09-10 15:28:54.000000000","message":"side note: I didn\u0027t know (or had forgotten) you could do this. Usually people use \u0027partition\u0027 for this, but this is better","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":471,"context_line":"                    raise exception.PMEMNamespaceConfigInvalid("},{"line_number":472,"context_line":"                            reason\u003dreason)"},{"line_number":473,"context_line":"                if ns_name in vpmems_by_name:"},{"line_number":474,"context_line":"                    reason \u003d _(\"Duplicated PMEM namespace %s configured\") % \\"},{"line_number":475,"context_line":"                                ns_name"},{"line_number":476,"context_line":"                    raise exception.PMEMNamespaceConfigInvalid("},{"line_number":477,"context_line":"                            reason\u003dreason)"},{"line_number":478,"context_line":"                pmem_ns_updated \u003d vpmems_host[ns_name]"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_1b5ce57c","line":475,"range":{"start_line":474,"start_character":76,"end_line":475,"end_character":39},"updated":"2019-09-10 15:28:54.000000000","message":"nit: just use brackets","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d083fa960afc5c0caa2d6e0df55f1803f87727be","unresolved":false,"context_lines":[{"line_number":471,"context_line":"                    raise exception.PMEMNamespaceConfigInvalid("},{"line_number":472,"context_line":"                            reason\u003dreason)"},{"line_number":473,"context_line":"                if ns_name in vpmems_by_name:"},{"line_number":474,"context_line":"                    reason \u003d _(\"Duplicated PMEM namespace %s configured\") % \\"},{"line_number":475,"context_line":"                                ns_name"},{"line_number":476,"context_line":"                    raise exception.PMEMNamespaceConfigInvalid("},{"line_number":477,"context_line":"                            reason\u003dreason)"},{"line_number":478,"context_line":"                pmem_ns_updated \u003d vpmems_host[ns_name]"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_73ff3501","line":475,"range":{"start_line":474,"start_character":76,"end_line":475,"end_character":39},"in_reply_to":"5faad753_1b5ce57c","updated":"2019-09-11 08:13:34.000000000","message":"Done","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        \"\"\"Get PMEM namespaces on host using ndctl utility.\"\"\""},{"line_number":489,"context_line":"        vpmems_host \u003d {}"},{"line_number":490,"context_line":"        try:"},{"line_number":491,"context_line":"            namespaces \u003d jsonutils.loads("},{"line_number":492,"context_line":"                nova.privsep.libvirt.get_pmem_namespaces())"},{"line_number":493,"context_line":"        except OSError:"},{"line_number":494,"context_line":"            reason \u003d _(\"Get PMEM namespaces by ndctl utility, \""},{"line_number":495,"context_line":"                       \"please ensure ndctl is installed\")"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_1b9f0504","line":492,"range":{"start_line":491,"start_character":0,"end_line":492,"end_character":59},"updated":"2019-09-10 15:28:54.000000000","message":"Just do the call to \u0027get_pmem_namespaces\u0027 here\n\n  output \u003d nova.privsep.libvirt.get_pmem_namespaces()\n\njsonutils.loads can raise ValueError but you\u0027re not handling (nor do you need to, IMO) that so doing the conversion inside the try-except is misleading","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"7b134e09c830d7f7b06f205611072d4d76fe4187","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        \"\"\"Get PMEM namespaces on host using ndctl utility.\"\"\""},{"line_number":489,"context_line":"        vpmems_host \u003d {}"},{"line_number":490,"context_line":"        try:"},{"line_number":491,"context_line":"            namespaces \u003d jsonutils.loads("},{"line_number":492,"context_line":"                nova.privsep.libvirt.get_pmem_namespaces())"},{"line_number":493,"context_line":"        except OSError:"},{"line_number":494,"context_line":"            reason \u003d _(\"Get PMEM namespaces by ndctl utility, \""},{"line_number":495,"context_line":"                       \"please ensure ndctl is installed\")"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_a0722810","line":492,"range":{"start_line":491,"start_character":0,"end_line":492,"end_character":59},"in_reply_to":"5faad753_1b9f0504","updated":"2019-09-11 11:38:30.000000000","message":"Done","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d083fa960afc5c0caa2d6e0df55f1803f87727be","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        \"\"\"Get PMEM namespaces on host using ndctl utility.\"\"\""},{"line_number":489,"context_line":"        vpmems_host \u003d {}"},{"line_number":490,"context_line":"        try:"},{"line_number":491,"context_line":"            namespaces \u003d jsonutils.loads("},{"line_number":492,"context_line":"                nova.privsep.libvirt.get_pmem_namespaces())"},{"line_number":493,"context_line":"        except OSError:"},{"line_number":494,"context_line":"            reason \u003d _(\"Get PMEM namespaces by ndctl utility, \""},{"line_number":495,"context_line":"                       \"please ensure ndctl is installed\")"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_932bd180","line":492,"range":{"start_line":491,"start_character":0,"end_line":492,"end_character":59},"in_reply_to":"5faad753_1b9f0504","updated":"2019-09-11 08:13:34.000000000","message":"if ndctl utility is installed as expected, nova.privsep.libvirt.get_pmem_namespaces() will always return a json array, so jsonutils.loads will not trigger any exception. If ndctl not installed, it will trigger OSError.","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c25935240981ac01b2fbc25cf16ab98dd4fcb6ca","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        \"\"\"Get PMEM namespaces on host using ndctl utility.\"\"\""},{"line_number":489,"context_line":"        vpmems_host \u003d {}"},{"line_number":490,"context_line":"        try:"},{"line_number":491,"context_line":"            namespaces \u003d jsonutils.loads("},{"line_number":492,"context_line":"                nova.privsep.libvirt.get_pmem_namespaces())"},{"line_number":493,"context_line":"        except OSError:"},{"line_number":494,"context_line":"            reason \u003d _(\"Get PMEM namespaces by ndctl utility, \""},{"line_number":495,"context_line":"                       \"please ensure ndctl is installed\")"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_ba3fb923","line":492,"range":{"start_line":491,"start_character":0,"end_line":492,"end_character":59},"in_reply_to":"5faad753_932bd180","updated":"2019-09-11 09:51:20.000000000","message":"I think Stephen is saying you should do the jsonutils.loads() part outside of the try/except.","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"898ceb98afd0323a95060d35663487854703a052","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                       \"please ensure ndctl is installed\")"},{"line_number":496,"context_line":"            raise exception.GetPMEMNamespacesFailed(reason\u003dreason)"},{"line_number":497,"context_line":"        for ns in namespaces:"},{"line_number":498,"context_line":"            if not ns.get(\u0027name\u0027):"},{"line_number":499,"context_line":"                continue"},{"line_number":500,"context_line":"            vpmems_host[ns[\u0027name\u0027]] \u003d objects.LibvirtVPMEMDevice("},{"line_number":501,"context_line":"                name\u003dns[\u0027name\u0027],"},{"line_number":502,"context_line":"                devpath\u003d \u0027/dev/\u0027 + ns[\u0027daxregion\u0027][\u0027devices\u0027][0][\u0027chardev\u0027],"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_3ba2014d","line":499,"range":{"start_line":498,"start_character":0,"end_line":499,"end_character":24},"updated":"2019-09-10 15:28:54.000000000","message":"Why might this happen? Can you add a comment?","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"7b134e09c830d7f7b06f205611072d4d76fe4187","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                       \"please ensure ndctl is installed\")"},{"line_number":496,"context_line":"            raise exception.GetPMEMNamespacesFailed(reason\u003dreason)"},{"line_number":497,"context_line":"        for ns in namespaces:"},{"line_number":498,"context_line":"            if not ns.get(\u0027name\u0027):"},{"line_number":499,"context_line":"                continue"},{"line_number":500,"context_line":"            vpmems_host[ns[\u0027name\u0027]] \u003d objects.LibvirtVPMEMDevice("},{"line_number":501,"context_line":"                name\u003dns[\u0027name\u0027],"},{"line_number":502,"context_line":"                devpath\u003d \u0027/dev/\u0027 + ns[\u0027daxregion\u0027][\u0027devices\u0027][0][\u0027chardev\u0027],"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_20607832","line":499,"range":{"start_line":498,"start_character":0,"end_line":499,"end_character":24},"in_reply_to":"5faad753_3ba2014d","updated":"2019-09-11 11:38:30.000000000","message":"Done","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d083fa960afc5c0caa2d6e0df55f1803f87727be","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                       \"please ensure ndctl is installed\")"},{"line_number":496,"context_line":"            raise exception.GetPMEMNamespacesFailed(reason\u003dreason)"},{"line_number":497,"context_line":"        for ns in namespaces:"},{"line_number":498,"context_line":"            if not ns.get(\u0027name\u0027):"},{"line_number":499,"context_line":"                continue"},{"line_number":500,"context_line":"            vpmems_host[ns[\u0027name\u0027]] \u003d objects.LibvirtVPMEMDevice("},{"line_number":501,"context_line":"                name\u003dns[\u0027name\u0027],"},{"line_number":502,"context_line":"                devpath\u003d \u0027/dev/\u0027 + ns[\u0027daxregion\u0027][\u0027devices\u0027][0][\u0027chardev\u0027],"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_734df570","line":499,"range":{"start_line":498,"start_character":0,"end_line":499,"end_character":24},"in_reply_to":"5faad753_3ba2014d","updated":"2019-09-11 08:13:34.000000000","message":"It\u0027s parsing from ndctl\u0027s return.\nI\u0027ll add comment here.","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c25935240981ac01b2fbc25cf16ab98dd4fcb6ca","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                       \"please ensure ndctl is installed\")"},{"line_number":496,"context_line":"            raise exception.GetPMEMNamespacesFailed(reason\u003dreason)"},{"line_number":497,"context_line":"        for ns in namespaces:"},{"line_number":498,"context_line":"            if not ns.get(\u0027name\u0027):"},{"line_number":499,"context_line":"                continue"},{"line_number":500,"context_line":"            vpmems_host[ns[\u0027name\u0027]] \u003d objects.LibvirtVPMEMDevice("},{"line_number":501,"context_line":"                name\u003dns[\u0027name\u0027],"},{"line_number":502,"context_line":"                devpath\u003d \u0027/dev/\u0027 + ns[\u0027daxregion\u0027][\u0027devices\u0027][0][\u0027chardev\u0027],"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_5a1805d2","line":499,"range":{"start_line":498,"start_character":0,"end_line":499,"end_character":24},"in_reply_to":"5faad753_734df570","updated":"2019-09-11 09:51:20.000000000","message":"I think Stephen is asking you to add a comment explaining the circumstances under which ns[\u0027name\u0027] could be absent (or empty).","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c25935240981ac01b2fbc25cf16ab98dd4fcb6ca","unresolved":false,"context_lines":[{"line_number":641,"context_line":"        if CONF.libvirt.virt_type !\u003d \"kvm\":"},{"line_number":642,"context_line":"            guestfs.force_tcg()"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"        if not self._host.has_min_version(MIN_LIBVIRT_VERSION):"},{"line_number":645,"context_line":"            raise exception.InternalError("},{"line_number":646,"context_line":"                _(\u0027Nova requires libvirt version %s or greater.\u0027) %"},{"line_number":647,"context_line":"                libvirt_utils.version_to_string(MIN_LIBVIRT_VERSION))"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_fa5c517f","line":644,"updated":"2019-09-11 09:51:20.000000000","message":"starting here","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e0b13335837134bc8254ef4da395e5ef8c057a8f","unresolved":false,"context_lines":[{"line_number":641,"context_line":"        if CONF.libvirt.virt_type !\u003d \"kvm\":"},{"line_number":642,"context_line":"            guestfs.force_tcg()"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"        if not self._host.has_min_version(MIN_LIBVIRT_VERSION):"},{"line_number":645,"context_line":"            raise exception.InternalError("},{"line_number":646,"context_line":"                _(\u0027Nova requires libvirt version %s or greater.\u0027) %"},{"line_number":647,"context_line":"                libvirt_utils.version_to_string(MIN_LIBVIRT_VERSION))"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_eb9ec152","line":644,"in_reply_to":"5faad753_cb98a5c1","updated":"2019-09-11 12:15:08.000000000","message":"I was just pointing out the precedent you mentioned for using InternalError rather than InvalidConfig.","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"7b134e09c830d7f7b06f205611072d4d76fe4187","unresolved":false,"context_lines":[{"line_number":641,"context_line":"        if CONF.libvirt.virt_type !\u003d \"kvm\":"},{"line_number":642,"context_line":"            guestfs.force_tcg()"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"        if not self._host.has_min_version(MIN_LIBVIRT_VERSION):"},{"line_number":645,"context_line":"            raise exception.InternalError("},{"line_number":646,"context_line":"                _(\u0027Nova requires libvirt version %s or greater.\u0027) %"},{"line_number":647,"context_line":"                libvirt_utils.version_to_string(MIN_LIBVIRT_VERSION))"}],"source_content_type":"text/x-python","patch_set":24,"id":"5faad753_cb98a5c1","line":644,"in_reply_to":"5faad753_fa5c517f","updated":"2019-09-11 11:38:30.000000000","message":"Do you mean put the Libvirt\u0026QEMU version check here? if we don\u0027t need vpmem feature support , it\u0027s no need to check the version.","commit_id":"6d533cd38d77bf2ef8f5e25787b89795888cfc34"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e0b13335837134bc8254ef4da395e5ef8c057a8f","unresolved":false,"context_lines":[{"line_number":444,"context_line":""},{"line_number":445,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":446,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"},{"line_number":447,"context_line":"            raise exception.InvalidConfiguration("},{"line_number":448,"context_line":"                _(\u0027Nova requires QEMU version %(qemu)s or greater \u0027"},{"line_number":449,"context_line":"                  \u0027and Libvirt version %(libvirt)s or greater \u0027"},{"line_number":450,"context_line":"                  \u0027for NVDIMM (Persistent Memory) support.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":27,"id":"5faad753_cbfae573","line":447,"range":{"start_line":447,"start_character":28,"end_line":447,"end_character":48},"updated":"2019-09-11 12:15:08.000000000","message":"Sorry this wasn\u0027t clear -- I think this should remain InternalError to stay consistent with the other exceptions starting at L652. In a future commit we can change them *all* to InvalidConfig if desired.\n\n...unless Stephen/Kashyap feel otherwise. In which case the docstring on L439 needs to be changed to match.","commit_id":"ab4be1ec699bc86a7012a1cc863cc8b86b58340d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1a9f2ed94b4de4ebca8862fd00cc1339752a6e6a","unresolved":false,"context_lines":[{"line_number":444,"context_line":""},{"line_number":445,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":446,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"},{"line_number":447,"context_line":"            raise exception.InvalidConfiguration("},{"line_number":448,"context_line":"                _(\u0027Nova requires QEMU version %(qemu)s or greater \u0027"},{"line_number":449,"context_line":"                  \u0027and Libvirt version %(libvirt)s or greater \u0027"},{"line_number":450,"context_line":"                  \u0027for NVDIMM (Persistent Memory) support.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":27,"id":"5faad753_ba0ed42f","line":447,"range":{"start_line":447,"start_character":28,"end_line":447,"end_character":48},"in_reply_to":"5faad753_06deb43e","updated":"2019-09-11 12:52:01.000000000","message":"Upon further discussion it sounds like we would rather be correct than consistent. So let\u0027s just update the docstring on L439 and move on.","commit_id":"ab4be1ec699bc86a7012a1cc863cc8b86b58340d"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"7391b704a5fde815128e38521980b0ad885a5a9c","unresolved":false,"context_lines":[{"line_number":444,"context_line":""},{"line_number":445,"context_line":"        if not self._host.has_min_version(lv_ver\u003dMIN_LIBVIRT_PMEM_SUPPORT,"},{"line_number":446,"context_line":"                                          hv_ver\u003dMIN_QEMU_PMEM_SUPPORT):"},{"line_number":447,"context_line":"            raise exception.InvalidConfiguration("},{"line_number":448,"context_line":"                _(\u0027Nova requires QEMU version %(qemu)s or greater \u0027"},{"line_number":449,"context_line":"                  \u0027and Libvirt version %(libvirt)s or greater \u0027"},{"line_number":450,"context_line":"                  \u0027for NVDIMM (Persistent Memory) support.\u0027) % {"}],"source_content_type":"text/x-python","patch_set":27,"id":"5faad753_06deb43e","line":447,"range":{"start_line":447,"start_character":28,"end_line":447,"end_character":48},"in_reply_to":"5faad753_cbfae573","updated":"2019-09-11 12:29:22.000000000","message":"I agree with Eric; FWIW, suggest InternalError to be consistent.  And indeed, we can tackle the \"use the right kind of exception\" problem in a future patch.\n\n(And yes, good catch on docstring.)","commit_id":"ab4be1ec699bc86a7012a1cc863cc8b86b58340d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e0b13335837134bc8254ef4da395e5ef8c057a8f","unresolved":false,"context_lines":[{"line_number":503,"context_line":"            if not ns.get(\u0027name\u0027):"},{"line_number":504,"context_line":"                # The name is used to identify namespaces, it\u0027s optional"},{"line_number":505,"context_line":"                # config when creating namespace. If an namespace don\u0027t have"},{"line_number":506,"context_line":"                # name, it can not be used by Nova, we will skip it."},{"line_number":507,"context_line":"                continue"},{"line_number":508,"context_line":"            vpmems_host[ns[\u0027name\u0027]] \u003d objects.LibvirtVPMEMDevice("},{"line_number":509,"context_line":"                name\u003dns[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":27,"id":"5faad753_2b393940","line":506,"updated":"2019-09-11 12:15:08.000000000","message":"++","commit_id":"ab4be1ec699bc86a7012a1cc863cc8b86b58340d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"43c5484b1287cd3d4d14d523f1da0389dd9a93fc","unresolved":false,"context_lines":[{"line_number":494,"context_line":"        except OSError:"},{"line_number":495,"context_line":"            reason \u003d _(\"Get PMEM namespaces by ndctl utility, \""},{"line_number":496,"context_line":"                       \"please ensure ndctl is installed\")"},{"line_number":497,"context_line":"            raise exception.GetPMEMNamespacesFailed(reason\u003dreason)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"        namespaces \u003d jsonutils.loads(output)"},{"line_number":500,"context_line":"        vpmems_host \u003d {}  # keyed by namespace name"}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_7fb4c635","line":497,"updated":"2019-09-11 16:50:17.000000000","message":"You need to catch \u0027processutils.ProcessExecutionError\u0027 too since it looks like this utility can fail [1] [2]. I don\u0027t know what those failures mean but they\u0027re real things.\n\n[1] https://github.com/pmem/ndctl/blob/f407a8b346412be03db93bd5245314ae7d07a0e5/daxctl/list.c#L117\n[2] https://github.com/pmem/ndctl/blob/f407a8b346412be03db93bd5245314ae7d07a0e5/daxctl/list.c#L125","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"01c52a564ed4b1539cd96570db7ea4d1840eda17","unresolved":false,"context_lines":[{"line_number":494,"context_line":"        except OSError:"},{"line_number":495,"context_line":"            reason \u003d _(\"Get PMEM namespaces by ndctl utility, \""},{"line_number":496,"context_line":"                       \"please ensure ndctl is installed\")"},{"line_number":497,"context_line":"            raise exception.GetPMEMNamespacesFailed(reason\u003dreason)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"        namespaces \u003d jsonutils.loads(output)"},{"line_number":500,"context_line":"        vpmems_host \u003d {}  # keyed by namespace name"}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_22d63251","line":497,"in_reply_to":"5faad753_7fb4c635","updated":"2019-09-11 18:07:04.000000000","message":"I would like also catch all exceptions and print them later with reraised excetion.","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"43c5484b1287cd3d4d14d523f1da0389dd9a93fc","unresolved":false,"context_lines":[{"line_number":495,"context_line":"            reason \u003d _(\"Get PMEM namespaces by ndctl utility, \""},{"line_number":496,"context_line":"                       \"please ensure ndctl is installed\")"},{"line_number":497,"context_line":"            raise exception.GetPMEMNamespacesFailed(reason\u003dreason)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"        namespaces \u003d jsonutils.loads(output)"},{"line_number":500,"context_line":"        vpmems_host \u003d {}  # keyed by namespace name"},{"line_number":501,"context_line":"        for ns in namespaces:"}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_e49fcb00","line":498,"updated":"2019-09-11 16:50:17.000000000","message":"so here, you\u0027d do:\n\n   namespaces \u003d []\n   if output:\n       namespaces \u003d jsonutils.loads(output)","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"09f5255b5af822ed759f8e931f20eb1852b49eca","unresolved":false,"context_lines":[{"line_number":495,"context_line":"            reason \u003d _(\"Get PMEM namespaces by ndctl utility, \""},{"line_number":496,"context_line":"                       \"please ensure ndctl is installed\")"},{"line_number":497,"context_line":"            raise exception.GetPMEMNamespacesFailed(reason\u003dreason)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"        namespaces \u003d jsonutils.loads(output)"},{"line_number":500,"context_line":"        vpmems_host \u003d {}  # keyed by namespace name"},{"line_number":501,"context_line":"        for ns in namespaces:"}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_828926cb","line":498,"in_reply_to":"5faad753_628d0a7a","updated":"2019-09-11 18:40:43.000000000","message":"that should be fine too","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"03c86284ece616b6d18e08c4cc2a8cc058ef4d4e","unresolved":false,"context_lines":[{"line_number":495,"context_line":"            reason \u003d _(\"Get PMEM namespaces by ndctl utility, \""},{"line_number":496,"context_line":"                       \"please ensure ndctl is installed\")"},{"line_number":497,"context_line":"            raise exception.GetPMEMNamespacesFailed(reason\u003dreason)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"        namespaces \u003d jsonutils.loads(output)"},{"line_number":500,"context_line":"        vpmems_host \u003d {}  # keyed by namespace name"},{"line_number":501,"context_line":"        for ns in namespaces:"}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_bfff9e32","line":498,"in_reply_to":"5faad753_e49fcb00","updated":"2019-09-11 17:08:04.000000000","message":"++","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"01c52a564ed4b1539cd96570db7ea4d1840eda17","unresolved":false,"context_lines":[{"line_number":495,"context_line":"            reason \u003d _(\"Get PMEM namespaces by ndctl utility, \""},{"line_number":496,"context_line":"                       \"please ensure ndctl is installed\")"},{"line_number":497,"context_line":"            raise exception.GetPMEMNamespacesFailed(reason\u003dreason)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"        namespaces \u003d jsonutils.loads(output)"},{"line_number":500,"context_line":"        vpmems_host \u003d {}  # keyed by namespace name"},{"line_number":501,"context_line":"        for ns in namespaces:"}],"source_content_type":"text/x-python","patch_set":28,"id":"5faad753_628d0a7a","line":498,"in_reply_to":"5faad753_e49fcb00","updated":"2019-09-11 18:07:04.000000000","message":"What about:\n\n    if not output:\n        return {}\n    namespaces \u003d jsonutils.loads(output)","commit_id":"113dff6c0b45ea1ee68ea1fb501b23c4f253038f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f693c3121f6448f4aab302a3d6b86091427ebab3","unresolved":false,"context_lines":[{"line_number":502,"context_line":"                    \"please ensure ndctl is installed: %s\") % e"},{"line_number":503,"context_line":"            raise exception.GetPMEMNamespacesFailed(reason\u003dreason)"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"        if not output:"},{"line_number":506,"context_line":"            return {}"},{"line_number":507,"context_line":"        namespaces \u003d jsonutils.loads(output)"},{"line_number":508,"context_line":"        vpmems_host \u003d {}  # keyed by namespace name"},{"line_number":509,"context_line":"        for ns in namespaces:"}],"source_content_type":"text/x-python","patch_set":33,"id":"5faad753_b4a8098c","line":506,"range":{"start_line":505,"start_character":0,"end_line":506,"end_character":21},"updated":"2019-09-12 15:59:40.000000000","message":"much better","commit_id":"0eb722767992727fcc67b453703238672cb7f044"}]}
