mirror of
https://github.com/cwinfo/powerdns-admin.git
synced 2024-12-04 19:15:30 +00:00
Use Flask-Migrate for db migration
This commit is contained in:
parent
ecdb9b9328
commit
a6f0bf26d4
1
.gitignore
vendored
1
.gitignore
vendored
@ -28,6 +28,7 @@ advanced_settings.json
|
||||
idp.crt
|
||||
log.txt
|
||||
|
||||
migrations/*
|
||||
db_repository/*
|
||||
upload/avatar/*
|
||||
tmp/*
|
||||
|
@ -2,6 +2,7 @@ from werkzeug.contrib.fixers import ProxyFix
|
||||
from flask import Flask, request, session, redirect, url_for
|
||||
from flask_login import LoginManager
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from flask_migrate import Migrate
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.from_object('config')
|
||||
@ -14,6 +15,7 @@ logging = logger('powerdns-admin', app.config['LOG_LEVEL'], app.config['LOG_FILE
|
||||
login_manager = LoginManager()
|
||||
login_manager.init_app(app)
|
||||
db = SQLAlchemy(app)
|
||||
migrate = Migrate(app, db) # used for flask-migrate
|
||||
|
||||
def enable_github_oauth(GITHUB_ENABLE):
|
||||
if not GITHUB_ENABLE:
|
||||
|
@ -1389,7 +1389,8 @@ class Server(object):
|
||||
class History(db.Model):
|
||||
id = db.Column(db.Integer, primary_key = True)
|
||||
msg = db.Column(db.String(256))
|
||||
detail = db.Column(db.Text().with_variant(db.Text(length=2**24-2), 'mysql'))
|
||||
# detail = db.Column(db.Text().with_variant(db.Text(length=2**24-2), 'mysql'))
|
||||
detail = db.Column(db.Text())
|
||||
created_by = db.Column(db.String(128))
|
||||
created_on = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
|
||||
|
121
create_db.py
121
create_db.py
@ -1,121 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import time
|
||||
import os.path
|
||||
import traceback
|
||||
|
||||
from migrate.versioning import api
|
||||
from config import SQLALCHEMY_DATABASE_URI
|
||||
from config import SQLALCHEMY_MIGRATE_REPO
|
||||
from app import db
|
||||
from app.models import Role, Setting, DomainTemplate
|
||||
|
||||
|
||||
def start():
|
||||
wait_time = get_waittime_from_env()
|
||||
|
||||
if not connect_db(wait_time):
|
||||
print("ERROR: Couldn't connect to database server")
|
||||
exit(1)
|
||||
|
||||
init_records()
|
||||
|
||||
def get_waittime_from_env():
|
||||
return int(os.environ.get('WAITFOR_DB', 1))
|
||||
|
||||
def connect_db(wait_time):
|
||||
for i in range(0, wait_time):
|
||||
print("INFO: Wait for database server")
|
||||
sys.stdout.flush()
|
||||
try:
|
||||
db.create_all()
|
||||
return True
|
||||
except:
|
||||
traceback.print_exc()
|
||||
time.sleep(1)
|
||||
|
||||
return False
|
||||
|
||||
def init_roles(db, role_names):
|
||||
|
||||
# Get key name of data
|
||||
name_of_roles = [r.name for r in role_names]
|
||||
|
||||
# Query to get current data
|
||||
rows = db.session.query(Role).filter(Role.name.in_(name_of_roles)).all()
|
||||
name_of_rows = [r.name for r in rows]
|
||||
|
||||
# Check which data that need to insert
|
||||
roles = [r for r in role_names if r.name not in name_of_rows]
|
||||
|
||||
# Insert data
|
||||
for role in roles:
|
||||
db.session.add(role)
|
||||
|
||||
def init_settings(db, setting_names):
|
||||
|
||||
# Get key name of data
|
||||
name_of_settings = [r.name for r in setting_names]
|
||||
|
||||
# Query to get current data
|
||||
rows = db.session.query(Setting).filter(Setting.name.in_(name_of_settings)).all()
|
||||
|
||||
# Check which data that need to insert
|
||||
name_of_rows = [r.name for r in rows]
|
||||
settings = [r for r in setting_names if r.name not in name_of_rows]
|
||||
|
||||
# Insert data
|
||||
for setting in settings:
|
||||
db.session.add(setting)
|
||||
|
||||
|
||||
def init_domain_templates(db, domain_template_names):
|
||||
|
||||
# Get key name of data
|
||||
name_of_domain_templates = map(lambda r: r.name, domain_template_names)
|
||||
|
||||
# Query to get current data
|
||||
rows = db.session.query(DomainTemplate).filter(DomainTemplate.name.in_(name_of_domain_templates)).all()
|
||||
|
||||
# Check which data that need to insert
|
||||
name_of_rows = map(lambda r: r.name, rows)
|
||||
domain_templates = filter(lambda r: r.name not in name_of_rows, domain_template_names)
|
||||
|
||||
# Insert data
|
||||
for domain_template in domain_templates:
|
||||
db.session.add(domain_template)
|
||||
|
||||
def init_records():
|
||||
# Create initial user roles and turn off maintenance mode
|
||||
init_roles(db, [
|
||||
Role('Administrator', 'Administrator'),
|
||||
Role('User', 'User')
|
||||
])
|
||||
init_settings(db, [
|
||||
Setting('maintenance', 'False'),
|
||||
Setting('fullscreen_layout', 'True'),
|
||||
Setting('record_helper', 'True'),
|
||||
Setting('login_ldap_first', 'True'),
|
||||
Setting('default_record_table_size', '15'),
|
||||
Setting('default_domain_table_size', '10'),
|
||||
Setting('auto_ptr','False')
|
||||
])
|
||||
# TODO: add sample records to sample templates
|
||||
init_domain_templates(db, [
|
||||
DomainTemplate('basic_template_1', 'Basic Template #1'),
|
||||
DomainTemplate('basic_template_2', 'Basic Template #2'),
|
||||
DomainTemplate('basic_template_3', 'Basic Template #3')
|
||||
])
|
||||
db_commit = db.session.commit()
|
||||
commit_version_control(db_commit)
|
||||
|
||||
def commit_version_control(db_commit):
|
||||
if not os.path.exists(SQLALCHEMY_MIGRATE_REPO):
|
||||
api.create(SQLALCHEMY_MIGRATE_REPO, 'database repository')
|
||||
api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
|
||||
elif db_commit is not None:
|
||||
api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, api.version(SQLALCHEMY_MIGRATE_REPO))
|
||||
|
||||
if __name__ == '__main__':
|
||||
start()
|
@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
from migrate.versioning import api
|
||||
from config import SQLALCHEMY_DATABASE_URI
|
||||
from config import SQLALCHEMY_MIGRATE_REPO
|
||||
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
|
||||
api.downgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, v - 1)
|
||||
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
|
||||
print('Current database version: ' + str(v))
|
@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
import imp
|
||||
from migrate.versioning import api
|
||||
from app import db
|
||||
from config import SQLALCHEMY_DATABASE_URI
|
||||
from config import SQLALCHEMY_MIGRATE_REPO
|
||||
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
|
||||
migration = SQLALCHEMY_MIGRATE_REPO + ('/versions/%03d_migration.py' % (v+1))
|
||||
tmp_module = imp.new_module('old_model')
|
||||
old_model = api.create_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
|
||||
exec(old_model, tmp_module.__dict__)
|
||||
script = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata)
|
||||
open(migration, "wt").write(script)
|
||||
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
|
||||
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
|
||||
print('New migration saved as ' + migration)
|
||||
print('Current database version: ' + str(v))
|
@ -1,7 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
from migrate.versioning import api
|
||||
from config import SQLALCHEMY_DATABASE_URI
|
||||
from config import SQLALCHEMY_MIGRATE_REPO
|
||||
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
|
||||
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
|
||||
print('Current database version: ' + str(v))
|
Loading…
Reference in New Issue
Block a user