)]}'
{"nova/compute/api.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"79ad511185664d22d54836f3d0350ce5c3b03e38","unresolved":false,"context_lines":[{"line_number":2482,"context_line":"    def get_all_instance_metadata(self, context, search_filts):"},{"line_number":2483,"context_line":"        \"\"\"Get all metadata.\"\"\""},{"line_number":2484,"context_line":""},{"line_number":2485,"context_line":"        def make_tuple(item):"},{"line_number":2486,"context_line":"            if isinstance(item, dict):"},{"line_number":2487,"context_line":"                item \u003d item.values()"},{"line_number":2488,"context_line":"            if not isinstance(item, (tuple, list, set)):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAP3%2F%2F27g%3D","line":2485,"updated":"2013-07-10 09:59:47.000000000","message":"I saw this method in db.sqlalchemy.api.py probably we should create one method in some kind of utils and don\u0027t copy paste such functions?","commit_id":"41cf1e99f171e9f452e2bdca987bb0a1a2a779bd"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"79ad511185664d22d54836f3d0350ce5c3b03e38","unresolved":false,"context_lines":[{"line_number":2505,"context_line":"            elif search_filt.get(\u0027value\u0027):"},{"line_number":2506,"context_line":"                value \u003d make_tuple(search_filt[\u0027value\u0027])"},{"line_number":2507,"context_line":""},{"line_number":2508,"context_line":"        if key and value:  # this is key\u003dvalue"},{"line_number":2509,"context_line":"            filters \u003d {\u0027filter\u0027: [{\u0027name\u0027: \u0027tag:%s\u0027 % key[0], \u0027value\u0027: value}]}"},{"line_number":2510,"context_line":"        elif key:"},{"line_number":2511,"context_line":"            filters \u003d {\u0027filter\u0027: [{\u0027name\u0027: \u0027tag-key\u0027, \u0027value\u0027: key}]}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAP3%2F%2F258%3D","line":2508,"updated":"2013-07-10 09:59:47.000000000","message":"I think this should be inside the loop?","commit_id":"41cf1e99f171e9f452e2bdca987bb0a1a2a779bd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8035309555d381cdf56b050929e883f3717a29f","unresolved":false,"context_lines":[{"line_number":2510,"context_line":"        elif key:"},{"line_number":2511,"context_line":"            filters \u003d {\u0027filter\u0027: [{\u0027name\u0027: \u0027tag-key\u0027, \u0027value\u0027: key}]}"},{"line_number":2512,"context_line":"        elif value:"},{"line_number":2513,"context_line":"            filters \u003d {\u0027filter\u0027: [{\u0027name\u0027: \u0027tag-value\u0027, \u0027value\u0027: value}]}"},{"line_number":2514,"context_line":""},{"line_number":2515,"context_line":"        filters[\u0027remove_metadata\u0027] \u003d True"},{"line_number":2516,"context_line":"        sort_key \u003d \u0027created_at\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAP3%2F%2F1R8%3D","line":2513,"updated":"2013-07-10 17:56:43.000000000","message":"This seems too sqlalchemy-specific, and will likely require some changes to InstanceList in order to support when this inevitably needs to be ported. It also won\u0027t work if/when we convert metadata to a blob.\n\nIs it really necessary?\n\nCan you just do this with the InstanceList object from the start?","commit_id":"41cf1e99f171e9f452e2bdca987bb0a1a2a779bd"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"79ad511185664d22d54836f3d0350ce5c3b03e38","unresolved":false,"context_lines":[{"line_number":2516,"context_line":"        sort_key \u003d \u0027created_at\u0027"},{"line_number":2517,"context_line":"        sort_dir \u003d \u0027desc\u0027"},{"line_number":2518,"context_line":""},{"line_number":2519,"context_line":"        instances \u003d self._get_instances_by_filters(context, filters,"},{"line_number":2520,"context_line":"                                                   sort_key\u003d\u0027created_at\u0027,"},{"line_number":2521,"context_line":"                                                   sort_dir\u003d\u0027desc\u0027)"},{"line_number":2522,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAP3%2F%2F26A%3D","line":2519,"updated":"2013-07-10 09:59:47.000000000","message":"I don\u0027t like this approach.\n\nOur goal is to get all metadata by some filters. And we are getting instances, why?","commit_id":"41cf1e99f171e9f452e2bdca987bb0a1a2a779bd"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"131f46b19ca5107dbd1018991ec34210df61bf04","unresolved":false,"context_lines":[{"line_number":2493,"context_line":""},{"line_number":2494,"context_line":"            for (k, v) in input_metadata.iteritems():"},{"line_number":2495,"context_line":"                # Both keys and value defined -- AND"},{"line_number":2496,"context_line":"                if (keys_filter and values_filter) and \\"},{"line_number":2497,"context_line":"                   (k not in keys_filter) and (v not in values_filter):"},{"line_number":2498,"context_line":"                    continue"},{"line_number":2499,"context_line":"                # Only keys or value is defined"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2FiKQ%3D","line":2496,"updated":"2013-07-16 21:31:08.000000000","message":"Use parentheses to eliminate the backslashes.","commit_id":"2c2602c7efe3d4658f3bf5a92aaa0155c879d21b"},{"author":{"_account_id":6661,"name":"Burt Holzman","email":"holzman@gmail.com","username":"burt"},"change_message_id":"3dc38e5603ac6330b6b03c993f55abbfc33e72b1","unresolved":false,"context_lines":[{"line_number":2493,"context_line":""},{"line_number":2494,"context_line":"            for (k, v) in input_metadata.iteritems():"},{"line_number":2495,"context_line":"                # Both keys and value defined -- AND"},{"line_number":2496,"context_line":"                if (keys_filter and values_filter) and \\"},{"line_number":2497,"context_line":"                   (k not in keys_filter) and (v not in values_filter):"},{"line_number":2498,"context_line":"                    continue"},{"line_number":2499,"context_line":"                # Only keys or value is defined"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2FiFI%3D","line":2496,"in_reply_to":"AAAAP3%2F%2FiKQ%3D","updated":"2013-07-16 21:45:20.000000000","message":"Done","commit_id":"2c2602c7efe3d4658f3bf5a92aaa0155c879d21b"},{"author":{"_account_id":6624,"name":"Stephen Gran","email":"sgran@debian.org","username":"sgran"},"change_message_id":"0f5df8f3ffa5234b2b264e0a75a6d49a8429d796","unresolved":false,"context_lines":[{"line_number":2513,"context_line":"                metadata \u003d instance.get(\u0027metadata\u0027, {})"},{"line_number":2514,"context_line":"                for filt in search_filts:"},{"line_number":2515,"context_line":"                    # By chaining the input to the output, the filters are"},{"line_number":2516,"context_line":"                    # ANDed together"},{"line_number":2517,"context_line":"                    metadata \u003d _filter_metadata(instance, filt, metadata)"},{"line_number":2518,"context_line":""},{"line_number":2519,"context_line":"                for (k, v) in metadata.iteritems():"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2FeZ4%3D","line":2516,"updated":"2013-07-17 17:34:37.000000000","message":"The version that this is replacing OR\u0027ed the filters together, per the EC2 spec.  You are replacing that with AND\u0027ing them together, which is wrong, it seems to me.  Is that on purpose?","commit_id":"b48789f14b41b7f017f84a5d832e9283a0808ef4"},{"author":{"_account_id":6661,"name":"Burt Holzman","email":"holzman@gmail.com","username":"burt"},"change_message_id":"e6564f30a6b12aac8681630d6ed3d8730fb88e2a","unresolved":false,"context_lines":[{"line_number":2513,"context_line":"                metadata \u003d instance.get(\u0027metadata\u0027, {})"},{"line_number":2514,"context_line":"                for filt in search_filts:"},{"line_number":2515,"context_line":"                    # By chaining the input to the output, the filters are"},{"line_number":2516,"context_line":"                    # ANDed together"},{"line_number":2517,"context_line":"                    metadata \u003d _filter_metadata(instance, filt, metadata)"},{"line_number":2518,"context_line":""},{"line_number":2519,"context_line":"                for (k, v) in metadata.iteritems():"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2FeUc%3D","line":2516,"in_reply_to":"AAAAP3%2F%2FeZ4%3D","updated":"2013-07-17 17:54:54.000000000","message":"Yes, this is on purpose, but did I make a mistake?\n\nFrom the EC2 API on DescribeTags:\n\nhttp://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeTags.html\n\nYou can specify multiple filters (for example, specify a specific\nresource type and tag values that contain the string database). The\nresponse includes information for a tag only if it matches all the\nfilters that you specified. If there\u0027s no match, no special message is\nreturned, the response is simply empty.","commit_id":"b48789f14b41b7f017f84a5d832e9283a0808ef4"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"79ad511185664d22d54836f3d0350ce5c3b03e38","unresolved":false,"context_lines":[{"line_number":4171,"context_line":"                        session\u003dsession).filter("},{"line_number":4172,"context_line":"        models.InstanceMetadata.instance_uuid.in_(instance_uuids))"},{"line_number":4173,"context_line":""},{"line_number":4174,"context_line":"    if filters and \u0027remove_metadata\u0027 in filters:"},{"line_number":4175,"context_line":"        query \u003d filter_metadata_by_tag(query, models.InstanceMetadata,"},{"line_number":4176,"context_line":"                                  filters)"},{"line_number":4177,"context_line":"    return query"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAP3%2F%2F278%3D","line":4174,"updated":"2013-07-10 09:59:47.000000000","message":"It is not so quite easy to understans, why we are checking that \u0027remove_metdata\u0027 is in filters and then passing all filters dict to fitler_metadata_by_tag?","commit_id":"41cf1e99f171e9f452e2bdca987bb0a1a2a779bd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8035309555d381cdf56b050929e883f3717a29f","unresolved":false,"context_lines":[{"line_number":4173,"context_line":""},{"line_number":4174,"context_line":"    if filters and \u0027remove_metadata\u0027 in filters:"},{"line_number":4175,"context_line":"        query \u003d filter_metadata_by_tag(query, models.InstanceMetadata,"},{"line_number":4176,"context_line":"                                  filters)"},{"line_number":4177,"context_line":"    return query"},{"line_number":4178,"context_line":""},{"line_number":4179,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAP3%2F%2F1SI%3D","line":4176,"updated":"2013-07-10 17:56:43.000000000","message":"Alignment here, should fit under \u0027query\u0027","commit_id":"41cf1e99f171e9f452e2bdca987bb0a1a2a779bd"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"08ba225094037ef32cb7e1fd7ece834293db79ac","unresolved":false,"context_lines":[{"line_number":4211,"context_line":""},{"line_number":4212,"context_line":""},{"line_number":4213,"context_line":"@require_context"},{"line_number":4214,"context_line":"def instance_metadata_get_all(context, search_filts\u003d[], read_deleted\u003d\"no\"):"},{"line_number":4215,"context_line":"    rows \u003d _instance_metadata_get_all_query(context,"},{"line_number":4216,"context_line":"                                       read_deleted\u003dread_deleted,"},{"line_number":4217,"context_line":"                                       search_filts\u003dsearch_filts).all()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAP3%2F%2Fx7M%3D","side":"PARENT","line":4214,"updated":"2013-07-11 15:38:52.000000000","message":"This method remained in public api (nova/db/api).","commit_id":"c43bc58aa1e2dfaf3c6787560ec2d09af0a819ae"},{"author":{"_account_id":6661,"name":"Burt Holzman","email":"holzman@gmail.com","username":"burt"},"change_message_id":"1e8ef76931d7993bdfdc6c8ed6c0cf3d1bf70760","unresolved":false,"context_lines":[{"line_number":4211,"context_line":""},{"line_number":4212,"context_line":""},{"line_number":4213,"context_line":"@require_context"},{"line_number":4214,"context_line":"def instance_metadata_get_all(context, search_filts\u003d[], read_deleted\u003d\"no\"):"},{"line_number":4215,"context_line":"    rows \u003d _instance_metadata_get_all_query(context,"},{"line_number":4216,"context_line":"                                       read_deleted\u003dread_deleted,"},{"line_number":4217,"context_line":"                                       search_filts\u003dsearch_filts).all()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAP3%2F%2FxzQ%3D","side":"PARENT","line":4214,"in_reply_to":"AAAAP3%2F%2Fx7M%3D","updated":"2013-07-11 16:48:33.000000000","message":"Oh, that\u0027s too bad.  Ok, I\u0027ll put it back. :)","commit_id":"c43bc58aa1e2dfaf3c6787560ec2d09af0a819ae"}]}
