diff --git a/make/common/db/registry.sql b/make/common/db/registry.sql index 2c4a8ab04..97ad883b2 100644 --- a/make/common/db/registry.sql +++ b/make/common/db/registry.sql @@ -204,4 +204,4 @@ CREATE TABLE IF NOT EXISTS `alembic_version` ( `version_num` varchar(32) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -insert into alembic_version values ('0.4.0'); +insert into alembic_version values ('1.2.0'); diff --git a/tools/migration/db_meta.py b/tools/migration/db_meta.py index c928edc17..c47bf7a50 100644 --- a/tools/migration/db_meta.py +++ b/tools/migration/db_meta.py @@ -139,4 +139,40 @@ class Repository(Base): creation_time = sa.Column(mysql.TIMESTAMP, server_default = sa.text("CURRENT_TIMESTAMP")) update_time = sa.Column(mysql.TIMESTAMP, server_default = sa.text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")) +class AccessLog(Base): + __tablename__ = "access_log" + user_id = sa.Column(sa.Integer, nullable=False) + log_id = sa.Column(sa.Integer, primary_key=True) + username = sa.Column(sa.String(32), nullable=False) + project_id = sa.Column(sa.Integer, nullable=False) + repo_name = sa.Column(sa.String(256)) + repo_tag = sa.Column(sa.String(128)) + GUID = sa.Column(sa.String(64)) + operation = sa.Column(sa.String(20)) + op_time = sa.Column(mysql.TIMESTAMP) + update_time = sa.Column(mysql.TIMESTAMP, server_default = sa.text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")) + + __table_args__ = (sa.Index('project_id', "op_time"),) + +class ImageScanJob(Base): + __tablename__ = "img_scan_job" + + id = sa.Column(sa.Integer, nullable=False, primary_key=True) + status = sa.Column(sa.String(64), nullable=False) + repository = sa.Column(sa.String(256), nullable=False) + tag = sa.Column(sa.String(128), nullable=False) + digest = sa.Column(sa.String(128)) + creation_time = sa.Column(mysql.TIMESTAMP, server_default = sa.text("CURRENT_TIMESTAMP")) + update_time = sa.Column(mysql.TIMESTAMP, server_default = sa.text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")) + +class ImageScanOverview(Base): + __tablename__ = "img_scan_overview" + + scan_job_id = sa.Column(sa.Integer, nullable=False) + image_digest = sa.Column(sa.String(128), nullable=False, primary_key=True) + severity = sa.Column(sa.Integer, nullable=False, server_default=sa.text("'0'")) + components_overview = sa.Column(sa.String(2048)) + details_key = sa.Column(sa.String(128)) + creation_time = sa.Column(mysql.TIMESTAMP, server_default = sa.text("CURRENT_TIMESTAMP")) + update_time = sa.Column(mysql.TIMESTAMP, server_default = sa.text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")) \ No newline at end of file diff --git a/tools/migration/migration_harbor/versions/1_2_0.py b/tools/migration/migration_harbor/versions/1_2_0.py new file mode 100644 index 000000000..05c712f1d --- /dev/null +++ b/tools/migration/migration_harbor/versions/1_2_0.py @@ -0,0 +1,68 @@ +# Copyright (c) 2008-2016 VMware, Inc. All Rights Reserved. +# +# 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. + +"""0.4.0 to 1.2.0 + +Revision ID: 0.4.0 +Revises: + +""" + +# revision identifiers, used by Alembic. +revision = '1.2.0' +down_revision = '0.4.0' +branch_labels = None +depends_on = None + +from alembic import op +from db_meta import * + +from sqlalchemy.dialects import mysql + +Session = sessionmaker() + +def upgrade(): + """ + update schema&data + """ + bind = op.get_bind() + session = Session(bind=bind) + + #delete column access_log.user_id(access_log_ibfk_1), access_log.project_id(access_log_ibfk_2) + op.drop_constraint('access_log_ibfk_1', 'access_log', type_='foreignkey') + op.drop_constraint('access_log_ibfk_2', 'access_log', type_='foreignkey') + + #add colume username to access_log + op.add_column('access_log', sa.Column('username', mysql.VARCHAR(32), nullable=False)) + + #init username + session.query(AccessLog).update({AccessLog.username: ""}) + + #update access_log username + user_all = session.query(User).all() + for user in user_all: + session.query(AccessLog).filter(AccessLog.user_id == user.user_id).update({AccessLog.username: user.username}, synchronize_session='fetch') + + op.drop_column("access_log", "user_id") + op.drop_column("repository", "owner_id") + + #create tables: img_scan_job, img_scan_overview + ImageScanJob.__table__.create(bind) + ImageScanOverview.__table__.create(bind) + +def downgrade(): + """ + Downgrade has been disabled. + """ + pass