| Trees | Indices | Help |
|---|
|
|
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
51
52
56
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
65 for obj in srcdb.session.query(model).all():
66 new = self.create_object(model, obj)
67 self.dstdb.session.add(new)
68
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
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
117
118
119 # Stage 1 - Copy data (projects, packages, last successfull build from each package)
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]
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)
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
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
| Trees | Indices | Help |
|---|
| Generated by Epydoc 3.0.1 | http://epydoc.sourceforge.net |