)]}'
{"nova/tests/unit/virt/libvirt/fakelibvirt.py":[{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"abd9d11ea9be1b104d0fbce76016b9cac3246a53","unresolved":false,"context_lines":[{"line_number":1607,"context_line":"      \u003cmachine\u003eg3beige\u003c/machine\u003e"},{"line_number":1608,"context_line":"      \u003cmachine\u003evirtex-ml507\u003c/machine\u003e"},{"line_number":1609,"context_line":"      \u003cmachine\u003empc8544ds\u003c/machine\u003e"},{"line_number":1610,"context_line":"      \u003cmachine canonical\u003d\u0027bamboo-0.13\u0027\u003ebamboo\u003c/machine\u003e"},{"line_number":1611,"context_line":"      \u003cmachine\u003ebamboo-0.13\u003c/machine\u003e"},{"line_number":1612,"context_line":"      \u003cmachine\u003ebamboo-0.12\u003c/machine\u003e"},{"line_number":1613,"context_line":"      \u003cmachine\u003eref405ep\u003c/machine\u003e"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_3642e8ac","side":"PARENT","line":1610,"updated":"2019-07-30 09:21:08.000000000","message":"Removal explained in the commit message.","commit_id":"f1426d128ef504ce364828720ac1d08435dbdeb8"}],"nova/tests/unit/virt/libvirt/test_config.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"812581c8719945055b0a0c19641c74ade05d8c4a","unresolved":false,"context_lines":[{"line_number":152,"context_line":"          \u003cguest\u003e"},{"line_number":153,"context_line":"            \u003cos_type\u003ehvm\u003c/os_type\u003e"},{"line_number":154,"context_line":"            \u003carch name\u003d\u0027x86_64\u0027\u003e"},{"line_number":155,"context_line":"              \u003cemulator\u003e/usr/bin/qemu-system-x86_64\u003c/emulator\u003e"},{"line_number":156,"context_line":"              \u003cmachine maxCpus\u003d\u0027255\u0027\u003epc-i440fx-2.11\u003c/machine\u003e"},{"line_number":157,"context_line":"              \u003cmachine canonical\u003d\u0027pc-i440fx-2.11\u0027 maxCpus\u003d\u0027255\u0027\u003epc\u003c/machine\u003e"},{"line_number":158,"context_line":"              \u003cmachine maxCpus\u003d\u00271\u0027\u003eisapc\u003c/machine\u003e"},{"line_number":159,"context_line":"              \u003cmachine maxCpus\u003d\u0027255\u0027\u003epc-1.1\u003c/machine\u003e"},{"line_number":160,"context_line":"              \u003cmachine maxCpus\u003d\u0027255\u0027\u003epc-i440fx-2.0\u003c/machine\u003e"},{"line_number":161,"context_line":"              \u003cmachine maxCpus\u003d\u0027288\u0027\u003epc-q35-2.11\u003c/machine\u003e"},{"line_number":162,"context_line":"              \u003cmachine canonical\u003d\u0027pc-q35-2.11\u0027 maxCpus\u003d\u0027288\u0027\u003eq35\u003c/machine\u003e"},{"line_number":163,"context_line":"              \u003cmachine maxCpus\u003d\u00271\u0027\u003exenpv\u003c/machine\u003e"},{"line_number":164,"context_line":"              \u003cmachine maxCpus\u003d\u0027288\u0027\u003epc-q35-2.10\u003c/machine\u003e"},{"line_number":165,"context_line":"              \u003cdomain type\u003d\"qemu\" /\u003e"},{"line_number":166,"context_line":"              \u003cdomain type\u003d\"kvm\"\u003e"},{"line_number":167,"context_line":"                \u003cemulator\u003e/usr/bin/qemu-kvm\u003c/emulator\u003e"},{"line_number":168,"context_line":"                \u003cmachine maxCpus\u003d\u0027255\u0027\u003epc-i440fx-2.11\u003c/machine\u003e"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_073ee2d9","line":165,"range":{"start_line":155,"start_character":0,"end_line":165,"end_character":36},"updated":"2019-08-09 14:15:15.000000000","message":"To be clear this is essentially saying the below:\n\n  \u003carch name\u003d\"x86_64\" defaultDomain\u003d\"qemu\"\u003e\n    \u003cdomain type\u003d\"qemu\"\u003e\n      \u003cemulator\u003e/usr/bin/qemu-system-x86_64\u003c/emulator\u003e\n      \u003cmachine maxCpus\u003d\u0027255\u0027\u003epc-i440fx-2.11\u003c/machine\u003e\n      \u003cmachine canonical\u003d\u0027pc-i440fx-2.11\u0027 maxCpus\u003d\u0027255\u0027\u003epc\u003c/machine\u003e\n      \u003cmachine maxCpus\u003d\u00271\u0027\u003eisapc\u003c/machine\u003e\n      ...\n    \u003c/domain\u003e\n    \u003cdomain type\u003d\"kvm\"\u003e\n      \u003cemulator\u003e/usr/bin/qemu-kvm\u003c/emulator\u003e\n      \u003cmachine maxCpus\u003d\u0027255\u0027\u003epc-i440fx-2.11\u003c/machine\u003e\n      ...\n    \u003c/domain\u003e\n  \u003c/arch\u003e\n\nand things are done in this rather awkward manner for legacy reasons? I hadn\u0027t paid attention to this before","commit_id":"8b8cca7fbd23a7d2cbd131a5059d6260d2fcd7ab"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"78b9e968db6db991b770a7860cb9fdf1954c7c1a","unresolved":false,"context_lines":[{"line_number":152,"context_line":"          \u003cguest\u003e"},{"line_number":153,"context_line":"            \u003cos_type\u003ehvm\u003c/os_type\u003e"},{"line_number":154,"context_line":"            \u003carch name\u003d\u0027x86_64\u0027\u003e"},{"line_number":155,"context_line":"              \u003cemulator\u003e/usr/bin/qemu-system-x86_64\u003c/emulator\u003e"},{"line_number":156,"context_line":"              \u003cmachine maxCpus\u003d\u0027255\u0027\u003epc-i440fx-2.11\u003c/machine\u003e"},{"line_number":157,"context_line":"              \u003cmachine canonical\u003d\u0027pc-i440fx-2.11\u0027 maxCpus\u003d\u0027255\u0027\u003epc\u003c/machine\u003e"},{"line_number":158,"context_line":"              \u003cmachine maxCpus\u003d\u00271\u0027\u003eisapc\u003c/machine\u003e"},{"line_number":159,"context_line":"              \u003cmachine maxCpus\u003d\u0027255\u0027\u003epc-1.1\u003c/machine\u003e"},{"line_number":160,"context_line":"              \u003cmachine maxCpus\u003d\u0027255\u0027\u003epc-i440fx-2.0\u003c/machine\u003e"},{"line_number":161,"context_line":"              \u003cmachine maxCpus\u003d\u0027288\u0027\u003epc-q35-2.11\u003c/machine\u003e"},{"line_number":162,"context_line":"              \u003cmachine canonical\u003d\u0027pc-q35-2.11\u0027 maxCpus\u003d\u0027288\u0027\u003eq35\u003c/machine\u003e"},{"line_number":163,"context_line":"              \u003cmachine maxCpus\u003d\u00271\u0027\u003exenpv\u003c/machine\u003e"},{"line_number":164,"context_line":"              \u003cmachine maxCpus\u003d\u0027288\u0027\u003epc-q35-2.10\u003c/machine\u003e"},{"line_number":165,"context_line":"              \u003cdomain type\u003d\"qemu\" /\u003e"},{"line_number":166,"context_line":"              \u003cdomain type\u003d\"kvm\"\u003e"},{"line_number":167,"context_line":"                \u003cemulator\u003e/usr/bin/qemu-kvm\u003c/emulator\u003e"},{"line_number":168,"context_line":"                \u003cmachine maxCpus\u003d\u0027255\u0027\u003epc-i440fx-2.11\u003c/machine\u003e"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_4f0fa138","line":165,"range":{"start_line":155,"start_character":0,"end_line":165,"end_character":36},"in_reply_to":"7faddb67_073ee2d9","updated":"2019-08-16 14:46:15.000000000","message":"That\u0027s my understanding, yes.  It\u0027s not very nice is it!","commit_id":"8b8cca7fbd23a7d2cbd131a5059d6260d2fcd7ab"}],"nova/virt/libvirt/config.py":[{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"abd9d11ea9be1b104d0fbce76016b9cac3246a53","unresolved":false,"context_lines":[{"line_number":359,"context_line":"    def parse_dom(self, xmldoc):"},{"line_number":360,"context_line":"        super(LibvirtConfigCapsHost, self).parse_dom(xmldoc)"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        for c in xmldoc:"},{"line_number":363,"context_line":"            if c.tag \u003d\u003d \"cpu\":"},{"line_number":364,"context_line":"                cpu \u003d LibvirtConfigCPU()"},{"line_number":365,"context_line":"                cpu.parse_dom(c)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_b636d850","line":362,"updated":"2019-07-30 09:21:08.000000000","message":"Yeah yeah, I know this isn\u0027t strictly needed here.  I\u0027ll do a separate patch cleaning all those deprecated getchildren() calls up :-)","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"812581c8719945055b0a0c19641c74ade05d8c4a","unresolved":false,"context_lines":[{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def parse_dom(self, xmldoc):"},{"line_number":400,"context_line":"        super(LibvirtConfigCapsGuest, self).parse_dom(xmldoc)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        for child in xmldoc:"},{"line_number":403,"context_line":"            if child.tag \u003d\u003d \"os_type\":"},{"line_number":404,"context_line":"                self.ostype \u003d child.text"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_d2640ae8","line":401,"updated":"2019-08-09 14:15:15.000000000","message":"This definitely doesn\u0027t need to be done now, but assuming my understanding of what\u0027s happening in the XML is correct, could we just build a fake \u0027domain\u0027 XML doc containing all non-domain children and feed that into \u0027LibvirtConfigCapsGuestDomain\u0027? Seems like it be slightly less unusual than what we\u0027re doing here","commit_id":"8b8cca7fbd23a7d2cbd131a5059d6260d2fcd7ab"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"78b9e968db6db991b770a7860cb9fdf1954c7c1a","unresolved":false,"context_lines":[{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def parse_dom(self, xmldoc):"},{"line_number":400,"context_line":"        super(LibvirtConfigCapsGuest, self).parse_dom(xmldoc)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        for child in xmldoc:"},{"line_number":403,"context_line":"            if child.tag \u003d\u003d \"os_type\":"},{"line_number":404,"context_line":"                self.ostype \u003d child.text"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_216b59b9","line":401,"in_reply_to":"7faddb67_d2640ae8","updated":"2019-08-16 14:46:15.000000000","message":"If by \"non-domain children\" you mean \"non-domain-children\" i.e. XML relating to the default domain at the top rather than other \u003cdomain\u003e elements and their children, then wouldn\u0027t that require walking the XML dom tree more than once?  Not sure I\u0027ve understood correctly but I can\u0027t immediately see what the benefit would be.","commit_id":"8b8cca7fbd23a7d2cbd131a5059d6260d2fcd7ab"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"812581c8719945055b0a0c19641c74ade05d8c4a","unresolved":false,"context_lines":[{"line_number":6018,"context_line":"        caps \u003d self._host.get_capabilities()"},{"line_number":6019,"context_line":"        instance_caps \u003d list()"},{"line_number":6020,"context_line":"        for g in caps.guests:"},{"line_number":6021,"context_line":"            for dt, domain in six.iteritems(g.domains):"},{"line_number":6022,"context_line":"                try:"},{"line_number":6023,"context_line":"                    instance_cap \u003d ("},{"line_number":6024,"context_line":"                        fields.Architecture.canonicalize(g.arch),"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_92b3f24d","line":6021,"range":{"start_line":6021,"start_character":0,"end_line":6021,"end_character":55},"updated":"2019-08-09 14:15:15.000000000","message":"Do you really need the iterator? This is default behavior in Python 3, after all","commit_id":"8b8cca7fbd23a7d2cbd131a5059d6260d2fcd7ab"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"be18c249494d914db2782c41b244a18ab06e02d6","unresolved":false,"context_lines":[{"line_number":6018,"context_line":"        caps \u003d self._host.get_capabilities()"},{"line_number":6019,"context_line":"        instance_caps \u003d list()"},{"line_number":6020,"context_line":"        for g in caps.guests:"},{"line_number":6021,"context_line":"            for dt, domain in six.iteritems(g.domains):"},{"line_number":6022,"context_line":"                try:"},{"line_number":6023,"context_line":"                    instance_cap \u003d ("},{"line_number":6024,"context_line":"                        fields.Architecture.canonicalize(g.arch),"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_778ef32e","line":6021,"range":{"start_line":6021,"start_character":0,"end_line":6021,"end_character":55},"in_reply_to":"7faddb67_61839157","updated":"2019-08-16 16:52:47.000000000","message":"Sorry, I meant is there any reason we _had_ to use the iterator-based approach. Would\n\n    for dt, domain in g.domains.items():\n\nhave done the trick? I know it would not use an interator-based approach in Python 2.7, but the main reason you\u0027d use that (iirc) is to avoid loading the entirety of whatever your iterating through into memory and we\u0027ve already done so...","commit_id":"8b8cca7fbd23a7d2cbd131a5059d6260d2fcd7ab"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"fba51ffb4160609812e7673b7afe842541ad3039","unresolved":false,"context_lines":[{"line_number":6018,"context_line":"        caps \u003d self._host.get_capabilities()"},{"line_number":6019,"context_line":"        instance_caps \u003d list()"},{"line_number":6020,"context_line":"        for g in caps.guests:"},{"line_number":6021,"context_line":"            for dt, domain in six.iteritems(g.domains):"},{"line_number":6022,"context_line":"                try:"},{"line_number":6023,"context_line":"                    instance_cap \u003d ("},{"line_number":6024,"context_line":"                        fields.Architecture.canonicalize(g.arch),"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_7aed7a23","line":6021,"range":{"start_line":6021,"start_character":0,"end_line":6021,"end_character":55},"in_reply_to":"7faddb67_778ef32e","updated":"2019-08-16 20:23:01.000000000","message":"Ah, I see!  Yeah, for the sake of avoiding six and making 2.7 retirement easier, it makes sense to go with your approach.  Thanks - done!","commit_id":"8b8cca7fbd23a7d2cbd131a5059d6260d2fcd7ab"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b6b3690fa4a21c6481bd0edbd0dabec8719f08bd","unresolved":false,"context_lines":[{"line_number":6018,"context_line":"        caps \u003d self._host.get_capabilities()"},{"line_number":6019,"context_line":"        instance_caps \u003d list()"},{"line_number":6020,"context_line":"        for g in caps.guests:"},{"line_number":6021,"context_line":"            for dt, domain in six.iteritems(g.domains):"},{"line_number":6022,"context_line":"                try:"},{"line_number":6023,"context_line":"                    instance_cap \u003d ("},{"line_number":6024,"context_line":"                        fields.Architecture.canonicalize(g.arch),"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_95d7e723","line":6021,"range":{"start_line":6021,"start_character":0,"end_line":6021,"end_character":55},"in_reply_to":"7faddb67_778ef32e","updated":"2019-08-16 18:51:41.000000000","message":"I remember at some point there being a push to get rid of six.iteritems, where it was claimed that for all but the biggest of lists it made no difference, and just using dict.items() was... more py3-ready?\n\nBut I can\u0027t track that down rn.\n\nOTOH, there\u0027s only three other places - all in libvirt code - that use it, vs \u003e400 that just use .items().\n\nShrug.","commit_id":"8b8cca7fbd23a7d2cbd131a5059d6260d2fcd7ab"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"78b9e968db6db991b770a7860cb9fdf1954c7c1a","unresolved":false,"context_lines":[{"line_number":6018,"context_line":"        caps \u003d self._host.get_capabilities()"},{"line_number":6019,"context_line":"        instance_caps \u003d list()"},{"line_number":6020,"context_line":"        for g in caps.guests:"},{"line_number":6021,"context_line":"            for dt, domain in six.iteritems(g.domains):"},{"line_number":6022,"context_line":"                try:"},{"line_number":6023,"context_line":"                    instance_cap \u003d ("},{"line_number":6024,"context_line":"                        fields.Architecture.canonicalize(g.arch),"}],"source_content_type":"text/x-python","patch_set":7,"id":"7faddb67_61839157","line":6021,"range":{"start_line":6021,"start_character":0,"end_line":6021,"end_character":55},"in_reply_to":"7faddb67_92b3f24d","updated":"2019-08-16 14:46:15.000000000","message":"... but not in Python 2, which AFAIK we still need to support.  Not sure what you\u0027re proposing here?","commit_id":"8b8cca7fbd23a7d2cbd131a5059d6260d2fcd7ab"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"74c7e5390fd76af3beb225debf5c9ef4017dc024","unresolved":false,"context_lines":[{"line_number":6043,"context_line":"        caps \u003d self._host.get_capabilities()"},{"line_number":6044,"context_line":"        instance_caps \u003d list()"},{"line_number":6045,"context_line":"        for g in caps.guests:"},{"line_number":6046,"context_line":"            for dt, domain in g.domains.items():"},{"line_number":6047,"context_line":"                try:"},{"line_number":6048,"context_line":"                    instance_cap \u003d ("},{"line_number":6049,"context_line":"                        fields.Architecture.canonicalize(g.arch),"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_aae85cde","line":6046,"range":{"start_line":6046,"start_character":12,"end_line":6046,"end_character":48},"updated":"2019-08-20 08:42:49.000000000","message":"nit, \"for dt in g.domains\"","commit_id":"bd03827fec48e68513207d2a570e5cac0b5eaf6c"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"d75f9cb3be3cbdca9501d20d9f069a0d5975bc0f","unresolved":false,"context_lines":[{"line_number":6043,"context_line":"        caps \u003d self._host.get_capabilities()"},{"line_number":6044,"context_line":"        instance_caps \u003d list()"},{"line_number":6045,"context_line":"        for g in caps.guests:"},{"line_number":6046,"context_line":"            for dt, domain in g.domains.items():"},{"line_number":6047,"context_line":"                try:"},{"line_number":6048,"context_line":"                    instance_cap \u003d ("},{"line_number":6049,"context_line":"                        fields.Architecture.canonicalize(g.arch),"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_55e868dd","line":6046,"range":{"start_line":6046,"start_character":12,"end_line":6046,"end_character":48},"in_reply_to":"7faddb67_aae85cde","updated":"2019-08-20 12:43:35.000000000","message":"Done","commit_id":"bd03827fec48e68513207d2a570e5cac0b5eaf6c"}],"nova/virt/libvirt/host.py":[{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"cc1828a35f0e69788414f31d43672232aa0a56d3","unresolved":false,"context_lines":[{"line_number":706,"context_line":"            https://bugzilla.redhat.com/show_bug.cgi?id\u003d1683471#c7"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"        However, that\u0027s not quite sufficient in the context of nova,"},{"line_number":709,"context_line":"        because SEV guests typically require a q35 machine type,"},{"line_number":710,"context_line":"        whereas the current default machine type for x86_64 is \u0027pc\u0027."},{"line_number":711,"context_line":"        So we need results from the getDomainCapabilities API for at"},{"line_number":712,"context_line":"        least those two.  Fortunately we can take advantage of the"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_b68498d4","line":709,"range":{"start_line":709,"start_character":16,"end_line":709,"end_character":63},"updated":"2019-07-30 09:47:07.000000000","message":"Optionally, you can also point out other (future) features that rely on \u0027q35\u0027:\n\n\"SEV guests require a \u0027q35\u0027 machine type (so do KVM/QEMU guests that want Secure Boot), whereas ...\"","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"65b1f088aa98825a7311780ff580ab782ab9c4f5","unresolved":false,"context_lines":[{"line_number":706,"context_line":"            https://bugzilla.redhat.com/show_bug.cgi?id\u003d1683471#c7"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"        However, that\u0027s not quite sufficient in the context of nova,"},{"line_number":709,"context_line":"        because SEV guests typically require a q35 machine type,"},{"line_number":710,"context_line":"        whereas the current default machine type for x86_64 is \u0027pc\u0027."},{"line_number":711,"context_line":"        So we need results from the getDomainCapabilities API for at"},{"line_number":712,"context_line":"        least those two.  Fortunately we can take advantage of the"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_7653806c","line":709,"range":{"start_line":709,"start_character":16,"end_line":709,"end_character":63},"updated":"2019-07-30 09:25:16.000000000","message":"Quote from http://specs.openstack.org/openstack/nova-specs/specs/train/approved/amd-sev-libvirt-support.html#proposed-change:\n\n\u003e q35 is required in order to bind all the virtio devices to the PCIe bridge so that they use virtio 1.0 and not virtio 0.9, since QEMU’s iommu_platform feature is added in virtio 1.0 only.\n\nThe gurus went back and forth on this point, and seemed confused themselves, so I didn\u0027t want to write \"definitely\".  But basically it would be at least difficult to do SEV without q35 right now, and not worth trying.","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"cc1828a35f0e69788414f31d43672232aa0a56d3","unresolved":false,"context_lines":[{"line_number":706,"context_line":"            https://bugzilla.redhat.com/show_bug.cgi?id\u003d1683471#c7"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"        However, that\u0027s not quite sufficient in the context of nova,"},{"line_number":709,"context_line":"        because SEV guests typically require a q35 machine type,"},{"line_number":710,"context_line":"        whereas the current default machine type for x86_64 is \u0027pc\u0027."},{"line_number":711,"context_line":"        So we need results from the getDomainCapabilities API for at"},{"line_number":712,"context_line":"        least those two.  Fortunately we can take advantage of the"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_96cddc31","line":709,"range":{"start_line":709,"start_character":16,"end_line":709,"end_character":63},"in_reply_to":"7faddb67_7653806c","updated":"2019-07-30 09:47:07.000000000","message":"\u003e Quote from http://specs.openstack.org/openstack/nova-specs/specs/train/approved/amd-sev-libvirt-support.html#proposed-change:\n \u003e \n \u003e \u003e q35 is required in order to bind all the virtio devices to the\n \u003e PCIe bridge so that they use virtio 1.0 and not virtio 0.9, since\n \u003e QEMU’s iommu_platform feature is added in virtio 1.0 only.\n \u003e \n \u003e The gurus went back and forth on this point, and seemed confused\n \u003e themselves, so I didn\u0027t want to write \"definitely\".  But basically\n \u003e it would be at least difficult to do SEV without q35 right now, and\n \u003e not worth trying.\n\nNoted, thanks for the clarification.","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"f9ed4dae3ed7259055a7ef3e9751183402d9c19d","unresolved":false,"context_lines":[{"line_number":706,"context_line":"            https://bugzilla.redhat.com/show_bug.cgi?id\u003d1683471#c7"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"        However, that\u0027s not quite sufficient in the context of nova,"},{"line_number":709,"context_line":"        because SEV guests typically require a q35 machine type,"},{"line_number":710,"context_line":"        whereas the current default machine type for x86_64 is \u0027pc\u0027."},{"line_number":711,"context_line":"        So we need results from the getDomainCapabilities API for at"},{"line_number":712,"context_line":"        least those two.  Fortunately we can take advantage of the"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_b901eb6c","line":709,"range":{"start_line":709,"start_character":16,"end_line":709,"end_character":63},"in_reply_to":"7faddb67_b68498d4","updated":"2019-07-30 10:52:41.000000000","message":"Good idea, done.","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"0328f07dbfa3bec329c080a3a50e476e20496d3c","unresolved":false,"context_lines":[{"line_number":706,"context_line":"            https://bugzilla.redhat.com/show_bug.cgi?id\u003d1683471#c7"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"        However, that\u0027s not quite sufficient in the context of nova,"},{"line_number":709,"context_line":"        because SEV guests typically require a q35 machine type,"},{"line_number":710,"context_line":"        whereas the current default machine type for x86_64 is \u0027pc\u0027."},{"line_number":711,"context_line":"        So we need results from the getDomainCapabilities API for at"},{"line_number":712,"context_line":"        least those two.  Fortunately we can take advantage of the"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_17e3ffd9","line":709,"range":{"start_line":709,"start_character":16,"end_line":709,"end_character":63},"in_reply_to":"7faddb67_b901eb6c","updated":"2019-08-05 14:28:36.000000000","message":"Thanks!","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"cc1828a35f0e69788414f31d43672232aa0a56d3","unresolved":false,"context_lines":[{"line_number":711,"context_line":"        So we need results from the getDomainCapabilities API for at"},{"line_number":712,"context_line":"        least those two.  Fortunately we can take advantage of the"},{"line_number":713,"context_line":"        results from the getCapabilities API which marks selected"},{"line_number":714,"context_line":"        machine types as canonical, e.g.:"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"            \u003cmachine canonical\u003d\u0027pc-i440fx-2.11\u0027 maxCpus\u003d\u0027255\u0027\u003epc\u003c/machine\u003e"},{"line_number":717,"context_line":"            \u003cmachine canonical\u003d\u0027pc-q35-2.11\u0027 maxCpus\u003d\u0027288\u0027\u003eq35\u003c/machine\u003e"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_7674e0cf","line":714,"range":{"start_line":714,"start_character":25,"end_line":714,"end_character":34},"updated":"2019-07-30 09:47:07.000000000","message":"Just clarifying what libvirt means by the \u0027canonical\u0027 attribute:\n\n... \u0027canonical\u0027 (meaning, the fully-expanded name of a given shorthand of a machine type, e.g. \u0027pc\u0027 \u003d\u003d \u0027pc-i440fx-2.11\u0027) ...","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"0328f07dbfa3bec329c080a3a50e476e20496d3c","unresolved":false,"context_lines":[{"line_number":711,"context_line":"        So we need results from the getDomainCapabilities API for at"},{"line_number":712,"context_line":"        least those two.  Fortunately we can take advantage of the"},{"line_number":713,"context_line":"        results from the getCapabilities API which marks selected"},{"line_number":714,"context_line":"        machine types as canonical, e.g.:"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"            \u003cmachine canonical\u003d\u0027pc-i440fx-2.11\u0027 maxCpus\u003d\u0027255\u0027\u003epc\u003c/machine\u003e"},{"line_number":717,"context_line":"            \u003cmachine canonical\u003d\u0027pc-q35-2.11\u0027 maxCpus\u003d\u0027288\u0027\u003eq35\u003c/machine\u003e"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_77e273d7","line":714,"range":{"start_line":714,"start_character":25,"end_line":714,"end_character":34},"in_reply_to":"7faddb67_39d41be9","updated":"2019-08-05 14:28:36.000000000","message":"Yes, it is.  (But a little voice at the back of my head was saying: \"only a careful reader will notice it\" :-))","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"f9ed4dae3ed7259055a7ef3e9751183402d9c19d","unresolved":false,"context_lines":[{"line_number":711,"context_line":"        So we need results from the getDomainCapabilities API for at"},{"line_number":712,"context_line":"        least those two.  Fortunately we can take advantage of the"},{"line_number":713,"context_line":"        results from the getCapabilities API which marks selected"},{"line_number":714,"context_line":"        machine types as canonical, e.g.:"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"            \u003cmachine canonical\u003d\u0027pc-i440fx-2.11\u0027 maxCpus\u003d\u0027255\u0027\u003epc\u003c/machine\u003e"},{"line_number":717,"context_line":"            \u003cmachine canonical\u003d\u0027pc-q35-2.11\u0027 maxCpus\u003d\u0027288\u0027\u003eq35\u003c/machine\u003e"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_39d41be9","line":714,"range":{"start_line":714,"start_character":25,"end_line":714,"end_character":34},"in_reply_to":"7faddb67_7674e0cf","updated":"2019-07-30 10:52:41.000000000","message":"Yes, but isn\u0027t that self-explanatory from the XML snippet immediately following?","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"cc1828a35f0e69788414f31d43672232aa0a56d3","unresolved":false,"context_lines":[{"line_number":761,"context_line":"            machine_types \u003d self._get_machine_types(arch, guest, domain)"},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"            for machine_type in machine_types:"},{"line_number":764,"context_line":"                # It is expected that each \u003cguest\u003e will have a different"},{"line_number":765,"context_line":"                # architecture, but it doesn\u0027t hurt to add a safety net to"},{"line_number":766,"context_line":"                # avoid needlessly calling libvirt\u0027s API more times than we"},{"line_number":767,"context_line":"                # need."},{"line_number":768,"context_line":"                if machine_type and machine_type in domain_caps[arch]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_99050f13","line":765,"range":{"start_line":764,"start_character":18,"end_line":765,"end_character":30},"updated":"2019-07-30 09:47:07.000000000","message":"I know you didn\u0027t add it in this patch, but for my own edification: why is it _expected_ that each guest on a given host have a different architecture?  Or was the intention: it is _likely_ that there can be guests with multiple architectures on the same host?","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"0328f07dbfa3bec329c080a3a50e476e20496d3c","unresolved":false,"context_lines":[{"line_number":761,"context_line":"            machine_types \u003d self._get_machine_types(arch, guest, domain)"},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"            for machine_type in machine_types:"},{"line_number":764,"context_line":"                # It is expected that each \u003cguest\u003e will have a different"},{"line_number":765,"context_line":"                # architecture, but it doesn\u0027t hurt to add a safety net to"},{"line_number":766,"context_line":"                # avoid needlessly calling libvirt\u0027s API more times than we"},{"line_number":767,"context_line":"                # need."},{"line_number":768,"context_line":"                if machine_type and machine_type in domain_caps[arch]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_f7c8a355","line":765,"range":{"start_line":764,"start_character":18,"end_line":765,"end_character":30},"in_reply_to":"7faddb67_19735f18","updated":"2019-08-05 14:28:36.000000000","message":"Ah, true (x8_86 and two \u0027arch\u0027); thanks.","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"f9ed4dae3ed7259055a7ef3e9751183402d9c19d","unresolved":false,"context_lines":[{"line_number":761,"context_line":"            machine_types \u003d self._get_machine_types(arch, guest, domain)"},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"            for machine_type in machine_types:"},{"line_number":764,"context_line":"                # It is expected that each \u003cguest\u003e will have a different"},{"line_number":765,"context_line":"                # architecture, but it doesn\u0027t hurt to add a safety net to"},{"line_number":766,"context_line":"                # avoid needlessly calling libvirt\u0027s API more times than we"},{"line_number":767,"context_line":"                # need."},{"line_number":768,"context_line":"                if machine_type and machine_type in domain_caps[arch]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_19735f18","line":765,"range":{"start_line":764,"start_character":18,"end_line":765,"end_character":30},"in_reply_to":"7faddb67_99050f13","updated":"2019-07-30 10:52:41.000000000","message":"It\u0027s expected because it\u0027s been true in every getCapabilities response I\u0027ve seen. Additionally:\n\n- I asked my local libvirt guru whether each \u003cguest\u003e can have more than one \u003carch\u003e and he said no.\n- On x86 hosts, there will typically be two \u003carch\u003e elements:\n\n        # virsh capabilities | xq /capabilities/guest/arch/@name\n        \u003cresults\u003e\n          \u003cresult\u003ei686\u003c/result\u003e\n          \u003cresult\u003ex86_64\u003c/result\u003e\n        \u003c/results\u003e","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"b86aed770896d1f9a34de8cc450288587159a181","unresolved":false,"context_lines":[{"line_number":761,"context_line":"            machine_types \u003d self._get_machine_types(arch, guest, domain)"},{"line_number":762,"context_line":""},{"line_number":763,"context_line":"            for machine_type in machine_types:"},{"line_number":764,"context_line":"                # It is expected that each \u003cguest\u003e will have a different"},{"line_number":765,"context_line":"                # architecture, but it doesn\u0027t hurt to add a safety net to"},{"line_number":766,"context_line":"                # avoid needlessly calling libvirt\u0027s API more times than we"},{"line_number":767,"context_line":"                # need."},{"line_number":768,"context_line":"                if machine_type and machine_type in domain_caps[arch]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_c206d11c","line":765,"range":{"start_line":764,"start_character":18,"end_line":765,"end_character":30},"in_reply_to":"7faddb67_f7c8a355","updated":"2019-08-05 15:07:17.000000000","message":"I\u0027ve improved the comment to clarify this.","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"cc1828a35f0e69788414f31d43672232aa0a56d3","unresolved":false,"context_lines":[{"line_number":765,"context_line":"                # architecture, but it doesn\u0027t hurt to add a safety net to"},{"line_number":766,"context_line":"                # avoid needlessly calling libvirt\u0027s API more times than we"},{"line_number":767,"context_line":"                # need."},{"line_number":768,"context_line":"                if machine_type and machine_type in domain_caps[arch]:"},{"line_number":769,"context_line":"                    continue"},{"line_number":770,"context_line":"                self._add_to_domain_capabilities(domain.emulator, arch,"},{"line_number":771,"context_line":"                                                 domain_caps, machine_type,"},{"line_number":772,"context_line":"                                                 virt_type)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_b90a4b1d","line":769,"range":{"start_line":768,"start_character":16,"end_line":769,"end_character":28},"updated":"2019-07-30 09:47:07.000000000","message":"But yes, the check itself makes sense to me.","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"0328f07dbfa3bec329c080a3a50e476e20496d3c","unresolved":false,"context_lines":[{"line_number":852,"context_line":"        if cap_obj.machine_type:"},{"line_number":853,"context_line":"            domain_caps[arch][cap_obj.machine_type] \u003d cap_obj"},{"line_number":854,"context_line":"        else:"},{"line_number":855,"context_line":"            # NOTE(aspiers): In theory this should never happen,"},{"line_number":856,"context_line":"            # but better safe than sorry."},{"line_number":857,"context_line":"            LOG.warning("},{"line_number":858,"context_line":"                \"libvirt getDomainCapabilities(\""},{"line_number":859,"context_line":"                \"emulator_bin\u003d%(emulator_bin)s, arch\u003d%(arch)s, \""}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_a70f272c","line":856,"range":{"start_line":855,"start_character":0,"end_line":856,"end_character":41},"updated":"2019-08-05 14:28:36.000000000","message":"Defensive programming, is it :-)","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":6962,"name":"Kashyap Chamarthy","email":"kchamart@redhat.com","username":"kashyapc"},"change_message_id":"0328f07dbfa3bec329c080a3a50e476e20496d3c","unresolved":false,"context_lines":[{"line_number":865,"context_line":""},{"line_number":866,"context_line":"        # And if we passed an alias, register the domain caps"},{"line_number":867,"context_line":"        # under that too."},{"line_number":868,"context_line":"        if machine_type and machine_type !\u003d cap_obj.machine_type:"},{"line_number":869,"context_line":"            domain_caps[arch][machine_type] \u003d cap_obj"},{"line_number":870,"context_line":"            cap_obj.machine_type_alias \u003d machine_type"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def _get_domain_capabilities(self, emulator_bin\u003dNone, arch\u003dNone,"},{"line_number":873,"context_line":"                                 machine_type\u003dNone, virt_type\u003dNone, flags\u003d0):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7faddb67_27049714","line":870,"range":{"start_line":868,"start_character":0,"end_line":870,"end_character":53},"updated":"2019-08-05 14:28:36.000000000","message":"Nice, appreciate this extra guard for an alias.","commit_id":"7b39a7e8f597553a8dae3db81f193bd780766cb4"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6c53648585f7ddca0c8f848ca7a112fbeb415280","unresolved":false,"context_lines":[{"line_number":758,"context_line":""},{"line_number":759,"context_line":"        for guest in caps.guests:"},{"line_number":760,"context_line":"            arch \u003d guest.arch"},{"line_number":761,"context_line":"            domain \u003d guest.domains.get(virt_type) or guest.default_domain"},{"line_number":762,"context_line":"            machine_types \u003d self._get_machine_types(arch, guest, domain)"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"            for machine_type in machine_types:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_3a22a2a4","line":761,"range":{"start_line":761,"start_character":21,"end_line":761,"end_character":73},"updated":"2019-08-16 16:54:27.000000000","message":"nit:\n\n  guest.domains.get(virt_type, guest.default_domain)","commit_id":"1f80ee7445dcbee1abbd756a0ec1feaa374bd8fd"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"fba51ffb4160609812e7673b7afe842541ad3039","unresolved":false,"context_lines":[{"line_number":758,"context_line":""},{"line_number":759,"context_line":"        for guest in caps.guests:"},{"line_number":760,"context_line":"            arch \u003d guest.arch"},{"line_number":761,"context_line":"            domain \u003d guest.domains.get(virt_type) or guest.default_domain"},{"line_number":762,"context_line":"            machine_types \u003d self._get_machine_types(arch, guest, domain)"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"            for machine_type in machine_types:"}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_faaacacf","line":761,"range":{"start_line":761,"start_character":21,"end_line":761,"end_character":73},"in_reply_to":"7faddb67_3a22a2a4","updated":"2019-08-16 20:23:01.000000000","message":"Done","commit_id":"1f80ee7445dcbee1abbd756a0ec1feaa374bd8fd"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0e6820b63c04f9522fe99d42445c863d63f172be","unresolved":false,"context_lines":[{"line_number":795,"context_line":"        # NOTE(aspiers): machine_type could be None here if nova"},{"line_number":796,"context_line":"        # doesn\u0027t have a default machine type for this architecture."},{"line_number":797,"context_line":"        # See _add_to_domain_capabilities() below for how this is handled."},{"line_number":798,"context_line":"        mtypes \u003d set([libvirt_utils.get_default_machine_type(arch)])"},{"line_number":799,"context_line":"        mtypes.update(domain.aliases.keys())"},{"line_number":800,"context_line":"        LOG.debug(\"Getting domain capabilities for %(arch)s via \""},{"line_number":801,"context_line":"                  \"machine types: %(mtypes)s\","},{"line_number":802,"context_line":"                  {\u0027arch\u0027: arch, \u0027mtypes\u0027: mtypes})"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_6ffa7375","line":799,"range":{"start_line":798,"start_character":7,"end_line":799,"end_character":44},"updated":"2019-08-20 10:49:24.000000000","message":"I thought you need all the machine types for specific virt_type and arch. But there only includes the default machine type and aliases. For the x86_64 and kvm, so you return set([\u0027pc\u0027, \u0027q35\u0027])?\n\nSorry, I have a hard time on this","commit_id":"bd03827fec48e68513207d2a570e5cac0b5eaf6c"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"d75f9cb3be3cbdca9501d20d9f069a0d5975bc0f","unresolved":false,"context_lines":[{"line_number":795,"context_line":"        # NOTE(aspiers): machine_type could be None here if nova"},{"line_number":796,"context_line":"        # doesn\u0027t have a default machine type for this architecture."},{"line_number":797,"context_line":"        # See _add_to_domain_capabilities() below for how this is handled."},{"line_number":798,"context_line":"        mtypes \u003d set([libvirt_utils.get_default_machine_type(arch)])"},{"line_number":799,"context_line":"        mtypes.update(domain.aliases.keys())"},{"line_number":800,"context_line":"        LOG.debug(\"Getting domain capabilities for %(arch)s via \""},{"line_number":801,"context_line":"                  \"machine types: %(mtypes)s\","},{"line_number":802,"context_line":"                  {\u0027arch\u0027: arch, \u0027mtypes\u0027: mtypes})"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_d583f801","line":799,"range":{"start_line":798,"start_character":7,"end_line":799,"end_character":44},"in_reply_to":"7faddb67_6ffa7375","updated":"2019-08-20 12:43:35.000000000","message":"\u003e I thought you need all the machine types for specific virt_type and arch.\n\nNo, not *all* the machine types, only the ones for which we need to call getDomainCapabilities.  This is explained in the docstring above.\n\n \u003e But there only includes the default machine type and aliases.\n \u003e For the x86_64 and kvm, so you return set([\u0027pc\u0027, \u0027q35\u0027])?\n\nYes, that\u0027s correct, otherwise we\u0027d be calling getDomainCapabilities once for each machine type in a long list including entries like\n\npc-i440fx-1.4\npc-i440fx-1.5\npc-i440fx-1.6\npc-i440fx-1.7\npc-i440fx-2.0\npc-i440fx-2.1\n...\n\nand this would be massively overkill.","commit_id":"bd03827fec48e68513207d2a570e5cac0b5eaf6c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"74c7e5390fd76af3beb225debf5c9ef4017dc024","unresolved":false,"context_lines":[{"line_number":846,"context_line":"                 \u0027exception\u0027: ex})"},{"line_number":847,"context_line":"            # Remove archs added by default dict lookup when checking"},{"line_number":848,"context_line":"            # if the machine type has already been recoded."},{"line_number":849,"context_line":"            if arch in domain_caps:"},{"line_number":850,"context_line":"                domain_caps.pop(arch)"},{"line_number":851,"context_line":"            return"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        # Register the domain caps using the expanded form of"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_2a6d4c02","line":850,"range":{"start_line":849,"start_character":12,"end_line":850,"end_character":37},"updated":"2019-08-20 08:42:49.000000000","message":"nit, domain_caps.clear()?","commit_id":"bd03827fec48e68513207d2a570e5cac0b5eaf6c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0e6820b63c04f9522fe99d42445c863d63f172be","unresolved":false,"context_lines":[{"line_number":846,"context_line":"                 \u0027exception\u0027: ex})"},{"line_number":847,"context_line":"            # Remove archs added by default dict lookup when checking"},{"line_number":848,"context_line":"            # if the machine type has already been recoded."},{"line_number":849,"context_line":"            if arch in domain_caps:"},{"line_number":850,"context_line":"                domain_caps.pop(arch)"},{"line_number":851,"context_line":"            return"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        # Register the domain caps using the expanded form of"}],"source_content_type":"text/x-python","patch_set":11,"id":"7faddb67_4fde976a","line":850,"range":{"start_line":849,"start_character":12,"end_line":850,"end_character":37},"in_reply_to":"7faddb67_2a6d4c02","updated":"2019-08-20 10:49:24.000000000","message":"oops, I see what is this now.","commit_id":"bd03827fec48e68513207d2a570e5cac0b5eaf6c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"6d6bc6c1635bf4069bc5564289451acdc10cc7a0","unresolved":false,"context_lines":[{"line_number":694,"context_line":"        picture of the hypervisor\u0027s capabilities, technically we need"},{"line_number":695,"context_line":"        to call it with the right parameters, once for each"},{"line_number":696,"context_line":"        (architecture, machine_type) combination which we care about."},{"line_number":697,"context_line":"        However the libvirt experts have advised us that in practice"},{"line_number":698,"context_line":"        the domain capabilities do not (yet, at least) vary enough"},{"line_number":699,"context_line":"        across machine types to justify the cost of calling"},{"line_number":700,"context_line":"        getDomainCapabilities() once for every single (architecture,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_55a38843","line":697,"range":{"start_line":697,"start_character":20,"end_line":697,"end_character":35},"updated":"2019-08-20 13:01:19.000000000","message":"so I\u0027m just going to trust what libvirt experts said at here.","commit_id":"e7bf4d2a9b75c8e15c8c1f3f37ef35f1de05a775"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"d4b1a2fc853365c24990cc4b8eff1d2c8875a53b","unresolved":false,"context_lines":[{"line_number":694,"context_line":"        picture of the hypervisor\u0027s capabilities, technically we need"},{"line_number":695,"context_line":"        to call it with the right parameters, once for each"},{"line_number":696,"context_line":"        (architecture, machine_type) combination which we care about."},{"line_number":697,"context_line":"        However the libvirt experts have advised us that in practice"},{"line_number":698,"context_line":"        the domain capabilities do not (yet, at least) vary enough"},{"line_number":699,"context_line":"        across machine types to justify the cost of calling"},{"line_number":700,"context_line":"        getDomainCapabilities() once for every single (architecture,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_49cbde70","line":697,"range":{"start_line":697,"start_character":20,"end_line":697,"end_character":35},"in_reply_to":"7faddb67_55a38843","updated":"2019-08-21 12:52:53.000000000","message":"Me too ;-)","commit_id":"e7bf4d2a9b75c8e15c8c1f3f37ef35f1de05a775"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"6d6bc6c1635bf4069bc5564289451acdc10cc7a0","unresolved":false,"context_lines":[{"line_number":796,"context_line":"        # doesn\u0027t have a default machine type for this architecture."},{"line_number":797,"context_line":"        # See _add_to_domain_capabilities() below for how this is handled."},{"line_number":798,"context_line":"        mtypes \u003d set([libvirt_utils.get_default_machine_type(arch)])"},{"line_number":799,"context_line":"        mtypes.update(domain.aliases.keys())"},{"line_number":800,"context_line":"        LOG.debug(\"Getting domain capabilities for %(arch)s via \""},{"line_number":801,"context_line":"                  \"machine types: %(mtypes)s\","},{"line_number":802,"context_line":"                  {\u0027arch\u0027: arch, \u0027mtypes\u0027: mtypes})"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_b5699cf8","line":799,"range":{"start_line":799,"start_character":8,"end_line":799,"end_character":44},"updated":"2019-08-20 13:01:19.000000000","message":"I prefer to have unittest for this, that will help me understand the finall machine type I get in the end. But that can be in a followup patch.","commit_id":"e7bf4d2a9b75c8e15c8c1f3f37ef35f1de05a775"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3a614dba0a639a5096a7b5e0be2808031f4a06f6","unresolved":false,"context_lines":[{"line_number":759,"context_line":"        for guest in caps.guests:"},{"line_number":760,"context_line":"            arch \u003d guest.arch"},{"line_number":761,"context_line":"            domain \u003d guest.domains.get(virt_type, guest.default_domain)"},{"line_number":762,"context_line":"            machine_types \u003d self._get_machine_types(arch, domain)"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"            for machine_type in machine_types:"},{"line_number":765,"context_line":"                # It is expected that if there are multiple \u003cguest\u003e"},{"line_number":766,"context_line":"                # elements, each will have a different architecture;"},{"line_number":767,"context_line":"                # for example, on x86 hosts one \u003cguest\u003e will contain"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_166adab1","line":764,"range":{"start_line":762,"start_character":0,"end_line":764,"end_character":46},"updated":"2019-08-21 16:52:12.000000000","message":"nit:\n\n    for machine_type in self._get_machine_types(arch, domain):","commit_id":"a53c867913ff364c789aba1f7255dfcc68ff9f85"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"65e3fd1b8f7d04aa5f547b567bf5b319f4e1c8a3","unresolved":false,"context_lines":[{"line_number":759,"context_line":"        for guest in caps.guests:"},{"line_number":760,"context_line":"            arch \u003d guest.arch"},{"line_number":761,"context_line":"            domain \u003d guest.domains.get(virt_type, guest.default_domain)"},{"line_number":762,"context_line":"            machine_types \u003d self._get_machine_types(arch, domain)"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"            for machine_type in machine_types:"},{"line_number":765,"context_line":"                # It is expected that if there are multiple \u003cguest\u003e"},{"line_number":766,"context_line":"                # elements, each will have a different architecture;"},{"line_number":767,"context_line":"                # for example, on x86 hosts one \u003cguest\u003e will contain"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_7979332d","line":764,"range":{"start_line":762,"start_character":0,"end_line":764,"end_character":46},"in_reply_to":"7faddb67_166adab1","updated":"2019-08-29 20:47:03.000000000","message":"Fixed in https://review.opendev.org/#/c/679340/","commit_id":"a53c867913ff364c789aba1f7255dfcc68ff9f85"}]}
