)]}'
{"tempest/api/object_storage/base.py":[{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"a574b43300e8f99d94922f781ac9c0ec2924ebb5","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        if CONF.object_storage_feature_enabled.discoverability:"},{"line_number":60,"context_line":"            resp, body \u003d cls.account_client.list_extensions()"},{"line_number":61,"context_line":"            cls.version \u003d body[\u0027swift\u0027][\u0027version\u0027]"},{"line_number":62,"context_line":"            cls.policies \u003d body[\u0027swift\u0027][\u0027policies\u0027]"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            cls.version \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_eff0e168","line":61,"updated":"2016-04-22 16:24:04.000000000","message":"it looks like it should be removed.","commit_id":"fd3e2d2f2f71f3ee3d2a57ec8e3bdf2c4d7f13d0"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"a574b43300e8f99d94922f781ac9c0ec2924ebb5","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            cls.version \u003d body[\u0027swift\u0027][\u0027version\u0027]"},{"line_number":62,"context_line":"            cls.policies \u003d body[\u0027swift\u0027][\u0027policies\u0027]"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            cls.version \u003d None"},{"line_number":65,"context_line":"            cls.policies \u003d None"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_6ffdf13a","line":64,"updated":"2016-04-22 16:24:04.000000000","message":"ditto.","commit_id":"fd3e2d2f2f71f3ee3d2a57ec8e3bdf2c4d7f13d0"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"496268d6d1a88e1ae8b7c774585d22ea3b72d7c2","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        if CONF.object_storage_feature_enabled.discoverability:"},{"line_number":60,"context_line":"            resp, body \u003d cls.account_client.list_extensions()"},{"line_number":61,"context_line":"            cls.policies \u003d body[\u0027swift\u0027][\u0027policies\u0027]"},{"line_number":62,"context_line":"        else:"},{"line_number":63,"context_line":"            cls.policies \u003d None"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_977156ab","line":61,"updated":"2016-04-25 12:06:16.000000000","message":"Is it possible that the \"policies\" extension will not be enabled in some environments and in this case we will get the KeyError exception here?","commit_id":"88983e3b12740cb9a7bd9334d679046490947f44"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"2f200f57a243a59047026fe0511aa152af3d6833","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        if CONF.object_storage_feature_enabled.discoverability:"},{"line_number":60,"context_line":"            resp, body \u003d cls.account_client.list_extensions()"},{"line_number":61,"context_line":"            cls.policies \u003d body[\u0027swift\u0027][\u0027policies\u0027]"},{"line_number":62,"context_line":"        else:"},{"line_number":63,"context_line":"            cls.policies \u003d None"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_57921e4c","line":61,"in_reply_to":"1a122d0e_977156ab","updated":"2016-04-25 12:21:51.000000000","message":"That\u0027s a good question.   My initial understanding is that if the discoverability feature is enabled, then this will always be present.   Which is true.   However, there is a \"disallowed_sections\" configuration parameter in the Swift proxy server where an operator can specifically call out this section to withhold from returning in /info.   \n\nSo, excellent comment, it is better for me to explicitly check for both [\u0027swift\u0027] and [\u0027policies\u0027].\n\nI\u0027ll upload new patch set.","commit_id":"88983e3b12740cb9a7bd9334d679046490947f44"}],"tempest/common/custom_matchers.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"8585c665f3c5bf33d38d12d0c2439cde8e2c6669","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"                # Checking for the per policy usage values in the"},{"line_number":73,"context_line":"                # newer versions of Swift."},{"line_number":74,"context_line":"                if (self.version is not None) and (self.version \u003e \u00272.6\u0027):"},{"line_number":75,"context_line":"                    usage_list \u003d \\"},{"line_number":76,"context_line":"                        [\u0027-bytes-used\u0027, \u0027-object-count\u0027, \u0027-container-count\u0027]"},{"line_number":77,"context_line":"                    acct_header \u003d \"x-account-storage-policy-\""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a122d0e_8d28e7e3","line":74,"updated":"2016-04-20 08:35:14.000000000","message":"You don\"t need those extra parenthesis.","commit_id":"be0357121702f1ee68965ab80c9be2daee6031b2"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"8585c665f3c5bf33d38d12d0c2439cde8e2c6669","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                # Checking for the per policy usage values in the"},{"line_number":73,"context_line":"                # newer versions of Swift."},{"line_number":74,"context_line":"                if (self.version is not None) and (self.version \u003e \u00272.6\u0027):"},{"line_number":75,"context_line":"                    usage_list \u003d \\"},{"line_number":76,"context_line":"                        [\u0027-bytes-used\u0027, \u0027-object-count\u0027, \u0027-container-count\u0027]"},{"line_number":77,"context_line":"                    acct_header \u003d \"x-account-storage-policy-\""},{"line_number":78,"context_line":"                    for policy in self.policies:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a122d0e_adede3b8","line":75,"updated":"2016-04-20 08:35:14.000000000","message":"You can do without this \u0027\\\u0027 that doesn\"t look nice:\n\n  usage_list \u003d [\n    \u0027-bytes-used\u0027, \u0027-object-count\u0027, \u0027-container-count\u0027\n  ]","commit_id":"be0357121702f1ee68965ab80c9be2daee6031b2"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"1471f0fd388564cb31f49fc166af31f788dae0bd","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self.target \u003d target"},{"line_number":38,"context_line":"        self.method \u003d method"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        self.version \u003d version"},{"line_number":41,"context_line":"        self.policies \u003d policies"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def match(self, actual):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_3df9814e","line":40,"updated":"2016-04-22 11:39:49.000000000","message":"For what purpose do you add self.version here? I have not found any place with the use of it.","commit_id":"b7d31f6b8b95121aa282c6d5e9a05bdca33bcec4"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"1471f0fd388564cb31f49fc166af31f788dae0bd","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.method \u003d method"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        self.version \u003d version"},{"line_number":41,"context_line":"        self.policies \u003d policies"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def match(self, actual):"},{"line_number":44,"context_line":"        \"\"\"Check headers"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_9d037576","line":41,"updated":"2016-04-22 11:39:49.000000000","message":"It looks like it should be something like this:\n\n    self.policies \u003d policies or []","commit_id":"b7d31f6b8b95121aa282c6d5e9a05bdca33bcec4"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"1471f0fd388564cb31f49fc166af31f788dae0bd","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                    \u0027-bytes-used\u0027, \u0027-object-count\u0027, \u0027-container-count\u0027"},{"line_number":75,"context_line":"                ]"},{"line_number":76,"context_line":"                acct_header \u003d \"x-account-storage-policy-\""},{"line_number":77,"context_line":"                for policy in self.policies:"},{"line_number":78,"context_line":"                    front_header \u003d acct_header + policy[\u0027name\u0027].lower()"},{"line_number":79,"context_line":"                    for used in usage_list:"},{"line_number":80,"context_line":"                        header \u003d front_header + used"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_bd10f1a9","line":77,"range":{"start_line":77,"start_character":30,"end_line":77,"end_character":43},"updated":"2016-04-22 11:39:49.000000000","message":"If self.policies \u003d\u003d None, it will not work.","commit_id":"b7d31f6b8b95121aa282c6d5e9a05bdca33bcec4"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"1471f0fd388564cb31f49fc166af31f788dae0bd","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                    # loop through the policies and ensure that"},{"line_number":96,"context_line":"                    # the value in the container header matches"},{"line_number":97,"context_line":"                    # one of the storage policies"},{"line_number":98,"context_line":"                    for policy in self.policies:"},{"line_number":99,"context_line":"                        if (policy[\u0027name\u0027] \u003d\u003d policy_name):"},{"line_number":100,"context_line":"                            policy_found \u003d True"},{"line_number":101,"context_line":"                            break"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_fd50a960","line":98,"range":{"start_line":98,"start_character":34,"end_line":98,"end_character":47},"updated":"2016-04-22 11:39:49.000000000","message":"ditto","commit_id":"b7d31f6b8b95121aa282c6d5e9a05bdca33bcec4"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"a574b43300e8f99d94922f781ac9c0ec2924ebb5","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    checked in each test code."},{"line_number":29,"context_line":"    \"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, target, method, version\u003dNone, policies\u003dNone):"},{"line_number":32,"context_line":"        \"\"\"Initialization of ExistsAllResponseHeaders"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        param: target Account/Container/Object"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_0f955de3","line":31,"range":{"start_line":31,"start_character":39,"end_line":31,"end_character":51},"updated":"2016-04-22 16:24:04.000000000","message":"ditto.","commit_id":"fd3e2d2f2f71f3ee3d2a57ec8e3bdf2c4d7f13d0"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"b5c2affeaee30007349d19cce22f83698e235515","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                    # loop through the policies and ensure that"},{"line_number":94,"context_line":"                    # the value in the container header matches"},{"line_number":95,"context_line":"                    # one of the storage policies"},{"line_number":96,"context_line":"                    for policy in self.policies:"},{"line_number":97,"context_line":"                        if (policy[\u0027name\u0027] \u003d\u003d policy_name):"},{"line_number":98,"context_line":"                            policy_found \u003d True"},{"line_number":99,"context_line":"                            break"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a122d0e_ea8ef825","line":96,"updated":"2016-04-23 17:00:32.000000000","message":"Use a for/else construct. More elegant, you don\"t need this \"policy_found\" flag.","commit_id":"876f58443d7017c40e3a03c0c797ff145e72f426"},{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"b5c2affeaee30007349d19cce22f83698e235515","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                    # the value in the container header matches"},{"line_number":95,"context_line":"                    # one of the storage policies"},{"line_number":96,"context_line":"                    for policy in self.policies:"},{"line_number":97,"context_line":"                        if (policy[\u0027name\u0027] \u003d\u003d policy_name):"},{"line_number":98,"context_line":"                            policy_found \u003d True"},{"line_number":99,"context_line":"                            break"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a122d0e_ca917c48","line":97,"updated":"2016-04-23 17:00:32.000000000","message":"No need for the parenthesis","commit_id":"876f58443d7017c40e3a03c0c797ff145e72f426"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"44edd5b4441037b64d1f3c7a65530a64caf42e85","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                usage_list \u003d ["},{"line_number":72,"context_line":"                    \u0027-bytes-used\u0027, \u0027-object-count\u0027, \u0027-container-count\u0027"},{"line_number":73,"context_line":"                ]"},{"line_number":74,"context_line":"                acct_header \u003d \"x-account-storage-policy-\""},{"line_number":75,"context_line":"                for policy in self.policies:"},{"line_number":76,"context_line":"                    front_header \u003d acct_header + policy[\u0027name\u0027].lower()"},{"line_number":77,"context_line":"                    for used in usage_list:"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a122d0e_d223b356","line":74,"range":{"start_line":74,"start_character":16,"end_line":74,"end_character":27},"updated":"2016-04-26 21:06:52.000000000","message":"I need to redo this.   It works for a standard Swift cluster.   But if someone has deployed multiple storage policies and this test is run against a storage account for which not all stories policies are represented the test will fail.\n\nThere is no really clean way to do this at scale, since you would have to look at all of the containers under this account and examine their storage policies in order to build the policies that should be represented here.\n\nSo, I think what I\u0027ll do is loop through the headers and make sure that the policies stories map to proper storage policies presented in /info","commit_id":"899dd1f9a3f951aed18072ee23734bd940381d88"},{"author":{"_account_id":20553,"name":"Brian Ober","email":"bober@us.ibm.com","username":"ober37"},"change_message_id":"47fce74a43146613a964fbc9022b945256aa49a3","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                                    if use_hdr not in actual:"},{"line_number":98,"context_line":"                                        return NonExistentHeader(use_hdr)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"                    if matched_policy_count \u003d\u003d 0:"},{"line_number":101,"context_line":"                        return GenericError(\"No storage policy usage headers\")"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"            elif self.target \u003d\u003d \u0027Container\u0027:"}],"source_content_type":"text/x-python","patch_set":10,"id":"dab17558_452793c9","line":100,"updated":"2016-05-17 22:44:18.000000000","message":"This does not work right when discoverability is disabled, since policies will be None, it will flag a bogus error.   I\u0027ll fix this.","commit_id":"8a4a91cdb3061678dadd990e4ea747cbfd4597ff"}]}
