)]}'
{"openstack_dashboard/api/neutron.py":[{"author":{"_account_id":11885,"name":"Ying Zuo","email":"yingzuo4@gmail.com","username":"yingzuo"},"change_message_id":"b0b0feebc767972636a86395aa229ad7b083dac6","unresolved":false,"context_lines":[{"line_number":869,"context_line":"                                                  **params).get(\u0027network\u0027)"},{"line_number":870,"context_line":"    if expand_subnet:"},{"line_number":871,"context_line":"        # NOTE(amotoki): There are some cases where a user has no permission"},{"line_number":872,"context_line":"        # get subnet details, but the condition is complicated. We first try"},{"line_number":873,"context_line":"        # to fetch subnet details. If succeed, Subnet objects are set to"},{"line_number":874,"context_line":"        # network[\u0027subnets\u0027]. If NotFound exception is returned by neutron,"},{"line_number":875,"context_line":"        # network[\u0027subnets\u0027] is left untouched and a list of subnet IDs are"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f436f4f_aac68715","line":872,"updated":"2017-08-20 21:01:04.000000000","message":"to get","commit_id":"0b99a32c23f74d43ceeb90be584a4069dccbb067"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"17d51f99727216e7f552cb3eb26d84b8bea31ab7","unresolved":false,"context_lines":[{"line_number":869,"context_line":"                                                  **params).get(\u0027network\u0027)"},{"line_number":870,"context_line":"    if expand_subnet:"},{"line_number":871,"context_line":"        # NOTE(amotoki): There are some cases where a user has no permission"},{"line_number":872,"context_line":"        # get subnet details, but the condition is complicated. We first try"},{"line_number":873,"context_line":"        # to fetch subnet details. If succeed, Subnet objects are set to"},{"line_number":874,"context_line":"        # network[\u0027subnets\u0027]. If NotFound exception is returned by neutron,"},{"line_number":875,"context_line":"        # network[\u0027subnets\u0027] is left untouched and a list of subnet IDs are"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f436f4f_84372f4e","line":872,"in_reply_to":"9f436f4f_aac68715","updated":"2017-08-21 10:29:30.000000000","message":"Done","commit_id":"0b99a32c23f74d43ceeb90be584a4069dccbb067"},{"author":{"_account_id":11885,"name":"Ying Zuo","email":"yingzuo4@gmail.com","username":"yingzuo"},"change_message_id":"b0b0feebc767972636a86395aa229ad7b083dac6","unresolved":false,"context_lines":[{"line_number":870,"context_line":"    if expand_subnet:"},{"line_number":871,"context_line":"        # NOTE(amotoki): There are some cases where a user has no permission"},{"line_number":872,"context_line":"        # get subnet details, but the condition is complicated. We first try"},{"line_number":873,"context_line":"        # to fetch subnet details. If succeed, Subnet objects are set to"},{"line_number":874,"context_line":"        # network[\u0027subnets\u0027]. If NotFound exception is returned by neutron,"},{"line_number":875,"context_line":"        # network[\u0027subnets\u0027] is left untouched and a list of subnet IDs are"},{"line_number":876,"context_line":"        # stored."}],"source_content_type":"text/x-python","patch_set":3,"id":"9f436f4f_8ac98326","line":873,"updated":"2017-08-20 21:01:04.000000000","message":"If successful, the subnet details ...","commit_id":"0b99a32c23f74d43ceeb90be584a4069dccbb067"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"17d51f99727216e7f552cb3eb26d84b8bea31ab7","unresolved":false,"context_lines":[{"line_number":870,"context_line":"    if expand_subnet:"},{"line_number":871,"context_line":"        # NOTE(amotoki): There are some cases where a user has no permission"},{"line_number":872,"context_line":"        # get subnet details, but the condition is complicated. We first try"},{"line_number":873,"context_line":"        # to fetch subnet details. If succeed, Subnet objects are set to"},{"line_number":874,"context_line":"        # network[\u0027subnets\u0027]. If NotFound exception is returned by neutron,"},{"line_number":875,"context_line":"        # network[\u0027subnets\u0027] is left untouched and a list of subnet IDs are"},{"line_number":876,"context_line":"        # stored."}],"source_content_type":"text/x-python","patch_set":3,"id":"9f436f4f_2421a3fc","line":873,"in_reply_to":"9f436f4f_8ac98326","updated":"2017-08-21 10:29:30.000000000","message":"Done","commit_id":"0b99a32c23f74d43ceeb90be584a4069dccbb067"}],"openstack_dashboard/dashboards/project/networks/ports/forms.py":[{"author":{"_account_id":11885,"name":"Ying Zuo","email":"yingzuo4@gmail.com","username":"yingzuo"},"change_message_id":"b0b0feebc767972636a86395aa229ad7b083dac6","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        # If so, we skip such subnet as subnet choices."},{"line_number":119,"context_line":"        # This happens usually for external networks."},{"line_number":120,"context_line":"        # TODO(amotoki): Ideally it is better to disable/hide"},{"line_number":121,"context_line":"        # Create Port button in the port table, but at now"},{"line_number":122,"context_line":"        # the default neutron policy.json for \"create_port\" is empty"},{"line_number":123,"context_line":"        # and there seems no appropriate policy. This is a dirty hack."},{"line_number":124,"context_line":"        return [(subnet.id, \u0027%s %s\u0027 % (subnet.name_or_id, subnet.cidr))"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f436f4f_4ad39bd6","line":121,"updated":"2017-08-20 21:01:04.000000000","message":"Do you mean \"right now\"?","commit_id":"0b99a32c23f74d43ceeb90be584a4069dccbb067"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"17d51f99727216e7f552cb3eb26d84b8bea31ab7","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        # If so, we skip such subnet as subnet choices."},{"line_number":119,"context_line":"        # This happens usually for external networks."},{"line_number":120,"context_line":"        # TODO(amotoki): Ideally it is better to disable/hide"},{"line_number":121,"context_line":"        # Create Port button in the port table, but at now"},{"line_number":122,"context_line":"        # the default neutron policy.json for \"create_port\" is empty"},{"line_number":123,"context_line":"        # and there seems no appropriate policy. This is a dirty hack."},{"line_number":124,"context_line":"        return [(subnet.id, \u0027%s %s\u0027 % (subnet.name_or_id, subnet.cidr))"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f436f4f_64da0bea","line":121,"in_reply_to":"9f436f4f_4ad39bd6","updated":"2017-08-21 10:29:30.000000000","message":"Yes, it is what we have right now. neutron determines if a user can create a port on a network based on an ownership of the network and RBAC definitions (neutron-rbac), so it is not easy to support it with a simple logic.\n\nI rephrased \"at now\" to \"as of Pike\".","commit_id":"0b99a32c23f74d43ceeb90be584a4069dccbb067"},{"author":{"_account_id":11885,"name":"Ying Zuo","email":"yingzuo4@gmail.com","username":"yingzuo"},"change_message_id":"b0b0feebc767972636a86395aa229ad7b083dac6","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            if isinstance(e, neutron_exc.Forbidden):"},{"line_number":165,"context_line":"                msg \u003d (_(\u0027Failed to create a port for network %s \u0027"},{"line_number":166,"context_line":"                         \u0027as you do not have enough permission.\u0027)"},{"line_number":167,"context_line":"                       % self.initial[\u0027network_id\u0027])"},{"line_number":168,"context_line":"            else:"},{"line_number":169,"context_line":"                msg \u003d (_(\u0027Failed to create a port for network %s\u0027)"},{"line_number":170,"context_line":"                       % self.initial[\u0027network_id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f436f4f_aaefa785","line":167,"updated":"2017-08-20 21:01:04.000000000","message":"I think this would be a better message: \"You are not allowed to create a port for network %s.\"","commit_id":"0b99a32c23f74d43ceeb90be584a4069dccbb067"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"17d51f99727216e7f552cb3eb26d84b8bea31ab7","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            if isinstance(e, neutron_exc.Forbidden):"},{"line_number":165,"context_line":"                msg \u003d (_(\u0027Failed to create a port for network %s \u0027"},{"line_number":166,"context_line":"                         \u0027as you do not have enough permission.\u0027)"},{"line_number":167,"context_line":"                       % self.initial[\u0027network_id\u0027])"},{"line_number":168,"context_line":"            else:"},{"line_number":169,"context_line":"                msg \u003d (_(\u0027Failed to create a port for network %s\u0027)"},{"line_number":170,"context_line":"                       % self.initial[\u0027network_id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f436f4f_0471ff0c","line":167,"in_reply_to":"9f436f4f_aaefa785","updated":"2017-08-21 10:29:30.000000000","message":"Done","commit_id":"0b99a32c23f74d43ceeb90be584a4069dccbb067"}]}
