blob: cc43a2b7eb2b057460de78d6de2abcc165efc8d7 [file] [log] [blame]
"""
Data storage for the slave allocator
"""
import sqlalchemy as sa
metadata = sa.MetaData()
# basic definitions
distros = sa.Table('distros', metadata,
sa.Column('distroid', sa.Integer, primary_key=True),
sa.Column(
'name', sa.String(128), nullable=False, unique=True),
mysql_engine="InnoDB",
)
datacenters = sa.Table('datacenters', metadata,
sa.Column('dcid', sa.Integer, primary_key=True),
sa.Column('name', sa.String(
128), nullable=False, unique=True),
mysql_engine="InnoDB",
)
bitlengths = sa.Table('bitlengths', metadata,
sa.Column('bitsid', sa.Integer, primary_key=True),
sa.Column(
'name', sa.String(128), nullable=False, unique=True),
mysql_engine="InnoDB",
)
speeds = sa.Table('speeds', metadata,
sa.Column('speedid', sa.Integer, primary_key=True),
sa.Column(
'name', sa.String(128), nullable=False, unique=True),
mysql_engine="InnoDB",
)
purposes = sa.Table('purposes', metadata,
sa.Column('purposeid', sa.Integer, primary_key=True),
sa.Column(
'name', sa.String(128), nullable=False, unique=True),
mysql_engine="InnoDB",
)
trustlevels = sa.Table('trustlevels', metadata,
sa.Column('trustid', sa.Integer, primary_key=True),
sa.Column('name', sa.String(
128), nullable=False, unique=True),
mysql_engine="InnoDB",
)
environments = sa.Table('environments', metadata,
sa.Column('envid', sa.Integer, primary_key=True),
sa.Column('name', sa.String(
128), nullable=False, unique=True),
mysql_engine="InnoDB",
)
tac_templates = sa.Table('tac_templates', metadata,
sa.Column('tplid', sa.Integer, primary_key=True),
sa.Column('name', sa.String(
128), nullable=False, unique=True),
sa.Column('template', sa.Text, nullable=False),
mysql_engine="InnoDB",
)
# pools
pools = sa.Table('pools', metadata,
sa.Column('poolid', sa.Integer, primary_key=True),
sa.Column(
'name', sa.String(128), nullable=False, unique=True),
mysql_engine="InnoDB",
)
# slave passwords, based on pool and distro
slave_passwords = sa.Table('slave_passwords', metadata,
# for most pools, all slaves have the same password, but for some pools,
# different distros have different passwords. Needless complexity FTW!
# If the distro column is NULL, that is considered a wildcard and will match
# all distros.
sa.Column(
'poolid', sa.Integer, sa.ForeignKey('pools.poolid'), nullable=False),
sa.Column('distroid', sa.Integer,
sa.ForeignKey('distros.distroid')),
sa.Column('password', sa.Text, nullable=False),
mysql_engine="InnoDB",
)
# all slaves
slaves = sa.Table('slaves', metadata,
sa.Column('slaveid', sa.Integer, primary_key=True),
sa.Column(
'name', sa.String(128), nullable=False, unique=True),
# silo (c.f. corresponding index below)
sa.Column('distroid', sa.Integer, sa.ForeignKey(
'distros.distroid'), nullable=False),
sa.Column(
'bitsid', sa.Integer, sa.ForeignKey('bitlengths.bitsid'),
nullable=False),
sa.Column(
'speedid', sa.Integer, sa.ForeignKey('speeds.speedid'),
nullable=False, default=0),
sa.Column('purposeid', sa.Integer, sa.ForeignKey(
'purposes.purposeid'), nullable=False),
sa.Column(
'dcid', sa.Integer, sa.ForeignKey('datacenters.dcid'),
nullable=False),
sa.Column('trustid', sa.Integer, sa.ForeignKey(
'trustlevels.trustid'), nullable=False),
sa.Column(
'envid', sa.Integer, sa.ForeignKey('environments.envid'),
nullable=False),
# pool
sa.Column(
'poolid', sa.Integer, sa.ForeignKey('pools.poolid'), nullable=False),
# config
sa.Column('basedir', sa.Text, nullable=False),
sa.Column(
'locked_masterid', sa.Integer, sa.ForeignKey('masters.masterid')),
sa.Column(
'custom_tplid', sa.Integer, sa.ForeignKey('tac_templates.tplid')),
sa.Column(
'enabled', sa.Boolean, nullable=False, default=True),
sa.Column('notes', sa.Text),
# state
sa.Column(
'current_masterid', sa.Integer, sa.ForeignKey('masters.masterid')),
mysql_engine="InnoDB",
)
# masters
masters = sa.Table('masters', metadata,
sa.Column('masterid', sa.Integer, primary_key=True),
sa.Column('nickname', sa.String(128),
nullable=False, unique=True),
sa.Column('fqdn', sa.Text, nullable=False),
sa.Column('http_port', sa.Integer,
nullable=False), # 0 for no HTTP port
sa.Column('pb_port', sa.Integer, nullable=False),
sa.Column(
'dcid', sa.Integer, sa.ForeignKey('datacenters.dcid'),
nullable=False),
# pool
sa.Column(
'poolid', sa.Integer, sa.ForeignKey('pools.poolid'), nullable=False),
# config
sa.Column(
'enabled', sa.Boolean, nullable=False, default=True),
sa.Column('notes', sa.Text),
mysql_engine="InnoDB",
)
# indices
sa.Index('slave_silo',
slaves.c.distroid,
slaves.c.bitsid,
slaves.c.speedid,
slaves.c.purposeid,
slaves.c.dcid,
slaves.c.trustid,
slaves.c.envid,
)
sa.Index('slave_poolid',
slaves.c.poolid)