Merge lp:~sinzui/charmworld/drain-ingest-queue into lp:~juju-jitsu/charmworld/trunk

Proposed by Curtis Hovey
Status: Merged
Approved by: Curtis Hovey
Approved revision: 292
Merged at revision: 289
Proposed branch: lp:~sinzui/charmworld/drain-ingest-queue
Merge into: lp:~juju-jitsu/charmworld/trunk
Diff against target: 93 lines (+46/-2)
3 files modified
charmworld/jobs/lp.py (+23/-0)
charmworld/jobs/tests/test_lp.py (+22/-2)
setup.py (+1/-0)
To merge this branch: bzr merge lp:~sinzui/charmworld/drain-ingest-queue
Reviewer Review Type Date Requested Status
Richard Harding (community) Approve
Review via email: mp+172353@code.launchpad.net

Commit message

Add a dequeue script so that the ingest queue can be drained during deploys.

Description of the change

Add a dequeue script so that the ingest queue can be drained during deploys.

RULES

    This branch, pre-implementation: abentley
    * Add a dequeue script that a user or charm could call to empty
      the ingest queue.

    Next Branches
    * Update the charmworld charm to call dequeue when the revno changes
    * Update ingest to only enqueue when the code's revno is => queue's
      revno.
    * Update the code to not pull from the queue when its revno is lower
      the queue's revno.

QA

    Using two terminals
    * T1: ssh to the staging.charmworld.com's charmworld app and get ready:
      juju ssh -e staging charmworld/6
      cd /home/webops_deploy/charmworld
      ls ./bin/dequeue
    * T2 ssh to the staging.charmworld.com's mongdb and check the queue size:
      juju ssh -e staging mongodb/0
      mongo juju --eval 'db["charm-queue"].count()'
    * T1: Run dequeue
      sudo su charmworld -c 'HOME=./ INI=./production.ini ./bin/dequeue'
    * T2: Verify the the queue was drained (the count is zero):
      mongo juju --eval 'db["charm-queue"].count()'

To post a comment you must log in.
Revision history for this message
Richard Harding (rharding) wrote :

Thanks, looks good to me.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'charmworld/jobs/lp.py'
2--- charmworld/jobs/lp.py 2013-06-11 18:45:50 +0000
3+++ charmworld/jobs/lp.py 2013-07-01 15:42:49 +0000
4@@ -98,6 +98,29 @@
5 log.info("Queued %s", charm)
6
7
8+def dequeue():
9+ """Dequeue all the charm data in the CHARM_QUEUE.
10+
11+ This is a script entry point to dequeue all charms. This might be done when
12+ when a running instance will get a code update that is incompatible with
13+ charm data in the queue.
14+ """
15+ configure_logging()
16+ log = logging.getLogger("charm.launchpad")
17+ settings = get_ini()
18+ connection = getconnection(settings)
19+ db = getdb(connection, settings.get('mongo.database'))
20+ try:
21+ lease_time = int(settings['script_lease_time']) * 60
22+ with lock('ingest-queue', lease_time, db, log):
23+ queue = get_queue(CHARM_QUEUE)
24+ queue_size = queue.size()
25+ queue.clear()
26+ log.info("Dequeued %s charms", queue_size)
27+ except LockHeld, error:
28+ log.warn(str(error))
29+
30+
31 def main():
32 configure_logging()
33 parser = argparse.ArgumentParser()
34
35=== modified file 'charmworld/jobs/tests/test_lp.py'
36--- charmworld/jobs/tests/test_lp.py 2013-06-10 11:35:18 +0000
37+++ charmworld/jobs/tests/test_lp.py 2013-07-01 15:42:49 +0000
38@@ -4,17 +4,23 @@
39 import json
40
41 from httmock import HTTMock
42-from mock import patch
43+from mock import (
44+ ANY,
45+ patch,
46+)
47
48 from charmworld.testing import (
49 factory,
50 JobTestBase,
51+ MONGO_DATABASE,
52 )
53
54 from charmworld.jobs.lp import (
55 all_charms,
56+ available_charms,
57+ CHARM_QUEUE,
58 db_charms,
59- available_charms,
60+ dequeue,
61 queue_charms,
62 )
63 from charmworld.jobs.utils import get_queue
64@@ -231,3 +237,17 @@
65 item = out_queue.next()
66 self.assertEqual(
67 {'branch_dir': 'foo', 'branch_spec': 'bar'}, item.payload)
68+
69+ def test_dequeue(self):
70+ queue = get_queue('test_queue')
71+ self.addCleanup(queue.clear)
72+ charm_data = factory.get_charm_json()
73+ queue.put(charm_data)
74+ self.assertEqual(1, queue.size())
75+ with patch('charmworld.jobs.lp.getdb', return_value=self.db) as getdb:
76+ lp_get_queue = 'charmworld.jobs.lp.get_queue'
77+ with patch(lp_get_queue, return_value=queue) as gq:
78+ dequeue()
79+ getdb.assert_called_with(ANY, MONGO_DATABASE)
80+ gq.assert_called_with(CHARM_QUEUE)
81+ self.assertEqual(0, queue.size())
82
83=== modified file 'setup.py'
84--- setup.py 2013-05-03 13:13:14 +0000
85+++ setup.py 2013-07-01 15:42:49 +0000
86@@ -34,6 +34,7 @@
87 main = charmworld:main
88 [console_scripts]
89 enqueue = charmworld.jobs.lp:main
90+ dequeue = charmworld.jobs.lp:dequeue
91 ingest-queued = charmworld.jobs.worker:main
92 migrations = migrations.migrate:main
93 es-update = charmworld.search:update_main

Subscribers

People subscribed via source and target branches