)]}'
{"nova/api/openstack/compute/simple_tenant_usage.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9c41362106fb473ae5a15124a04b7495c4456997","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"            try:"},{"line_number":166,"context_line":"                info[\u0027memory_mb\u0027] \u003d instance.flavor.memory_mb"},{"line_number":167,"context_line":"                is_volume_backed \u003d compute_utils.is_volume_backed_instance("},{"line_number":168,"context_line":"                    context, instance)"},{"line_number":169,"context_line":"                if is_volume_backed:"},{"line_number":170,"context_line":"                    info[\u0027local_gb\u0027] \u003d instance.flavor.ephemeral_gb"},{"line_number":171,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_f53c192e","line":168,"range":{"start_line":167,"start_character":16,"end_line":168,"end_character":38},"updated":"2018-10-25 18:57:42.000000000","message":"As noted in the bug report:\n\nhttps://bugs.launchpad.net/nova/+bug/1715570/comments/4\n\nThis is going to be fairly expensive if you\u0027re iterating over a lot of instances. I\u0027m not sure if my joined load column idea works, but it would be nice to know if it was investigated and proven to either not work, or not be any different performance-wise.\n\nMaybe for index, where the admin is listing over all tenants, we don\u0027t care as much about performance compare to show where a single tenant is logging into horizon and seeing just their usage, which means iterating far fewer instances most likely. But differences in behavior between list and show would also be weird...","commit_id":"becf4b73d2bbd9992b30ea09df0d85eb91901e40"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"51d75420eb989a521e1c2cc2b55968814192b48c","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"            try:"},{"line_number":166,"context_line":"                info[\u0027memory_mb\u0027] \u003d instance.flavor.memory_mb"},{"line_number":167,"context_line":"                is_volume_backed \u003d compute_utils.is_volume_backed_instance("},{"line_number":168,"context_line":"                    context, instance)"},{"line_number":169,"context_line":"                if is_volume_backed:"},{"line_number":170,"context_line":"                    info[\u0027local_gb\u0027] \u003d instance.flavor.ephemeral_gb"},{"line_number":171,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bfdaf3ff_0439ca3f","line":168,"range":{"start_line":167,"start_character":16,"end_line":168,"end_character":38},"in_reply_to":"3f79a3b5_f53c192e","updated":"2019-11-15 07:21:21.000000000","message":"Hi Matt, \n\nVerified suggested joined load column idea. Updated [1] by joining \u0027block_device_mapping\u0027 and verified performance improvement. \nIt’s improving performance drastically provided the usage period requested by an user has instances which are not deleted. \nIf there are too many deleted instances, there is no performance gain. \n\nPlease give your feedback on the latest patch and then accordingly I will add required unit/functional tests.\n\n[1] https://github.com/openstack/nova/blob/master/nova/objects/instance.py#L50","commit_id":"becf4b73d2bbd9992b30ea09df0d85eb91901e40"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"7d90d4719d67c399d6c294d141331f319103081e","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"            try:"},{"line_number":168,"context_line":"                info[\u0027memory_mb\u0027] \u003d instance.flavor.memory_mb"},{"line_number":169,"context_line":"                is_volume_backed \u003d compute_utils.is_volume_backed_instance("},{"line_number":170,"context_line":"                    context, instance, bdms\u003dinstance.block_device_mapping)"},{"line_number":171,"context_line":"                if is_volume_backed:"},{"line_number":172,"context_line":"                    info[\u0027local_gb\u0027] \u003d instance.flavor.ephemeral_gb"},{"line_number":173,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfdaf3ff_2d8b911f","line":170,"range":{"start_line":169,"start_character":16,"end_line":170,"end_character":74},"updated":"2019-01-16 09:40:16.000000000","message":"we have those kind of logic to retrieve bdms, why add this into objects?\n\n6032         bdms \u003d objects.BlockDeviceMappingList.get_by_instance_uuid(\n6033             ctxt, instance.uuid)\n6034         is_volume_backed \u003d compute_utils.is_volume_backed_instance(\n6035             ctxt, instance, bdms)","commit_id":"95080d00e686e77e36db09ffc30b69a1ac18ba96"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"fbc2c90852977839ea7f2f88ac03b201c33eab88","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"            try:"},{"line_number":167,"context_line":"                info[\u0027memory_mb\u0027] \u003d instance.flavor.memory_mb"},{"line_number":168,"context_line":"                is_volume_backed \u003d instance.is_volume_backed"},{"line_number":169,"context_line":"                if is_volume_backed:"},{"line_number":170,"context_line":"                    info[\u0027local_gb\u0027] \u003d instance.flavor.ephemeral_gb"},{"line_number":171,"context_line":"                else:"},{"line_number":172,"context_line":"                    info[\u0027local_gb\u0027] \u003d (instance.flavor.root_gb +"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_79c69219","line":169,"range":{"start_line":168,"start_character":0,"end_line":169,"end_character":36},"updated":"2019-03-27 07:44:56.000000000","message":"nit:\nif instance.is_volume_backed:","commit_id":"81823b0a468221d47c8b1b7e3b717a711bc4d4bc"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"aaef4a8600e98af2d0d15e58993e9297b3a3e62e","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"            try:"},{"line_number":167,"context_line":"                info[\u0027memory_mb\u0027] \u003d instance.flavor.memory_mb"},{"line_number":168,"context_line":"                if instance.is_volume_backed:"},{"line_number":169,"context_line":"                    info[\u0027local_gb\u0027] \u003d instance.flavor.ephemeral_gb"},{"line_number":170,"context_line":"                else:"},{"line_number":171,"context_line":"                    info[\u0027local_gb\u0027] \u003d (instance.flavor.root_gb +"},{"line_number":172,"context_line":"                                        instance.flavor.ephemeral_gb)"},{"line_number":173,"context_line":"                info[\u0027vcpus\u0027] \u003d instance.flavor.vcpus"},{"line_number":174,"context_line":"            except exception.InstanceNotFound:"},{"line_number":175,"context_line":"                # This is rare case, instance disappear during analysis"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_e377d23a","line":172,"range":{"start_line":168,"start_character":0,"end_line":172,"end_character":69},"updated":"2019-04-04 11:19:22.000000000","message":"nit:\n                info[\u0027local_gb\u0027] \u003d instance.flavor.ephemeral_gb\n\n                if not instance.is_volume_backed:\n                    info[\u0027local_gb\u0027] +\u003d instance.flavor.root_gb","commit_id":"54abef984a22b6982f78a0342b5ebc9a97f12717"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"12bda8d48103a36e01fde00159316c281a70fb66","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                info[\u0027memory_mb\u0027] \u003d instance.flavor.memory_mb"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"                info[\u0027local_gb\u0027] \u003d instance.flavor.ephemeral_gb"},{"line_number":170,"context_line":"                if instance.is_volume_backed is False:"},{"line_number":171,"context_line":"                    info[\u0027local_gb\u0027] +\u003d instance.flavor.root_gb"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"                info[\u0027vcpus\u0027] \u003d instance.flavor.vcpus"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_7e9991cd","line":170,"range":{"start_line":170,"start_character":16,"end_line":170,"end_character":54},"updated":"2020-01-13 06:51:30.000000000","message":"nit, \u0027if not instance.is_volume_backed:\u0027","commit_id":"866e195d724755a6158308145b28399209cff233"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"aaef4a8600e98af2d0d15e58993e9297b3a3e62e","unresolved":false,"context_lines":[{"line_number":1931,"context_line":"    else:"},{"line_number":1932,"context_line":"        faults \u003d {}"},{"line_number":1933,"context_line":""},{"line_number":1934,"context_line":"    bfv_instances \u003d []"},{"line_number":1935,"context_line":"    if \u0027is_volume_backed\u0027 in manual_joins:"},{"line_number":1936,"context_line":"        bfv_instances \u003d _get_volume_backed_instances(context)"},{"line_number":1937,"context_line":""},{"line_number":1938,"context_line":"    bfv_instances_uuids \u003d set()"},{"line_number":1939,"context_line":"    if bfv_instances:"},{"line_number":1940,"context_line":"        bfv_instances_uuids \u003d set("},{"line_number":1941,"context_line":"            [bfv_inst[\u0027uuid\u0027] for bfv_inst in bfv_instances])"},{"line_number":1942,"context_line":""},{"line_number":1943,"context_line":"    filled_instances \u003d []"},{"line_number":1944,"context_line":"    for inst in instances:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_c3497632","line":1941,"range":{"start_line":1934,"start_character":0,"end_line":1941,"end_character":61},"updated":"2019-04-04 11:19:22.000000000","message":"-1:\n\n if \u0027is_volume_backend\u0027 in manual_joins:\n    bfv_instances_uuids \u003d {\n       inst[\u0027uuid\u0027] for inst in _get_volume_backend_instances(context)}\n else:\n    bfv_instances_uuids \u003d set()","commit_id":"54abef984a22b6982f78a0342b5ebc9a97f12717"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"aaef4a8600e98af2d0d15e58993e9297b3a3e62e","unresolved":false,"context_lines":[{"line_number":1943,"context_line":"    filled_instances \u003d []"},{"line_number":1944,"context_line":"    for inst in instances:"},{"line_number":1945,"context_line":"        inst \u003d dict(inst)"},{"line_number":1946,"context_line":"        if \u0027is_volume_backed\u0027 in manual_joins:"},{"line_number":1947,"context_line":"            if inst[\u0027uuid\u0027] in bfv_instances_uuids:"},{"line_number":1948,"context_line":"                inst[\u0027is_volume_backed\u0027] \u003d True"},{"line_number":1949,"context_line":"            else:"},{"line_number":1950,"context_line":"                inst[\u0027is_volume_backed\u0027] \u003d False"},{"line_number":1951,"context_line":"        inst[\u0027system_metadata\u0027] \u003d sys_meta[inst[\u0027uuid\u0027]]"},{"line_number":1952,"context_line":"        inst[\u0027metadata\u0027] \u003d meta[inst[\u0027uuid\u0027]]"},{"line_number":1953,"context_line":"        if \u0027pci_devices\u0027 in manual_joins:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_23f5daed","line":1950,"range":{"start_line":1946,"start_character":0,"end_line":1950,"end_character":48},"updated":"2019-04-04 11:19:22.000000000","message":"-1:\n\n inst[\u0027is_volume_backend\u0027] \u003d inst[\u0027uuid\u0027] in bfv_instances_uuids","commit_id":"54abef984a22b6982f78a0342b5ebc9a97f12717"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"aaef4a8600e98af2d0d15e58993e9297b3a3e62e","unresolved":false,"context_lines":[{"line_number":1965,"context_line":"        models.BlockDeviceMapping.instance_uuid)).filter(and_(("},{"line_number":1966,"context_line":"            models.BlockDeviceMapping.boot_index \u003d\u003d 0),"},{"line_number":1967,"context_line":"        (models.BlockDeviceMapping.destination_type \u003d\u003d \u0027volume\u0027)))"},{"line_number":1968,"context_line":"    return query.all()"},{"line_number":1969,"context_line":""},{"line_number":1970,"context_line":""},{"line_number":1971,"context_line":"def _manual_join_columns(columns_to_join):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_23df1a3b","line":1968,"updated":"2019-04-04 11:19:22.000000000","message":"Why do we want to read deleted entries? Wouldn\u0027t we ant to ignore them?\n\nI think we should limit the query to just return the uuid, since it is the only field we care about.","commit_id":"54abef984a22b6982f78a0342b5ebc9a97f12717"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"dfee9d453bb4ea68650091174232631b1fb5fc34","unresolved":false,"context_lines":[{"line_number":1965,"context_line":"        models.BlockDeviceMapping.instance_uuid)).filter(and_(("},{"line_number":1966,"context_line":"            models.BlockDeviceMapping.boot_index \u003d\u003d 0),"},{"line_number":1967,"context_line":"        (models.BlockDeviceMapping.destination_type \u003d\u003d \u0027volume\u0027)))"},{"line_number":1968,"context_line":"    return query.all()"},{"line_number":1969,"context_line":""},{"line_number":1970,"context_line":""},{"line_number":1971,"context_line":"def _manual_join_columns(columns_to_join):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_d2338161","line":1968,"in_reply_to":"5fc1f717_23df1a3b","updated":"2019-04-04 12:46:55.000000000","message":"We need to read deleted entries, unfortunately, because the simple-tenant-usage API looks at a period of time and sums up \"usage\" information. Instances could very well have been deleted during that time period, of course.\n\n++ on the suggestion to only return the uuid column, though.","commit_id":"54abef984a22b6982f78a0342b5ebc9a97f12717"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"dfee9d453bb4ea68650091174232631b1fb5fc34","unresolved":false,"context_lines":[{"line_number":1971,"context_line":"def _manual_join_columns(columns_to_join):"},{"line_number":1972,"context_line":"    \"\"\"Separate manually joined columns from columns_to_join"},{"line_number":1973,"context_line":""},{"line_number":1974,"context_line":"    If columns_to_join contains \u0027metadata\u0027, \u0027system_metadata\u0027, \u0027fault\u0027, or"},{"line_number":1975,"context_line":"    \u0027pci_devices\u0027 those columns are removed from columns_to_join and added"},{"line_number":1976,"context_line":"    to a manual_joins list to be used with the _instances_fill_metadata method."},{"line_number":1977,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_321685a9","line":1974,"updated":"2019-04-04 12:46:55.000000000","message":"You didn\u0027t update the docstring.","commit_id":"54abef984a22b6982f78a0342b5ebc9a97f12717"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9d8cf28b0f8f5ff857f8b0755250f11779e8746","unresolved":false,"context_lines":[{"line_number":1932,"context_line":"        faults \u003d {}"},{"line_number":1933,"context_line":""},{"line_number":1934,"context_line":"    if \u0027is_volume_backed\u0027 in manual_joins:"},{"line_number":1935,"context_line":"        bfv_instances_uuids \u003d _get_volume_backed_instances(context)"},{"line_number":1936,"context_line":"    else:"},{"line_number":1937,"context_line":"        bfv_instances_uuids \u003d set()"},{"line_number":1938,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_652c524a","line":1935,"range":{"start_line":1935,"start_character":30,"end_line":1935,"end_character":58},"updated":"2019-08-12 15:14:36.000000000","message":"Why wouldn\u0027t you pass instances to this to filter the instances? Otherwise you\u0027re getting *all* instances in the DB just to determine if the subset here, which could be 1 or 2, are volume-backed?","commit_id":"25a1b63400171ef42a70571690f3f08b2ef17e86"}],"nova/objects/instance.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"58e17b342fc15ddc7ee917b8c0f48e8faee6127b","unresolved":false,"context_lines":[{"line_number":51,"context_line":"_INSTANCE_OPTIONAL_JOINED_FIELDS \u003d [\u0027metadata\u0027, \u0027system_metadata\u0027,"},{"line_number":52,"context_line":"                                    \u0027info_cache\u0027, \u0027security_groups\u0027,"},{"line_number":53,"context_line":"                                    \u0027pci_devices\u0027, \u0027tags\u0027, \u0027services\u0027,"},{"line_number":54,"context_line":"                                    \u0027fault\u0027, \u0027block_device_mapping\u0027]"},{"line_number":55,"context_line":"# These are fields that are optional but don\u0027t translate to db columns"},{"line_number":56,"context_line":"_INSTANCE_OPTIONAL_NON_COLUMN_FIELDS \u003d [\u0027flavor\u0027, \u0027old_flavor\u0027,"},{"line_number":57,"context_line":"                                        \u0027new_flavor\u0027, \u0027ec2_ids\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfdaf3ff_0b1b1281","line":54,"range":{"start_line":54,"start_character":46,"end_line":54,"end_character":66},"updated":"2019-01-16 15:05:10.000000000","message":"What I\u0027d try to do is add a Boolean is_volume_backed field, which is optional, and then if requested, the DB API code would check for that and do a fast query to the block_device_mapping table to determine if there are:\n\n1. bdms for the given instance uuid\n2. those bdms are not deleted\n3. the boot_index\u003d0\n4. the destination_type\u003dvolume\n\nThat could be a simple scalar query which sets the boolean field on the DB model object which then sets the Instance.is_volume_backed field, and as it\u0027s optional, we can control which callers need that additional join/query when pulling instances out of the DB (we\u0027d just start with the simple tenant usage API).","commit_id":"95080d00e686e77e36db09ffc30b69a1ac18ba96"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e3e9d9b726c2ceade1d548f2b88179a96cdb9cef","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                                                nullable\u003dTrue),"},{"line_number":217,"context_line":"        \u0027keypairs\u0027: fields.ObjectField(\u0027KeyPairList\u0027),"},{"line_number":218,"context_line":"        \u0027trusted_certs\u0027: fields.ObjectField(\u0027TrustedCerts\u0027, nullable\u003dTrue),"},{"line_number":219,"context_line":"        \u0027block_device_mapping\u0027: fields.ObjectField(\u0027BlockDeviceMappingList\u0027,"},{"line_number":220,"context_line":"                                                   nullable\u003dTrue),"},{"line_number":221,"context_line":"        }"},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfdaf3ff_8bfaa272","line":219,"updated":"2019-01-16 14:51:53.000000000","message":"As jichenjc pointed out, we already have tools to do this same thing, and this wasn\u0027t really what I was thinking. I was thinking more along the lines of setting a boolean field based on a DB query when pulling the instance using joins to determine if the instance is volume-backed by having a related block_device_mappings record with boot_index\u003d0 and destination_type\u003dvolume, which could set a boolean on the instance record, not a full list of BDMs.","commit_id":"95080d00e686e77e36db09ffc30b69a1ac18ba96"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"fbc2c90852977839ea7f2f88ac03b201c33eab88","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    # Version 2.4: Added trusted_certs"},{"line_number":117,"context_line":"    VERSION \u003d \u00272.4\u0027"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    fields \u003d {"},{"line_number":120,"context_line":"        \u0027id\u0027: fields.IntegerField(),"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        \u0027user_id\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_611939d5","line":119,"range":{"start_line":119,"start_character":4,"end_line":119,"end_character":10},"updated":"2019-03-27 07:44:56.000000000","message":"Just a question.\nWhy didn\u0027t you add \u0027is_volume_backed\u0027 in fields of Instance object?","commit_id":"81823b0a468221d47c8b1b7e3b717a711bc4d4bc"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"aaef4a8600e98af2d0d15e58993e9297b3a3e62e","unresolved":false,"context_lines":[{"line_number":248,"context_line":"                                   \u0027metadata\u0027 in self else {})"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def obj_attr_is_set(self, attrname):"},{"line_number":251,"context_line":"        if attrname not in self.obj_fields:"},{"line_number":252,"context_line":"            if attrname \u003d\u003d \u0027is_volume_backed\u0027:"},{"line_number":253,"context_line":"                # NOTE(bhagyashris): This is special case where the"},{"line_number":254,"context_line":"                # \u0027is_volume_backed\u0027 field is passed as extra_attr to identify"},{"line_number":255,"context_line":"                # the instance is boot from volume or not."}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_632d22fc","line":252,"range":{"start_line":251,"start_character":0,"end_line":252,"end_character":46},"updated":"2019-04-04 11:19:22.000000000","message":"-1: This will raise an `AttributeError` exception if \u0027is_volume_backend\u0027 has been set.\n\nWe should replace it with:\n\n        if attrname \u003d\u003d \u0027is_volume_backend\u0027:\n            return attrname in self.obj_fields","commit_id":"54abef984a22b6982f78a0342b5ebc9a97f12717"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"182a38d1deb38359c0916c41ae6f1bfd205ef3d0","unresolved":false,"context_lines":[{"line_number":248,"context_line":"                                   \u0027metadata\u0027 in self else {})"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def obj_attr_is_set(self, attrname):"},{"line_number":251,"context_line":"        if attrname not in self.obj_fields:"},{"line_number":252,"context_line":"            if attrname \u003d\u003d \u0027is_volume_backed\u0027:"},{"line_number":253,"context_line":"                # NOTE(bhagyashris): This is special case where the"},{"line_number":254,"context_line":"                # \u0027is_volume_backed\u0027 field is passed as extra_attr to identify"},{"line_number":255,"context_line":"                # the instance is boot from volume or not."}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_233ddadc","line":252,"range":{"start_line":251,"start_character":0,"end_line":252,"end_character":46},"in_reply_to":"5fc1f717_632d22fc","updated":"2019-04-04 11:23:09.000000000","message":"Now that I think about it, my code is so wrong...\n\n  if attrname \u003d\u003d \u0027is_volume_backend\u0027:\n     return hasattr(self, attrname)","commit_id":"54abef984a22b6982f78a0342b5ebc9a97f12717"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"dfee9d453bb4ea68650091174232631b1fb5fc34","unresolved":false,"context_lines":[{"line_number":255,"context_line":"                # the instance is boot from volume or not."},{"line_number":256,"context_line":"                # No need to save/set this attribute in the instance object as"},{"line_number":257,"context_line":"                # it is used only for get purpose."},{"line_number":258,"context_line":"                return False"},{"line_number":259,"context_line":"        return super(Instance, self).obj_attr_is_set(attrname)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def obj_clone(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_72d40dea","line":258,"updated":"2019-04-04 12:46:55.000000000","message":"this doesn\u0027t make sense to me. obj_attr_is_set() returns False whenever attrname isn\u0027t in self.obj_fields anyway, so  \"if attrname \u003d\u003d \u0027is_volume_backed\u0027\" is redundant with the \"if attrname not in self.obj_fields\" conditional.","commit_id":"54abef984a22b6982f78a0342b5ebc9a97f12717"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"aaef4a8600e98af2d0d15e58993e9297b3a3e62e","unresolved":false,"context_lines":[{"line_number":393,"context_line":"            # (simple tenant usage) only when it is requested in the"},{"line_number":394,"context_line":"            # expected_attrs otherwise it won\u0027t be available in the"},{"line_number":395,"context_line":"            # instance object."},{"line_number":396,"context_line":"            if db_inst.get(\u0027is_volume_backed\u0027) is not None:"},{"line_number":397,"context_line":"                if db_inst.get(\u0027is_volume_backed\u0027):"},{"line_number":398,"context_line":"                    instance.is_volume_backed \u003d True"},{"line_number":399,"context_line":"                else:"},{"line_number":400,"context_line":"                    instance.is_volume_backed \u003d False"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        if \u0027metadata\u0027 in expected_attrs:"},{"line_number":403,"context_line":"            instance[\u0027metadata\u0027] \u003d utils.instance_meta(db_inst)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_a3bf8aa8","line":400,"range":{"start_line":396,"start_character":0,"end_line":400,"end_character":53},"updated":"2019-04-04 11:19:22.000000000","message":"Why not just do?:\n\n  instance.is_volume_backed \u003d db_inst.get(\u0027is_volume_backed\u0027, False)\n\nOr if you think that it could have the value `None` we can do\n\n  instance.is_volume_backed \u003d db_inst.get(\u0027is_volume_backed\u0027) or False","commit_id":"54abef984a22b6982f78a0342b5ebc9a97f12717"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"a4cf794c594bdddd11b17235adf8316fe17ab0f6","unresolved":false,"context_lines":[{"line_number":223,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":224,"context_line":"        super(Instance, self).obj_make_compatible(primitive, target_version)"},{"line_number":225,"context_line":"        target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":226,"context_line":"        if target_version \u003c (2, 5) and \u0027is_volume_backed\u0027 in primitive:"},{"line_number":227,"context_line":"            del primitive[\u0027is_volume_backed\u0027]"},{"line_number":228,"context_line":"        if target_version \u003c (2, 4) and \u0027trusted_certs\u0027 in primitive:"},{"line_number":229,"context_line":"            del primitive[\u0027trusted_certs\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_71ff7167","line":226,"range":{"start_line":226,"start_character":28,"end_line":226,"end_character":34},"updated":"2019-07-05 04:36:35.000000000","message":"(2, 6)","commit_id":"d966d1d417e43f4a7bcb0a9a70fa884a7a28d76a"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5202f5342888f8c7ba2b9c057e6e36fdcac33b0c","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    # instance thereby improving the performance of the simple tenant usage"},{"line_number":99,"context_line":"    # API."},{"line_number":100,"context_line":"    if include_non_cols_fields:"},{"line_number":101,"context_line":"        if (\u0027is_volume_backed\u0027 in expected_attrs and"},{"line_number":102,"context_line":"                _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS):"},{"line_number":103,"context_line":"            non_cols_fields \u003d [\u0027is_volume_backed\u0027]"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_06d93a55","line":101,"updated":"2019-08-22 09:29:33.000000000","message":"?: what about the other elements from `_INSTANCE_OPTIONAL_NON_COLUMN_FIELDS`?","commit_id":"76d1da0e371e27eda0f8ed58539840b9490cc87c"},{"author":{"_account_id":20182,"name":"Bhagyashri Shewale","email":"bshewale@redhat.com","username":"bhagyashris"},"change_message_id":"ebfcce31385d3ca2d779b9d43a29d1b1937afa66","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    # instance thereby improving the performance of the simple tenant usage"},{"line_number":99,"context_line":"    # API."},{"line_number":100,"context_line":"    if include_non_cols_fields:"},{"line_number":101,"context_line":"        if (\u0027is_volume_backed\u0027 in expected_attrs and"},{"line_number":102,"context_line":"                _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS):"},{"line_number":103,"context_line":"            non_cols_fields \u003d [\u0027is_volume_backed\u0027]"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_1d009935","line":101,"in_reply_to":"7faddb67_06d93a55","updated":"2019-08-23 02:01:29.000000000","message":"As mentioned in the notes that this is the special case (“simple tenant usage api”) where we want to get instance list, by checking ‘is_volume_backed’ attribute is requested in expected_attrs and present in _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS, if it’s there then add that in the ‘expected_cols’ and passed it to ‘_get_active_by_window_joined’ method to execute the query.","commit_id":"76d1da0e371e27eda0f8ed58539840b9490cc87c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5202f5342888f8c7ba2b9c057e6e36fdcac33b0c","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    # API."},{"line_number":100,"context_line":"    if include_non_cols_fields:"},{"line_number":101,"context_line":"        if (\u0027is_volume_backed\u0027 in expected_attrs and"},{"line_number":102,"context_line":"                _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS):"},{"line_number":103,"context_line":"            non_cols_fields \u003d [\u0027is_volume_backed\u0027]"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    if complex_cols:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_e6df3e36","line":102,"updated":"2019-08-22 09:29:33.000000000","message":"What\u0027s the purpose of this?  We know beforehand that it\u0027s not an empty list and will always evaluate to True.","commit_id":"76d1da0e371e27eda0f8ed58539840b9490cc87c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"8e79e13c185577a0fcd2acbd9e7d0c085cefcb44","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    # API."},{"line_number":100,"context_line":"    if include_non_cols_fields:"},{"line_number":101,"context_line":"        if (\u0027is_volume_backed\u0027 in expected_attrs and"},{"line_number":102,"context_line":"                _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS):"},{"line_number":103,"context_line":"            non_cols_fields \u003d [\u0027is_volume_backed\u0027]"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    if complex_cols:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_5bf376a0","line":102,"in_reply_to":"7faddb67_ddf9a14e","updated":"2019-08-23 09:14:31.000000000","message":"you are not checking that \u0027is_volume_backend\u0027 is present in _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS, you are only checking that `bool(_INSTANCE_OPTIONAL_NON_COLUMN_FIELDS) is True`.","commit_id":"76d1da0e371e27eda0f8ed58539840b9490cc87c"},{"author":{"_account_id":20182,"name":"Bhagyashri Shewale","email":"bshewale@redhat.com","username":"bhagyashris"},"change_message_id":"ebfcce31385d3ca2d779b9d43a29d1b1937afa66","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    # API."},{"line_number":100,"context_line":"    if include_non_cols_fields:"},{"line_number":101,"context_line":"        if (\u0027is_volume_backed\u0027 in expected_attrs and"},{"line_number":102,"context_line":"                _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS):"},{"line_number":103,"context_line":"            non_cols_fields \u003d [\u0027is_volume_backed\u0027]"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    if complex_cols:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_ddf9a14e","line":102,"in_reply_to":"7faddb67_e6df3e36","updated":"2019-08-23 02:01:29.000000000","message":"Here I am checking ‘is_voliume_backed’ is present in both expected_attrs and _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS and not the _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS list is None or not","commit_id":"76d1da0e371e27eda0f8ed58539840b9490cc87c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"5202f5342888f8c7ba2b9c057e6e36fdcac33b0c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS):"},{"line_number":103,"context_line":"            non_cols_fields \u003d [\u0027is_volume_backed\u0027]"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    if complex_cols:"},{"line_number":106,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":107,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":108,"context_line":"    expected_cols \u003d simple_cols + complex_cols + non_cols_fields"},{"line_number":109,"context_line":"    # NOTE(pumaranikar): expected_cols list can contain duplicates since"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_5cbe2865","line":106,"range":{"start_line":105,"start_character":0,"end_line":106,"end_character":35},"updated":"2019-08-22 09:29:33.000000000","message":"nit: we should not split this from L90-L92","commit_id":"76d1da0e371e27eda0f8ed58539840b9490cc87c"},{"author":{"_account_id":20182,"name":"Bhagyashri Shewale","email":"bshewale@redhat.com","username":"bhagyashris"},"change_message_id":"ebfcce31385d3ca2d779b9d43a29d1b1937afa66","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS):"},{"line_number":103,"context_line":"            non_cols_fields \u003d [\u0027is_volume_backed\u0027]"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    if complex_cols:"},{"line_number":106,"context_line":"        simple_cols.append(\u0027extra\u0027)"},{"line_number":107,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":108,"context_line":"    expected_cols \u003d simple_cols + complex_cols + non_cols_fields"},{"line_number":109,"context_line":"    # NOTE(pumaranikar): expected_cols list can contain duplicates since"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_9d91e9fa","line":106,"range":{"start_line":105,"start_character":0,"end_line":106,"end_character":35},"in_reply_to":"7faddb67_5cbe2865","updated":"2019-08-23 02:01:29.000000000","message":"Done","commit_id":"76d1da0e371e27eda0f8ed58539840b9490cc87c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"8e79e13c185577a0fcd2acbd9e7d0c085cefcb44","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    # API."},{"line_number":102,"context_line":"    if include_non_cols_fields:"},{"line_number":103,"context_line":"        if (\u0027is_volume_backed\u0027 in expected_attrs and"},{"line_number":104,"context_line":"                _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS):"},{"line_number":105,"context_line":"            non_cols_fields \u003d [\u0027is_volume_backed\u0027]"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_1bedfeb6","line":104,"updated":"2019-08-23 09:14:31.000000000","message":"Why the nested `if`s?  And according to your comment on patch 12 you wanted to checked it\u0027s also part of _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS\n\nWe can do:\n\n    if (include_non_cols_fields and\n            \u0027is_volume_backed\u0027 in expected_attrs and\n            \u0027is_volume_backed\u0027 in _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS):\n\nThough in my opinion we already know it\u0027s in _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS, so we should just do:\n\n    if (include_non_cols_fields and \u0027is_volume_backed\u0027 in expected_attrs):","commit_id":"0c0be1659a8ff8944523b516030b890aeff5db88"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"24c080e141caab30015aa547128ab3bc154c925e","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    if include_non_cols_fields:"},{"line_number":103,"context_line":"        if (\u0027is_volume_backed\u0027 in expected_attrs and"},{"line_number":104,"context_line":"                _INSTANCE_OPTIONAL_NON_COLUMN_FIELDS):"},{"line_number":105,"context_line":"            non_cols_fields \u003d [\u0027is_volume_backed\u0027]"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    simple_cols \u003d [x for x in simple_cols if x not in _INSTANCE_EXTRA_FIELDS]"},{"line_number":108,"context_line":"    expected_cols \u003d simple_cols + complex_cols + non_cols_fields"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_5bab761d","line":105,"updated":"2019-08-23 09:30:04.000000000","message":"nit: Probably more efficient to append to the existing list instead of creating a new one:\n\n   non_cols_fields.append(\u0027is_volume_backed\u0027)","commit_id":"0c0be1659a8ff8944523b516030b890aeff5db88"}],"nova/tests/functional/test_simple_tenant_usage.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"12bda8d48103a36e01fde00159316c281a70fb66","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        # server1 using flavor of ephemeral_gb\u003d1, root_gb\u003d1, vcpus\u003d1,"},{"line_number":57,"context_line":"        # memory_mb\u003d512"},{"line_number":58,"context_line":"        created_server1 \u003d self.api.post_server({\"server\": server1})"},{"line_number":59,"context_line":"        # server2 using flavor of ephemeral_gb\u003d0, root_gb\u003d1, vcpus\u003d1,"},{"line_number":60,"context_line":"        # memory_mb\u003d512"},{"line_number":61,"context_line":"        created_server2 \u003d self.api.post_server({\"server\": server2})"},{"line_number":62,"context_line":"        self._wait_for_state_change(created_server1, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_beae29e2","line":59,"range":{"start_line":59,"start_character":47,"end_line":59,"end_character":48},"updated":"2020-01-13 06:51:30.000000000","message":"there should \u00271\u0027?","commit_id":"866e195d724755a6158308145b28399209cff233"}],"nova/tests/unit/api/openstack/compute/test_simple_tenant_usage.py":[{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"db19a0f0383040ef3478c5613dd3354b913d6aaf","unresolved":false,"context_lines":[{"line_number":245,"context_line":"            \u00271\u0027, START.isoformat(), STOP.isoformat()), version\u003dself.version)"},{"line_number":246,"context_line":"        req.environ[\u0027nova.context\u0027] \u003d self.admin_context"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        # NOTE(pooja_jadhav): Default fixture has two cells (cell0 and cell1),"},{"line_number":249,"context_line":"        # so get_active_by_window_joined method get\u0027s called for each cell so"},{"line_number":250,"context_line":"        # all our math will be doubled."},{"line_number":251,"context_line":"        with mock.patch.object("},{"line_number":252,"context_line":"                objects.InstanceList, \u0027get_active_by_window_joined\u0027,"},{"line_number":253,"context_line":"                return_value\u003dobjects.InstanceList("}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_9c4bd4b0","line":250,"range":{"start_line":248,"start_character":7,"end_line":250,"end_character":39},"updated":"2018-10-23 11:13:55.000000000","message":"hmm, this seems wrong, I mean, that we got doubled result for tenant_usages[0][\u0027total_local_gb_usage\u0027] is wrong if it is true, because it does not make sense.","commit_id":"becf4b73d2bbd9992b30ea09df0d85eb91901e40"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"bcef09c8de11409c41c11da528f5c7662f24b98c","unresolved":false,"context_lines":[{"line_number":245,"context_line":"            \u00271\u0027, START.isoformat(), STOP.isoformat()), version\u003dself.version)"},{"line_number":246,"context_line":"        req.environ[\u0027nova.context\u0027] \u003d self.admin_context"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"        # NOTE(pooja_jadhav): Default fixture has two cells (cell0 and cell1),"},{"line_number":249,"context_line":"        # so get_active_by_window_joined method get\u0027s called for each cell so"},{"line_number":250,"context_line":"        # all our math will be doubled."},{"line_number":251,"context_line":"        with mock.patch.object("},{"line_number":252,"context_line":"                objects.InstanceList, \u0027get_active_by_window_joined\u0027,"},{"line_number":253,"context_line":"                return_value\u003dobjects.InstanceList("}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_6f0ddc34","line":250,"range":{"start_line":248,"start_character":7,"end_line":250,"end_character":39},"in_reply_to":"3f79a3b5_9c4bd4b0","updated":"2018-10-23 11:30:56.000000000","message":"...Later, talked on IRC and I got what this means, but maybe we should move this closer to the actuall assert?","commit_id":"becf4b73d2bbd9992b30ea09df0d85eb91901e40"}]}
