New projects get empty Cleanup policy for tags
Summary
When a new project is created, a Cleanup policy is created and associated to it. We recently changed the policy from being disabled by default to being enabled by default. The problem is, the record is created using the database defaults (there is nothing creating defaults on the model), and the only default value within the database is cadence: 7d
, which is also not the desired default.
What happened was when it was disabled by default, a user would go to the expiration policy settings, and the form would auto-populate with the default values:
cadence: '1d'
keep_n: 10
older_than: '90d'
The user would enable the policy, and when saved/updated, the policy would now have the correct default values. So right now, all new projects are being created with an enabled
container expiration policy that does not do anything when run because all of the settings are NULL
.
The current bug means that many users may create projects, believe they have an expiration policy running with the defaults listed above and shown in their form, but it is actually empty and will never remove any tags.
Steps to reproduce
Create a new project. Check the container expiration policy form, it is filled out, but the values are not actually correct until you hit save.
Example Project
I created https://gitlab.com/sabrams/test123proj
If I check the expiration policy, it looks like it is enabled with the defaults:
If I check the database, the policy is empty and has a cadence of '7d'
=> select * from container_expiration_policies where project_id = 18875898;
created_at | updated_at | next_run_at | project_id | name_regex | cadence | older_than | keep_n | enabled | name_regex_keep
-------------------------------+-------------------------------+-------------------------------+------------+------------+---------+------------+--------+---------+-----------------
2020-05-19 15:07:34.156836+00 | 2020-05-19 15:07:34.156836+00 | 2020-05-26 15:07:34.149649+00 | 18875898 | | 7d | | | t |
(1 row)
Proposed fix
-
Update the database to have the correct defaults: cadence: '1d' keep_n: 10 older_than: '90d'
-
Remove the "default" values from https://gitlab.com/gitlab-org/gitlab/blob/master/app/helpers/container_expiration_policies_helper.rb so they do not appear when there is a NULL
value. -
Create a background migration to disable all of the empty container expiration policies.