# Copyright 2022 Google LLC
#
# 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.

"""Initial migration.

Revision ID: 46b528bd81dc
Revises: 
Create Date: 2022-01-05 19:10:43.908299

"""
from alembic import op
import sqlalchemy as sa
import sqlalchemy_utils
from bms_app.models import OperationType, OperationStatus, SourceDBType

# revision identifiers, used by Alembic.
revision = '46b528bd81dc'
down_revision = None
branch_labels = None
depends_on = None


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('bms_servers',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(), nullable=True),
    sa.Column('create_time', sa.DateTime(), nullable=True),
    sa.Column('state', sa.String(), nullable=True),
    sa.Column('machine_type', sa.String(), nullable=True),
    sa.Column('luns', sa.JSON(), nullable=True),
    sa.Column('networks', sa.JSON(), nullable=True),
    sa.Column('deleted', sa.Boolean(), nullable=True),
    sa.Column('secret_name', sa.String(), nullable=True),
    sa.Column('cpu', sa.String(), nullable=True),
    sa.Column('socket', sa.String(), nullable=True),
    sa.Column('ram', sa.String(), nullable=True),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('name')
    )
    op.create_table('projects',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(), nullable=False),
    sa.Column('vpc', sa.String(), nullable=False),
    sa.Column('subnet', sa.String(), nullable=False),
    sa.Column('service_account', sa.String(), nullable=False),
    sa.Column('description', sa.String(), nullable=False),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('db_assessments',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('project_id', sa.Integer(), nullable=True),
    sa.Column('path', sa.String(), nullable=False),
    sa.Column('uploaded_at', sa.DateTime(), nullable=True),
    sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('waves',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('name', sa.String(), nullable=True),
    sa.Column('project_id', sa.Integer(), nullable=False),
    sa.Column('is_running', sa.Boolean(), nullable=True),
    sa.Column('description', sa.String(), nullable=True),
    sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('operations',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('wave_id', sa.Integer(), nullable=True),
    sa.Column('operation_type', sqlalchemy_utils.types.choice.ChoiceType(OperationType, impl=sa.String(20)), nullable=True),
    sa.Column('status', sqlalchemy_utils.types.choice.ChoiceType(OperationStatus, impl=sa.String(20)), nullable=True),
    sa.Column('started_at', sa.DateTime(), nullable=True),
    sa.Column('completed_at', sa.DateTime(), nullable=True),
    sa.ForeignKeyConstraint(['wave_id'], ['waves.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_table('source_dbs',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('server', sa.String(), nullable=False),
    sa.Column('oracle_version', sa.String(), nullable=False),
    sa.Column('oracle_edition', sa.String(), nullable=True),
    sa.Column('db_type', sqlalchemy_utils.types.choice.ChoiceType(SourceDBType, impl=sa.String(10)), nullable=True),
    sa.Column('rac_nodes', sa.Integer(), nullable=True),
    sa.Column('fe_rac_nodes', sa.Integer(), nullable=True),
    sa.Column('arch', sa.String(), nullable=False),
    sa.Column('cores', sa.Integer(), nullable=False),
    sa.Column('ram', sa.Integer(), nullable=False),
    sa.Column('allocated_memory', sa.Integer(), nullable=False),
    sa.Column('db_name', sa.String(), nullable=False),
    sa.Column('db_size', sa.Numeric(), nullable=False),
    sa.Column('status', sa.String(), nullable=True),
    sa.Column('project_id', sa.Integer(), nullable=False),
    sa.Column('wave_id', sa.Integer(), nullable=True),
    sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ),
    sa.ForeignKeyConstraint(['wave_id'], ['waves.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('server', 'db_name')
    )
    op.create_table('configs',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('db_id', sa.Integer(), nullable=False),
    sa.Column('install_config_values', sa.JSON(), nullable=True),
    sa.Column('db_params_values', sa.JSON(), nullable=True),
    sa.Column('data_mounts_values', sa.JSON(), nullable=True),
    sa.Column('asm_config_values', sa.JSON(), nullable=True),
    sa.Column('rac_config_values', sa.JSON(), nullable=True),
    sa.Column('misc_config_values', sa.JSON(), nullable=True),
    sa.Column('created_at', sa.DateTime(), nullable=True),
    sa.ForeignKeyConstraint(['db_id'], ['source_dbs.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('db_id')
    )
    op.create_table('mappings',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('db_id', sa.Integer(), nullable=False),
    sa.Column('bms_id', sa.Integer(), nullable=False),
    sa.Column('rac_node', sa.Integer(), nullable=True),
    sa.Column('is_deployable', sa.Boolean(), server_default='1', nullable=True),
    sa.ForeignKeyConstraint(['bms_id'], ['bms_servers.id'], ),
    sa.ForeignKeyConstraint(['db_id'], ['source_dbs.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('db_id', 'bms_id')
    )
    op.create_table('operation_history',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('mapping_id', sa.Integer(), nullable=False),
    sa.Column('wave_id', sa.Integer(), nullable=False),
    sa.Column('operation_id', sa.Integer(), nullable=False),
    sa.Column('operation_type', sqlalchemy_utils.types.choice.ChoiceType(OperationType, impl=sa.String(20)), nullable=True),
    sa.Column('step', sa.String(length=20), nullable=True),
    sa.Column('step_upd_at', sa.DateTime(), nullable=True),
    sa.Column('status', sqlalchemy_utils.types.choice.ChoiceType(OperationStatus, impl=sa.String(20)), nullable=True),
    sa.Column('started_at', sa.DateTime(), nullable=True),
    sa.Column('completed_at', sa.DateTime(), nullable=True),
    sa.ForeignKeyConstraint(['mapping_id'], ['mappings.id'], ),
    sa.ForeignKeyConstraint(['operation_id'], ['operations.id'], ),
    sa.ForeignKeyConstraint(['wave_id'], ['waves.id'], ),
    sa.PrimaryKeyConstraint('id')
    )
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('operation_history')
    op.drop_table('mappings')
    op.drop_table('configs')
    op.drop_table('source_dbs')
    op.drop_table('operations')
    op.drop_table('waves')
    op.drop_table('db_assessments')
    op.drop_table('projects')
    op.drop_table('bms_servers')
    # ### end Alembic commands ###
