)]}'
{"nova/network/floating_ips.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"3f7ddee18e31df1022d56399171ede1bcc4745c6","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        # handle auto_assigned"},{"line_number":241,"context_line":"        if not affect_auto_assigned and floating_ip.auto_assigned:"},{"line_number":242,"context_line":"            return"},{"line_number":243,"context_line":"        use_quota \u003d not floating_ip.auto_assigned"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        # make sure project owns this floating ip (allocated)"},{"line_number":246,"context_line":"        self._floating_ip_owned_by_project(context, floating_ip)"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_be629dd7","side":"PARENT","line":243,"updated":"2017-06-20 14:26:39.000000000","message":"Had a question on the last patch on auto_assigned not impacting quota, but I guess the answer is here.","commit_id":"10cdcad85aa2f97d5af539a1c559f69022a65942"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d2be03c2990b5bed394aab6144e8971bca3da841","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                objects.Quotas.check_deltas(context, {\u0027floating_ips\u0027: 0},"},{"line_number":223,"context_line":"                                            project_id)"},{"line_number":224,"context_line":"            except exception.OverQuota:"},{"line_number":225,"context_line":"                objects.FloatingIP.deallocate(context, floating_ip.address)"},{"line_number":226,"context_line":"                LOG.warning(_LW(\"Quota exceeded for %s, tried to allocate \""},{"line_number":227,"context_line":"                                \"floating IP\"), context.project_id)"},{"line_number":228,"context_line":"                raise exception.FloatingIpLimitExceeded()"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_6f51ed0e","line":225,"range":{"start_line":225,"start_character":16,"end_line":225,"end_character":75},"updated":"2017-06-20 15:40:53.000000000","message":"Why not call self.deallocate_floating_ip here? That\u0027s checking for things like auto-assigned. There is a unique constraint on the address in the floating_ips table so I\u0027d think if we were racing we\u0027d hit a constraint error trying to create a floating IP for the same address.\n\nBut then again, in thinking about this, we only get here if use_quota is True and that\u0027s only True if auto_assigned is False, which means \"if not affect_auto_assigned and floating_ip.auto_assigned\" in deallocate_floating_ip would always be False so it shouldn\u0027t make a difference.\n\ndeallocate_floating_ip also calls _delete_all_entries_for_ip but we shouldn\u0027t have dns domains for something we just created either.","commit_id":"23e5036fbaf4ae9622027b129a6cd209029e52e5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8808bd2c2cf148eb68f42bafbc5e3acd861c452b","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                objects.Quotas.check_deltas(context, {\u0027floating_ips\u0027: 0},"},{"line_number":223,"context_line":"                                            project_id)"},{"line_number":224,"context_line":"            except exception.OverQuota:"},{"line_number":225,"context_line":"                objects.FloatingIP.deallocate(context, floating_ip.address)"},{"line_number":226,"context_line":"                LOG.warning(_LW(\"Quota exceeded for %s, tried to allocate \""},{"line_number":227,"context_line":"                                \"floating IP\"), context.project_id)"},{"line_number":228,"context_line":"                raise exception.FloatingIpLimitExceeded()"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_adfee802","line":225,"range":{"start_line":225,"start_character":16,"end_line":225,"end_character":75},"in_reply_to":"5f201791_6f51ed0e","updated":"2017-06-20 19:14:15.000000000","message":"Creating a dns entry for a floating ip requires the floating ip, which we\u0027re creating, so we don\u0027t need to worry about deallocating the floating ip and it being associated with a dns domain here since the user needs to get the ip before they can associate it. So we\u0027re good.","commit_id":"23e5036fbaf4ae9622027b129a6cd209029e52e5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d2be03c2990b5bed394aab6144e8971bca3da841","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                                            project_id)"},{"line_number":224,"context_line":"            except exception.OverQuota:"},{"line_number":225,"context_line":"                objects.FloatingIP.deallocate(context, floating_ip.address)"},{"line_number":226,"context_line":"                LOG.warning(_LW(\"Quota exceeded for %s, tried to allocate \""},{"line_number":227,"context_line":"                                \"floating IP\"), context.project_id)"},{"line_number":228,"context_line":"                raise exception.FloatingIpLimitExceeded()"},{"line_number":229,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_a455ec1f","line":226,"range":{"start_line":226,"start_character":28,"end_line":226,"end_character":31},"updated":"2017-06-20 15:40:53.000000000","message":"no longer need this","commit_id":"23e5036fbaf4ae9622027b129a6cd209029e52e5"}],"nova/quota.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ba2cf8124be3bb51e88a9a515b83285f00e1e49f","unresolved":false,"context_lines":[{"line_number":1939,"context_line":"    ReservableResource(\u0027ram\u0027, \u0027_sync_instances\u0027, \u0027ram\u0027),"},{"line_number":1940,"context_line":"    CountableResource(\u0027security_groups\u0027, _security_group_count,"},{"line_number":1941,"context_line":"                      \u0027security_groups\u0027),"},{"line_number":1942,"context_line":"    CountableResource(\u0027security_groups\u0027, _security_group_count,"},{"line_number":1943,"context_line":"                      \u0027security_groups\u0027),"},{"line_number":1944,"context_line":"    CountableResource(\u0027fixed_ips\u0027, _fixed_ip_count, \u0027fixed_ips\u0027),"},{"line_number":1945,"context_line":"    CountableResource(\u0027floating_ips\u0027, _floating_ip_count,"},{"line_number":1946,"context_line":"                      \u0027floating_ips\u0027),"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_f22048b3","line":1943,"range":{"start_line":1942,"start_character":2,"end_line":1943,"end_character":41},"updated":"2017-06-07 22:45:26.000000000","message":"Rebase error","commit_id":"05f1402c16708a017246036e4e0a8e310daddee1"},{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"eb12241baa83a2435aff2238b0a2b833dc81d042","unresolved":false,"context_lines":[{"line_number":1941,"context_line":"    CountableResource(\u0027security_groups\u0027, _security_group_count,"},{"line_number":1942,"context_line":"                      \u0027security_groups\u0027),"},{"line_number":1943,"context_line":"    CountableResource(\u0027fixed_ips\u0027, _fixed_ip_count, \u0027fixed_ips\u0027),"},{"line_number":1944,"context_line":"    CountableResource(\u0027floating_ips\u0027, _floating_ip_count,"},{"line_number":1945,"context_line":"                      \u0027floating_ips\u0027),"},{"line_number":1946,"context_line":"    AbsoluteResource(\u0027metadata_items\u0027, \u0027metadata_items\u0027),"},{"line_number":1947,"context_line":"    AbsoluteResource(\u0027injected_files\u0027, \u0027injected_files\u0027),"},{"line_number":1948,"context_line":"    AbsoluteResource(\u0027injected_file_content_bytes\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f231b9d_1123bb07","line":1945,"range":{"start_line":1944,"start_character":0,"end_line":1945,"end_character":38},"updated":"2017-06-20 02:47:20.000000000","message":"this could be in the same line","commit_id":"23e5036fbaf4ae9622027b129a6cd209029e52e5"}],"nova/tests/unit/network/test_manager.py":[{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"eb12241baa83a2435aff2238b0a2b833dc81d042","unresolved":false,"context_lines":[{"line_number":1363,"context_line":"        mock_owned.side_effect \u003d fake1"},{"line_number":1364,"context_line":"        mock_get.side_effect \u003d fake2"},{"line_number":1365,"context_line":""},{"line_number":1366,"context_line":"        # this time should raise because floating ip is associated to"},{"line_number":1367,"context_line":"        # fixed_ip"},{"line_number":1368,"context_line":"        self.assertRaises(exception.FloatingIpAssociated,"},{"line_number":1369,"context_line":"                          self.network.deallocate_floating_ip,"},{"line_number":1370,"context_line":"                          ctxt,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f231b9d_f1e27fa0","line":1367,"range":{"start_line":1366,"start_character":0,"end_line":1367,"end_character":18},"updated":"2017-06-20 02:47:20.000000000","message":"this can be in the same line too :D","commit_id":"23e5036fbaf4ae9622027b129a6cd209029e52e5"}],"nova/tests/unit/test_quota.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ba2cf8124be3bb51e88a9a515b83285f00e1e49f","unresolved":false,"context_lines":[{"line_number":3243,"context_line":"        # fixed_ips is a valid syncable project key,"},{"line_number":3244,"context_line":"        # but not a valid user key"},{"line_number":3245,"context_line":"        self._test_exception(context, \u0027test_project\u0027, \u0027fake_user\u0027,"},{"line_number":3246,"context_line":"                             [\u0027fixed_ips\u0027])"},{"line_number":3247,"context_line":""},{"line_number":3248,"context_line":"    def test_usage_refresh_non_syncable_user_key(self):"},{"line_number":3249,"context_line":"        # security_group_rules is a valid user key, but not syncable"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf091321_6d51fd0e","side":"PARENT","line":3246,"updated":"2017-06-07 22:45:26.000000000","message":"This should have been removed in the fixed_ips patch, I think.","commit_id":"a639c157a269b038de842b4c6c3735300cb22699"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d2be03c2990b5bed394aab6144e8971bca3da841","unresolved":false,"context_lines":[{"line_number":3207,"context_line":""},{"line_number":3208,"context_line":"        self.assertEqual(self.usages_created, {})"},{"line_number":3209,"context_line":""},{"line_number":3210,"context_line":"    def test_usage_refresh_project_one_key(self):"},{"line_number":3211,"context_line":"        self._init_usages(3, 3, 3, 3, 3, 3, 3, until_refresh \u003d 5)"},{"line_number":3212,"context_line":"        # Let the parameter determine the project_id, not the context."},{"line_number":3213,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":3214,"context_line":"        keys \u003d [\u0027floating_ips\u0027]"},{"line_number":3215,"context_line":"        quota.QUOTAS.usage_refresh(ctxt, \u0027test_project\u0027, resource_names\u003dkeys)"},{"line_number":3216,"context_line":""},{"line_number":3217,"context_line":"        self.assertEqual(self.sync_called, set([\u0027floating_ips\u0027]))"},{"line_number":3218,"context_line":""},{"line_number":3219,"context_line":"        # Compare the expected usages with the actual usages."},{"line_number":3220,"context_line":"        # Expect instances not to change since it is user scoped."},{"line_number":3221,"context_line":"        self.usages_list[0][\u0027in_use\u0027] \u003d 3"},{"line_number":3222,"context_line":"        self.usages_list[0][\u0027until_refresh\u0027] \u003d 5"},{"line_number":3223,"context_line":"        # Expect cores not to change since it is user scoped."},{"line_number":3224,"context_line":"        self.usages_list[1][\u0027in_use\u0027] \u003d 3"},{"line_number":3225,"context_line":"        self.usages_list[1][\u0027until_refresh\u0027] \u003d 5"},{"line_number":3226,"context_line":"        # Expect ram not to change since it is user scoped."},{"line_number":3227,"context_line":"        self.usages_list[2][\u0027in_use\u0027] \u003d 3"},{"line_number":3228,"context_line":"        self.usages_list[2][\u0027until_refresh\u0027] \u003d 5"},{"line_number":3229,"context_line":"        self.compare_usage(self.usages, self.usages_list)"},{"line_number":3230,"context_line":""},{"line_number":3231,"context_line":"        self.assertEqual(self.usages_created, {})"},{"line_number":3232,"context_line":""},{"line_number":3233,"context_line":"    def test_usage_refresh_create_project_usage(self):"},{"line_number":3234,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":3235,"context_line":""},{"line_number":3236,"context_line":"        # Create per-project floating_ips usage"},{"line_number":3237,"context_line":"        keys \u003d [\u0027floating_ips\u0027]"},{"line_number":3238,"context_line":"        quota.QUOTAS.usage_refresh(ctxt, \u0027test_project\u0027, resource_names\u003dkeys)"},{"line_number":3239,"context_line":""},{"line_number":3240,"context_line":"        self.assertEqual(self.sync_called, set([\u0027floating_ips\u0027]))"},{"line_number":3241,"context_line":""},{"line_number":3242,"context_line":"        # Compare the expected usages with the created usages."},{"line_number":3243,"context_line":"        # Expect floating_ips to be created and initialized to 0"},{"line_number":3244,"context_line":"        self.usages_list[3][\u0027in_use\u0027] \u003d 0"},{"line_number":3245,"context_line":"        self.compare_usage(self.usages_created, self.usages_list[3:])"},{"line_number":3246,"context_line":""},{"line_number":3247,"context_line":"        self.assertEqual(len(self.usages_created), 1)"},{"line_number":3248,"context_line":""},{"line_number":3249,"context_line":"    def _test_exception(self, context, project_id, user_id, keys):"},{"line_number":3250,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_2fd09550","side":"PARENT","line":3247,"range":{"start_line":3210,"start_character":0,"end_line":3247,"end_character":53},"updated":"2017-06-20 15:40:53.000000000","message":"Does it make sense to remove this yet? You haven\u0027t yet removed the nova-manage quota refresh command or removed the _sync_floating_ips function this uses, right?","commit_id":"10cdcad85aa2f97d5af539a1c559f69022a65942"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"98fed2941ee95775c4f82daca60c25eb30062652","unresolved":false,"context_lines":[{"line_number":3207,"context_line":""},{"line_number":3208,"context_line":"        self.assertEqual(self.usages_created, {})"},{"line_number":3209,"context_line":""},{"line_number":3210,"context_line":"    def test_usage_refresh_project_one_key(self):"},{"line_number":3211,"context_line":"        self._init_usages(3, 3, 3, 3, 3, 3, 3, until_refresh \u003d 5)"},{"line_number":3212,"context_line":"        # Let the parameter determine the project_id, not the context."},{"line_number":3213,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":3214,"context_line":"        keys \u003d [\u0027floating_ips\u0027]"},{"line_number":3215,"context_line":"        quota.QUOTAS.usage_refresh(ctxt, \u0027test_project\u0027, resource_names\u003dkeys)"},{"line_number":3216,"context_line":""},{"line_number":3217,"context_line":"        self.assertEqual(self.sync_called, set([\u0027floating_ips\u0027]))"},{"line_number":3218,"context_line":""},{"line_number":3219,"context_line":"        # Compare the expected usages with the actual usages."},{"line_number":3220,"context_line":"        # Expect instances not to change since it is user scoped."},{"line_number":3221,"context_line":"        self.usages_list[0][\u0027in_use\u0027] \u003d 3"},{"line_number":3222,"context_line":"        self.usages_list[0][\u0027until_refresh\u0027] \u003d 5"},{"line_number":3223,"context_line":"        # Expect cores not to change since it is user scoped."},{"line_number":3224,"context_line":"        self.usages_list[1][\u0027in_use\u0027] \u003d 3"},{"line_number":3225,"context_line":"        self.usages_list[1][\u0027until_refresh\u0027] \u003d 5"},{"line_number":3226,"context_line":"        # Expect ram not to change since it is user scoped."},{"line_number":3227,"context_line":"        self.usages_list[2][\u0027in_use\u0027] \u003d 3"},{"line_number":3228,"context_line":"        self.usages_list[2][\u0027until_refresh\u0027] \u003d 5"},{"line_number":3229,"context_line":"        self.compare_usage(self.usages, self.usages_list)"},{"line_number":3230,"context_line":""},{"line_number":3231,"context_line":"        self.assertEqual(self.usages_created, {})"},{"line_number":3232,"context_line":""},{"line_number":3233,"context_line":"    def test_usage_refresh_create_project_usage(self):"},{"line_number":3234,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":3235,"context_line":""},{"line_number":3236,"context_line":"        # Create per-project floating_ips usage"},{"line_number":3237,"context_line":"        keys \u003d [\u0027floating_ips\u0027]"},{"line_number":3238,"context_line":"        quota.QUOTAS.usage_refresh(ctxt, \u0027test_project\u0027, resource_names\u003dkeys)"},{"line_number":3239,"context_line":""},{"line_number":3240,"context_line":"        self.assertEqual(self.sync_called, set([\u0027floating_ips\u0027]))"},{"line_number":3241,"context_line":""},{"line_number":3242,"context_line":"        # Compare the expected usages with the created usages."},{"line_number":3243,"context_line":"        # Expect floating_ips to be created and initialized to 0"},{"line_number":3244,"context_line":"        self.usages_list[3][\u0027in_use\u0027] \u003d 0"},{"line_number":3245,"context_line":"        self.compare_usage(self.usages_created, self.usages_list[3:])"},{"line_number":3246,"context_line":""},{"line_number":3247,"context_line":"        self.assertEqual(len(self.usages_created), 1)"},{"line_number":3248,"context_line":""},{"line_number":3249,"context_line":"    def _test_exception(self, context, project_id, user_id, keys):"},{"line_number":3250,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_b289a927","side":"PARENT","line":3247,"range":{"start_line":3210,"start_character":0,"end_line":3247,"end_character":53},"in_reply_to":"5f201791_2fd09550","updated":"2017-06-20 18:51:43.000000000","message":"OK as noted below, we no longer have any per-project reservable resources to sync/refresh anymore, which is why this is removed. Could have used a mention about this in the commit message, but oh well.","commit_id":"10cdcad85aa2f97d5af539a1c559f69022a65942"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d2be03c2990b5bed394aab6144e8971bca3da841","unresolved":false,"context_lines":[{"line_number":3254,"context_line":"        else:"},{"line_number":3255,"context_line":"            self.fail(\u0027Expected QuotaUsageRefreshNotAllowed failure\u0027)"},{"line_number":3256,"context_line":""},{"line_number":3257,"context_line":"    def test_usage_refresh_invalid_user_key(self):"},{"line_number":3258,"context_line":"        context \u003d FakeContext(\u0027test_project\u0027, \u0027test_class\u0027)"},{"line_number":3259,"context_line":"        # floating_ips is a valid syncable project key,"},{"line_number":3260,"context_line":"        # but not a valid user key"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_efc17d82","side":"PARENT","line":3257,"range":{"start_line":3257,"start_character":8,"end_line":3257,"end_character":43},"updated":"2017-06-20 15:40:53.000000000","message":"same","commit_id":"10cdcad85aa2f97d5af539a1c559f69022a65942"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"98fed2941ee95775c4f82daca60c25eb30062652","unresolved":false,"context_lines":[{"line_number":3254,"context_line":"        else:"},{"line_number":3255,"context_line":"            self.fail(\u0027Expected QuotaUsageRefreshNotAllowed failure\u0027)"},{"line_number":3256,"context_line":""},{"line_number":3257,"context_line":"    def test_usage_refresh_invalid_user_key(self):"},{"line_number":3258,"context_line":"        context \u003d FakeContext(\u0027test_project\u0027, \u0027test_class\u0027)"},{"line_number":3259,"context_line":"        # floating_ips is a valid syncable project key,"},{"line_number":3260,"context_line":"        # but not a valid user key"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_72aaf185","side":"PARENT","line":3257,"range":{"start_line":3257,"start_character":8,"end_line":3257,"end_character":43},"in_reply_to":"5f201791_efc17d82","updated":"2017-06-20 18:51:43.000000000","message":"OK this test is removed because the only per-project syncable resources are fixed ips, floating ips, and networks, and as of this change those are all countable resources, so this would be false:\n\nhttps://github.com/openstack/nova/blob/master/nova/quota.py#L416\n\nSo this test is no longer valid. We basically no longer have per-project syncable / refreshable resources now.","commit_id":"10cdcad85aa2f97d5af539a1c559f69022a65942"}]}
