- Добавлена колонка 'Тип' во все таблицы истории сборок - Для push операций отображается registry вместо платформ - Сохранение пользователя при создании push лога - Исправлена ошибка с logger в push_docker_image endpoint - Улучшено отображение истории сборок с визуальными индикаторами
133 lines
6.2 KiB
Python
133 lines
6.2 KiB
Python
"""add presets table
|
|
|
|
Revision ID: 003
|
|
Revises: 002
|
|
Create Date: 2024-01-01 12:00:00.000000
|
|
|
|
"""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
from sqlalchemy.dialects import postgresql
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision = '003'
|
|
down_revision = '002_add_playbooks'
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade():
|
|
# Создание таблицы presets
|
|
op.create_table(
|
|
'presets',
|
|
sa.Column('id', sa.Integer(), nullable=False),
|
|
sa.Column('name', sa.String(), nullable=False),
|
|
sa.Column('category', sa.String(), nullable=True, server_default='main'),
|
|
sa.Column('description', sa.Text(), nullable=True),
|
|
sa.Column('content', sa.Text(), nullable=False),
|
|
sa.Column('docker_network', sa.String(), nullable=True),
|
|
sa.Column('hosts', postgresql.JSON(astext_type=sa.Text()), nullable=True),
|
|
sa.Column('images', postgresql.JSON(astext_type=sa.Text()), nullable=True),
|
|
sa.Column('systemd_defaults', postgresql.JSON(astext_type=sa.Text()), nullable=True),
|
|
sa.Column('kind_clusters', postgresql.JSON(astext_type=sa.Text()), nullable=True),
|
|
sa.Column('status', sa.String(), nullable=True, server_default='active'),
|
|
sa.Column('created_at', sa.DateTime(), nullable=False),
|
|
sa.Column('updated_at', sa.DateTime(), nullable=False),
|
|
sa.Column('created_by', sa.String(), nullable=True),
|
|
sa.Column('updated_by', sa.String(), nullable=True),
|
|
sa.Column('extra_data', postgresql.JSON(astext_type=sa.Text()), nullable=True),
|
|
sa.PrimaryKeyConstraint('id')
|
|
)
|
|
op.create_index(op.f('ix_presets_id'), 'presets', ['id'], unique=False)
|
|
op.create_index(op.f('ix_presets_name'), 'presets', ['name'], unique=True)
|
|
op.create_index(op.f('ix_presets_category'), 'presets', ['category'], unique=False)
|
|
|
|
# Основные preset'ы
|
|
if presets_dir.exists():
|
|
for preset_file in presets_dir.glob("*.yml"):
|
|
if preset_file.name == "deploy.yml":
|
|
continue
|
|
|
|
try:
|
|
with open(preset_file) as f:
|
|
content = f.read()
|
|
preset_data = yaml.safe_load(content) or {}
|
|
|
|
# Извлечение описания из комментария
|
|
description = None
|
|
for line in content.split('\n'):
|
|
if line.strip().startswith('#description:'):
|
|
description = line.split('#description:')[1].strip()
|
|
break
|
|
|
|
# Подсчет хостов
|
|
hosts_count = len(preset_data.get('hosts', []))
|
|
|
|
connection.execute(
|
|
sa.text("""
|
|
INSERT INTO presets (name, category, description, content, docker_network, hosts, images, systemd_defaults, kind_clusters, created_at, updated_at)
|
|
VALUES (:name, :category, :description, :content, :docker_network, :hosts, :images, :systemd_defaults, :kind_clusters, :created_at, :updated_at)
|
|
ON CONFLICT (name) DO NOTHING
|
|
"""),
|
|
{
|
|
'name': preset_file.stem,
|
|
'category': 'main',
|
|
'description': description,
|
|
'content': content,
|
|
'docker_network': preset_data.get('docker_network'),
|
|
'hosts': preset_data.get('hosts', []),
|
|
'images': preset_data.get('images', {}),
|
|
'systemd_defaults': preset_data.get('systemd_defaults', {}),
|
|
'kind_clusters': preset_data.get('kind_clusters', []),
|
|
'created_at': datetime.utcnow(),
|
|
'updated_at': datetime.utcnow()
|
|
}
|
|
)
|
|
except Exception as e:
|
|
print(f"Ошибка при импорте preset {preset_file.name}: {e}")
|
|
|
|
# K8s preset'ы
|
|
if k8s_presets_dir.exists():
|
|
for preset_file in k8s_presets_dir.glob("*.yml"):
|
|
try:
|
|
with open(preset_file) as f:
|
|
content = f.read()
|
|
preset_data = yaml.safe_load(content) or {}
|
|
|
|
# Извлечение описания из комментария
|
|
description = None
|
|
for line in content.split('\n'):
|
|
if line.strip().startswith('#description:'):
|
|
description = line.split('#description:')[1].strip()
|
|
break
|
|
|
|
connection.execute(
|
|
sa.text("""
|
|
INSERT INTO presets (name, category, description, content, docker_network, hosts, images, systemd_defaults, kind_clusters, created_at, updated_at)
|
|
VALUES (:name, :category, :description, :content, :docker_network, :hosts, :images, :systemd_defaults, :kind_clusters, :created_at, :updated_at)
|
|
ON CONFLICT (name) DO NOTHING
|
|
"""),
|
|
{
|
|
'name': preset_file.stem,
|
|
'category': 'k8s',
|
|
'description': description,
|
|
'content': content,
|
|
'docker_network': preset_data.get('docker_network'),
|
|
'hosts': preset_data.get('hosts', []),
|
|
'images': preset_data.get('images', {}),
|
|
'systemd_defaults': preset_data.get('systemd_defaults', {}),
|
|
'kind_clusters': preset_data.get('kind_clusters', []),
|
|
'created_at': datetime.utcnow(),
|
|
'updated_at': datetime.utcnow()
|
|
}
|
|
)
|
|
except Exception as e:
|
|
print(f"Ошибка при импорте k8s preset {preset_file.name}: {e}")
|
|
|
|
|
|
def downgrade():
|
|
op.drop_index(op.f('ix_presets_category'), table_name='presets')
|
|
op.drop_index(op.f('ix_presets_name'), table_name='presets')
|
|
op.drop_index(op.f('ix_presets_id'), table_name='presets')
|
|
op.drop_table('presets')
|