133 lines
4.5 KiB
Python
133 lines
4.5 KiB
Python
# Copyright (c) 2018 European Organization for Nuclear Research.
|
|
# 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.
|
|
|
|
"""change cluster to support nodegroups
|
|
|
|
Revision ID: 461d798132c7
|
|
Revises: ac92cbae311c
|
|
Create Date: 2019-02-06 14:32:40.316528
|
|
|
|
"""
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision = '461d798132c7'
|
|
down_revision = 'ac92cbae311c'
|
|
|
|
from alembic import op # noqa: E402
|
|
|
|
import sqlalchemy as sa # noqa: E402
|
|
|
|
from oslo_db.sqlalchemy.types import String # noqa: E402
|
|
from oslo_serialization import jsonutils # noqa: E402
|
|
from oslo_utils import uuidutils # noqa: E402
|
|
|
|
from magnum.db.sqlalchemy import models # noqa: E402
|
|
|
|
|
|
def _handle_json_columns(value, default=None):
|
|
if value is not None:
|
|
return jsonutils.loads(value)
|
|
return default
|
|
|
|
|
|
def upgrade():
|
|
|
|
nodegroup = sa.sql.table(
|
|
'nodegroup',
|
|
sa.Column('created_at', sa.DateTime(), default=sa.func.now()),
|
|
sa.Column('uuid', String(length=36), nullable=False),
|
|
sa.Column('name', String(length=255), nullable=False),
|
|
sa.Column('cluster_id', String(length=255), nullable=False),
|
|
sa.Column('project_id', String(length=255), nullable=False),
|
|
sa.Column('docker_volume_size', sa.Integer(), nullable=True),
|
|
sa.Column('labels', models.JSONEncodedDict, nullable=True),
|
|
sa.Column('flavor_id', String(length=255), nullable=True),
|
|
sa.Column('image_id', String(length=255), nullable=True),
|
|
sa.Column('node_addresses', models.JSONEncodedList(), nullable=True),
|
|
sa.Column('node_count', sa.Integer, nullable=True),
|
|
sa.Column('max_node_count', sa.Integer, nullable=True),
|
|
sa.Column('min_node_count', sa.Integer, nullable=True),
|
|
sa.Column('role', String(length=255), nullable=True),
|
|
sa.Column('is_default', sa.Boolean(create_constraint=False))
|
|
)
|
|
|
|
connection = op.get_bind()
|
|
# Fetching all required info from existing cluster
|
|
res = connection.execute(
|
|
"SELECT "
|
|
"cluster.uuid, "
|
|
"cluster.name, "
|
|
"cluster.project_id, "
|
|
"cluster.docker_volume_size, "
|
|
"cluster.labels, "
|
|
"cluster.master_flavor_id, "
|
|
"cluster.flavor_id, "
|
|
"cluster.node_count, "
|
|
"cluster.master_count, "
|
|
"cluster.node_addresses, "
|
|
"cluster.master_addresses, "
|
|
"cluster_template.master_flavor_id, "
|
|
"cluster_template.flavor_id, "
|
|
"cluster_template.image_id "
|
|
"FROM cluster INNER JOIN cluster_template "
|
|
"ON cluster.cluster_template_id=cluster_template.uuid"
|
|
)
|
|
|
|
results = res.fetchall()
|
|
|
|
# Create a list containing populated master nodegroups
|
|
master_ngs = [{
|
|
'uuid': uuidutils.generate_uuid(),
|
|
'name': 'default-master',
|
|
'cluster_id': rs[0],
|
|
'project_id': rs[2],
|
|
'docker_volume_size': rs[3],
|
|
'labels': _handle_json_columns(rs[4]),
|
|
'flavor_id': rs[5] or rs[11],
|
|
'image_id': rs[13],
|
|
'node_addresses': _handle_json_columns(rs[10]),
|
|
'node_count': rs[8],
|
|
'role': 'master',
|
|
'min_node_count': 1,
|
|
'is_default': True
|
|
} for rs in results]
|
|
|
|
# Create a list containing populated worker nodegroups
|
|
worker_ngs = [{
|
|
'uuid': uuidutils.generate_uuid(),
|
|
'name': 'default-worker',
|
|
'cluster_id': rs[0],
|
|
'project_id': rs[2],
|
|
'docker_volume_size': rs[3],
|
|
'labels': _handle_json_columns(rs[4]),
|
|
'flavor_id': rs[6] or rs[12],
|
|
'image_id': rs[13],
|
|
'node_addresses': _handle_json_columns(rs[9]),
|
|
'node_count': rs[7],
|
|
'role': "worker",
|
|
'min_node_count': 1,
|
|
'is_default': True
|
|
} for rs in results]
|
|
|
|
# Insert the populated nodegroups
|
|
op.bulk_insert(nodegroup, master_ngs)
|
|
op.bulk_insert(nodegroup, worker_ngs)
|
|
|
|
# Drop the columns from cluster table
|
|
op.drop_column('cluster', 'node_count')
|
|
op.drop_column('cluster', 'node_addresses')
|
|
op.drop_column('cluster', 'master_count')
|
|
op.drop_column('cluster', 'master_addresses')
|