Script migrate_copr_py
[hide private]
[frames] | no frames]

Source Code for Script script-migrate_copr_py

  1  #!/usr/bin/python 
  2  # -*- coding: utf-8 -*- 
  3   
  4  # RUN 
  5  #     cd frontend/coprs_frontend 
  6  #     COPR_CONFIG=../config/copr_devel.conf python run/migrate-copr.py 
  7  # 
  8  #               --stage=<number> to run only particular stage 
  9   
 10  # NOTES 
 11  # - We do have to copy user, group and some other (see mods variable) tables 
 12  # - Stage 0 - Cleaning 
 13  # - Not storing `old_status` in `BuildChroot`, but in `Package` 
 14   
 15   
 16  from __future__ import print_function 
 17  from __future__ import unicode_literals 
 18  from __future__ import division 
 19  from __future__ import absolute_import 
 20   
 21  import os 
 22  here = os.path.dirname(os.path.realpath(__file__)) 
 23  import sys 
 24  sys.path.append(os.path.dirname(here)) 
 25   
 26  import argparse 
 27  import flask 
 28  from flask_sqlalchemy import SQLAlchemy 
 29  from coprs import app, models, db, logic, helpers 
 30  from coprs.logic.coprs_logic import CoprsLogic 
 31  from coprs.logic.packages_logic import PackagesLogic 
 32   
 33   
 34  DSTDB_CONFIG = {"username": "copr-fe", "password": "coprpass", "host": "127.0.0.1", "database": "coprdbnew"} 
 35  srcdb = db 
 36   
 37  dstapp = flask.Flask(__name__) 
 38  dstapp.config.from_object("coprs.config.DevelopmentConfig") 
 39  dstapp.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://{username}:{password}@{host}/{database}".format(**DSTDB_CONFIG) 
 40  dstdb = SQLAlchemy(dstapp) 
 41   
 42   
 43  parser = argparse.ArgumentParser(prog = "migrate-copr") 
 44  parser.add_argument("-s", "--stage", dest="stage", type=int, default=-1) 
 45  args = parser.parse_args() 
 46   
 47   
48 -def all_coprs():
49 """ Return all coprs without those which are deleted. """ 50 return CoprsLogic.get_all()
51 52
53 -class Copying(object):
54 - def __init__(self, dstdb):
55 self.dstdb = dstdb
56
57 - def create_object(self, clazz, from_object, exclude=list()):
58 arguments = {} 59 for name, column in from_object.__mapper__.columns.items(): 60 if not name in exclude: 61 arguments[name] = getattr(from_object, name) 62 return clazz(**arguments)
63
64 - def copy_objects(self, model):
65 for obj in srcdb.session.query(model).all(): 66 new = self.create_object(model, obj) 67 self.dstdb.session.add(new)
68
69 - def copy_package(self, package):
70 build = package.last_build(successful=True) or package.last_build() or models.Build() 71 new = self.create_object(models.Package, package) 72 new.old_status = build.status 73 self.dstdb.session.add(new)
74
75 - def copy_build(self, build):
76 if build: 77 new = self.create_object(models.Build, build, exclude=["id"]) 78 new.build_chroots = [self.create_object(models.BuildChroot, c, exclude=["id"]) for c in build.build_chroots] 79 self.dstdb.session.add(new)
80 81 82 # class MockDB(): 83 # def __init__(self, dstdb): 84 # self.dstdb = dstdb 85 # self.olddb = None 86 # 87 # def __enter__(self): 88 # self.olddb = logic.coprs_logic.db 89 # logic.coprs_logic.db = self.dstdb 90 # 91 # def __exit__(self, exc_type, exc_val, exc_tb): 92 # logic.coprs_logic.db = self.olddb 93 94 95 mods = [ 96 models.User, 97 models.Group, 98 models.Copr, 99 models.LegalFlag, 100 models.CoprPermission, 101 models.CoprChroot, 102 models.CounterStat, 103 models.MockChroot, 104 ] 105 106 clean_mods = [ 107 models.BuildChroot, 108 models.Build, 109 models.Package, 110 ] + list(reversed(mods)) 111 112 113 # Stage 0 - Cleaning
114 -def clean(db):
115 for model in clean_mods: 116 db.session.query(model).delete()
117 118 119 # Stage 1 - Copy data (projects, packages, last successfull build from each package)
120 -def copy_data(cp):
121 for model in mods: 122 cp.copy_objects(model) 123 124 for copr in all_coprs(): 125 for package in PackagesLogic.get_all(copr.id): 126 cp.copy_package(package) 127 cp.copy_build(package.last_build(successful=True))
128 129 130 # Stage 2 - succeeded -> [pending|importing]
131 -def ensure_rebuild(dstdb):
132 for chroot in dstdb.session.query(models.BuildChroot).all(): 133 chroot.status = helpers.StatusEnum("pending" if chroot.git_hash else "importing")
134 135 136 # Stage 3 - failed -> pending (repeat)
137 -def rebuild_failed(dstdb):
138 for i in range(1, 5): 139 builds = dstdb.session.query(models.BuildChroot).filter_by(status=helpers.StatusEnum("failed")).all() 140 for chroot in builds: 141 chroot.status = helpers.StatusEnum("pending")
142 143
144 -def main():
145 if args.stage in [-1, 0]: 146 # Stage 0 - Cleaning 147 print("### Stage 0 - Cleaning ###################################") 148 clean(dstdb) 149 dstdb.session.commit() 150 151 if args.stage in [-1, 1]: 152 # Stage 1 - Copy data (projects, packages, last successfull build from each package) 153 print("### Stage 1 - Copy data ##################################") 154 cp = Copying(dstdb) 155 copy_data(cp) 156 dstdb.session.commit() 157 158 if args.stage in [-1, 2]: 159 # Stage 2 - succeeded -> [pending|importing] 160 print("### Stage 2 - succeeded -> [pending|importing] ###########") 161 ensure_rebuild(dstdb) 162 dstdb.session.commit() 163 164 if args.stage in [-1, 3]: 165 # Stage 3 - failed -> pending (repeat) 166 print("### Stage 3 - failed -> pending (repeat ##################") 167 rebuild_failed(dstdb) 168 dstdb.session.commit() 169 170 if args.stage not in range(-1, 4): 171 print("No such stage. See the code for possible values :-P")
172 173 174 if __name__ == "__main__": 175 main() 176