diff --git a/migration/README.md b/migration/README.md index dde8e00c9..ee1b12dcb 100644 --- a/migration/README.md +++ b/migration/README.md @@ -1,54 +1,56 @@ -# migration -Migration is a module for migrating database schema between different version of project [harbor](https://github.com/vmware/harbor) +# Migration guide +Migration is a module for migrating database schema between different version of project [Harbor](https://github.com/vmware/harbor) + +This module is for those machine running Harbor's old version, such as 0.1.0. If your Harbor' version is up to date, please ignore this module. **WARNING!!** You must backup your data before migrating -###installation -- step 1: modify migration.cfg +###Installation +- step 1: change `db_username`, `db_password`, `db_port`, `db_name` in migration.cfg - step 2: build image from dockerfile ``` cd harbor-migration - docker build -t your-image-name . + docker build -t migrate-tool . ``` -###migration operation -- show instruction of harbor-migration - - ```docker run your-image-name help``` - -- test mysql connection in harbor-migration - - ```docker run -v /data/database:/var/lib/mysql your-image-name test``` - -- create backup file in `/path/to/backup` - - ``` - docker run -ti -v /data/database:/var/lib/mysql -v /path/to/backup:/harbor-migration/backup your-image-name backup - ``` - -- restore from backup file in `/path/to/backup` - - ``` - docker run -ti -v /data/database:/var/lib/mysql -v /path/to/backup:/harbor-migration/backup your-image-name restore - ``` - -- perform database schema upgrade - - ```docker run -ti -v /data/database:/var/lib/mysql your-image-name up head``` - -you can use `-v /etc/localtime:/etc/localtime` to sync container timezone with host timezone. - -you may change `/data/database` to the mysql volumes path you set in docker-compose.yml. -###migration step -- step 1: stop and remove harbor service +###Migrate Step +- step 1: stop and remove Harbor service ``` docker-compose down ``` -- step 2: perform migration operation -- step 3: rebuild newest harbor images and restart service +- step 2: create backup file in `/path/to/backup` + + ``` + docker run -ti --rm -v /data/database:/var/lib/mysql -v /path/to/backup:/harbor-migration/backup migrate-tool backup + ``` + +- step 3: perform database schema upgrade + + ```docker run -ti --rm -v /data/database:/var/lib/mysql migrate-tool up head``` + + + +- step 4: rebuild newest Harbor images and restart service ``` docker-compose build && docker-compose up -d ``` + +You may change `/data/database` to the mysql volumes path you set in docker-compose.yml. + +###Migration operation reference +- You can use `help` to show instruction of Harbor migration + + ```docker run migrate-tool help``` + +- You can use `test` to test mysql connection in Harbor migration + + ```docker run --rm -v /data/database:/var/lib/mysql migrate-tool test``` + +- You can restore from backup file in `/path/to/backup` + + ``` + docker run -ti --rm -v /data/database:/var/lib/mysql -v /path/to/backup:/harbor-migration/backup migrate-tool restore + ``` diff --git a/migration/db_meta.py b/migration/db_meta.py index e20dd924c..dcbdd4311 100644 --- a/migration/db_meta.py +++ b/migration/db_meta.py @@ -4,6 +4,7 @@ import sqlalchemy as sa from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, relationship +from sqlalchemy.dialects import mysql Base = declarative_base() @@ -20,8 +21,8 @@ class User(Base): reset_uuid = sa.Column(sa.String(40)) salt = sa.Column(sa.String(40)) sysadmin_flag = sa.Column(sa.Integer) - creation_time = sa.Column(sa.DateTime) - update_time = sa.Column(sa.DateTime) + creation_time = sa.Column(mysql.TIMESTAMP) + update_time = sa.Column(mysql.TIMESTAMP) class Properties(Base): __tablename__ = 'properties' @@ -35,8 +36,8 @@ class ProjectMember(Base): project_id = sa.Column(sa.Integer(), primary_key = True) user_id = sa.Column(sa.Integer(), primary_key = True) role = sa.Column(sa.Integer(), nullable = False) - creation_time = sa.Column(sa.DateTime(), nullable = True) - update_time = sa.Column(sa.DateTime(), nullable = True) + creation_time = sa.Column(mysql.TIMESTAMP, nullable = True) + update_time = sa.Column(mysql.TIMESTAMP, nullable = True) sa.ForeignKeyConstraint(['project_id'], [u'project.project_id'], ), sa.ForeignKeyConstraint(['role'], [u'role.role_id'], ), sa.ForeignKeyConstraint(['user_id'], [u'user.user_id'], ), @@ -79,8 +80,8 @@ class Project(Base): project_id = sa.Column(sa.Integer, primary_key=True) owner_id = sa.Column(sa.ForeignKey(u'user.user_id'), nullable=False, index=True) name = sa.Column(sa.String(30), nullable=False, unique=True) - creation_time = sa.Column(sa.DateTime) - update_time = sa.Column(sa.DateTime) + creation_time = sa.Column(mysql.TIMESTAMP) + update_time = sa.Column(mysql.TIMESTAMP) deleted = sa.Column(sa.Integer, nullable=False, server_default=sa.text("'0'")) public = sa.Column(sa.Integer, nullable=False, server_default=sa.text("'0'")) owner = relationship(u'User') diff --git a/migration/migration_harbor/versions/0_1_1.py b/migration/migration_harbor/versions/0_1_1.py index ecec2cfb3..f3ea874a5 100644 --- a/migration/migration_harbor/versions/0_1_1.py +++ b/migration/migration_harbor/versions/0_1_1.py @@ -27,9 +27,10 @@ branch_labels = None depends_on = None from alembic import op -from datetime import datetime from db_meta import * +from sqlalchemy.dialects import mysql + Session = sessionmaker() def upgrade(): @@ -44,12 +45,9 @@ def upgrade(): session.add(Properties(k='schema_version', v='0.1.1')) #add column to table user - op.add_column('user', sa.Column('creation_time', sa.DateTime(), nullable=True)) + op.add_column('user', sa.Column('creation_time', mysql.TIMESTAMP, nullable=True)) op.add_column('user', sa.Column('sysadmin_flag', sa.Integer(), nullable=True)) - op.add_column('user', sa.Column('update_time', sa.DateTime(), nullable=True)) - - #fill update_time data into table user - session.query(User).update({User.update_time: datetime.now()}) + op.add_column('user', sa.Column('update_time', mysql.TIMESTAMP, nullable=True)) #init all sysadmin_flag = 0 session.query(User).update({User.sysadmin_flag: 0}) @@ -62,7 +60,7 @@ def upgrade(): for result in join_result: session.add(ProjectMember(project_id=result.project_role.project_id, \ user_id=result.user_id, role=result.project_role.role_id, \ - creation_time=datetime.now(), update_time=datetime.now())) + creation_time=None, update_time=None)) #update sysadmin_flag sys_admin_result = session.query(UserProjectRole).\ @@ -88,11 +86,9 @@ def upgrade(): session.delete(acc) session.query(Access).update({Access.access_id: Access.access_id - 1}) - #add column to table project - op.add_column('project', sa.Column('update_time', sa.DateTime(), nullable=True)) + #add column to table project + op.add_column('project', sa.Column('update_time', mysql.TIMESTAMP, nullable=True)) - #fill update_time data into table project - session.query(Project).update({Project.update_time: datetime.now()}) session.commit() def downgrade():