From 941a48d58b5d6739e22de8041970d6fdef2dfe62 Mon Sep 17 00:00:00 2001 From: Jessica Lucci Date: Tue, 21 May 2013 22:52:59 -0500 Subject: [PATCH] Almost done with sqlalchemy api --- taskflow/backends/celery/.celeryapp.py.swp | Bin 0 -> 12288 bytes taskflow/backends/celery/.celeryconfig.py.swp | Bin 12288 -> 12288 bytes taskflow/common/.config.py.swp | Bin 0 -> 12288 bytes taskflow/common/config.py | 3 +- taskflow/db/sqlalchemy/.api.py.swp | Bin 0 -> 20480 bytes taskflow/db/sqlalchemy/.models.py.swp | Bin 0 -> 16384 bytes taskflow/db/sqlalchemy/api.py | 168 ++++++++++++++++++ taskflow/db/sqlalchemy/models.py | 16 +- taskflow/db/sqlalchemy/session.py | 18 +- taskflow/test.db | Bin 0 -> 14336 bytes 10 files changed, 189 insertions(+), 16 deletions(-) create mode 100644 taskflow/backends/celery/.celeryapp.py.swp create mode 100644 taskflow/common/.config.py.swp create mode 100644 taskflow/db/sqlalchemy/.api.py.swp create mode 100644 taskflow/db/sqlalchemy/.models.py.swp create mode 100644 taskflow/test.db diff --git a/taskflow/backends/celery/.celeryapp.py.swp b/taskflow/backends/celery/.celeryapp.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..09e4e67ab71388cbfab6b5d93eb7c8ca91ed36f2 GIT binary patch literal 12288 zcmeHN&2Jk;6rUo*cL4zs7Y?tks@TO@CutE?iX}{vwl1kH?4(tMiZx!3*VC+bmYvzS zxqu26Brb5_zzvBzP8~Wqd-ua<*|9c-Yc1>t~`qbhXyL8xfX<_Mw#kGr#^IM1QV(hJ{ z!rH3x)3Jz*u5EC=eJ)g!n!#Xb2Yv2ui)f&0z6eFKTikdYd-3k!`rWEyz%g(b14r4Z zrNsri<9O*9J^j??VVm8WW56-s7;p?Y1{?#90mp!2z%g)-F<{~&>}~jTU*XsE$NrIG zKE2;#Zaa4z1C9a5fMdWh;23ZWI0hU8jseGjW56-+zhZz77`ycVW1l|=xAFh~^!NX- zPcU{H_y+hIxB=9Gv%qhUGxiDaE^q@_2QC6ffSX4d8vxG&e?G?8AHZ$k7vMYK1E2@I z0lWm91)c{^0?z1?>dlJO?}r{QMAOKLOtZ?*jp_ z3NYYX_;m~T61WL`0a#x@1Ki~pa11yG90QJl{}Ka)E9P1=I|xN=D^~hAN?mWJG0+ z!+0X`B0d(Ljzej(eXlPrU#*ZFQk3hM458tGtqWJPw<(oM)a5%OGp(>glTmc#9AS+O z#4uax>D2de^sqPL(EvvP%UVVO59=)z33!y5Q%nkH>`G;sy=)zsN_)PFBHR zP-SU-fWx!IC{kHifozOSK0szhN+FXaL|zs}c4U*iO3F;xS4Tng_jQyNjvVA_i#oD2 zr-|6BBf<5qmxw@WgQBe9dw=^piXLtUC{QmDW*tK;^?J5h^m^Em6;`BnxTj(fp&R+z zP&ghd^p{N%5vrL|X2cVn&j@X1Qr2q5iZ`2) zP8^-5k7JOQ>C`qjG9y9j(ubA8%bypstQXo<9SdI$rB5M`f|Lh>0<|NO2;NgHlCjhp zO+k}Qn^2A=das@5%C0mzoknY;xz?q2hgRCH)#gUC-NNh~HCkKrYO}S9v`13I7I8gB zYeQZo*7;D1fk$0|&N&jfwgG~W$bM>&w0D_LQq%qoAe%>2YILdDEzv8DZnImZE6t4y z?ahr`-DVWpw@bvEsZ5}C6D+GH~Ec+CBg@Kh4ipwF_aYwOLGwN`g+e#u*yigEH)yh{on0ef*EZgQoO zGL&lTKU^E4O&5i4EkQcLQXcstFW-Ig9&M?V#vFS4hRY~dR)lpwagEH#Y51#jStK@; z1Ow6FU{I+LDpk(XZmx4``3me#WH2&RUa8R1!s03FAk8&Y3c8@QrHPu6?@If~89fUPE=`I~hw8ckC9Xmu2k~?y|j6T%YM#c5hq(>65kOMQa6U1eK28PDsS%J-0{8*+=+$eRPd13K28M~b(*i3F__8#)ZIn9C%vxHKrfaeJ9rGcX&07>M Ya`8C3`nU!~#s|3uhx%;p)h=cM0NDi=EdT%j diff --git a/taskflow/common/.config.py.swp b/taskflow/common/.config.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..26ac485a870ebf1efefcac9faac1d1632afe6a57 GIT binary patch literal 12288 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 AH~;_u literal 0 HcmV?d00001 diff --git a/taskflow/db/sqlalchemy/.models.py.swp b/taskflow/db/sqlalchemy/.models.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..74b81ccac22ff2ddd923f2a58fa82983a53f1e76 GIT binary patch literal 16384 zcmeI3Uu+yl9mlsxTA-y3|0)DRbaFx58J*XT(~4r`P$#y@rLnEp=R{EmtGV5|^V+*R zm;K|*foP#B1R?QA`T~{c0}oV!N=QVs(=!7#xnb;dECJD4#Sw4{Q9|v+N+1$Lx!;>qUgcn#~!Aj z{jTNdnTL)oo|*sT#r!46B~SLIV*F^+52rO1UGcbQZwkLZ zD!3*Gd@C9%ZJOXar zXBgiCUj|8*zGWAG#J z40r-;fhAA}4}gQ<4{tGy=fGpY1Lwg8I0g=bTX(@0_zw6A@WBRXf=O@>xEuWWPQ&;q z_zCzX*Z~Q+3?{(+;61D&wy)S0lXjl69+iI z1+RgpfdwkyAE?*A169AshOP;N;W{O~#1Cp!*QwT7BZx&ugmu;pU7v@2Yg_c^nqeY# z$Ms~VCFQoYJI#^|h1&@p75!Q@jbS3j#6*2pMm-s-FFf{1okhu#XZKc?F^?i?vpLq} zEl<>{y|(4GEcFnDI61$*X!;`N4v%@=P?=LnLlGxoz&vSl&vauE0zazhqEQ4Ll5~+y z)V8D>2qzDu2>Iom7+Y=y6K5fxud1l@KDsS1XNPFp&1bG$3zYs&ced$Ko;4$F47u*u^JgNo)tQ zS1?kHjF>dq4V*yZTTsrS|F}`wbyNo<_oz+_zSq$xl)odjL6PYSxf|ui=?Ok+6S?2? zgf112iL18g#w6TA()C=MMx_WHPfX}4&~X`q3i`1r0w?OZ@g_#|NR3ZP;9f~Y71f$W z)<*R}j{&g17={w#{g4w`%?#IA9QJclStRZ_Z(`j+@^u=R#t9xFFzo@ua;rk>F(R$@ zbaGpObWOB?L4TSXZVy^fI~0id#?o3=Op}r225#(f&;5*W(3+MwDp>iIh4ZizSr&pm zTlM?+!qE~z2Qy7|w%P~+xp1=jITal;oaB*Uwufm=%^s)W8(Y@jLDHb8L$VJiDRMdr zQ72Y57_Pyj$DOD))PK97w9#U%P(&DGEESqctA0Z+lmwGSaac$VI*H#MYp~@8j@9KM z_xCmD`dyFuX1|MhqKVNsEz_Au2DS7l!WM)rLmpEz)en~wC3O>FUIx-77XSNEDl=OR~v$MEri8&Z~hGS;2 zbjK|$NY}B_2|9JX;;XY|Oz=h0TVnGo7ulnYl?9B+ z7|G#_xY|Vr#pDxG(L7f;CR-P3MW?MfE{1=#40J}_XP60!5zzK{z$)|Wtg&99rE+7v z&Mq{Xr&l+c+T2FqQFfuYlDHuTu~wg9RYUU+hBp+qN1pIbC=eD)TF>@SovLyo*^YZW z6vk0)iUehwaonAqn(Fm>Chu~5&W%>snSwo1H<~)zIJLO4zBoB!PG`wDvt_r>WV=`o zSnO(}wC+wYGO7up?ZT&YPJ<`t$MBQ~wqP_57So&TqD+|2VYd}?H_*n?YAp&kubgCQ zNS&P*A+25*9Aq`B`brv9nfN&CYnz$pr{H(!b~a;HJ2k;(rjH$GYv@W5ObT{dMkEuP z_dK>nks`JxA`$MOMzuF1$!FL_zA5DqTJoEFCq&8}*Pq3x){0`;oqLd>3!@rbC*GtR zRLLL+-}|!3k4!=)2ae1#^)WC#F=+q4f&K0V_QtgT&))C9gnj-sum(O1J_L>e1NJOb_qzrnu$2KWYe0(8I$a1a~-cYxnv z|9=B~A3O!FgKe+?4uku^U$O81CHMt+4ty6p36?+|yc7HlW&1U_4!#CH4^(+koboCa zC>1CbC>1CbC>1CbcvBRh)$gvuXj30BSlsh!v`N%k{~FG7=qM=-RC`+-OQ#2DgR^g! z&J)rDjchlRZ}o5po}R1gLvw>NSDV{7q{Zh@QhnYrIAPj5Sf2|-c_3}fbxJxk&7W&` zbO>#%aI`-hm><0iw$x@v1Ogj&VbLR4^%tq7GE5lyy}fePH9aCTQP8 z|6PhrW35rmtLd$+PF9l4TiJ z^m`yQ%6LrMkv%ks;g&OASRFF#?}*ssXi@O2^Q33%b7LB$_O_Vtwi_gJ-m{W8J0n|p zL&VLPN*ONOuKPXeWY_z#+pL%IU3yop>CK4BS=L3t{(DNNxsOph4ONFXoL*qj*}|Z~ z<`r>Pc245G=9tRRdZr`rZM`qmEwK20wK#AiG<(rW;$|6S{=Jd+q?F<4JJP|^(U+wE E1~dT(wg3PC literal 0 HcmV?d00001 diff --git a/taskflow/db/sqlalchemy/api.py b/taskflow/db/sqlalchemy/api.py index c6163e5c..63305d53 100644 --- a/taskflow/db/sqlalchemy/api.py +++ b/taskflow/db/sqlalchemy/api.py @@ -33,3 +33,171 @@ def model_query(context, *args, **kwargs): query = session.query(*args) return query + +""" +LOGBOOK +""" + +def logbook_get(context, lb_id, session=None): + """Return a logbook with matching lb_id""" + query = model_query(context, models.LogBook, session=session).\ + filter_by(logbook_id=lb_id) + + if not query: + raise exception.NotFound("No LogBook found with id " + "%s." % (lb_id,)) + + return query.first() + +def logbook_get_by_name(context, lb_name): + """Return all logbooks with matching name""" + query = model_query(context, models.LogBook).\ + filter_by(name=lb_name) + + if not query: + raise exception.NotFound("LogBook %s not found." + % (lb_name,)) + + return query.all() + +def logbook_create(context, name, lb_id=None): + """Create a new logbook""" + lb_ref = models.LogBook() + lb_ref.name = name + if lb_id: + lb_ref.logbook_id = lb_id + lb_ref.save() + + return lb_ref + +def logbook_get_workflows(context, lb_id): + """Return all workflows associated with a logbook""" + lb = logbook_get(context, lb_id) + + return lb.workflows + +def logbook_add_workflow(context, lb_id, wf_name): + """Add Workflow to given LogBook""" + session = get_session() + with session.begin(): + wf = workflow_get(context, wf_name, session=session) + lb = logbook_get(context, lb_id, session=session) + + lb.workflows.append(wf) + + return lb.workflows + +""" +JOB +""" + +def job_get(context, job_id, session=None): + """Return Job with matching job_id""" + query = model_query(context, models.Workflow, session=session).\ + filter_by(job_id=job_id) + + if not query: + raise exception.NotFound("No Job with id %s found" + % (job_id,)) + + +""" +WORKFLOW +""" + +def workflow_get(context, wf_name, session=None): + """Return one workflow with matching workflow_id""" + query = model_query(context, models.Workflow, session=session).\ + filter_by(name=wf_name) + + if not query: + raise exception.NotFound("Workflow %s not found." % (wf_name,)) + + return query.first() + +def workflow_get_all(context): + """Return all workflows""" + results = model_query(context, models.Workflow).all() + + if not results: + raise exception.NotFound("No Workflows were found.") + + return results + +def workflow_get_names(context): + """Return all workflow names""" + results = model_query(context, models.Workflow.name).all() + + return zip(*results) + +def workflow_get_tasks(context, wf_name): + """Return all tasks for a given Workflow""" + wf = workflow_get(context, wf_name) + + return wf.tasks + +def workflow_add_task(context, wf_id, task_id): + """Add a task to a given workflow""" + session = get_session() + with session.begin(): + task = task_get(context, task_id, session=session) + wf = workflow_get(context, wf_id, session=session) + wf.tasks.append(task) + return wf.tasks + +def workflow_create(context, workflow_name): + """Create new workflow with workflow_id""" + workflow_ref = models.Workflow() + workflow_ref.name = workflow_name + workflow_ref.save() + + return workflow_ref + +def workflow_destroy(context, wf_id): + """Delete a given Workflow""" + session = get_session() + with session.begin(): + wf = workflow_get(context, wf_id, session=session) + wf.delete() + +""" +TASK +""" + +def task_get(context, task_id, session=None): + """Return Task with task_id""" + result = model_query(context, models.Task, session=session).\ + filter_by(task_id=task_id) + + if not result: + raise exception.NotFound("No Task found with id " + "%s." % (task_id,)) + + return result + +def task_create(context, task_name, wf_id, task_id=None): + """Create task associated with given workflow""" + task_ref = models.Task() + task_ref.name = task_name + task_ref.wf_id = wf_id + if task_id: + task_ref.task_id = task_id + task_ref.save() + + return task_ref + +def task_update(context, task_id, values): + """Update Task with given values""" + session = get_session() + with session.begin(): + task = task_get(context, task_id) + + task.update(values) + task.save() + +def task_destroy(context, task_id): + """Delete an existing Task""" + session = get_session() + with session.begin(): + task = task_get(context, task_id, session=session) + task.delete() diff --git a/taskflow/db/sqlalchemy/models.py b/taskflow/db/sqlalchemy/models.py index 6db81578..a7f754b5 100644 --- a/taskflow/db/sqlalchemy/models.py +++ b/taskflow/db/sqlalchemy/models.py @@ -22,7 +22,7 @@ SQLAlchemy models for taskflow data. from oslo.config import cfg -from sqlalchemy import Column, Integer, String, Table +from sqlalchemy import Column, Integer, String, Table, MetaData from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import object_mapper, relationship, backref @@ -31,13 +31,12 @@ from sqlalchemy import types as types from json import dumps, loads -from taskflow.db.sqlalchemy.session import get_session +from taskflow.db.sqlalchemy.session import get_session, get_engine from taskflow.openstack.common import timeutils, uuidutils CONF = cfg.CONF BASE = declarative_base() - class Json(types.TypeDecorator, types.MutableType): impl = types.Text @@ -128,6 +127,8 @@ class LogBook(BASE, TaskFlowBase): __tablename__ = 'logbook' id = Column(Integer, primary_key=True) + logbook_id = Column(String, default=uuidutils.generate_uuid, + unique=True) name = Column(String) workflows = relationship("Workflow", secondary=workflow_logbook_assoc) @@ -138,7 +139,8 @@ class Job(BASE, TaskFlowBase): __tablename__ = 'job' id = Column(Integer, primary_key=True) - job_id = Column(String, default=uuidutils.generate_uuid) + job_id = Column(String, default=uuidutils.generate_uuid, + unique=True) name = Column(String) owner = Column(String) state = Column(String) @@ -152,8 +154,7 @@ class Workflow(BASE, TaskFlowBase): __tablename__ = 'workflow' id = Column(Integer, primary_key=True) - workflow_id = Column(String, default=uuidutils.generate_uuid) - name = Column(String) + name = Column(String, unique=True) tasks = relationship("Task", backref="workflow") class Task(BASE, TaskFlowBase): @@ -168,3 +169,6 @@ class Task(BASE, TaskFlowBase): exception = Column(String) stacktrace = Column(String) workflow_id = Column(String, ForeignKey('workflow.id')) + +def create_tables(): + BASE.metadata.create_all(get_engine()) diff --git a/taskflow/db/sqlalchemy/session.py b/taskflow/db/sqlalchemy/session.py index 477565a7..b95238ad 100644 --- a/taskflow/db/sqlalchemy/session.py +++ b/taskflow/db/sqlalchemy/session.py @@ -78,17 +78,17 @@ def get_engine(): "convert_unicode": True } - if "sqlite" in connection_dict.drivername: - engine_args['poolclass'] = NullPool + if "sqlite" in connection_dict.drivername: + engine_args['poolclass'] = NullPool - _ENGINE = sqlalchemy.create_engine(_get_sql_connection(), - **engine_args) + _ENGINE = sqlalchemy.create_engine(_get_sql_connection(), + **engine_args) - if 'mysql' in connection_dict.drivername: - sqlalchemy.event.listen(_ENGINE, 'checkout', ping_listener) - if 'sqlite' in connection_dict.drivername: - sqlalchemy.event.listen(_ENGINE, 'connect', - synchronous_switch_listener) + if 'mysql' in connection_dict.drivername: + sqlalchemy.event.listen(_ENGINE, 'checkout', ping_listener) + if 'sqlite' in connection_dict.drivername: + sqlalchemy.event.listen(_ENGINE, 'connect', + synchronous_switch_listener) #TODO: Check to make sure engine connected diff --git a/taskflow/test.db b/taskflow/test.db new file mode 100644 index 0000000000000000000000000000000000000000..7aa4e1b67e100992b1e30315898b3e54678457c7 GIT binary patch literal 14336 zcmeH~&u-d45XQX;;D#zE6j^G7v{Doal%^s^Bu&&q9lE5bgtU(PCnsc#sVD?Twj+A! zp`_2zhv{4NWuop9yVy?JlUoVpTiIfF#$M0&n;nffebXBFHtjp^x#`oY^gtp+dQPb% zNix5qBgYpcVu;Qo=G)U%ZptnFlw>RSJ$s$G&d7X$0RsP$z;r7oD{E`y+rDphN49Tz zLvhP>ooNQ6hIZIuR9I*!zhb$z>D#>yFM$`_Yc!A9W13&Nyy)F!9`tClZLlMz)Aor$ z+izPf@wC{i!+q~Gz5Y_ug=uV_+tIaadzT~MqXzq62*3T=vM>CBGmbvw`KC4WUDJxa zI&s`#f8_zG7#zH0YJZu8k9&HILfDR*Jk6z8=%g zO`+^B8ClubAXi!_do))aPP0kTq2n)_N6yEtl?UF`3MN?{$^7$UdAKAig#wxK+T}&e6UVRRSX8rQrc}XvuS9tzLv$u% z+f5WJZ=aEpzeB_$A}j0bWcqL>BFI4SvlJ8aJ3A=}N``+sIMJJV)5ib-5C8!X009uV zM+DIS?@_WL6$C&41V8`;0s^A{6Zwb4FANX>0T2KI5CDONA@Gc3HBBn0m7VH#rM9iA zw4xrU>Opn)N$qK+vRnI;XK(*~V+a5L7bejN6a+v31V8`;QX_!=pBhSR1Ogxc0w4ea Y3qt_?e_>LEKtTWmKmY_lAT