)]}'
{"nova/scheduler/host_manager.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"d776368b84ae382db4d75f416a4cc569c314c559","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        ram_mb \u003d spec_obj.memory_mb"},{"line_number":251,"context_line":"        vcpus \u003d spec_obj.vcpus"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        # Claim resources"},{"line_number":254,"context_line":"        # TODO(Yingxin): Reuse claim logic here"},{"line_number":255,"context_line":"        LOG.info(_LI(\"Attempting claim: memory %(memory_mb)d MB, \""},{"line_number":256,"context_line":"                     \"disk %(disk_mb)d MB, vcpus %(vcpus)d CPU\"),"},{"line_number":257,"context_line":"                 {\u0027memory_mb\u0027: ram_mb, \u0027disk_mb\u0027: disk_mb,"},{"line_number":258,"context_line":"                  \u0027vcpus\u0027: vcpus})"},{"line_number":259,"context_line":"        reasons \u003d []"},{"line_number":260,"context_line":"        cpu_limit \u003d self.limits.get(\u0027vcpu\u0027)"},{"line_number":261,"context_line":"        if cpu_limit is not None:"},{"line_number":262,"context_line":"            free \u003d cpu_limit - self.vcpus_used"},{"line_number":263,"context_line":"            if vcpus \u003e free:"},{"line_number":264,"context_line":"                reasons.append(_(\"Free vcpu %(free).02f VCPU \u003c \""},{"line_number":265,"context_line":"                               \"requested %(requested)d VCPU\") %"},{"line_number":266,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: vcpus})"},{"line_number":267,"context_line":"        ram_limit \u003d self.limits.get(\u0027memory_mb\u0027)"},{"line_number":268,"context_line":"        if ram_limit is not None:"},{"line_number":269,"context_line":"            free \u003d ram_limit - (self.total_usable_ram_mb - self.free_ram_mb)"},{"line_number":270,"context_line":"            if ram_mb \u003e free:"},{"line_number":271,"context_line":"                reasons.append(_(\"Free memory %(free).02f MB \u003c \""},{"line_number":272,"context_line":"                               \"requested %(requested)d MB\") %"},{"line_number":273,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: ram_mb})"},{"line_number":274,"context_line":"        disk_limit \u003d self.limits.get(\u0027disk_gb\u0027)"},{"line_number":275,"context_line":"        if disk_limit is not None:"},{"line_number":276,"context_line":"            free \u003d disk_limit * 1024 - \\"},{"line_number":277,"context_line":"                   (self.total_usable_disk_gb * 1024 - self.free_disk_mb)"},{"line_number":278,"context_line":"            if disk_mb \u003e free:"},{"line_number":279,"context_line":"                reasons.append(_(\"Free disk %(free).02f MB \u003c \""},{"line_number":280,"context_line":"                               \"requested %(requested)d MB\") %"},{"line_number":281,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: disk_mb})"},{"line_number":282,"context_line":"        if len(reasons) \u003e 0:"},{"line_number":283,"context_line":"            raise exception.ComputeResourcesUnavailable(reason\u003d"},{"line_number":284,"context_line":"                    \"; \".join(reasons))"},{"line_number":285,"context_line":"        LOG.info(_LI(\u0027Claim successful, instance: %(uuid)s.\u0027) %"},{"line_number":286,"context_line":"                     {\u0027uuid\u0027: spec_obj.instance_uuid})"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        # Consume resources"},{"line_number":289,"context_line":"        self.free_ram_mb -\u003d ram_mb"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a7b0d38_1ecbfe54","line":286,"range":{"start_line":253,"start_character":0,"end_line":286,"end_character":54},"updated":"2015-12-23 18:53:42.000000000","message":"OK so this is not exactly what I had in mind when I said that this is not critical on IRC... we really want to make the claims code reusable if we want to do this. This level of copy pasting is not really acceptable.","commit_id":"1be61a8a3471dec5cb32a54042f7c23abd077172"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"666276a4b4b627f13e11cc7f740a4f1975e3023f","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        ram_mb \u003d spec_obj.memory_mb"},{"line_number":251,"context_line":"        vcpus \u003d spec_obj.vcpus"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        # Claim resources"},{"line_number":254,"context_line":"        # TODO(Yingxin): Reuse claim logic here"},{"line_number":255,"context_line":"        LOG.info(_LI(\"Attempting claim: memory %(memory_mb)d MB, \""},{"line_number":256,"context_line":"                     \"disk %(disk_mb)d MB, vcpus %(vcpus)d CPU\"),"},{"line_number":257,"context_line":"                 {\u0027memory_mb\u0027: ram_mb, \u0027disk_mb\u0027: disk_mb,"},{"line_number":258,"context_line":"                  \u0027vcpus\u0027: vcpus})"},{"line_number":259,"context_line":"        reasons \u003d []"},{"line_number":260,"context_line":"        cpu_limit \u003d self.limits.get(\u0027vcpu\u0027)"},{"line_number":261,"context_line":"        if cpu_limit is not None:"},{"line_number":262,"context_line":"            free \u003d cpu_limit - self.vcpus_used"},{"line_number":263,"context_line":"            if vcpus \u003e free:"},{"line_number":264,"context_line":"                reasons.append(_(\"Free vcpu %(free).02f VCPU \u003c \""},{"line_number":265,"context_line":"                               \"requested %(requested)d VCPU\") %"},{"line_number":266,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: vcpus})"},{"line_number":267,"context_line":"        ram_limit \u003d self.limits.get(\u0027memory_mb\u0027)"},{"line_number":268,"context_line":"        if ram_limit is not None:"},{"line_number":269,"context_line":"            free \u003d ram_limit - (self.total_usable_ram_mb - self.free_ram_mb)"},{"line_number":270,"context_line":"            if ram_mb \u003e free:"},{"line_number":271,"context_line":"                reasons.append(_(\"Free memory %(free).02f MB \u003c \""},{"line_number":272,"context_line":"                               \"requested %(requested)d MB\") %"},{"line_number":273,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: ram_mb})"},{"line_number":274,"context_line":"        disk_limit \u003d self.limits.get(\u0027disk_gb\u0027)"},{"line_number":275,"context_line":"        if disk_limit is not None:"},{"line_number":276,"context_line":"            free \u003d disk_limit * 1024 - \\"},{"line_number":277,"context_line":"                   (self.total_usable_disk_gb * 1024 - self.free_disk_mb)"},{"line_number":278,"context_line":"            if disk_mb \u003e free:"},{"line_number":279,"context_line":"                reasons.append(_(\"Free disk %(free).02f MB \u003c \""},{"line_number":280,"context_line":"                               \"requested %(requested)d MB\") %"},{"line_number":281,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: disk_mb})"},{"line_number":282,"context_line":"        if len(reasons) \u003e 0:"},{"line_number":283,"context_line":"            raise exception.ComputeResourcesUnavailable(reason\u003d"},{"line_number":284,"context_line":"                    \"; \".join(reasons))"},{"line_number":285,"context_line":"        LOG.info(_LI(\u0027Claim successful, instance: %(uuid)s.\u0027) %"},{"line_number":286,"context_line":"                     {\u0027uuid\u0027: spec_obj.instance_uuid})"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"        # Consume resources"},{"line_number":289,"context_line":"        self.free_ram_mb -\u003d ram_mb"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a7b0d38_9eda204a","line":286,"range":{"start_line":253,"start_character":0,"end_line":286,"end_character":54},"in_reply_to":"1a7b0d38_1ecbfe54","updated":"2015-12-29 07:05:10.000000000","message":"Yes, this is aimed to merge claim code more easily, as described in comments.","commit_id":"1be61a8a3471dec5cb32a54042f7c23abd077172"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"d776368b84ae382db4d75f416a4cc569c314c559","unresolved":false,"context_lines":[{"line_number":304,"context_line":"                                self)"},{"line_number":305,"context_line":"        instance_numa_topology \u003d spec_obj.numa_topology"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        spec_obj.numa_topology \u003d hardware.numa_fit_instance_to_host("},{"line_number":308,"context_line":"            host_numa_topology, instance_numa_topology,"},{"line_number":309,"context_line":"            limits\u003dself.limits.get(\u0027numa_topology\u0027),"},{"line_number":310,"context_line":"            pci_requests\u003dpci_requests, pci_stats\u003dself.pci_stats)"},{"line_number":311,"context_line":"        if pci_requests:"},{"line_number":312,"context_line":"            instance_cells \u003d None"},{"line_number":313,"context_line":"            if spec_obj.numa_topology:"},{"line_number":314,"context_line":"                instance_cells \u003d spec_obj.numa_topology.cells"},{"line_number":315,"context_line":"            self.pci_stats.apply_requests(pci_requests, instance_cells)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        # NOTE(sbauza): Yeah, that\u0027s crap. We should get rid of all of those"},{"line_number":318,"context_line":"        # NUMA helpers because now we\u0027re 100% sure that spec_obj.numa_topology"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a7b0d38_5e350644","line":315,"range":{"start_line":307,"start_character":8,"end_line":315,"end_character":71},"updated":"2015-12-23 18:53:42.000000000","message":"As stated in the BP - this is not a huge deal for countable resources like CPU and ram, but is a serious hit for \"statefull\" resources such as NUMA nodes, dedicated CPUs and host devices, so if you want to \"duplicate\" some claims logic - I\u0027d start here (it\u0027s basically already duplicated.)","commit_id":"1be61a8a3471dec5cb32a54042f7c23abd077172"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"666276a4b4b627f13e11cc7f740a4f1975e3023f","unresolved":false,"context_lines":[{"line_number":304,"context_line":"                                self)"},{"line_number":305,"context_line":"        instance_numa_topology \u003d spec_obj.numa_topology"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        spec_obj.numa_topology \u003d hardware.numa_fit_instance_to_host("},{"line_number":308,"context_line":"            host_numa_topology, instance_numa_topology,"},{"line_number":309,"context_line":"            limits\u003dself.limits.get(\u0027numa_topology\u0027),"},{"line_number":310,"context_line":"            pci_requests\u003dpci_requests, pci_stats\u003dself.pci_stats)"},{"line_number":311,"context_line":"        if pci_requests:"},{"line_number":312,"context_line":"            instance_cells \u003d None"},{"line_number":313,"context_line":"            if spec_obj.numa_topology:"},{"line_number":314,"context_line":"                instance_cells \u003d spec_obj.numa_topology.cells"},{"line_number":315,"context_line":"            self.pci_stats.apply_requests(pci_requests, instance_cells)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        # NOTE(sbauza): Yeah, that\u0027s crap. We should get rid of all of those"},{"line_number":318,"context_line":"        # NUMA helpers because now we\u0027re 100% sure that spec_obj.numa_topology"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a7b0d38_d41dee62","line":315,"range":{"start_line":307,"start_character":8,"end_line":315,"end_character":71},"in_reply_to":"1a7b0d38_5e350644","updated":"2015-12-29 07:05:10.000000000","message":"Sorry I skipped the hard part, still working on this, will be in the following patches.","commit_id":"1be61a8a3471dec5cb32a54042f7c23abd077172"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"8806d240ee8cdad4800231a8be77c2e88d5c7a8e","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        ram_mb \u003d spec_obj.memory_mb"},{"line_number":263,"context_line":"        vcpus \u003d spec_obj.vcpus"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # Claim resources"},{"line_number":266,"context_line":"        # TODO(Yingxin): Reuse claim logic here"},{"line_number":267,"context_line":"        LOG.info(_LI(\"Attempting claim: memory %(memory_mb)d MB, \""},{"line_number":268,"context_line":"                     \"disk %(disk_mb)d MB, vcpus %(vcpus)d CPU\"),"},{"line_number":269,"context_line":"                 {\u0027memory_mb\u0027: ram_mb, \u0027disk_mb\u0027: disk_mb,"},{"line_number":270,"context_line":"                  \u0027vcpus\u0027: vcpus})"},{"line_number":271,"context_line":"        reasons \u003d []"},{"line_number":272,"context_line":"        cpu_limit \u003d self.limits.get(\u0027vcpu\u0027)"},{"line_number":273,"context_line":"        if cpu_limit is not None:"},{"line_number":274,"context_line":"            free \u003d cpu_limit - self.vcpus_used"},{"line_number":275,"context_line":"            if vcpus \u003e free:"},{"line_number":276,"context_line":"                reasons.append(_(\"Free vcpu %(free).02f VCPU \u003c \""},{"line_number":277,"context_line":"                               \"requested %(requested)d VCPU\") %"},{"line_number":278,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: vcpus})"},{"line_number":279,"context_line":"        ram_limit \u003d self.limits.get(\u0027memory_mb\u0027)"},{"line_number":280,"context_line":"        if ram_limit is not None:"},{"line_number":281,"context_line":"            free \u003d ram_limit - (self.total_usable_ram_mb - self.free_ram_mb)"},{"line_number":282,"context_line":"            if ram_mb \u003e free:"},{"line_number":283,"context_line":"                reasons.append(_(\"Free memory %(free).02f MB \u003c \""},{"line_number":284,"context_line":"                               \"requested %(requested)d MB\") %"},{"line_number":285,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: ram_mb})"},{"line_number":286,"context_line":"        disk_limit \u003d self.limits.get(\u0027disk_gb\u0027)"},{"line_number":287,"context_line":"        if disk_limit is not None:"},{"line_number":288,"context_line":"            free \u003d disk_limit * 1024 - \\"},{"line_number":289,"context_line":"                   (self.total_usable_disk_gb * 1024 - self.free_disk_mb)"},{"line_number":290,"context_line":"            if disk_mb \u003e free:"},{"line_number":291,"context_line":"                reasons.append(_(\"Free disk %(free).02f MB \u003c \""},{"line_number":292,"context_line":"                               \"requested %(requested)d MB\") %"},{"line_number":293,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: disk_mb})"},{"line_number":294,"context_line":"        if len(reasons) \u003e 0:"},{"line_number":295,"context_line":"            raise exception.ComputeResourcesUnavailable(reason\u003d"},{"line_number":296,"context_line":"                    \"; \".join(reasons))"},{"line_number":297,"context_line":"        LOG.info(_LI(\u0027Claim successful, instance: %(uuid)s.\u0027) %"},{"line_number":298,"context_line":"                     {\u0027uuid\u0027: spec_obj.instance_uuid})"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        # Consume resources"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_7ed6c4c6","line":297,"range":{"start_line":265,"start_character":0,"end_line":297,"end_character":63},"updated":"2015-12-31 11:37:32.000000000","message":"am personally quite unhappy with this level of duplication.","commit_id":"0c78e9c3bcfe957ae881ab5382b897f84bc5d6a3"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"b8b99fa67e410781eda4a7e910d4594a3b4aab5b","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        ram_mb \u003d spec_obj.memory_mb"},{"line_number":263,"context_line":"        vcpus \u003d spec_obj.vcpus"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # Claim resources"},{"line_number":266,"context_line":"        # TODO(Yingxin): Reuse claim logic here"},{"line_number":267,"context_line":"        LOG.info(_LI(\"Attempting claim: memory %(memory_mb)d MB, \""},{"line_number":268,"context_line":"                     \"disk %(disk_mb)d MB, vcpus %(vcpus)d CPU\"),"},{"line_number":269,"context_line":"                 {\u0027memory_mb\u0027: ram_mb, \u0027disk_mb\u0027: disk_mb,"},{"line_number":270,"context_line":"                  \u0027vcpus\u0027: vcpus})"},{"line_number":271,"context_line":"        reasons \u003d []"},{"line_number":272,"context_line":"        cpu_limit \u003d self.limits.get(\u0027vcpu\u0027)"},{"line_number":273,"context_line":"        if cpu_limit is not None:"},{"line_number":274,"context_line":"            free \u003d cpu_limit - self.vcpus_used"},{"line_number":275,"context_line":"            if vcpus \u003e free:"},{"line_number":276,"context_line":"                reasons.append(_(\"Free vcpu %(free).02f VCPU \u003c \""},{"line_number":277,"context_line":"                               \"requested %(requested)d VCPU\") %"},{"line_number":278,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: vcpus})"},{"line_number":279,"context_line":"        ram_limit \u003d self.limits.get(\u0027memory_mb\u0027)"},{"line_number":280,"context_line":"        if ram_limit is not None:"},{"line_number":281,"context_line":"            free \u003d ram_limit - (self.total_usable_ram_mb - self.free_ram_mb)"},{"line_number":282,"context_line":"            if ram_mb \u003e free:"},{"line_number":283,"context_line":"                reasons.append(_(\"Free memory %(free).02f MB \u003c \""},{"line_number":284,"context_line":"                               \"requested %(requested)d MB\") %"},{"line_number":285,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: ram_mb})"},{"line_number":286,"context_line":"        disk_limit \u003d self.limits.get(\u0027disk_gb\u0027)"},{"line_number":287,"context_line":"        if disk_limit is not None:"},{"line_number":288,"context_line":"            free \u003d disk_limit * 1024 - \\"},{"line_number":289,"context_line":"                   (self.total_usable_disk_gb * 1024 - self.free_disk_mb)"},{"line_number":290,"context_line":"            if disk_mb \u003e free:"},{"line_number":291,"context_line":"                reasons.append(_(\"Free disk %(free).02f MB \u003c \""},{"line_number":292,"context_line":"                               \"requested %(requested)d MB\") %"},{"line_number":293,"context_line":"                               {\u0027free\u0027: free, \u0027requested\u0027: disk_mb})"},{"line_number":294,"context_line":"        if len(reasons) \u003e 0:"},{"line_number":295,"context_line":"            raise exception.ComputeResourcesUnavailable(reason\u003d"},{"line_number":296,"context_line":"                    \"; \".join(reasons))"},{"line_number":297,"context_line":"        LOG.info(_LI(\u0027Claim successful, instance: %(uuid)s.\u0027) %"},{"line_number":298,"context_line":"                     {\u0027uuid\u0027: spec_obj.instance_uuid})"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        # Consume resources"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_92683989","line":297,"range":{"start_line":265,"start_character":0,"end_line":297,"end_character":63},"in_reply_to":"fa69d971_7ed6c4c6","updated":"2016-01-02 06:00:39.000000000","message":"Sorry I didn\u0027t make it clear enough. I was meant to make the patch easy to review by only touching scheduler code first.\n\nWithout messing with compute service code, IMO reviewers can do a 3-way comparison easier:\n1. Make sure this implementation performs the right operation comparing with previous consume_from_request logic.\n2. Make sure the logic can be merged with `nova.compute.claims.Claim` easily using the same claim steps.\n\nAlso, this patch follows the test-driven process. It tries to implement the claim feature using dumb but explicit code first and makes sure this implementations won\u0027t be regressed in the final refactoring patch.","commit_id":"0c78e9c3bcfe957ae881ab5382b897f84bc5d6a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ded0e714d8accd84bad0c712a4f9307afd0322f4","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        vcpus \u003d spec_obj.vcpus"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # Claim resources"},{"line_number":266,"context_line":"        # TODO(Yingxin): Reuse claim logic here"},{"line_number":267,"context_line":"        LOG.info(_LI(\"Attempting claim: memory %(memory_mb)d MB, \""},{"line_number":268,"context_line":"                     \"disk %(disk_mb)d MB, vcpus %(vcpus)d CPU\"),"},{"line_number":269,"context_line":"                 {\u0027memory_mb\u0027: ram_mb, \u0027disk_mb\u0027: disk_mb,"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_3101ebaf","line":266,"updated":"2016-01-05 17:52:10.000000000","message":"We should move the logic first, and not add this duplication. I am agreed with ndipanov.\n\nAlso, I feel this is enough logic to warrant a separate method. That would remove the need for that claim resources comment, which is no bad thing.","commit_id":"bc08418d93400c0c066a091d4b90adc2755cc0f8"}],"nova/tests/unit/scheduler/test_host_manager.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"00d5c714bdc80f922eaed8de43e4e630e7e5b528","unresolved":false,"context_lines":[{"line_number":1022,"context_line":"        fake_numa_topology \u003d objects.InstanceNUMATopology("},{"line_number":1023,"context_line":"            cells\u003d[objects.InstanceNUMACell()])"},{"line_number":1024,"context_line":"        spec_obj \u003d objects.RequestSpec("},{"line_number":1025,"context_line":"            instance_uuid\u003d\u0027fake-uuid\u0027,"},{"line_number":1026,"context_line":"            flavor\u003dobjects.Flavor(root_gb\u003d2, ephemeral_gb\u003d2,"},{"line_number":1027,"context_line":"                                  memory_mb\u003d2048, vcpus\u003d2),"},{"line_number":1028,"context_line":"            numa_topology\u003dfake_numa_topology,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a7b0d38_81dd6044","line":1025,"updated":"2015-12-23 14:03:39.000000000","message":"It doesn\u0027t matter in this context because the value is never used, but for cleanliness you might consider using the uuid sentinels in nova/tests/uuidsentinel.py here.","commit_id":"1be61a8a3471dec5cb32a54042f7c23abd077172"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"666276a4b4b627f13e11cc7f740a4f1975e3023f","unresolved":false,"context_lines":[{"line_number":1022,"context_line":"        fake_numa_topology \u003d objects.InstanceNUMATopology("},{"line_number":1023,"context_line":"            cells\u003d[objects.InstanceNUMACell()])"},{"line_number":1024,"context_line":"        spec_obj \u003d objects.RequestSpec("},{"line_number":1025,"context_line":"            instance_uuid\u003d\u0027fake-uuid\u0027,"},{"line_number":1026,"context_line":"            flavor\u003dobjects.Flavor(root_gb\u003d2, ephemeral_gb\u003d2,"},{"line_number":1027,"context_line":"                                  memory_mb\u003d2048, vcpus\u003d2),"},{"line_number":1028,"context_line":"            numa_topology\u003dfake_numa_topology,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a7b0d38_79019305","line":1025,"in_reply_to":"1a7b0d38_81dd6044","updated":"2015-12-29 07:05:10.000000000","message":"Thanks for recommending a useful tool.","commit_id":"1be61a8a3471dec5cb32a54042f7c23abd077172"}]}
