From ac9c649ecb6904696699d92e3254c919b25d7738 Mon Sep 17 00:00:00 2001 From: "Ernest W. Durbin III" Date: Thu, 20 Feb 2020 17:20:55 -0500 Subject: [PATCH] CASCADE deletes from Project/Release/File to Verdicts (#7418) --- warehouse/malware/models.py | 9 +- ...e_cascade_deletes_from_project_release_.py | 92 +++++++++++++++++++ 2 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 warehouse/migrations/versions/f47d2f06c13e_cascade_deletes_from_project_release_.py diff --git a/warehouse/malware/models.py b/warehouse/malware/models.py index e4f56fcf851a..45aa63ee17c2 100644 --- a/warehouse/malware/models.py +++ b/warehouse/malware/models.py @@ -147,9 +147,12 @@ class MalwareVerdict(db.Model): nullable=False, index=True, ) - file_id = Column(ForeignKey("release_files.id"), nullable=True) - release_id = Column(ForeignKey("releases.id"), nullable=True) - project_id = Column(ForeignKey("projects.id"), nullable=True) + # TODO: When GH-4440 is resolved, we should remove these CASCADEs to ensure that an + # auditable history of malware check verdicts remain in the event that a + # Project, Release, or File is removed by it's maintainers. + file_id = Column(ForeignKey("release_files.id", ondelete="CASCADE"), nullable=True) + release_id = Column(ForeignKey("releases.id", ondelete="CASCADE",), nullable=True) + project_id = Column(ForeignKey("projects.id", ondelete="CASCADE",), nullable=True) classification = Column( Enum(VerdictClassification, values_callable=lambda x: [e.value for e in x]), nullable=False, diff --git a/warehouse/migrations/versions/f47d2f06c13e_cascade_deletes_from_project_release_.py b/warehouse/migrations/versions/f47d2f06c13e_cascade_deletes_from_project_release_.py new file mode 100644 index 000000000000..7a3cd3ade27f --- /dev/null +++ b/warehouse/migrations/versions/f47d2f06c13e_cascade_deletes_from_project_release_.py @@ -0,0 +1,92 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Cascade deletes from Project/Release/File to Verdicts + +Revision ID: f47d2f06c13e +Revises: 061ff3d24c22 +Create Date: 2020-02-20 17:28:36.194480 +""" + +from alembic import op + +revision = "f47d2f06c13e" +down_revision = "061ff3d24c22" + + +def upgrade(): + op.drop_constraint( + "malware_verdicts_project_id_fkey", "malware_verdicts", type_="foreignkey" + ) + op.drop_constraint( + "malware_verdicts_release_id_fkey", "malware_verdicts", type_="foreignkey" + ) + op.drop_constraint( + "malware_verdicts_file_id_fkey", "malware_verdicts", type_="foreignkey" + ) + op.create_foreign_key( + "malware_verdicts_project_id_fkey", + "malware_verdicts", + "projects", + ["project_id"], + ["id"], + ondelete="CASCADE", + ) + op.create_foreign_key( + "malware_verdicts_release_id_fkey", + "malware_verdicts", + "releases", + ["release_id"], + ["id"], + ondelete="CASCADE", + ) + op.create_foreign_key( + "malware_verdicts_file_id_fkey", + "malware_verdicts", + "release_files", + ["file_id"], + ["id"], + ondelete="CASCADE", + ) + + +def downgrade(): + op.drop_constraint( + "malware_verdicts_file_id_fkey", "malware_verdicts", type_="foreignkey" + ) + op.drop_constraint( + "malware_verdicts_release_id_fkey", "malware_verdicts", type_="foreignkey" + ) + op.drop_constraint( + "malware_verdicts_project_id_fkey", "malware_verdicts", type_="foreignkey" + ) + op.create_foreign_key( + "malware_verdicts_file_id_fkey", + "malware_verdicts", + "release_files", + ["file_id"], + ["id"], + ) + op.create_foreign_key( + "malware_verdicts_release_id_fkey", + "malware_verdicts", + "releases", + ["release_id"], + ["id"], + ) + op.create_foreign_key( + "malware_verdicts_project_id_fkey", + "malware_verdicts", + "projects", + ["project_id"], + ["id"], + )