)]}'
{"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fd2e66abfef167f708f3c8a3949ee9084c67fb12","unresolved":false,"context_lines":[{"line_number":5140,"context_line":"            self.raise_invalid_group(msg)"},{"line_number":5141,"context_line":""},{"line_number":5142,"context_line":"        quotas \u003d objects.Quotas(context\u003dcontext)"},{"line_number":5143,"context_line":"        quota_project, quota_user \u003d quotas_obj.ids_from_security_group("},{"line_number":5144,"context_line":"                                context, security_group)"},{"line_number":5145,"context_line":"        try:"},{"line_number":5146,"context_line":"            quotas.reserve(project_id\u003dquota_project,"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_6eedacb5","side":"PARENT","line":5143,"range":{"start_line":5143,"start_character":47,"end_line":5143,"end_character":70},"updated":"2017-06-16 14:37:36.000000000","message":"This can be removed now as well, but that could be a follow up cleanup.","commit_id":"8fdb5278b5c6db857bcfac0b43b30524a57601bc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3e60f2148bb080a586cbb24aecb58f53e9f18351","unresolved":false,"context_lines":[{"line_number":5044,"context_line":""},{"line_number":5045,"context_line":"        LOG.info(\"Create Security Group %s\", name)"},{"line_number":5046,"context_line":""},{"line_number":5047,"context_line":"        self.ensure_default(context)"},{"line_number":5048,"context_line":""},{"line_number":5049,"context_line":"        group \u003d {\u0027user_id\u0027: context.user_id,"},{"line_number":5050,"context_line":"                 \u0027project_id\u0027: context.project_id,"},{"line_number":5051,"context_line":"                 \u0027name\u0027: name,"},{"line_number":5052,"context_line":"                 \u0027description\u0027: description}"},{"line_number":5053,"context_line":"        try:"},{"line_number":5054,"context_line":"            group_ref \u003d self.db.security_group_create(context, group)"},{"line_number":5055,"context_line":"        except exception.SecurityGroupExists:"},{"line_number":5056,"context_line":"            msg \u003d _(\u0027Security group %s already exists\u0027) % name"},{"line_number":5057,"context_line":"            self.raise_group_already_exists(msg)"},{"line_number":5058,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_4e66702c","line":5055,"range":{"start_line":5047,"start_character":0,"end_line":5055,"end_character":45},"updated":"2017-06-16 14:42:13.000000000","message":"Thinking about the case that a user requests to create the \u0027default\u0027 group, they\u0027d actually fail with a 400. If it didn\u0027t exist, ensure_default would create it, and then when security_group_create tries to create it again, it would fail with SecurityGroupExists which would result in a 400 error to the user.","commit_id":"977dd8bca2bbd48d11106043149e02cf332c8535"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fd2e66abfef167f708f3c8a3949ee9084c67fb12","unresolved":false,"context_lines":[{"line_number":5066,"context_line":"                                            context.project_id,"},{"line_number":5067,"context_line":"                                            user_id\u003dcontext.user_id)"},{"line_number":5068,"context_line":"            except exception.OverQuota:"},{"line_number":5069,"context_line":"                self.db.security_group_destroy(context, group_ref[\u0027id\u0027])"},{"line_number":5070,"context_line":"                msg \u003d _(\"Quota exceeded, too many security groups.\")"},{"line_number":5071,"context_line":"                self.raise_over_quota(msg)"},{"line_number":5072,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_2e6694c2","line":5069,"range":{"start_line":5069,"start_character":16,"end_line":5069,"end_character":72},"updated":"2017-06-16 14:37:36.000000000","message":"nit: you could just call self.destroy(context, group_ref) here.\n\nThe destroy method checks some things that are probably invalid here, like it being in use, which it shouldn\u0027t if we just created it and haven\u0027t returned it yet. It also checks for the default group, but I\u0027m not sure that an end user can explicitly create the default group since it\u0027s automatically created.","commit_id":"977dd8bca2bbd48d11106043149e02cf332c8535"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"99c89409e7fd157be1b5333c2688dabb14acacd0","unresolved":false,"context_lines":[{"line_number":5066,"context_line":"                                            context.project_id,"},{"line_number":5067,"context_line":"                                            user_id\u003dcontext.user_id)"},{"line_number":5068,"context_line":"            except exception.OverQuota:"},{"line_number":5069,"context_line":"                self.db.security_group_destroy(context, group_ref[\u0027id\u0027])"},{"line_number":5070,"context_line":"                msg \u003d _(\"Quota exceeded, too many security groups.\")"},{"line_number":5071,"context_line":"                self.raise_over_quota(msg)"},{"line_number":5072,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_366ca29a","line":5069,"range":{"start_line":5069,"start_character":16,"end_line":5069,"end_character":72},"in_reply_to":"7f231b9d_2e6694c2","updated":"2017-06-16 21:18:37.000000000","message":"Ah, I didn\u0027t see the self.destroy() function. It looks like it isn\u0027t used anywhere either. :\\","commit_id":"977dd8bca2bbd48d11106043149e02cf332c8535"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aaf06d6810cd2fcb5236bb669f37200a9be59be8","unresolved":false,"context_lines":[{"line_number":5066,"context_line":"                                            context.project_id,"},{"line_number":5067,"context_line":"                                            user_id\u003dcontext.user_id)"},{"line_number":5068,"context_line":"            except exception.OverQuota:"},{"line_number":5069,"context_line":"                self.db.security_group_destroy(context, group_ref[\u0027id\u0027])"},{"line_number":5070,"context_line":"                msg \u003d _(\"Quota exceeded, too many security groups.\")"},{"line_number":5071,"context_line":"                self.raise_over_quota(msg)"},{"line_number":5072,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7f231b9d_0b53bf3a","line":5069,"range":{"start_line":5069,"start_character":16,"end_line":5069,"end_character":72},"in_reply_to":"7f231b9d_2e6694c2","updated":"2017-06-16 20:59:31.000000000","message":"I\u0027m not really sure why these aren\u0027t using object methods to do all this anyway... I guess maybe because this is all n-net stuff that is mostly neglected.","commit_id":"977dd8bca2bbd48d11106043149e02cf332c8535"}],"nova/quota.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"252f286363f9b939570d1d99a0eb16e1fa95f090","unresolved":false,"context_lines":[{"line_number":1868,"context_line":"    \"\"\""},{"line_number":1869,"context_line":"    # NOTE(melwitt): This assumes a single cell."},{"line_number":1870,"context_line":"    return objects.SecurityGroupList.get_counts(context, project_id,"},{"line_number":1871,"context_line":"                                                user_id\u003duser_id)"},{"line_number":1872,"context_line":""},{"line_number":1873,"context_line":""},{"line_number":1874,"context_line":"def _server_group_count_members_by_user(context, group, user_id):"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_9b8ed3ce","line":1871,"range":{"start_line":1871,"start_character":48,"end_line":1871,"end_character":63},"updated":"2017-06-20 14:20:27.000000000","message":"it makes me sad that security groups have user quota on them :(","commit_id":"b93f6a9349f5ba32bb3ecf9c7e10e86a10b2d9c1"}]}
