)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"c4c39ba90b3fbd965698c6a3e4423b6978efa7f7","unresolved":false,"context_lines":[{"line_number":11,"context_line":"we now pass a dict to resource_tracker. Updates compute to handle old"},{"line_number":12,"context_line":"compute nodes version during an upgrade."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Co-Authored-By: Alexis Lee \u003calexisl@hp.com\u003e"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: Ic4e77ad49148a33982d440c11ccb839c32136444"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"fa81d914_461d0e0f","line":14,"updated":"2015-01-28 10:16:38.000000000","message":"Well this look to me a little bit \"advanced\" - In this case we should add every people to have participated to review it. Dan Smith, Jay Pipes, Nikola Dipanov, Daniel Berrangé","commit_id":"e0fcf1448bdc4ed924fd193264de49cf1bab2d54"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"69aa6a84da1d115dc2496cb872fafc6e4f47e526","unresolved":false,"context_lines":[{"line_number":10,"context_line":"NUMATopologyLimits responsible to handle cpu and memory limitation. Also"},{"line_number":11,"context_line":"we now pass a dict to resource_tracker. Updates compute to handle old"},{"line_number":12,"context_line":"compute nodes version during an upgrade."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ic4e77ad49148a33982d440c11ccb839c32136444"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"9a80dd14_467a0c25","line":13,"updated":"2015-03-12 20:30:21.000000000","message":"Shouldn\u0027t this be targeted against a blueprint?  Maybe blueprint kilo-objects?  Feature freeze is 3/19 and this is cutting it close for a thing that\u0027s not tied to a blueprint or bug.","commit_id":"71d50b0e12fa68877be78b56dda2dbe27629ee18"}],"nova/compute/claims.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"ddef5e6dde747db737f52a0608101003efe3a311","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        disk_gb_limit \u003d limits.get(\u0027disk_gb\u0027)"},{"line_number":149,"context_line":"        numa_topology_limit \u003d limits.get(\u0027numa_topology\u0027)"},{"line_number":150,"context_line":"        if numa_topology_limit:"},{"line_number":151,"context_line":"            numa_topology_limit \u003d objects.NUMATopologyLimits.obj_from_db_obj("},{"line_number":152,"context_line":"                numa_topology_limit)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        msg \u003d _(\"Attempting claim: memory %(memory_mb)d MB, disk %(disk_gb)d \""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_e0569505","line":151,"updated":"2014-12-02 09:07:06.000000000","message":"Hmmm so limits come to the compute node as part of the limits dict which is part of the filter_properties dict which is just a RPC argument -\u003e meaning what we should be getting on the (LATEST) compute side is an object already inflated by the NovaObjectSerializer and we don\u0027t need this call.\n\nI think this will break - have you ran it on devstack?","commit_id":"4178fdb60192b147c0d3b49b2e80031eb12eabc1"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"16c15343151fd834cefd920339343cecad860525","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        numa_topology_limit \u003d limits.get(\u0027numa_topology\u0027)"},{"line_number":150,"context_line":"        if numa_topology_limit:"},{"line_number":151,"context_line":"            numa_topology_limit \u003d objects.NUMATopologyLimits("},{"line_number":152,"context_line":"                **numa_topology_limit)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        msg \u003d _(\"Attempting claim: memory %(memory_mb)d MB, disk %(disk_gb)d \""},{"line_number":155,"context_line":"                \"GB\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_c4532e14","line":152,"updated":"2014-12-03 16:00:42.000000000","message":"If it is, this doesn\u0027t work:\n\n    TypeError: NovaObjectMetaclass object argument after ** must be a mapping, not NUMATopologyLimits","commit_id":"9371691aaab0fb00018918368961824c0e5034a1"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3b1e5cbed55cd5428d2ce0dc79344fd85fdb71b3","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        numa_topology_limit \u003d limits.get(\u0027numa_topology\u0027)"},{"line_number":150,"context_line":"        if numa_topology_limit:"},{"line_number":151,"context_line":"            numa_topology_limit \u003d objects.NUMATopologyLimits("},{"line_number":152,"context_line":"                **numa_topology_limit)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        msg \u003d _(\"Attempting claim: memory %(memory_mb)d MB, disk %(disk_gb)d \""},{"line_number":155,"context_line":"                \"GB\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_1f592e35","line":152,"updated":"2014-12-02 17:40:36.000000000","message":"TBH - I am not sure we need to do this even - I think numa_topology_limit is already an object.","commit_id":"9371691aaab0fb00018918368961824c0e5034a1"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"5cb5f3d3fa73a82050f875a5f0eadf88130c3ed1","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        numa_topology_limit \u003d limits.get(\u0027numa_topology\u0027)"},{"line_number":150,"context_line":"        if numa_topology_limit:"},{"line_number":151,"context_line":"            numa_topology_limit \u003d objects.NUMATopologyLimits("},{"line_number":152,"context_line":"                **numa_topology_limit)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        msg \u003d _(\"Attempting claim: memory %(memory_mb)d MB, disk %(disk_gb)d \""},{"line_number":155,"context_line":"                \"GB\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_e59c515e","line":152,"in_reply_to":"5a890539_8003ad0e","updated":"2014-12-05 10:58:54.000000000","message":"hmmm interesting - in that case your code is correct. let me try to figure out why it is not an object dict with version and namespace and data...","commit_id":"9371691aaab0fb00018918368961824c0e5034a1"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"c07093cd6916211f6832269e618f71bfcedadbf5","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        numa_topology_limit \u003d limits.get(\u0027numa_topology\u0027)"},{"line_number":150,"context_line":"        if numa_topology_limit:"},{"line_number":151,"context_line":"            numa_topology_limit \u003d objects.NUMATopologyLimits("},{"line_number":152,"context_line":"                **numa_topology_limit)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        msg \u003d _(\"Attempting claim: memory %(memory_mb)d MB, disk %(disk_gb)d \""},{"line_number":155,"context_line":"                \"GB\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_8003ad0e","line":152,"in_reply_to":"5a890539_c4532e14","updated":"2014-12-04 08:30:21.000000000","message":"This is serialized by the rpc thing and looks to return something like, i have probably missed something...\n\n  \u003e /opt/stack/nova/nova/compute/claims.py(151)_claim_test()\n  -\u003e if numa_topology_limit:\n  (Pdb) list\n  146             # unlimited:\n  147             memory_mb_limit \u003d limits.get(\u0027memory_mb\u0027)\n  148             disk_gb_limit \u003d limits.get(\u0027disk_gb\u0027)\n  149             numa_topology_limit \u003d limits.get(\u0027numa_topology\u0027)\n  150             import pdb; pdb.set_trace()\n  151  -\u003e         if numa_topology_limit:\n  152                 numa_topology_limit \u003d objects.NUMATopologyLimits(\n  153                     **numa_topology_limit)\n  154\n  155             msg \u003d _(\"Attempting claim: memory %(memory_mb)d MB, disk %(  disk_gb)d \"\n  156                     \"GB\")\n  (Pdb) numa_topology_limit\n  {u\u0027ram_allocation_ratio\u0027: 1.5, u\u0027cpu_allocation_ratio\u0027: 16.0}\n  (Pdb)","commit_id":"9371691aaab0fb00018918368961824c0e5034a1"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"637aaa804dcc671206baa1a238c4c28c41b3ef29","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        numa_topology_limit \u003d limits.get(\u0027numa_topology\u0027)"},{"line_number":150,"context_line":"        if numa_topology_limit:"},{"line_number":151,"context_line":"            numa_topology_limit \u003d objects.NUMATopologyLimits("},{"line_number":152,"context_line":"                **numa_topology_limit)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        msg \u003d _(\"Attempting claim: memory %(memory_mb)d MB, disk %(disk_gb)d \""},{"line_number":155,"context_line":"                \"GB\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_3f159d9b","line":152,"updated":"2014-12-15 13:22:12.000000000","message":"This should already be an object...","commit_id":"bf7fcd499fe75e1f620e9ac8571bc087ac0e0bcf"}],"nova/compute/manager.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f1952068d129ec0e2d338b0fcd3d77b42e5da0f9","unresolved":false,"context_lines":[{"line_number":587,"context_line":"class ComputeManager(manager.Manager):"},{"line_number":588,"context_line":"    \"\"\"Manages the running instances from creation to destruction.\"\"\""},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    target \u003d messaging.Target(version\u003d\u00273.36\u0027)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    # How long to wait in seconds before re-issuing a shutdown"},{"line_number":593,"context_line":"    # signal to a instance during power off.  The overall"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_66f2109d","line":590,"updated":"2014-12-05 23:37:33.000000000","message":"You need code in this manager to handle the case where an old-style non-object structure is passed in.","commit_id":"21bd230a374156e826de95f7ab0d0fd86e6bf519"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"4cccb4bce0ddf3c6b24befaed93400247040bd1d","unresolved":false,"context_lines":[{"line_number":587,"context_line":"class ComputeManager(manager.Manager):"},{"line_number":588,"context_line":"    \"\"\"Manages the running instances from creation to destruction.\"\"\""},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    target \u003d messaging.Target(version\u003d\u00273.36\u0027)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    # How long to wait in seconds before re-issuing a shutdown"},{"line_number":593,"context_line":"    # signal to a instance during power off.  The overall"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_d32474c8","line":590,"in_reply_to":"3a961159_330058aa","updated":"2014-12-08 11:31:00.000000000","message":"Ok I understand better now, i\u0027m going to fix this. Thanks Nikola.","commit_id":"21bd230a374156e826de95f7ab0d0fd86e6bf519"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"4efa798f863b1eabefdfb9bfb35ad4bd2776975a","unresolved":false,"context_lines":[{"line_number":587,"context_line":"class ComputeManager(manager.Manager):"},{"line_number":588,"context_line":"    \"\"\"Manages the running instances from creation to destruction.\"\"\""},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    target \u003d messaging.Target(version\u003d\u00273.36\u0027)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    # How long to wait in seconds before re-issuing a shutdown"},{"line_number":593,"context_line":"    # signal to a instance during power off.  The overall"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_330058aa","line":590,"in_reply_to":"3a961159_387e77af","updated":"2014-12-08 11:05:46.000000000","message":"This is because of how version caps work - we set it as a config option so even new conductor will be sening the \"old\" messages to every compute node (even the new ones) until the whole cloud is upgraded, and the config option is set back to uncapped.\n\nwe may want to fix this in oslo.messaging but for now this is how it works.\n\nThis is what I said wiht my previous -1","commit_id":"21bd230a374156e826de95f7ab0d0fd86e6bf519"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7908382f2187dca8725bcde69ceb4e2238b50f18","unresolved":false,"context_lines":[{"line_number":587,"context_line":"class ComputeManager(manager.Manager):"},{"line_number":588,"context_line":"    \"\"\"Manages the running instances from creation to destruction.\"\"\""},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    target \u003d messaging.Target(version\u003d\u00273.36\u0027)"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    # How long to wait in seconds before re-issuing a shutdown"},{"line_number":593,"context_line":"    # signal to a instance during power off.  The overall"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_387e77af","line":590,"in_reply_to":"5a890539_66f2109d","updated":"2014-12-08 10:55:47.000000000","message":"How it is possible, we are migrating compute nodes after all services ?","commit_id":"21bd230a374156e826de95f7ab0d0fd86e6bf519"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"960ce6810664de6bc3f2e13b49d24eb3caf27f21","unresolved":false,"context_lines":[{"line_number":2018,"context_line":"            limits[\u0027numa_topology\u0027] \u003d jsonutils.to_primitive("},{"line_number":2019,"context_line":"                obj_base.obj_to_primitive("},{"line_number":2020,"context_line":"                    objects.NUMATopologyLimits.obj_from_db_obj("},{"line_number":2021,"context_line":"                        limits[\u0027numa_topology\u0027])))"},{"line_number":2022,"context_line":""},{"line_number":2023,"context_line":"        @utils.synchronized(instance.uuid)"},{"line_number":2024,"context_line":"        def _locked_do_build_and_run_instance(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_7f81e5f9","line":2021,"updated":"2014-12-15 13:17:29.000000000","message":"This code will *only* be running on nova-compute nodes that have already been upgraded to version 3.38 of the RPC API, and so hasattr(objects, \u0027NUMATopologyLimits\u0027) will *always* be True. The above conversion should actually be creating limits[\u0027numa_topology\u0027] as an objects.NUMATopologyLimits object, not as a dict...","commit_id":"bf7fcd499fe75e1f620e9ac8571bc087ac0e0bcf"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"f92305ab1cd5d161c9caf63c370554f828c93fe6","unresolved":false,"context_lines":[{"line_number":2018,"context_line":"            limits[\u0027numa_topology\u0027] \u003d jsonutils.to_primitive("},{"line_number":2019,"context_line":"                obj_base.obj_to_primitive("},{"line_number":2020,"context_line":"                    objects.NUMATopologyLimits.obj_from_db_obj("},{"line_number":2021,"context_line":"                        limits[\u0027numa_topology\u0027])))"},{"line_number":2022,"context_line":""},{"line_number":2023,"context_line":"        @utils.synchronized(instance.uuid)"},{"line_number":2024,"context_line":"        def _locked_do_build_and_run_instance(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_170bcc8e","line":2021,"in_reply_to":"3a961159_7f81e5f9","updated":"2014-12-19 11:24:09.000000000","message":"Yes... I had the same interrogation but this is what\u0027s happens, i will try to catch why","commit_id":"bf7fcd499fe75e1f620e9ac8571bc087ac0e0bcf"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"8cede48919bec0d5432ef87ea33228c5a1a82b53","unresolved":false,"context_lines":[{"line_number":2016,"context_line":"        if (limits and \u0027numa_topology\u0027 in limits and"},{"line_number":2017,"context_line":"                isinstance(limits[\u0027numa_topology\u0027], six.string_types)):"},{"line_number":2018,"context_line":"            db_obj \u003d limits[\u0027numa_topology\u0027]"},{"line_number":2019,"context_line":"            lim \u003d objects.NUMATopologyLimits.obj_from_db_obj(db_obj)"},{"line_number":2020,"context_line":"            limits[\u0027numa_topology\u0027] \u003d lim"},{"line_number":2021,"context_line":""},{"line_number":2022,"context_line":"        @utils.synchronized(instance.uuid)"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_4b8733b5","line":2019,"updated":"2015-01-27 09:41:01.000000000","message":"nit: lim? are we trying to save memory on variable names now? :)","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9723930d1bdd0cc6a00c892bcc6d2a9dceb5a06d","unresolved":false,"context_lines":[{"line_number":2016,"context_line":"        if (limits and \u0027numa_topology\u0027 in limits and"},{"line_number":2017,"context_line":"                isinstance(limits[\u0027numa_topology\u0027], six.string_types)):"},{"line_number":2018,"context_line":"            db_obj \u003d limits[\u0027numa_topology\u0027]"},{"line_number":2019,"context_line":"            lim \u003d objects.NUMATopologyLimits.obj_from_db_obj(db_obj)"},{"line_number":2020,"context_line":"            limits[\u0027numa_topology\u0027] \u003d lim"},{"line_number":2021,"context_line":""},{"line_number":2022,"context_line":"        @utils.synchronized(instance.uuid)"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_797be5bd","line":2019,"in_reply_to":"1a930d6b_4b8733b5","updated":"2015-01-27 10:12:17.000000000","message":"i guess Jay introduced this variable to set a breakpoint and read the result of \u0027objects.NUMATopologyLimits.obj_from_db_obj(db_obj)\u0027","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"}],"nova/compute/rpcapi.py":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"4835546f52f06286562a238cb2517a8d5ced45ce","unresolved":false,"context_lines":[{"line_number":888,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":889,"context_line":"                topology_limits \u003d objects.NUMATopologyLimits("},{"line_number":890,"context_line":"                    **limits[\u0027numa_topology\u0027])"},{"line_number":891,"context_line":"                host_topology \u003d objects.NUMATopology(cells\u003d[])"},{"line_number":892,"context_line":"                limits[\u0027numa_topology\u0027] \u003d topology_limits.to_dict_legacy("},{"line_number":893,"context_line":"                    host_topology)"},{"line_number":894,"context_line":"        if not self.client.can_send_version(version):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a890539_86c16050","line":891,"updated":"2014-12-02 14:48:37.000000000","message":"Don\u0027t know the best way to get the host numa_topology here...","commit_id":"6aff854ec570e13828f22d52206a335719d201d1"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3b1e5cbed55cd5428d2ce0dc79344fd85fdb71b3","unresolved":false,"context_lines":[{"line_number":888,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":889,"context_line":"                topology_limits \u003d objects.NUMATopologyLimits("},{"line_number":890,"context_line":"                    **limits[\u0027numa_topology\u0027])"},{"line_number":891,"context_line":"                service \u003d objects.Service.get_by_compute_host(ctxt, host)"},{"line_number":892,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":893,"context_line":"                    service.compute_node.numa_topology)"},{"line_number":894,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_bf265ab8","line":891,"updated":"2014-12-02 17:40:36.000000000","message":"The fact that we have to get it like this is pretty sad but probably inevitable.\n\nLet\u0027s see what bauzas thinks about this.","commit_id":"9371691aaab0fb00018918368961824c0e5034a1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f1952068d129ec0e2d338b0fcd3d77b42e5da0f9","unresolved":false,"context_lines":[{"line_number":886,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":887,"context_line":"            version \u003d \u00273.33\u0027"},{"line_number":888,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":889,"context_line":"                topology_limits \u003d objects.NUMATopologyLimits("},{"line_number":890,"context_line":"                    **limits[\u0027numa_topology\u0027])"},{"line_number":891,"context_line":"                service \u003d objects.Service.get_by_compute_host(ctxt, host)"},{"line_number":892,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_c62824f1","line":889,"updated":"2014-12-05 23:37:33.000000000","message":"Isn\u0027t this the case where we\u0027re already passed an object and we need to turn it into the old JSON-based thing?","commit_id":"21bd230a374156e826de95f7ab0d0fd86e6bf519"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7908382f2187dca8725bcde69ceb4e2238b50f18","unresolved":false,"context_lines":[{"line_number":886,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":887,"context_line":"            version \u003d \u00273.33\u0027"},{"line_number":888,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":889,"context_line":"                topology_limits \u003d objects.NUMATopologyLimits("},{"line_number":890,"context_line":"                    **limits[\u0027numa_topology\u0027])"},{"line_number":891,"context_line":"                service \u003d objects.Service.get_by_compute_host(ctxt, host)"},{"line_number":892,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_53ffa401","line":889,"in_reply_to":"5a890539_c62824f1","updated":"2014-12-08 10:55:47.000000000","message":"yes, so we retrieve a new style and construct the object. then with ne object cann the legacy method to return the old style limits topology.","commit_id":"21bd230a374156e826de95f7ab0d0fd86e6bf519"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f1952068d129ec0e2d338b0fcd3d77b42e5da0f9","unresolved":false,"context_lines":[{"line_number":888,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":889,"context_line":"                topology_limits \u003d objects.NUMATopologyLimits("},{"line_number":890,"context_line":"                    **limits[\u0027numa_topology\u0027])"},{"line_number":891,"context_line":"                service \u003d objects.Service.get_by_compute_host(ctxt, host)"},{"line_number":892,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":893,"context_line":"                    service.compute_node.numa_topology)"},{"line_number":894,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_2638083d","line":891,"updated":"2014-12-05 23:37:33.000000000","message":"It would be good to avoid making DB calls in the RPC client layer if at all possible.","commit_id":"21bd230a374156e826de95f7ab0d0fd86e6bf519"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7908382f2187dca8725bcde69ceb4e2238b50f18","unresolved":false,"context_lines":[{"line_number":888,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":889,"context_line":"                topology_limits \u003d objects.NUMATopologyLimits("},{"line_number":890,"context_line":"                    **limits[\u0027numa_topology\u0027])"},{"line_number":891,"context_line":"                service \u003d objects.Service.get_by_compute_host(ctxt, host)"},{"line_number":892,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":893,"context_line":"                    service.compute_node.numa_topology)"},{"line_number":894,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_9844cb75","line":891,"in_reply_to":"5a890539_2638083d","updated":"2014-12-08 10:55:47.000000000","message":"Did not see better way, please let me know if you have any idea?","commit_id":"21bd230a374156e826de95f7ab0d0fd86e6bf519"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f1952068d129ec0e2d338b0fcd3d77b42e5da0f9","unresolved":false,"context_lines":[{"line_number":893,"context_line":"                    service.compute_node.numa_topology)"},{"line_number":894,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("},{"line_number":895,"context_line":"                    objects_base.obj_to_primitive("},{"line_number":896,"context_line":"                        topology_limits.to_dict_legacy(host_topology)))"},{"line_number":897,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":898,"context_line":"            version \u003d \u00273.23\u0027"},{"line_number":899,"context_line":"            if requested_networks is not None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_86461cbf","line":896,"updated":"2014-12-05 23:37:33.000000000","message":"It seems to me that you should be passed an object to this method, yet you\u0027re pulling a new thing from the database and doing a conversion here. I\u0027m confused?","commit_id":"21bd230a374156e826de95f7ab0d0fd86e6bf519"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7908382f2187dca8725bcde69ceb4e2238b50f18","unresolved":false,"context_lines":[{"line_number":893,"context_line":"                    service.compute_node.numa_topology)"},{"line_number":894,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("},{"line_number":895,"context_line":"                    objects_base.obj_to_primitive("},{"line_number":896,"context_line":"                        topology_limits.to_dict_legacy(host_topology)))"},{"line_number":897,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":898,"context_line":"            version \u003d \u00273.23\u0027"},{"line_number":899,"context_line":"            if requested_networks is not None:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_d82493c8","line":896,"in_reply_to":"5a890539_86461cbf","updated":"2014-12-08 10:55:47.000000000","message":"Not sure to understand? to_dict_legacy will return the old limits \u0027style\u0027 topology","commit_id":"21bd230a374156e826de95f7ab0d0fd86e6bf519"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"960ce6810664de6bc3f2e13b49d24eb3caf27f21","unresolved":false,"context_lines":[{"line_number":921,"context_line":"                    service.compute_node.numa_topology)"},{"line_number":922,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("},{"line_number":923,"context_line":"                    objects_base.obj_to_primitive("},{"line_number":924,"context_line":"                        topology_limits.to_dict_legacy(host_topology)))"},{"line_number":925,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":926,"context_line":"            version \u003d \u00273.33\u0027"},{"line_number":927,"context_line":"            if \u0027instance_type\u0027 in filter_properties:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_9f84d10b","line":924,"updated":"2014-12-15 13:17:29.000000000","message":"Note to @bauzas: the above will cause you to rebase and resolve conflicts in your detach-service-from-compute-node patch series.","commit_id":"bf7fcd499fe75e1f620e9ac8571bc087ac0e0bcf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5049a45825b768849ae407f2c42bcdc8b6ba4818","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        * 3.36 - Make build_and_run_instance() send a Flavor object"},{"line_number":279,"context_line":"        * 3.37 - Add clean_shutdown to stop, resize, rescue, shelve, and"},{"line_number":280,"context_line":"                 shelve_offload"},{"line_number":281,"context_line":"        * 3.38 - Make build_and_run_instance() handle legacy limits topology"},{"line_number":282,"context_line":"    \u0027\u0027\u0027"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    VERSION_ALIASES \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_4eb4da81","line":281,"updated":"2014-12-19 15:56:49.000000000","message":"This should read:\n\n \"Make build_and_run_instance() send numa topology limits objects\"\n\nTo be consistent with the others.","commit_id":"e329e79d7523e4e4c46e33a06636d179d83faa92"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"57c7b318b34b2aed3e7ad30a294a5f2abf75a6c9","unresolved":false,"context_lines":[{"line_number":913,"context_line":"        version \u003d \u00273.38\u0027"},{"line_number":914,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":915,"context_line":"            version \u003d \u00273.36\u0027"},{"line_number":916,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":917,"context_line":"                topology_limits \u003d objects.NUMATopologyLimits("},{"line_number":918,"context_line":"                    **limits[\u0027numa_topology\u0027])"},{"line_number":919,"context_line":"                service \u003d objects.Service.get_by_compute_host(ctxt, host)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_663d368f","line":916,"updated":"2014-12-19 19:50:30.000000000","message":"Isn\u0027t limits an object here? You should use .attr syntax if so.","commit_id":"e329e79d7523e4e4c46e33a06636d179d83faa92"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"26ac3dc968ad7481c307a941293155b0895d3f49","unresolved":false,"context_lines":[{"line_number":913,"context_line":"        version \u003d \u00273.38\u0027"},{"line_number":914,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":915,"context_line":"            version \u003d \u00273.36\u0027"},{"line_number":916,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":917,"context_line":"                topology_limits \u003d objects.NUMATopologyLimits("},{"line_number":918,"context_line":"                    **limits[\u0027numa_topology\u0027])"},{"line_number":919,"context_line":"                service \u003d objects.Service.get_by_compute_host(ctxt, host)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_9c2c1c9b","line":916,"in_reply_to":"3a961159_663d368f","updated":"2014-12-22 08:49:09.000000000","message":"no this is a dict {\u0027memory\u0027: xx, \u0027numa_topology\u0027: xx}","commit_id":"e329e79d7523e4e4c46e33a06636d179d83faa92"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"26ac3dc968ad7481c307a941293155b0895d3f49","unresolved":false,"context_lines":[{"line_number":915,"context_line":"            version \u003d \u00273.36\u0027"},{"line_number":916,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":917,"context_line":"                topology_limits \u003d objects.NUMATopologyLimits("},{"line_number":918,"context_line":"                    **limits[\u0027numa_topology\u0027])"},{"line_number":919,"context_line":"                service \u003d objects.Service.get_by_compute_host(ctxt, host)"},{"line_number":920,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":921,"context_line":"                    service.compute_node.numa_topology)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_dc594436","line":918,"updated":"2014-12-22 08:49:09.000000000","message":"This should be an object... i have to see something :/","commit_id":"e329e79d7523e4e4c46e33a06636d179d83faa92"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"57c7b318b34b2aed3e7ad30a294a5f2abf75a6c9","unresolved":false,"context_lines":[{"line_number":916,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":917,"context_line":"                topology_limits \u003d objects.NUMATopologyLimits("},{"line_number":918,"context_line":"                    **limits[\u0027numa_topology\u0027])"},{"line_number":919,"context_line":"                service \u003d objects.Service.get_by_compute_host(ctxt, host)"},{"line_number":920,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":921,"context_line":"                    service.compute_node.numa_topology)"},{"line_number":922,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_465f5ae5","line":919,"updated":"2014-12-19 19:50:30.000000000","message":"Doing a DB lookup in the RPC client layer like this is kinda gross. Is there any other way we could get this?","commit_id":"e329e79d7523e4e4c46e33a06636d179d83faa92"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"26ac3dc968ad7481c307a941293155b0895d3f49","unresolved":false,"context_lines":[{"line_number":916,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":917,"context_line":"                topology_limits \u003d objects.NUMATopologyLimits("},{"line_number":918,"context_line":"                    **limits[\u0027numa_topology\u0027])"},{"line_number":919,"context_line":"                service \u003d objects.Service.get_by_compute_host(ctxt, host)"},{"line_number":920,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":921,"context_line":"                    service.compute_node.numa_topology)"},{"line_number":922,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_fc3a80cb","line":919,"in_reply_to":"3a961159_465f5ae5","updated":"2014-12-22 08:49:09.000000000","message":"Did not find other way.","commit_id":"e329e79d7523e4e4c46e33a06636d179d83faa92"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"24f36c5875701c7c335f2432fba641a363264293","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        * 3.37 - Add clean_shutdown to stop, resize, rescue, shelve, and"},{"line_number":283,"context_line":"                 shelve_offload"},{"line_number":284,"context_line":"        * 3.38 - Add clean_shutdown to prep_resize"},{"line_number":285,"context_line":"        * 3.39 - Make build_and_run_instance() handle legacy limits topology"},{"line_number":286,"context_line":"    \u0027\u0027\u0027"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    VERSION_ALIASES \u003d {"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_f67769d2","line":285,"updated":"2015-01-22 17:10:26.000000000","message":"So you bump the rpcapi version between PS18 and 19, let see what CI will say","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"8cede48919bec0d5432ef87ea33228c5a1a82b53","unresolved":false,"context_lines":[{"line_number":963,"context_line":"                        ctxt, host, node)"},{"line_number":964,"context_line":"                else:"},{"line_number":965,"context_line":"                    cnodes \u003d objects.ComputeNodeList.get_all_by_host("},{"line_number":966,"context_line":"                        ctxt, host)"},{"line_number":967,"context_line":"                    # We need to just grab the list of compute nodes and"},{"line_number":968,"context_line":"                    # use the first one arbitrarily."},{"line_number":969,"context_line":"                    cnode \u003d cnodes[0]"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_2b758763","line":966,"updated":"2015-01-27 09:41:01.000000000","message":"We can now use get_first_node_by_host_for_old_compat - which is slightly less horrible than this.","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9723930d1bdd0cc6a00c892bcc6d2a9dceb5a06d","unresolved":false,"context_lines":[{"line_number":963,"context_line":"                        ctxt, host, node)"},{"line_number":964,"context_line":"                else:"},{"line_number":965,"context_line":"                    cnodes \u003d objects.ComputeNodeList.get_all_by_host("},{"line_number":966,"context_line":"                        ctxt, host)"},{"line_number":967,"context_line":"                    # We need to just grab the list of compute nodes and"},{"line_number":968,"context_line":"                    # use the first one arbitrarily."},{"line_number":969,"context_line":"                    cnode \u003d cnodes[0]"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_390a3d26","line":966,"in_reply_to":"1a930d6b_2b758763","updated":"2015-01-27 10:12:17.000000000","message":"Done","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aa50bb8c7a62aa4404c3e0c2b95401ae8f837f05","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        * 3.37 - Add clean_shutdown to stop, resize, rescue, shelve, and"},{"line_number":283,"context_line":"                 shelve_offload"},{"line_number":284,"context_line":"        * 3.38 - Add clean_shutdown to prep_resize"},{"line_number":285,"context_line":"        * 3.39 - Make build_and_run_instance() handle legacy limits topology"},{"line_number":286,"context_line":"    \u0027\u0027\u0027"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    VERSION_ALIASES \u003d {"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_2cd90bf3","line":285,"updated":"2015-01-27 16:59:01.000000000","message":"As I said before: In order to be consistent, this should be \"make build_and_run_instance() take a new-world topology limits object\". You\u0027re describing the change you\u0027re making, not the legacy behavior you still tolerate.","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"f6a2a5b3f09616c29fa4b42c3839baa8117dd880","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        * 3.37 - Add clean_shutdown to stop, resize, rescue, shelve, and"},{"line_number":283,"context_line":"                 shelve_offload"},{"line_number":284,"context_line":"        * 3.38 - Add clean_shutdown to prep_resize"},{"line_number":285,"context_line":"        * 3.39 - Make build_and_run_instance() handle legacy limits topology"},{"line_number":286,"context_line":"    \u0027\u0027\u0027"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    VERSION_ALIASES \u003d {"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_30512963","line":285,"in_reply_to":"1a930d6b_00aed32d","updated":"2015-01-28 14:16:01.000000000","message":"Done","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"ae92e531861d2b879d6ffa04bdad601b33c010c6","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        * 3.37 - Add clean_shutdown to stop, resize, rescue, shelve, and"},{"line_number":283,"context_line":"                 shelve_offload"},{"line_number":284,"context_line":"        * 3.38 - Add clean_shutdown to prep_resize"},{"line_number":285,"context_line":"        * 3.39 - Make build_and_run_instance() handle legacy limits topology"},{"line_number":286,"context_line":"    \u0027\u0027\u0027"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    VERSION_ALIASES \u003d {"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_00aed32d","line":285,"in_reply_to":"1a930d6b_2cd90bf3","updated":"2015-01-27 17:13:25.000000000","message":"Yes I have forgotten this point. Will update it.","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aa50bb8c7a62aa4404c3e0c2b95401ae8f837f05","unresolved":false,"context_lines":[{"line_number":965,"context_line":"                    cnode \u003d ("},{"line_number":966,"context_line":"                        objects.ComputeNode."},{"line_number":967,"context_line":"                        get_first_node_by_host_for_old_compat("},{"line_number":968,"context_line":"                            ctxt, host))"},{"line_number":969,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":970,"context_line":"                    cnode.numa_topology)"},{"line_number":971,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_80a1e3f9","line":968,"updated":"2015-01-27 16:59:01.000000000","message":"I still really hate this.","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1114090cd577ece25cbc34136b7d16766aa7ae2c","unresolved":false,"context_lines":[{"line_number":965,"context_line":"                    cnode \u003d ("},{"line_number":966,"context_line":"                        objects.ComputeNode."},{"line_number":967,"context_line":"                        get_first_node_by_host_for_old_compat("},{"line_number":968,"context_line":"                            ctxt, host))"},{"line_number":969,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":970,"context_line":"                    cnode.numa_topology)"},{"line_number":971,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_434f0534","line":968,"in_reply_to":"1a930d6b_80a1e3f9","updated":"2015-01-27 17:30:04.000000000","message":"@Dan: I agree it\u0027s ugly, but there\u0027s no real way around the fact that without a supplied nodename, there\u0027s no other way to get the compute node...","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"ae92e531861d2b879d6ffa04bdad601b33c010c6","unresolved":false,"context_lines":[{"line_number":965,"context_line":"                    cnode \u003d ("},{"line_number":966,"context_line":"                        objects.ComputeNode."},{"line_number":967,"context_line":"                        get_first_node_by_host_for_old_compat("},{"line_number":968,"context_line":"                            ctxt, host))"},{"line_number":969,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":970,"context_line":"                    cnode.numa_topology)"},{"line_number":971,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_0075f3c9","line":968,"in_reply_to":"1a930d6b_80a1e3f9","updated":"2015-01-27 17:13:25.000000000","message":"I do not believe it is my fault, let me know a better way ?","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"5c4b7bb6ab9a724c78077f44158840fb12110e15","unresolved":false,"context_lines":[{"line_number":957,"context_line":"        version \u003d \u00273.39\u0027"},{"line_number":958,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":959,"context_line":"            version \u003d \u00273.36\u0027"},{"line_number":960,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":961,"context_line":"                topology_limits \u003d limits[\u0027numa_topology\u0027]"},{"line_number":962,"context_line":"                # TODO(lxsli): The reason we\u0027re doing this is that the old nova"},{"line_number":963,"context_line":"                # virt objects had a different format and we need to provide"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa81d914_15ea280f","line":960,"updated":"2015-01-29 08:18:52.000000000","message":"I believe that that limits\u003d\u003dNone should be tested","commit_id":"e7ca5306346a29c1e13a3abac7ca5ff679e19af6"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"6d4546b6026252b0985cba66efd343e8ffc05fcc","unresolved":false,"context_lines":[{"line_number":957,"context_line":"        version \u003d \u00273.39\u0027"},{"line_number":958,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":959,"context_line":"            version \u003d \u00273.36\u0027"},{"line_number":960,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":961,"context_line":"                topology_limits \u003d limits[\u0027numa_topology\u0027]"},{"line_number":962,"context_line":"                # TODO(lxsli): The reason we\u0027re doing this is that the old nova"},{"line_number":963,"context_line":"                # virt objects had a different format and we need to provide"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_b676ec3c","line":960,"in_reply_to":"da86d52c_711ac76f","updated":"2015-02-02 14:10:39.000000000","message":"Right, let met update this point when ndipanov will give me more hints about what he wants on the test. thx.","commit_id":"e7ca5306346a29c1e13a3abac7ca5ff679e19af6"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"330d938c9f0bc10f501c0fa9a402726bd8ce3339","unresolved":false,"context_lines":[{"line_number":957,"context_line":"        version \u003d \u00273.39\u0027"},{"line_number":958,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":959,"context_line":"            version \u003d \u00273.36\u0027"},{"line_number":960,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":961,"context_line":"                topology_limits \u003d limits[\u0027numa_topology\u0027]"},{"line_number":962,"context_line":"                # TODO(lxsli): The reason we\u0027re doing this is that the old nova"},{"line_number":963,"context_line":"                # virt objects had a different format and we need to provide"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_711ac76f","line":960,"in_reply_to":"da86d52c_7f6c539d","updated":"2015-02-02 10:19:05.000000000","message":"\u0027limits\u0027 is argument with default value \u0027None\u0027. If function call is changed we can get exception here.","commit_id":"e7ca5306346a29c1e13a3abac7ca5ff679e19af6"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3039bfbc20d4a69d895e37440db1909d13063d22","unresolved":false,"context_lines":[{"line_number":957,"context_line":"        version \u003d \u00273.39\u0027"},{"line_number":958,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":959,"context_line":"            version \u003d \u00273.36\u0027"},{"line_number":960,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":961,"context_line":"                topology_limits \u003d limits[\u0027numa_topology\u0027]"},{"line_number":962,"context_line":"                # TODO(lxsli): The reason we\u0027re doing this is that the old nova"},{"line_number":963,"context_line":"                # virt objects had a different format and we need to provide"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa81d914_cee0c598","line":960,"in_reply_to":"fa81d914_15ea280f","updated":"2015-01-30 11:15:21.000000000","message":"yep!","commit_id":"e7ca5306346a29c1e13a3abac7ca5ff679e19af6"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"73a7144121acc3c99bb4df02340fd7ad2f63cc51","unresolved":false,"context_lines":[{"line_number":957,"context_line":"        version \u003d \u00273.39\u0027"},{"line_number":958,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":959,"context_line":"            version \u003d \u00273.36\u0027"},{"line_number":960,"context_line":"            if \u0027numa_topology\u0027 in limits and limits[\u0027numa_topology\u0027]:"},{"line_number":961,"context_line":"                topology_limits \u003d limits[\u0027numa_topology\u0027]"},{"line_number":962,"context_line":"                # TODO(lxsli): The reason we\u0027re doing this is that the old nova"},{"line_number":963,"context_line":"                # virt objects had a different format and we need to provide"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_7f6c539d","line":960,"in_reply_to":"fa81d914_cee0c598","updated":"2015-02-02 10:00:20.000000000","message":"I do not see how this can happen?","commit_id":"e7ca5306346a29c1e13a3abac7ca5ff679e19af6"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"6023be50c40c914603414e534b62013794640b69","unresolved":false,"context_lines":[{"line_number":971,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":972,"context_line":"                    cnode.numa_topology)"},{"line_number":973,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("},{"line_number":974,"context_line":"                    objects_base.obj_to_primitive("},{"line_number":975,"context_line":"                        topology_limits.to_dict_legacy(host_topology)))"},{"line_number":976,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":977,"context_line":"            version \u003d \u00273.33\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_18cd0c5e","line":974,"updated":"2015-03-05 12:32:59.000000000","message":"why do we call obj_to_primitive on a dict?","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"6887ecd4ea8ca90794ab9182c189541bc836a49c","unresolved":false,"context_lines":[{"line_number":971,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":972,"context_line":"                    cnode.numa_topology)"},{"line_number":973,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("},{"line_number":974,"context_line":"                    objects_base.obj_to_primitive("},{"line_number":975,"context_line":"                        topology_limits.to_dict_legacy(host_topology)))"},{"line_number":976,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":977,"context_line":"            version \u003d \u00273.33\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_ede1d42a","line":974,"in_reply_to":"9a80dd14_14f0fafc","updated":"2015-03-09 15:51:16.000000000","message":"Not sure what you mean - my point is that obj_base.obj_to_primitive should be passed an instance of NovaObjects, while we pass it a dict here. \n\nI think you don\u0027t need the obj_to_primitive here at all.","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"8c0f507772f4dd5e45681262189849afb3cc6c80","unresolved":false,"context_lines":[{"line_number":971,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":972,"context_line":"                    cnode.numa_topology)"},{"line_number":973,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("},{"line_number":974,"context_line":"                    objects_base.obj_to_primitive("},{"line_number":975,"context_line":"                        topology_limits.to_dict_legacy(host_topology)))"},{"line_number":976,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":977,"context_line":"            version \u003d \u00273.33\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_14f0fafc","line":974,"in_reply_to":"9a80dd14_18cd0c5e","updated":"2015-03-09 12:13:50.000000000","message":"I need to verify this point  but it think this is something happens between scheduler and compute","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"416339c5ebd480a2b3ab08c1302076033ba5a7f2","unresolved":false,"context_lines":[{"line_number":971,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":972,"context_line":"                    cnode.numa_topology)"},{"line_number":973,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("},{"line_number":974,"context_line":"                    objects_base.obj_to_primitive("},{"line_number":975,"context_line":"                        topology_limits.to_dict_legacy(host_topology)))"},{"line_number":976,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":977,"context_line":"            version \u003d \u00273.33\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_fe071c7f","line":974,"in_reply_to":"9a80dd14_c3ed25b9","updated":"2015-03-12 15:03:40.000000000","message":"Done","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"97cfd6a7a90b5e5fe1d2058706d082897a18d80f","unresolved":false,"context_lines":[{"line_number":971,"context_line":"                host_topology \u003d objects.NUMATopology.obj_from_db_obj("},{"line_number":972,"context_line":"                    cnode.numa_topology)"},{"line_number":973,"context_line":"                limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps("},{"line_number":974,"context_line":"                    objects_base.obj_to_primitive("},{"line_number":975,"context_line":"                        topology_limits.to_dict_legacy(host_topology)))"},{"line_number":976,"context_line":"        if not self.client.can_send_version(version):"},{"line_number":977,"context_line":"            version \u003d \u00273.33\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_c3ed25b9","line":974,"in_reply_to":"9a80dd14_ede1d42a","updated":"2015-03-12 12:56:22.000000000","message":"Agree with Nikola here. The above should just be:\n\n host_topology \u003d objects.NUMATopology.obj_from_db_obj(\n     cnode.numa_topology)\n limits[\u0027numa_topology\u0027] \u003d jsonutils.dumps(\n     topology_limits.to_dict_legacy(host_topology))","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"}],"nova/conductor/manager.py":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"261499fcd5256c2c51eaac926c555922d9d94c8c","unresolved":false,"context_lines":[{"line_number":656,"context_line":"            # Compatibility with compute nodes that handle old limits topology"},{"line_number":657,"context_line":"            if legacy_limits:"},{"line_number":658,"context_line":"                limits \u003d objects.NUMATopologyLimits(**host[\u0027limits\u0027])"},{"line_number":659,"context_line":"                host_topology \u003d objects.NUMATopology(cells\u003d[])"},{"line_number":660,"context_line":"                host[\u0027limits\u0027][\u0027numa_topology\u0027] \u003d ("},{"line_number":661,"context_line":"                    jsonutils.dumps(limits.to_dict_legacy(host_topology)))"},{"line_number":662,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_dd697bf9","line":659,"updated":"2014-12-02 13:47:30.000000000","message":"I\u0027m stuck here about how to get the host numa topology. we need it to construct old topology limits.","commit_id":"5d9e760002d22d2e69d68e1cb4276e10a53b2374"}],"nova/objects/numa.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8493357889fa31c9725680f52fafc491bb80b780","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    fields \u003d {"},{"line_number":108,"context_line":"        \u0027cpu_ratio\u0027: fields.FloatField(),"},{"line_number":109,"context_line":"        \u0027ram_ratio\u0027: fields.FloatField(),"},{"line_number":110,"context_line":"        }"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_a24d96c7","line":108,"updated":"2014-12-01 12:44:54.000000000","message":"Should be cpu_allocation_ratio, to match the same named configuration option.","commit_id":"eb85f9e2913c423f7bf3c5ae9b6f5ebc2620a434"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"ddef5e6dde747db737f52a0608101003efe3a311","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        }"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    @classmethod"},{"line_number":113,"context_line":"    def obj_from_db_obj(cls, db_obj):"},{"line_number":114,"context_line":"        return cls.obj_from_primitive("},{"line_number":115,"context_line":"            jsonutils.loads(db_obj))"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a890539_ec59318f","line":113,"updated":"2014-12-02 09:07:06.000000000","message":"Hmmmm - we never save these anywhere and I am not sure we would want to. I guess it can stay since we might wanna persist them in the future (when they are on the compute node side) but even that seems unlikely.","commit_id":"4178fdb60192b147c0d3b49b2e80031eb12eabc1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f1952068d129ec0e2d338b0fcd3d77b42e5da0f9","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                         \u0027limit\u0027: cell.memory * self.ram_allocation_ratio},"},{"line_number":135,"context_line":"                 \u0027cpu_limit\u0027: len(cell.cpuset) * self.cpu_allocation_ratio,"},{"line_number":136,"context_line":"                 \u0027id\u0027: cell.id})"},{"line_number":137,"context_line":"        return {\u0027cells\u0027: cells}"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a890539_66677052","line":137,"updated":"2014-12-05 23:37:33.000000000","message":"Where is the test for this method? Looks like it should have a test for this whole class in nova/tests/unit/objects/test_numa.py","commit_id":"21bd230a374156e826de95f7ab0d0fd86e6bf519"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"960ce6810664de6bc3f2e13b49d24eb3caf27f21","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                primitive)"},{"line_number":177,"context_line":"        else:"},{"line_number":178,"context_line":"            # NOTE(sahid): This compatibility code needs to stay until we can"},{"line_number":179,"context_line":"            # guarantee that all compute nodes are in a version \u003d\u003e 3.38."},{"line_number":180,"context_line":"            cell \u003d primitive[\u0027cells\u0027][0]"},{"line_number":181,"context_line":"            ram_ratio \u003d cell[\u0027mem\u0027][\u0027limit\u0027] / float(cell[\u0027mem\u0027][\u0027total\u0027])"},{"line_number":182,"context_line":"            cpu_ratio \u003d cell[\u0027cpu_limit\u0027] / float(len(hardware.parse_cpu_spec("}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_bf7eed16","line":179,"updated":"2014-12-15 13:17:29.000000000","message":"s/in a version/using RPC API version/","commit_id":"bf7fcd499fe75e1f620e9ac8571bc087ac0e0bcf"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"f92305ab1cd5d161c9caf63c370554f828c93fe6","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                primitive)"},{"line_number":177,"context_line":"        else:"},{"line_number":178,"context_line":"            # NOTE(sahid): This compatibility code needs to stay until we can"},{"line_number":179,"context_line":"            # guarantee that all compute nodes are in a version \u003d\u003e 3.38."},{"line_number":180,"context_line":"            cell \u003d primitive[\u0027cells\u0027][0]"},{"line_number":181,"context_line":"            ram_ratio \u003d cell[\u0027mem\u0027][\u0027limit\u0027] / float(cell[\u0027mem\u0027][\u0027total\u0027])"},{"line_number":182,"context_line":"            cpu_ratio \u003d cell[\u0027cpu_limit\u0027] / float(len(hardware.parse_cpu_spec("}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_1732ec5e","line":179,"in_reply_to":"3a961159_bf7eed16","updated":"2014-12-19 11:24:09.000000000","message":"Done","commit_id":"bf7fcd499fe75e1f620e9ac8571bc087ac0e0bcf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5049a45825b768849ae407f2c42bcdc8b6ba4818","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        if \u0027nova_object.name\u0027 in primitive:"},{"line_number":198,"context_line":"            obj_topology \u003d super(NUMATopologyLimits, cls).obj_from_primitive("},{"line_number":199,"context_line":"                primitive)"},{"line_number":200,"context_line":"        else:"},{"line_number":201,"context_line":"            # NOTE(sahid): This compatibility code needs to stay until we can"},{"line_number":202,"context_line":"            # guarantee that all compute nodes are using RPC API \u003d\u003e 3.38."},{"line_number":203,"context_line":"            cell \u003d primitive[\u0027cells\u0027][0]"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_ee7bc6bb","line":200,"updated":"2014-12-19 15:56:49.000000000","message":"I don\u0027t think you should do this. obj_from_primitive() is specifically to load the regular object serialized form. If you need to load from an older format, that should be another method. Just make obj_from_db_obj() do this else part directly instead of overriding obj_from_primitive()","commit_id":"e329e79d7523e4e4c46e33a06636d179d83faa92"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"26ac3dc968ad7481c307a941293155b0895d3f49","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        if \u0027nova_object.name\u0027 in primitive:"},{"line_number":198,"context_line":"            obj_topology \u003d super(NUMATopologyLimits, cls).obj_from_primitive("},{"line_number":199,"context_line":"                primitive)"},{"line_number":200,"context_line":"        else:"},{"line_number":201,"context_line":"            # NOTE(sahid): This compatibility code needs to stay until we can"},{"line_number":202,"context_line":"            # guarantee that all compute nodes are using RPC API \u003d\u003e 3.38."},{"line_number":203,"context_line":"            cell \u003d primitive[\u0027cells\u0027][0]"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_7c9cd0c0","line":200,"in_reply_to":"3a961159_ee7bc6bb","updated":"2014-12-22 08:49:09.000000000","message":"I can do that if you prefer, yes.","commit_id":"e329e79d7523e4e4c46e33a06636d179d83faa92"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"e2882acc150de83da42a43e7f9025d6cd22c10b4","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":218,"context_line":"        if \u0027nova_object.name\u0027 in db_obj:"},{"line_number":219,"context_line":"            obj_topology \u003d cls.obj_from_primitive("},{"line_number":220,"context_line":"                primitive)"},{"line_number":221,"context_line":"        else:"},{"line_number":222,"context_line":"            # NOTE(sahid): This compatibility code needs to stay until we can"},{"line_number":223,"context_line":"            # guarantee that all compute nodes are using RPC API \u003d\u003e 3.38."}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_021fdc6c","line":220,"updated":"2015-01-27 00:33:08.000000000","message":"Looks like \u0027primitive\u0027 could be on the prior line.","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9723930d1bdd0cc6a00c892bcc6d2a9dceb5a06d","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":218,"context_line":"        if \u0027nova_object.name\u0027 in db_obj:"},{"line_number":219,"context_line":"            obj_topology \u003d cls.obj_from_primitive("},{"line_number":220,"context_line":"                primitive)"},{"line_number":221,"context_line":"        else:"},{"line_number":222,"context_line":"            # NOTE(sahid): This compatibility code needs to stay until we can"},{"line_number":223,"context_line":"            # guarantee that all compute nodes are using RPC API \u003d\u003e 3.38."}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_74b84c11","line":220,"in_reply_to":"1a930d6b_021fdc6c","updated":"2015-01-27 10:12:17.000000000","message":"Done","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aa50bb8c7a62aa4404c3e0c2b95401ae8f837f05","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        return {\u0027cells\u0027: cells}"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    @classmethod"},{"line_number":216,"context_line":"    def obj_from_db_obj(cls, db_obj):"},{"line_number":217,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":218,"context_line":"        if \u0027nova_object.name\u0027 in primitive:"},{"line_number":219,"context_line":"            obj_topology \u003d cls.obj_from_primitive("}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_4c92d7f6","line":216,"updated":"2015-01-27 16:59:01.000000000","message":"Normally these kinds of functions take a dict as db_obj, not a string we expect to be un-json-ified. It seems unintuitive this way.","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1114090cd577ece25cbc34136b7d16766aa7ae2c","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        return {\u0027cells\u0027: cells}"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    @classmethod"},{"line_number":216,"context_line":"    def obj_from_db_obj(cls, db_obj):"},{"line_number":217,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":218,"context_line":"        if \u0027nova_object.name\u0027 in primitive:"},{"line_number":219,"context_line":"            obj_topology \u003d cls.obj_from_primitive("}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_632fa13f","line":216,"in_reply_to":"1a930d6b_4c92d7f6","updated":"2015-01-27 17:30:04.000000000","message":"Agreed. Or at least, the _from_db_obj() method of most nova.object subclasses takes a dict. How about just renaming this to from_legacy_blob()?","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"ae92e531861d2b879d6ffa04bdad601b33c010c6","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        return {\u0027cells\u0027: cells}"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    @classmethod"},{"line_number":216,"context_line":"    def obj_from_db_obj(cls, db_obj):"},{"line_number":217,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":218,"context_line":"        if \u0027nova_object.name\u0027 in primitive:"},{"line_number":219,"context_line":"            obj_topology \u003d cls.obj_from_primitive("}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_40529b35","line":216,"in_reply_to":"1a930d6b_4c92d7f6","updated":"2015-01-27 17:13:25.000000000","message":"Hum... I will see that","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"f6a2a5b3f09616c29fa4b42c3839baa8117dd880","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    @classmethod"},{"line_number":216,"context_line":"    def obj_from_db_obj(cls, db_obj):"},{"line_number":217,"context_line":"        primitive \u003d jsonutils.loads(db_obj)"},{"line_number":218,"context_line":"        if \u0027nova_object.name\u0027 in primitive:"},{"line_number":219,"context_line":"            obj_topology \u003d cls.obj_from_primitive("},{"line_number":220,"context_line":"                primitive)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_d05a8d82","line":217,"updated":"2015-01-28 14:16:01.000000000","message":"This line looks to be not necessary.","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"97cfd6a7a90b5e5fe1d2058706d082897a18d80f","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            obj_topology \u003d cls.obj_from_primitive(db_obj)"},{"line_number":212,"context_line":"        else:"},{"line_number":213,"context_line":"            # NOTE(sahid): This compatibility code needs to stay until we can"},{"line_number":214,"context_line":"            # guarantee that all compute nodes are using RPC API \u003d\u003e 3.38."},{"line_number":215,"context_line":"            cell \u003d db_obj[\u0027cells\u0027][0]"},{"line_number":216,"context_line":"            ram_ratio \u003d cell[\u0027mem\u0027][\u0027limit\u0027] / float(cell[\u0027mem\u0027][\u0027total\u0027])"},{"line_number":217,"context_line":"            cpu_ratio \u003d cell[\u0027cpu_limit\u0027] / float(len(hardware.parse_cpu_spec("}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_a32031f8","line":214,"updated":"2015-03-12 12:56:22.000000000","message":"s/3.38/3.40/","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"416339c5ebd480a2b3ab08c1302076033ba5a7f2","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            obj_topology \u003d cls.obj_from_primitive(db_obj)"},{"line_number":212,"context_line":"        else:"},{"line_number":213,"context_line":"            # NOTE(sahid): This compatibility code needs to stay until we can"},{"line_number":214,"context_line":"            # guarantee that all compute nodes are using RPC API \u003d\u003e 3.38."},{"line_number":215,"context_line":"            cell \u003d db_obj[\u0027cells\u0027][0]"},{"line_number":216,"context_line":"            ram_ratio \u003d cell[\u0027mem\u0027][\u0027limit\u0027] / float(cell[\u0027mem\u0027][\u0027total\u0027])"},{"line_number":217,"context_line":"            cpu_ratio \u003d cell[\u0027cpu_limit\u0027] / float(len(hardware.parse_cpu_spec("}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_de2b38e9","line":214,"in_reply_to":"9a80dd14_a32031f8","updated":"2015-03-12 15:03:40.000000000","message":"Done","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"}],"nova/scheduler/filters/numa_topology_filter.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8493357889fa31c9725680f52fafc491bb80b780","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                        limits_topology\u003dlimits))"},{"line_number":42,"context_line":"            if not instance_topology:"},{"line_number":43,"context_line":"                return False"},{"line_number":44,"context_line":"            host_state.limits[\u0027numa_topology\u0027] \u003d limits"},{"line_number":45,"context_line":"            instance[\u0027numa_topology\u0027] \u003d instance_topology"},{"line_number":46,"context_line":"            return True"},{"line_number":47,"context_line":"        elif requested_topology:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a890539_a2d4b6bb","line":44,"updated":"2014-12-01 12:44:54.000000000","message":"++ yay :)","commit_id":"eb85f9e2913c423f7bf3c5ae9b6f5ebc2620a434"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"637aaa804dcc671206baa1a238c4c28c41b3ef29","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                        limits_topology\u003dlimits))"},{"line_number":42,"context_line":"            if not instance_topology:"},{"line_number":43,"context_line":"                return False"},{"line_number":44,"context_line":"            host_state.limits[\u0027numa_topology\u0027] \u003d limits"},{"line_number":45,"context_line":"            instance[\u0027numa_topology\u0027] \u003d instance_topology"},{"line_number":46,"context_line":"            return True"},{"line_number":47,"context_line":"        elif requested_topology:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_5f18a9d2","line":44,"updated":"2014-12-15 13:22:12.000000000","message":"See, right here, you\u0027ve made this an object (correctly), therefore you do not need to reconstruct the LImits object in claims.py like you are doing above. The manager should not be converting an object back to a dict...","commit_id":"bf7fcd499fe75e1f620e9ac8571bc087ac0e0bcf"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"f92305ab1cd5d161c9caf63c370554f828c93fe6","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                        limits_topology\u003dlimits))"},{"line_number":42,"context_line":"            if not instance_topology:"},{"line_number":43,"context_line":"                return False"},{"line_number":44,"context_line":"            host_state.limits[\u0027numa_topology\u0027] \u003d limits"},{"line_number":45,"context_line":"            instance[\u0027numa_topology\u0027] \u003d instance_topology"},{"line_number":46,"context_line":"            return True"},{"line_number":47,"context_line":"        elif requested_topology:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_37336863","line":44,"in_reply_to":"3a961159_5f18a9d2","updated":"2014-12-19 11:24:09.000000000","message":"yep...","commit_id":"bf7fcd499fe75e1f620e9ac8571bc087ac0e0bcf"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"6023be50c40c914603414e534b62013794640b69","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            pci_requests \u003d pci_requests.requests"},{"line_number":38,"context_line":"        if requested_topology and host_topology:"},{"line_number":39,"context_line":"            limits \u003d objects.NUMATopologyLimits("},{"line_number":40,"context_line":"                cpu_allocation_ratio\u003dcpu_ratio,"},{"line_number":41,"context_line":"                ram_allocation_ratio\u003dram_ratio)"},{"line_number":42,"context_line":"            instance_topology \u003d (hardware.numa_fit_instance_to_host("},{"line_number":43,"context_line":"                        host_topology, requested_topology,"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_b845e071","line":40,"updated":"2015-03-05 12:32:59.000000000","message":"hmmm so why did we decide to move from sending an actual limit to a ratio? I\u0027m not cool with that just on the basis of semantics. Ratio is not a limit!","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"97cfd6a7a90b5e5fe1d2058706d082897a18d80f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            pci_requests \u003d pci_requests.requests"},{"line_number":38,"context_line":"        if requested_topology and host_topology:"},{"line_number":39,"context_line":"            limits \u003d objects.NUMATopologyLimits("},{"line_number":40,"context_line":"                cpu_allocation_ratio\u003dcpu_ratio,"},{"line_number":41,"context_line":"                ram_allocation_ratio\u003dram_ratio)"},{"line_number":42,"context_line":"            instance_topology \u003d (hardware.numa_fit_instance_to_host("},{"line_number":43,"context_line":"                        host_topology, requested_topology,"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_43ba156f","line":40,"in_reply_to":"9a80dd14_4d266069","updated":"2015-03-12 12:56:22.000000000","message":"Yes, after a chat with Sahid (and you, I thought?) I was told that under no circumstances do we (or do we plan to) support setting different overcommit ratios on different cells within a NUMA topology. In other words, there\u0027s a single ratio for CPU and RAM allocation that is applied to all cells. Therefore, I asked that the Limits object simply represent those two things, and not repeat them for each cell in the topology (or even contain a set of cell objects in the Limits object).","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"6887ecd4ea8ca90794ab9182c189541bc836a49c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            pci_requests \u003d pci_requests.requests"},{"line_number":38,"context_line":"        if requested_topology and host_topology:"},{"line_number":39,"context_line":"            limits \u003d objects.NUMATopologyLimits("},{"line_number":40,"context_line":"                cpu_allocation_ratio\u003dcpu_ratio,"},{"line_number":41,"context_line":"                ram_allocation_ratio\u003dram_ratio)"},{"line_number":42,"context_line":"            instance_topology \u003d (hardware.numa_fit_instance_to_host("},{"line_number":43,"context_line":"                        host_topology, requested_topology,"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_4d266069","line":40,"in_reply_to":"9a80dd14_7444d649","updated":"2015-03-09 15:51:16.000000000","message":"I see... well still it\u0027s not limits if you\u0027re sending a ratio... maybe we shouldn\u0027t be changing it at all, and just objectifying the current limits (that carry limits per cell)?","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"8c0f507772f4dd5e45681262189849afb3cc6c80","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            pci_requests \u003d pci_requests.requests"},{"line_number":38,"context_line":"        if requested_topology and host_topology:"},{"line_number":39,"context_line":"            limits \u003d objects.NUMATopologyLimits("},{"line_number":40,"context_line":"                cpu_allocation_ratio\u003dcpu_ratio,"},{"line_number":41,"context_line":"                ram_allocation_ratio\u003dram_ratio)"},{"line_number":42,"context_line":"            instance_topology \u003d (hardware.numa_fit_instance_to_host("},{"line_number":43,"context_line":"                        host_topology, requested_topology,"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_7444d649","line":40,"in_reply_to":"9a80dd14_b845e071","updated":"2015-03-09 12:13:50.000000000","message":"\u0027O_o - I remember that we have discussed with Jay on Hangout about how to handle the new topology limits object. ratio makes sense since  cells can have different amounts of memory or number of cpus","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"}],"nova/tests/unit/compute/test_resource_tracker.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5049a45825b768849ae407f2c42bcdc8b6ba4818","unresolved":false,"context_lines":[{"line_number":549,"context_line":"            \u0027memory_mb\u0027: memory_mb,"},{"line_number":550,"context_line":"            \u0027disk_gb\u0027: disk_gb,"},{"line_number":551,"context_line":"            \u0027vcpu\u0027: vcpus,"},{"line_number":552,"context_line":"            \u0027numa_topology\u0027: numa_topology"},{"line_number":553,"context_line":"        }"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"    def assertEqualNUMAHostTopology(self, expected, got):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_ce552a1f","line":552,"updated":"2014-12-19 15:56:49.000000000","message":"Missing trailing comma","commit_id":"e329e79d7523e4e4c46e33a06636d179d83faa92"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"4893cd833e2dd2907971acb9bc592d541d55cdcc","unresolved":false,"context_lines":[{"line_number":549,"context_line":"            \u0027memory_mb\u0027: memory_mb,"},{"line_number":550,"context_line":"            \u0027disk_gb\u0027: disk_gb,"},{"line_number":551,"context_line":"            \u0027vcpu\u0027: vcpus,"},{"line_number":552,"context_line":"            \u0027numa_topology\u0027: numa_topology"},{"line_number":553,"context_line":"        }"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"    def assertEqualNUMAHostTopology(self, expected, got):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a961159_3c8de87c","line":552,"in_reply_to":"3a961159_ce552a1f","updated":"2014-12-22 08:51:48.000000000","message":"We don\u0027t have a particular rule about this, do we have? actually since it\u0027s a kind of hash table I also prefer to have a trailing comma.\n\nI will update the code.","commit_id":"e329e79d7523e4e4c46e33a06636d179d83faa92"}],"nova/tests/unit/compute/test_rpcapi.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"8cede48919bec0d5432ef87ea33228c5a1a82b53","unresolved":false,"context_lines":[{"line_number":556,"context_line":"                        network_id\u003d\"fake_network_id\", address\u003d\"10.0.0.1\","},{"line_number":557,"context_line":"                        port_id\u003d\"fake_port_id\")]),"},{"line_number":558,"context_line":"                security_groups\u003dNone,"},{"line_number":559,"context_line":"                block_device_mapping\u003dNone, node\u003d\u0027node\u0027, limits\u003d[],"},{"line_number":560,"context_line":"                version\u003d\u00273.23\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_cef4115d","line":559,"updated":"2015-01-27 09:41:01.000000000","message":"It would be really good to tests limits here or in a separate test, seeing that it won\u0027t get hit by granade immediately (until we land the tempest tests)","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"5ec33f08e09a084af321e6b6a7f70b2d12c7648e","unresolved":false,"context_lines":[{"line_number":560,"context_line":"                block_device_mapping\u003dNone, node\u003d\u0027node\u0027, limits\u003d{},"},{"line_number":561,"context_line":"                version\u003d\u00273.23\u0027)"},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_by_host_and_nodename\u0027)"},{"line_number":564,"context_line":"    @mock.patch(\u0027nova.utils.is_neutron\u0027, return_value\u003dTrue)"},{"line_number":565,"context_line":"    def test_build_and_run_instance_limits_icehouse_compat("},{"line_number":566,"context_line":"            self, is_neutron, get_by_host_and_nodename):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_5748a8b2","line":563,"updated":"2015-01-27 14:46:22.000000000","message":"new test added","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1114090cd577ece25cbc34136b7d16766aa7ae2c","unresolved":false,"context_lines":[{"line_number":564,"context_line":"    @mock.patch(\u0027nova.utils.is_neutron\u0027, return_value\u003dTrue)"},{"line_number":565,"context_line":"    def test_build_and_run_instance_limits_icehouse_compat("},{"line_number":566,"context_line":"            self, is_neutron, get_by_host_and_nodename):"},{"line_number":567,"context_line":"        cnode \u003d mock.MagicMock()"},{"line_number":568,"context_line":"        cnode.numa_topology \u003d jsonutils.dumps(objects_numa.NUMATopology(cells\u003d["},{"line_number":569,"context_line":"            objects_numa.NUMACell("},{"line_number":570,"context_line":"                id\u003d0, cpuset\u003dset([1, 2]), memory\u003d512,"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_43c2a553","line":567,"updated":"2015-01-27 17:30:04.000000000","message":"Instead of a mock, just make cnode an actual nova.objects.ComputeNode object.","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1114090cd577ece25cbc34136b7d16766aa7ae2c","unresolved":false,"context_lines":[{"line_number":565,"context_line":"    def test_build_and_run_instance_limits_icehouse_compat("},{"line_number":566,"context_line":"            self, is_neutron, get_by_host_and_nodename):"},{"line_number":567,"context_line":"        cnode \u003d mock.MagicMock()"},{"line_number":568,"context_line":"        cnode.numa_topology \u003d jsonutils.dumps(objects_numa.NUMATopology(cells\u003d["},{"line_number":569,"context_line":"            objects_numa.NUMACell("},{"line_number":570,"context_line":"                id\u003d0, cpuset\u003dset([1, 2]), memory\u003d512,"},{"line_number":571,"context_line":"                cpu_usage\u003d2, memory_usage\u003d256,"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a930d6b_43ec65bb","line":568,"updated":"2015-01-27 17:30:04.000000000","message":"This doesn\u0027t make sense to me. This is testing the block of code in the RPC API that corresponds to an old compute node calling a new conductor. The new conductor code path calls nova.objects.ComputeNode.get_by_host_and_nodename() (or get_first_blah_old_compat()), which constructs the ComputeNode object\u0027s numa_topology to be a nova.objects.NUMATopology object, not a serialized JSON string.","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"f6a2a5b3f09616c29fa4b42c3839baa8117dd880","unresolved":false,"context_lines":[{"line_number":565,"context_line":"    def test_build_and_run_instance_limits_icehouse_compat("},{"line_number":566,"context_line":"            self, is_neutron, get_by_host_and_nodename):"},{"line_number":567,"context_line":"        cnode \u003d mock.MagicMock()"},{"line_number":568,"context_line":"        cnode.numa_topology \u003d jsonutils.dumps(objects_numa.NUMATopology(cells\u003d["},{"line_number":569,"context_line":"            objects_numa.NUMACell("},{"line_number":570,"context_line":"                id\u003d0, cpuset\u003dset([1, 2]), memory\u003d512,"},{"line_number":571,"context_line":"                cpu_usage\u003d2, memory_usage\u003d256,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_9063b519","line":568,"in_reply_to":"1a930d6b_43ec65bb","updated":"2015-01-28 14:16:01.000000000","message":"The problem comes from a json.loads added in obj_from_db in numa.py","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9aefc06fea3de521fe55e0bfa616e21f9df81a90","unresolved":false,"context_lines":[{"line_number":565,"context_line":"    def test_build_and_run_instance_limits_icehouse_compat("},{"line_number":566,"context_line":"            self, is_neutron, get_by_host_and_nodename):"},{"line_number":567,"context_line":"        cnode \u003d mock.MagicMock()"},{"line_number":568,"context_line":"        cnode.numa_topology \u003d jsonutils.dumps(objects_numa.NUMATopology(cells\u003d["},{"line_number":569,"context_line":"            objects_numa.NUMACell("},{"line_number":570,"context_line":"                id\u003d0, cpuset\u003dset([1, 2]), memory\u003d512,"},{"line_number":571,"context_line":"                cpu_usage\u003d2, memory_usage\u003d256,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa81d914_26dacf78","line":568,"in_reply_to":"fa81d914_9063b519","updated":"2015-01-28 14:40:58.000000000","message":"Actually the problem is because ComputeNode.numa_topology is a jsonstring: http://git.openstack.org/cgit/openstack/nova/tree/nova/objects/compute_node.py ...let me see what i can do","commit_id":"57e48faad55342af1c8b6c3e48ce19abae07d11b"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"9875b953bfe1ae7e8205388932c377d7f78ab631","unresolved":false,"context_lines":[{"line_number":600,"context_line":"                security_groups\u003dNone,"},{"line_number":601,"context_line":"                block_device_mapping\u003dNone,"},{"line_number":602,"context_line":"                node\u003d\u0027node\u0027,"},{"line_number":603,"context_line":"                limits\u003d{\u0027numa_topology\u0027: limits},"},{"line_number":604,"context_line":"                version\u003d\u00273.23\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa81d914_da68f1f7","line":603,"updated":"2015-01-28 12:51:07.000000000","message":"Hmmm so this should be the old style object now, no??","commit_id":"e093dd437e2010889af55959ec359301993957a7"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9a459b5fe2f3ba0be18cca7f595f1985aba2e60e","unresolved":false,"context_lines":[{"line_number":600,"context_line":"                security_groups\u003dNone,"},{"line_number":601,"context_line":"                block_device_mapping\u003dNone,"},{"line_number":602,"context_line":"                node\u003d\u0027node\u0027,"},{"line_number":603,"context_line":"                limits\u003d{\u0027numa_topology\u0027: limits},"},{"line_number":604,"context_line":"                version\u003d\u00273.23\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa81d914_43b9752d","line":603,"in_reply_to":"fa81d914_da68f1f7","updated":"2015-01-28 15:46:55.000000000","message":"Ahaha.. this make me crazy; we are testing an upgrade when we call an old compute node from a conductor updated, so limits should be in the new format, no?","commit_id":"e093dd437e2010889af55959ec359301993957a7"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3039bfbc20d4a69d895e37440db1909d13063d22","unresolved":false,"context_lines":[{"line_number":599,"context_line":"                security_groups\u003dNone,"},{"line_number":600,"context_line":"                block_device_mapping\u003dNone,"},{"line_number":601,"context_line":"                node\u003d\u0027node\u0027,"},{"line_number":602,"context_line":"                limits\u003d{\u0027numa_topology\u0027: limits},"},{"line_number":603,"context_line":"                version\u003d\u00273.23\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa81d914_6edd19e0","line":602,"updated":"2015-01-30 11:15:21.000000000","message":"Yeah so this still doesn\u0027t add up. If we had to downgrade - this should be receiving the old topology, jsonified, not the new object?","commit_id":"e7ca5306346a29c1e13a3abac7ca5ff679e19af6"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"73a7144121acc3c99bb4df02340fd7ad2f63cc51","unresolved":false,"context_lines":[{"line_number":599,"context_line":"                security_groups\u003dNone,"},{"line_number":600,"context_line":"                block_device_mapping\u003dNone,"},{"line_number":601,"context_line":"                node\u003d\u0027node\u0027,"},{"line_number":602,"context_line":"                limits\u003d{\u0027numa_topology\u0027: limits},"},{"line_number":603,"context_line":"                version\u003d\u00273.23\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_0eb0868a","line":602,"in_reply_to":"fa81d914_6edd19e0","updated":"2015-02-02 10:00:20.000000000","message":"I do not know what do you mean Nikola, we are in update_levels icehouse (I will update the test to use juno) and the compute node can handle 3.23. the conductor will pass to rpcapi limits as new object, then the rpcapi will convert it to the old format to send it to the compute node. Please can you elaborate what do you mean and/or at least what you want me to change/add. I probably do not have enough knowledge on this part","commit_id":"e7ca5306346a29c1e13a3abac7ca5ff679e19af6"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"6023be50c40c914603414e534b62013794640b69","unresolved":false,"context_lines":[{"line_number":628,"context_line":"                security_groups\u003dNone,"},{"line_number":629,"context_line":"                block_device_mapping\u003dNone,"},{"line_number":630,"context_line":"                node\u003d\u0027node\u0027,"},{"line_number":631,"context_line":"                limits\u003d{\u0027numa_topology\u0027: limits},"},{"line_number":632,"context_line":"                version\u003d\u00273.33\u0027)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_5b193e78","line":631,"updated":"2015-03-05 12:32:59.000000000","message":"I\u0027d still like this test to confirm that the donwgraded version is included tho...","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"97cfd6a7a90b5e5fe1d2058706d082897a18d80f","unresolved":false,"context_lines":[{"line_number":628,"context_line":"                security_groups\u003dNone,"},{"line_number":629,"context_line":"                block_device_mapping\u003dNone,"},{"line_number":630,"context_line":"                node\u003d\u0027node\u0027,"},{"line_number":631,"context_line":"                limits\u003d{\u0027numa_topology\u0027: limits},"},{"line_number":632,"context_line":"                version\u003d\u00273.33\u0027)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_637719d5","line":631,"in_reply_to":"9a80dd14_5b193e78","updated":"2015-03-12 12:56:22.000000000","message":"Agreed. We need to verify that the legacy JSON format is what is included here.","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"416339c5ebd480a2b3ab08c1302076033ba5a7f2","unresolved":false,"context_lines":[{"line_number":628,"context_line":"                security_groups\u003dNone,"},{"line_number":629,"context_line":"                block_device_mapping\u003dNone,"},{"line_number":630,"context_line":"                node\u003d\u0027node\u0027,"},{"line_number":631,"context_line":"                limits\u003d{\u0027numa_topology\u0027: limits},"},{"line_number":632,"context_line":"                version\u003d\u00273.33\u0027)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_91444eb8","line":631,"in_reply_to":"9a80dd14_637719d5","updated":"2015-03-12 15:03:40.000000000","message":"ok so i have to update _test_compute_api.","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"}],"nova/tests/unit/virt/test_hardware.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"8cede48919bec0d5432ef87ea33228c5a1a82b53","unresolved":false,"context_lines":[{"line_number":1316,"context_line":"        self.host \u003d hw.numa_usage_from_instances(self.host,"},{"line_number":1317,"context_line":"                [fitted_instance1])"},{"line_number":1318,"context_line":"        fitted_instance2 \u003d hw.numa_fit_instance_to_host("},{"line_number":1319,"context_line":"                self.host, self.instance2, self.limits)"},{"line_number":1320,"context_line":"        self.assertIsNone(fitted_instance2)"},{"line_number":1321,"context_line":""},{"line_number":1322,"context_line":"    def test_get_fitting_culmulative_success_limits(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_4e7581c9","line":1319,"updated":"2015-01-27 09:41:01.000000000","message":"This is because now we cannot represent separate limits per cell - but we were never actually using it so it\u0027s cool!","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"}],"nova/virt/hardware.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3b1e5cbed55cd5428d2ce0dc79344fd85fdb71b3","unresolved":false,"context_lines":[{"line_number":609,"context_line":"        return cls(cell_id, cpuset, memory)"},{"line_number":610,"context_line":""},{"line_number":611,"context_line":""},{"line_number":612,"context_line":"class VirtNUMATopologyCellLimit(VirtNUMATopologyCell):"},{"line_number":613,"context_line":"    def __init__(self, id, cpuset, memory, cpu_limit, memory_limit):"},{"line_number":614,"context_line":"        \"\"\"Create a new NUMA Cell with usage"},{"line_number":615,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_7c540022","side":"PARENT","line":612,"updated":"2014-12-02 17:40:36.000000000","message":"Can we kill the base classes too?","commit_id":"88e659193d65bcb3ecbcd32db94407a1a5ce81a9"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"ebc5990ccedb9ed98ff97ac4509da949331c5f98","unresolved":false,"context_lines":[{"line_number":609,"context_line":"        return cls(cell_id, cpuset, memory)"},{"line_number":610,"context_line":""},{"line_number":611,"context_line":""},{"line_number":612,"context_line":"class VirtNUMATopologyCellLimit(VirtNUMATopologyCell):"},{"line_number":613,"context_line":"    def __init__(self, id, cpuset, memory, cpu_limit, memory_limit):"},{"line_number":614,"context_line":"        \"\"\"Create a new NUMA Cell with usage"},{"line_number":615,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_80ad3b87","side":"PARENT","line":612,"in_reply_to":"5a890539_7c540022","updated":"2014-12-05 11:40:37.000000000","message":"Done","commit_id":"88e659193d65bcb3ecbcd32db94407a1a5ce81a9"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3b1e5cbed55cd5428d2ce0dc79344fd85fdb71b3","unresolved":false,"context_lines":[{"line_number":845,"context_line":"            nodes, flavor, image_meta)"},{"line_number":846,"context_line":""},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"class VirtNUMALimitTopology(VirtNUMATopology):"},{"line_number":849,"context_line":"    \"\"\"Class to represent the max resources of a compute node used"},{"line_number":850,"context_line":"    for checking oversubscription limits."},{"line_number":851,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_bc31080d","side":"PARENT","line":848,"updated":"2014-12-02 17:40:36.000000000","message":"Same here?","commit_id":"88e659193d65bcb3ecbcd32db94407a1a5ce81a9"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"ebc5990ccedb9ed98ff97ac4509da949331c5f98","unresolved":false,"context_lines":[{"line_number":845,"context_line":"            nodes, flavor, image_meta)"},{"line_number":846,"context_line":""},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"class VirtNUMALimitTopology(VirtNUMATopology):"},{"line_number":849,"context_line":"    \"\"\"Class to represent the max resources of a compute node used"},{"line_number":850,"context_line":"    for checking oversubscription limits."},{"line_number":851,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_60b84fc8","side":"PARENT","line":848,"in_reply_to":"5a890539_bc31080d","updated":"2014-12-05 11:40:37.000000000","message":"Done","commit_id":"88e659193d65bcb3ecbcd32db94407a1a5ce81a9"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3b1e5cbed55cd5428d2ce0dc79344fd85fdb71b3","unresolved":false,"context_lines":[{"line_number":822,"context_line":"        return"},{"line_number":823,"context_line":"    else:"},{"line_number":824,"context_line":"        # TODO(sahid): needs to refactor this part of code"},{"line_number":825,"context_line":"        # limit_topology is same for every cells."},{"line_number":826,"context_line":"        limits_topology_cells \u003d itertools.repeat("},{"line_number":827,"context_line":"            limits_topology, len(host_topology))"},{"line_number":828,"context_line":"        # TODO(ndipanov): We may want to sort permutations differently"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_3f134a5d","line":825,"updated":"2014-12-02 17:40:36.000000000","message":"Ah comeon this is easy j- just pass the limits_topology (that we should rename really) to every call to _numa_fit_instance_cell - we don\u0027t need this repeat and the zip inside the permutations call.","commit_id":"9371691aaab0fb00018918368961824c0e5034a1"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"ebc5990ccedb9ed98ff97ac4509da949331c5f98","unresolved":false,"context_lines":[{"line_number":822,"context_line":"        return"},{"line_number":823,"context_line":"    else:"},{"line_number":824,"context_line":"        # TODO(sahid): needs to refactor this part of code"},{"line_number":825,"context_line":"        # limit_topology is same for every cells."},{"line_number":826,"context_line":"        limits_topology_cells \u003d itertools.repeat("},{"line_number":827,"context_line":"            limits_topology, len(host_topology))"},{"line_number":828,"context_line":"        # TODO(ndipanov): We may want to sort permutations differently"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_40b353ec","line":825,"in_reply_to":"5a890539_3f134a5d","updated":"2014-12-05 11:40:37.000000000","message":"Done","commit_id":"9371691aaab0fb00018918368961824c0e5034a1"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"6aef4f6d19770d60b0b633f1fb8120806b54f38b","unresolved":false,"context_lines":[{"line_number":822,"context_line":"        return"},{"line_number":823,"context_line":"    else:"},{"line_number":824,"context_line":"        # TODO(sahid): needs to refactor this part of code"},{"line_number":825,"context_line":"        # limit_topology is same for every cells."},{"line_number":826,"context_line":"        limits_topology_cells \u003d itertools.repeat("},{"line_number":827,"context_line":"            limits_topology, len(host_topology))"},{"line_number":828,"context_line":"        # TODO(ndipanov): We may want to sort permutations differently"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_dbcad645","line":825,"in_reply_to":"5a890539_40b353ec","updated":"2014-12-05 12:17:54.000000000","message":"The algorithm is not enough covered by tests and no so easy to fix, i would recommend to fix it in an other changes.","commit_id":"9371691aaab0fb00018918368961824c0e5034a1"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"960ce6810664de6bc3f2e13b49d24eb3caf27f21","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        # TODO(sahid): needs to refactor this part of code"},{"line_number":716,"context_line":"        # limit_topology is same for every cells."},{"line_number":717,"context_line":"        limits_topology_cells \u003d itertools.repeat("},{"line_number":718,"context_line":"            limits_topology, len(host_topology))"},{"line_number":719,"context_line":"        # TODO(ndipanov): We may want to sort permutations differently"},{"line_number":720,"context_line":"        # depending on whether we want packing/spreading over NUMA nodes"},{"line_number":721,"context_line":"        for host_cell_perm in itertools.permutations("}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_df79f92f","line":718,"updated":"2014-12-15 13:17:29.000000000","message":"The limits *is* the same for every cell on nova-compute nodes running this code. No need for the TODO above.","commit_id":"bf7fcd499fe75e1f620e9ac8571bc087ac0e0bcf"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"f92305ab1cd5d161c9caf63c370554f828c93fe6","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        # TODO(sahid): needs to refactor this part of code"},{"line_number":716,"context_line":"        # limit_topology is same for every cells."},{"line_number":717,"context_line":"        limits_topology_cells \u003d itertools.repeat("},{"line_number":718,"context_line":"            limits_topology, len(host_topology))"},{"line_number":719,"context_line":"        # TODO(ndipanov): We may want to sort permutations differently"},{"line_number":720,"context_line":"        # depending on whether we want packing/spreading over NUMA nodes"},{"line_number":721,"context_line":"        for host_cell_perm in itertools.permutations("}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_97241c0e","line":718,"in_reply_to":"3a961159_df79f92f","updated":"2014-12-19 11:24:09.000000000","message":"actually the algorithm get be re-factored since now limits are the same.\n\nThis line can be remove\n  limits_topology_cells \u003d itertools.repeat(\n    None, len(host_topology))\n\n\nBut it is not so easy to do it and this commit already have several change. dont want to add more.","commit_id":"bf7fcd499fe75e1f620e9ac8571bc087ac0e0bcf"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"8cede48919bec0d5432ef87ea33228c5a1a82b53","unresolved":false,"context_lines":[{"line_number":983,"context_line":"        # TODO(sahid): needs to refactor this part of code"},{"line_number":984,"context_line":"        # limit_topology is same for every cells."},{"line_number":985,"context_line":"        limits_topology_cells \u003d itertools.repeat("},{"line_number":986,"context_line":"            limits_topology, len(host_topology))"},{"line_number":987,"context_line":"        # TODO(ndipanov): We may want to sort permutations differently"},{"line_number":988,"context_line":"        # depending on whether we want packing/spreading over NUMA nodes"},{"line_number":989,"context_line":"        for host_cell_perm in itertools.permutations("}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_ae1b457f","line":986,"updated":"2015-01-27 09:41:01.000000000","message":"We don\u0027t need to do this just use litmits instead of limits_cell in the permutations and cell loop. and drop it from the zip tuple","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"074f6bd4f879afd295ac9793592aa8cdc51cf8d8","unresolved":false,"context_lines":[{"line_number":983,"context_line":"        # TODO(sahid): needs to refactor this part of code"},{"line_number":984,"context_line":"        # limit_topology is same for every cells."},{"line_number":985,"context_line":"        limits_topology_cells \u003d itertools.repeat("},{"line_number":986,"context_line":"            limits_topology, len(host_topology))"},{"line_number":987,"context_line":"        # TODO(ndipanov): We may want to sort permutations differently"},{"line_number":988,"context_line":"        # depending on whether we want packing/spreading over NUMA nodes"},{"line_number":989,"context_line":"        for host_cell_perm in itertools.permutations("}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_b759cc8f","line":986,"in_reply_to":"1a930d6b_39879db6","updated":"2015-01-27 14:45:43.000000000","message":"please see https://review.openstack.org/#/c/150441/","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"9723930d1bdd0cc6a00c892bcc6d2a9dceb5a06d","unresolved":false,"context_lines":[{"line_number":983,"context_line":"        # TODO(sahid): needs to refactor this part of code"},{"line_number":984,"context_line":"        # limit_topology is same for every cells."},{"line_number":985,"context_line":"        limits_topology_cells \u003d itertools.repeat("},{"line_number":986,"context_line":"            limits_topology, len(host_topology))"},{"line_number":987,"context_line":"        # TODO(ndipanov): We may want to sort permutations differently"},{"line_number":988,"context_line":"        # depending on whether we want packing/spreading over NUMA nodes"},{"line_number":989,"context_line":"        for host_cell_perm in itertools.permutations("}],"source_content_type":"text/x-python","patch_set":19,"id":"1a930d6b_39879db6","line":986,"in_reply_to":"1a930d6b_ae1b457f","updated":"2015-01-27 10:12:17.000000000","message":"ok i will see what i can do... but as i said before, tests for this do not cover all cases and this patch is already quiet big.","commit_id":"214a06adb57daf2b2be8836b7bb6adb77a13cbdd"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"9875b953bfe1ae7e8205388932c377d7f78ab631","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"    else:"},{"line_number":1014,"context_line":"        # TODO(sahid): needs to refactor this part of code"},{"line_number":1015,"context_line":"        # limit_topology is same for every cells."},{"line_number":1016,"context_line":"        limits_topology_cells \u003d itertools.repeat("},{"line_number":1017,"context_line":"            limits_topology, len(host_topology))"},{"line_number":1018,"context_line":"        # TODO(ndipanov): We may want to sort permutations differently"},{"line_number":1019,"context_line":"        # depending on whether we want packing/spreading over NUMA nodes"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa81d914_7a49c5cf","line":1016,"updated":"2015-01-28 12:51:07.000000000","message":"Still would be good to fix this... it\u0027s a simple matter of removing this line and then...","commit_id":"e093dd437e2010889af55959ec359301993957a7"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"9875b953bfe1ae7e8205388932c377d7f78ab631","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"        # depending on whether we want packing/spreading over NUMA nodes"},{"line_number":1020,"context_line":"        for host_cell_perm in itertools.permutations("},{"line_number":1021,"context_line":"                zip(host_topology.cells, limits_topology_cells),"},{"line_number":1022,"context_line":"                len(instance_topology)"},{"line_number":1023,"context_line":"        ):"},{"line_number":1024,"context_line":"            cells \u003d []"},{"line_number":1025,"context_line":"            for (host_cell, limit_cell), instance_cell in zip("}],"source_content_type":"text/x-python","patch_set":24,"id":"fa81d914_3a6d8d33","line":1022,"updated":"2015-01-28 12:51:07.000000000","message":"And then this becomes: \n  for host_cell_perm in itertools.permutations(host_topology.cells, len(instance_topology)):","commit_id":"e093dd437e2010889af55959ec359301993957a7"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"9875b953bfe1ae7e8205388932c377d7f78ab631","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"        ):"},{"line_number":1024,"context_line":"            cells \u003d []"},{"line_number":1025,"context_line":"            for (host_cell, limit_cell), instance_cell in zip("},{"line_number":1026,"context_line":"                    host_cell_perm, instance_topology.cells):"},{"line_number":1027,"context_line":"                got_cell \u003d _numa_fit_instance_cell("},{"line_number":1028,"context_line":"                    host_cell, instance_cell, limit_cell)"},{"line_number":1029,"context_line":"                if got_cell is None:"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa81d914_5a516161","line":1026,"updated":"2015-01-28 12:51:07.000000000","message":"And this becomes:\n\n  for host_cell, instance_cell in zip(host_cell_perm, instance_topology.cells):\n\nAnd...","commit_id":"e093dd437e2010889af55959ec359301993957a7"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"9875b953bfe1ae7e8205388932c377d7f78ab631","unresolved":false,"context_lines":[{"line_number":1024,"context_line":"            cells \u003d []"},{"line_number":1025,"context_line":"            for (host_cell, limit_cell), instance_cell in zip("},{"line_number":1026,"context_line":"                    host_cell_perm, instance_topology.cells):"},{"line_number":1027,"context_line":"                got_cell \u003d _numa_fit_instance_cell("},{"line_number":1028,"context_line":"                    host_cell, instance_cell, limit_cell)"},{"line_number":1029,"context_line":"                if got_cell is None:"},{"line_number":1030,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa81d914_da9ab113","line":1027,"updated":"2015-01-28 12:51:07.000000000","message":"this is now just passing in the same limit every time like:\n\n  got_cell \u003d _numa_fit_instance_cell(host_cell, instance_cell, limits_topology\n\nAnd we\u0027re done - for bonus points we should also probably rename limits_topology since it\u0027s not a topology anymore","commit_id":"e093dd437e2010889af55959ec359301993957a7"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3039bfbc20d4a69d895e37440db1909d13063d22","unresolved":false,"context_lines":[{"line_number":1186,"context_line":"    This is a convenience method to help us handle the fact that we use several"},{"line_number":1187,"context_line":"    different types throughout the code (ComputeNode and Instance objects,"},{"line_number":1188,"context_line":"    dicts, scheduler HostState) which may have both json and deserialized"},{"line_number":1189,"context_line":"    versions of objects.numa classes."},{"line_number":1190,"context_line":""},{"line_number":1191,"context_line":"    Handles all the complexity without polluting the class method with it."},{"line_number":1192,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"fa81d914_cef7e557","line":1189,"updated":"2015-01-30 11:15:21.000000000","message":"Not really related to this change at all? Maybe drop?","commit_id":"e7ca5306346a29c1e13a3abac7ca5ff679e19af6"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"73a7144121acc3c99bb4df02340fd7ad2f63cc51","unresolved":false,"context_lines":[{"line_number":1186,"context_line":"    This is a convenience method to help us handle the fact that we use several"},{"line_number":1187,"context_line":"    different types throughout the code (ComputeNode and Instance objects,"},{"line_number":1188,"context_line":"    dicts, scheduler HostState) which may have both json and deserialized"},{"line_number":1189,"context_line":"    versions of objects.numa classes."},{"line_number":1190,"context_line":""},{"line_number":1191,"context_line":"    Handles all the complexity without polluting the class method with it."},{"line_number":1192,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"da86d52c_1fba77de","line":1189,"in_reply_to":"fa81d914_cef7e557","updated":"2015-02-02 10:00:20.000000000","message":"There is not VirtNUMATopology classes now. This patches removed these classes so it looks related. And actually you asked to removed theses classes.","commit_id":"e7ca5306346a29c1e13a3abac7ca5ff679e19af6"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"6023be50c40c914603414e534b62013794640b69","unresolved":false,"context_lines":[{"line_number":729,"context_line":"            [host_cell.free_cpus], instance_cell, host_cell.id)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":""},{"line_number":732,"context_line":"def _numa_fit_instance_cell(host_cell, instance_cell, limit_cell\u003dNone):"},{"line_number":733,"context_line":"    \"\"\"Check if a instance cell can fit and set it\u0027s cell id"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"    :param host_cell: host cell to fit the instance cell onto"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_98f2dc6d","line":732,"updated":"2015-03-05 12:32:59.000000000","message":"maybe rename this from limit_cell since it\u0027s no longer a cell","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"8c0f507772f4dd5e45681262189849afb3cc6c80","unresolved":false,"context_lines":[{"line_number":729,"context_line":"            [host_cell.free_cpus], instance_cell, host_cell.id)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":""},{"line_number":732,"context_line":"def _numa_fit_instance_cell(host_cell, instance_cell, limit_cell\u003dNone):"},{"line_number":733,"context_line":"    \"\"\"Check if a instance cell can fit and set it\u0027s cell id"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"    :param host_cell: host cell to fit the instance cell onto"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_b4bd6e04","line":732,"in_reply_to":"9a80dd14_98f2dc6d","updated":"2015-03-09 12:13:50.000000000","message":"ok i will do","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"6023be50c40c914603414e534b62013794640b69","unresolved":false,"context_lines":[{"line_number":1194,"context_line":"    This is a convenience method to help us handle the fact that we use several"},{"line_number":1195,"context_line":"    different types throughout the code (ComputeNode and Instance objects,"},{"line_number":1196,"context_line":"    dicts, scheduler HostState) which may have both json and deserialized"},{"line_number":1197,"context_line":"    versions of objects.numa classes."},{"line_number":1198,"context_line":""},{"line_number":1199,"context_line":"    Handles all the complexity without polluting the class method with it."},{"line_number":1200,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_3821f0fb","line":1197,"updated":"2015-03-05 12:32:59.000000000","message":"not related but meh... keep it imho","commit_id":"761d2e35d6ff17c1de89e3c5edeefbd107a6eb29"}]}
