Merge lp:~rharding/juju-gui/bundle-counts into lp:juju-gui/experimental

Proposed by Richard Harding
Status: Merged
Merged at revision: 1208
Proposed branch: lp:~rharding/juju-gui/bundle-counts
Merge into: lp:juju-gui/experimental
Diff against target: 2636 lines (+1303/-1167)
9 files modified
app/models/bundle.js (+42/-0)
app/models/charm.js (+18/-1)
app/templates/bundle-token.handlebars (+1/-0)
app/templates/bundle.handlebars (+2/-0)
test/data/browserbundle.json (+1199/-1155)
test/test_bundle_details_view.js (+3/-0)
test/test_model_bundle.js (+30/-8)
test/test_token.js (+6/-1)
test/test_utils.js (+2/-2)
To merge this branch: bzr merge lp:~rharding/juju-gui/bundle-counts
Reviewer Review Type Date Requested Status
Juju GUI Hackers Pending
Review via email: mp+196135@code.launchpad.net

Description of the change

Display bundle download counts in the UI.

- Update the model to carry the attribute from the api.
- Update the token to display the "Deployed X times".
- Update the details to also display the count.
- Drive-by to update the attributes in the charm model.
- Update tests with updated api download from the server that includes the
download counts. Required updating tests to the new data.

https://codereview.appspot.com/30210044/

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

Reviewers: mp+196135_code.launchpad.net,

Message:
Please take a look.

Description:
Display bundle download counts in the UI.

- Update the model to carry the attribute from the api.
- Update the token to display the "Deployed X times".
- Update the details to also display the count.
- Drive-by to update the attributes in the charm model.
- Update tests with updated api download from the server that includes
the
download counts. Required updating tests to the new data.

https://code.launchpad.net/~rharding/juju-gui/bundle-counts/+merge/196135

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/30210044/

Affected files (+1306, -1168 lines):
   A [revision details]
   M app/models/bundle.js
   M app/models/charm.js
   M app/templates/bundle-token.handlebars
   M app/templates/bundle.handlebars
   M test/data/browserbundle.json
   M test/test_bundle_details_view.js
   M test/test_model_bundle.js
   M test/test_token.js
   M test/test_utils.js

lp:~rharding/juju-gui/bundle-counts updated
1209. By Richard Harding

Move the deployed text

Revision history for this message
Richard Harding (rharding) wrote :
Revision history for this message
Richard Harding (rharding) wrote :

Reviewer comments

https://codereview.appspot.com/30210044/diff/20001/app/models/bundle.js
File app/models/bundle.js (right):

https://codereview.appspot.com/30210044/diff/20001/app/models/bundle.js#newcode57
app/models/bundle.js:57: this.set('recent_download_count',
cfg.downloads_in_past_30_days);
the api is downloads_in_past_30_days but we've moved that before from 90
and such. So we map it to a more generic "recent" attr.

https://codereview.appspot.com/30210044/diff/20001/app/models/charm.js
File app/models/charm.js (right):

https://codereview.appspot.com/30210044/diff/20001/app/models/charm.js#newcode476
app/models/charm.js:476: downloads: {
drive-by, not sure how this attr was missing from before.

https://codereview.appspot.com/30210044/diff/20001/app/templates/bundle-token.handlebars
File app/templates/bundle-token.handlebars (right):

https://codereview.appspot.com/30210044/diff/20001/app/templates/bundle-token.handlebars#newcode26
app/templates/bundle-token.handlebars:26: <div>Deployed {{downloads}}
{{pluralize 'time' downloads}}</div>
per UX, make the first item in the metadata list.

https://codereview.appspot.com/30210044/diff/20001/test/data/browserbundle.json
File test/data/browserbundle.json (right):

https://codereview.appspot.com/30210044/diff/20001/test/data/browserbundle.json#newcode1
test/data/browserbundle.json:1: {
IGNORE ME: Updated test file due to api changes. It's a mechanical
change of downloading new api result.

https://codereview.appspot.com/30210044/diff/20001/test/test_model_bundle.js
File test/test_model_bundle.js (right):

https://codereview.appspot.com/30210044/diff/20001/test/test_model_bundle.js#newcode184
test/test_model_bundle.js:184: assert.lengthOf(commits, 5);
the rest of these are making the old tests match the updated api
response.

https://codereview.appspot.com/30210044/diff/20001/test/test_model_bundle.js#newcode195
test/test_model_bundle.js:195: // Manually added a second author into
the test data from the server.
this was manually tweaked in that api response so noted it here for
future test failures.

https://codereview.appspot.com/30210044/

Revision history for this message
Jeff Pihach (hatch) wrote :

LGTM Thanks for adding this to the UI.

Using a valueFn here looks to be an unnecessary performance hit.

https://codereview.appspot.com/30210044/diff/20001/app/models/bundle.js
File app/models/bundle.js (right):

https://codereview.appspot.com/30210044/diff/20001/app/models/bundle.js#newcode159
app/models/bundle.js:159: valueFn: function() {
Why can't you just set the initial value to 0 vs a valueFn?

https://codereview.appspot.com/30210044/diff/20001/app/models/bundle.js#newcode177
app/models/bundle.js:177: valueFn: function() {
Same as above

https://codereview.appspot.com/30210044/diff/20001/app/models/charm.js
File app/models/charm.js (right):

https://codereview.appspot.com/30210044/diff/20001/app/models/charm.js#newcode482
app/models/charm.js:482: valueFn: function() {
same as in the bundle.js

https://codereview.appspot.com/30210044/

Revision history for this message
Richard Harding (rharding) wrote :

*** Submitted:

Display bundle download counts in the UI.

- Update the model to carry the attribute from the api.
- Update the token to display the "Deployed X times".
- Update the details to also display the count.
- Drive-by to update the attributes in the charm model.
- Update tests with updated api download from the server that includes
the
download counts. Required updating tests to the new data.

R=jeff.pihach
CC=
https://codereview.appspot.com/30210044

https://codereview.appspot.com/30210044/

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'app/models/bundle.js'
2--- app/models/bundle.js 2013-11-05 16:53:21 +0000
3+++ app/models/bundle.js 2013-11-21 18:07:56 +0000
4@@ -51,6 +51,12 @@
5 * @param {Object} cfg The configuration object.
6 */
7 initializer: function(cfg) {
8+ // Map this to a name that we can change as the timeframes change
9+ // without having to update all users of the code.
10+ if (cfg && cfg.downloads_in_past_30_days) {
11+ this.set('recent_download_count', cfg.downloads_in_past_30_days);
12+ }
13+
14 this.loaded = false;
15 this.on('load', function() { this.loaded = true; });
16 },
17@@ -137,6 +143,42 @@
18 },
19 data: {},
20 deployer_file_url: {},
21+
22+ /**
23+ @attribute downloads
24+ @default 0
25+ @type {Integer}
26+
27+ */
28+ downloads: {
29+ /**
30+ @method downloads.valueFn
31+ @return {Integer} the number of downloads for the bundle.
32+
33+ */
34+ valueFn: function() {
35+ return 0;
36+ }
37+ },
38+
39+ /**
40+ @attribute recent_download_count
41+ @default 0
42+ @type {Integer}
43+
44+ */
45+ recent_download_count: {
46+ /**
47+ @method recent_download_count.valueFn
48+ @return {Integer} the number of downloads in the 'recent' time
49+ frame.
50+
51+ */
52+ valueFn: function() {
53+ return 0;
54+ }
55+ },
56+
57 relations: {
58 /**
59 Return the relations data as a list of objects.
60
61=== modified file 'app/models/charm.js'
62--- app/models/charm.js 2013-11-01 23:04:50 +0000
63+++ app/models/charm.js 2013-11-21 18:07:56 +0000
64@@ -467,6 +467,23 @@
65 }
66 }
67 },
68+ /**
69+ @attribute downloads
70+ @default 0
71+ @type {Integer}
72+
73+ */
74+ downloads: {
75+ /**
76+ @method downloads.valueFn
77+ @return {Integer} the number of downloads for the charm.
78+
79+ */
80+ valueFn: function() {
81+ return 0;
82+ }
83+ },
84+
85 files: {
86 value: [],
87 /**
88@@ -671,7 +688,7 @@
89 * Mapped from the downloads_in_past_30_days in the API.
90 *
91 * @attribute recent_download_count
92- * @default undefined
93+ * @default 0
94 * @type {Int} number of downloads in 'recent' time.
95 *
96 */
97
98=== modified file 'app/templates/bundle-token.handlebars'
99--- app/templates/bundle-token.handlebars 2013-11-04 16:40:41 +0000
100+++ app/templates/bundle-token.handlebars 2013-11-21 18:07:56 +0000
101@@ -23,6 +23,7 @@
102 {{basket_name}}:{{ name }}
103 </span>
104 <span class="metadata">
105+ <div>Deployed {{downloads}} {{pluralize 'time' downloads}}</div>
106 <div><strong>{{serviceCount}} {{pluralize 'service' serviceCount}} | {{unitCount}} {{pluralize 'unit' unitCount}}</strong></div>
107 <div>{{#if series}}{{series}} |{{/if}} {{#if is_approved}}Recommended{{else}}{{owner}}{{/if}}</div>
108 </span>
109
110=== modified file 'app/templates/bundle.handlebars'
111--- app/templates/bundle.handlebars 2013-11-13 10:06:38 +0000
112+++ app/templates/bundle.handlebars 2013-11-21 18:07:56 +0000
113@@ -26,6 +26,7 @@
114 <a href="" class="add deploy">Deploy this bundle</a>
115 </div>
116 <ul>
117+ <li>Deployed {{downloads}} {{pluralize 'time' downloads}}</li>
118 <li>
119 {{serviceCount}}
120 {{pluralize 'service' serviceCount}} |
121@@ -177,6 +178,7 @@
122 {{else}}
123 1
124 {{/if}}
125+
126 </li>
127 {{/unless}}
128 {{#if origService.options}}
129
130=== modified file 'test/data/browserbundle.json'
131--- test/data/browserbundle.json 2013-10-31 14:34:07 +0000
132+++ test/data/browserbundle.json 2013-11-21 18:07:56 +0000
133@@ -1,1159 +1,1203 @@
134-
135 {
136- "basket_name": "wiki",
137- "basket_revision": 5,
138- "branch_deleted": false,
139- "changes": [
140- {
141- "authors": [
142- "Brad Crittenden <bac@example.com>"
143- ],
144- "committer": "Brad Crittenden <bac@example.com>",
145- "created": 1378218161.439,
146- "message": "Correct icon",
147- "revno": 3
148- },
149- {
150- "authors": [
151- "Jorge O. O'Castro <jorge@example.com>",
152- "Brad Crittenden <bac@example.com>"
153- ],
154- "committer": "Brad Crittenden <bac@example.com>",
155- "created": 1377718535.465,
156- "message": "Added README and icon",
157- "revno": 2
158- },
159- {
160- "authors": [
161- "Brad Crittenden <bac@example.com>"
162- ],
163- "committer": "Brad Crittenden <bac@example.com>",
164- "created": 1375449744.902,
165- "message": "Initial checking of working config.",
166- "revno": 1
167- }
168- ],
169- "charm_metadata": {
170- "haproxy": {
171- "categories": [
172- "cache-proxy"
173- ],
174- "code_source": {
175- "bugs_link": "https://bugs.launchpad.net/charms/+source/haproxy",
176- "last_log": "merging lp:~davidpbritton/charms/precise/haproxy/trunk ",
177- "location": "lp:~charmers/charms/precise/haproxy/trunk",
178- "revision": "67",
179- "revisions": [
180- {
181- "authors": [
182- {
183- "email": "mark.mims@canonical.com",
184- "name": "Mark Mims"
185- }
186- ],
187- "date": "2013-06-03T23:13:29Z",
188- "message": "merging lp:~davidpbritton/charms/precise/haproxy/trunk ",
189- "revno": 67
190- },
191- {
192- "authors": [
193- {
194- "email": "jorge@ubuntu.com",
195- "name": "Jorge O. Castro"
196- }
197- ],
198- "date": "2013-04-22T19:42:18Z",
199- "message": "Add categories.\n",
200- "revno": 66
201- },
202- {
203- "authors": [
204- {
205- "email": "juan.negron@canonical.com",
206- "name": "Juan L. Negron"
207- }
208- ],
209- "date": "2013-02-15T04:55:15Z",
210- "message": "When the reverseproxy relation changes, the website proxy will likely need to be updated, so trigger a config-changed to notify the other side of the relation that it will need to update.\n\nI'm not sure if this the appropriate way to handle this situation, but in practice it seems to work. Please let me know if there is a more accurate or correct way to do it. LP:148605",
211- "revno": 65
212- },
213- {
214- "authors": [
215- {
216- "email": "juan.negron@canonical.com",
217- "name": "Juan L. Negron"
218- }
219- ],
220- "date": "2013-02-15T04:29:14Z",
221- "message": "Merging LP:148065 Relation driven proxying or multi-service proxying",
222- "revno": 64
223- },
224- {
225- "authors": [
226- {
227- "email": "juan.negron@canonical.com",
228- "name": "Juan L. Negron"
229- }
230- ],
231- "date": "2013-01-15T02:04:19Z",
232- "message": "Merging mthaddon's branch. Include nrpe-external-master relation, and ability to inject pre-install hooks if necessary. MP:139978",
233- "revno": 63
234- },
235- {
236- "authors": [
237- {
238- "email": "juan.negron@canonical.com",
239- "name": "Juan L. Negron"
240- }
241- ],
242- "date": "2012-11-21T16:57:10Z",
243- "message": "When a unit of a service having a relation with haproxy is juju-removed, ha proxy was not removing the line for this unit in /etc/haproxy.cfg.",
244- "revno": 62
245- },
246- {
247- "authors": [
248- {
249- "email": "marco@ceppi.net",
250+ "basket_name": "wiki",
251+ "basket_revision": 5,
252+ "branch_deleted": false,
253+ "branch_spec": "~benji/charms/bundles/wiki/bundle",
254+ "changes": [
255+ {
256+ "authors": [
257+ "Benji York <benji.york@canonical.com>"
258+ ],
259+ "committer": "Benji York <benji.york@canonical.com>",
260+ "created": 1380814176.735,
261+ "message": "add a series to the bundle\n",
262+ "revno": 5
263+ },
264+ {
265+ "authors": [
266+ "Jorge O. O'Castro <jorge@example.com>",
267+ "Benji York <benji.york@canonical.com>"
268+ ],
269+ "committer": "Benji York <benji.york@canonical.com>",
270+ "created": 1380809461.559,
271+ "message": "make the bundle work better (relations working now)",
272+ "revno": 4
273+ },
274+ {
275+ "authors": [
276+ "Brad Crittenden <bac@canonical.com>"
277+ ],
278+ "committer": "Brad Crittenden <bac@canonical.com>",
279+ "created": 1378218161.439,
280+ "message": "Correct icon",
281+ "revno": 3
282+ },
283+ {
284+ "authors": [
285+ "Brad Crittenden <bac@canonical.com>"
286+ ],
287+ "committer": "Brad Crittenden <bac@canonical.com>",
288+ "created": 1377718535.465,
289+ "message": "Added README and icon",
290+ "revno": 2
291+ },
292+ {
293+ "authors": [
294+ "Brad Crittenden <bac@canonical.com>"
295+ ],
296+ "committer": "Brad Crittenden <bac@canonical.com>",
297+ "created": 1375449744.902,
298+ "message": "Initial checking of working config.",
299+ "revno": 1
300+ }
301+ ],
302+ "charm_metadata": {
303+ "haproxy": {
304+ "categories": [
305+ "cache-proxy"
306+ ],
307+ "code_source": {
308+ "bugs_link": "https://bugs.launchpad.net/charms/+source/haproxy",
309+ "last_log": "[sidnei] Fix tests\n",
310+ "location": "lp:~charmers/charms/precise/haproxy/trunk",
311+ "revision": "70",
312+ "revisions": [
313+ {
314+ "authors": [
315+ {
316+ "email": "marco@ceppi.net",
317+ "name": "Marco Ceppi"
318+ }
319+ ],
320+ "date": "2013-11-04T13:52:06Z",
321+ "message": "[sidnei] Fix tests\n",
322+ "revno": 70
323+ },
324+ {
325+ "authors": [
326+ {
327+ "email": "marco@ceppi.net",
328+ "name": "Marco Ceppi"
329+ }
330+ ],
331+ "date": "2013-11-04T12:41:56Z",
332+ "message": "[sidnei] This restores some functionality that got removed by accident during my refactoring and was even documented in README.md, namely, that a service can specify a piece of yaml via relation set services=<> to be used when generating the haproxy stanzas.\n",
333+ "revno": 69
334+ },
335+ {
336+ "authors": [
337+ {
338+ "email": "marco@ceppi.net",
339+ "name": "Marco Ceppi"
340+ }
341+ ],
342+ "date": "2013-10-17T03:33:48Z",
343+ "message": "[sidnei] The 'all_services' config now supports a static list of servers to be used *in addition* to the ones provided via relation.\n[sidnei] When more than one haproxy units exist, the configured service is upgraded in-place to a mode where traffic is routed to a single haproxy unit (the first one in unit-name order) and the remaining ones are configured as 'backup'. This is done to allow the enforcement of a 'maxconn' session in the configured services, which would not be possible to enforce otherwise.\n[sidnei] Changes to the configured services are properly propagated to the upstream relation.\n",
344+ "revno": 68
345+ },
346+ {
347+ "authors": [
348+ {
349+ "email": "mark.mims@canonical.com",
350+ "name": "Mark Mims"
351+ }
352+ ],
353+ "date": "2013-06-03T23:13:29Z",
354+ "message": "merging lp:~davidpbritton/charms/precise/haproxy/trunk ",
355+ "revno": 67
356+ },
357+ {
358+ "authors": [
359+ {
360+ "email": "jorge@ubuntu.com",
361+ "name": "Jorge O. Castro"
362+ }
363+ ],
364+ "date": "2013-04-22T19:42:18Z",
365+ "message": "Add categories.\n",
366+ "revno": 66
367+ },
368+ {
369+ "authors": [
370+ {
371+ "email": "juan.negron@canonical.com",
372+ "name": "Juan L. Negron"
373+ }
374+ ],
375+ "date": "2013-02-15T04:55:15Z",
376+ "message": "When the reverseproxy relation changes, the website proxy will likely need to be updated, so trigger a config-changed to notify the other side of the relation that it will need to update.\n\nI'm not sure if this the appropriate way to handle this situation, but in practice it seems to work. Please let me know if there is a more accurate or correct way to do it. LP:148605",
377+ "revno": 65
378+ },
379+ {
380+ "authors": [
381+ {
382+ "email": "juan.negron@canonical.com",
383+ "name": "Juan L. Negron"
384+ }
385+ ],
386+ "date": "2013-02-15T04:29:14Z",
387+ "message": "Merging LP:148065 Relation driven proxying or multi-service proxying",
388+ "revno": 64
389+ },
390+ {
391+ "authors": [
392+ {
393+ "email": "juan.negron@canonical.com",
394+ "name": "Juan L. Negron"
395+ }
396+ ],
397+ "date": "2013-01-15T02:04:19Z",
398+ "message": "Merging mthaddon's branch. Include nrpe-external-master relation, and ability to inject pre-install hooks if necessary. MP:139978",
399+ "revno": 63
400+ },
401+ {
402+ "authors": [
403+ {
404+ "email": "juan.negron@canonical.com",
405+ "name": "Juan L. Negron"
406+ }
407+ ],
408+ "date": "2012-11-21T16:57:10Z",
409+ "message": "When a unit of a service having a relation with haproxy is juju-removed, ha proxy was not removing the line for this unit in /etc/haproxy.cfg.",
410+ "revno": 62
411+ },
412+ {
413+ "authors": [
414+ {
415+ "email": "marco@ceppi.net",
416+ "name": "Marco Ceppi"
417+ }
418+ ],
419+ "date": "2012-10-29T21:04:13Z",
420+ "message": "No more hard coded paths",
421+ "revno": 61
422+ }
423+ ],
424+ "type": "bzr"
425+ },
426+ "date_created": "2012-04-16T18:29:51Z",
427+ "description": "HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments. It features connection persistence through HTTP cookies, load balancing, header addition, modification, deletion both ways. It has request blocking capabilities and provides interface to display server status.",
428+ "distro_series": "precise",
429+ "downloads": 1143,
430+ "downloads_in_past_30_days": 154,
431+ "files": [
432+ "hooks/website-relation-joined",
433+ "hooks/tests/test_nrpe_hooks.py",
434+ "hooks/nrpe-external-master-relation-joined",
435+ "hooks/charmhelpers/fetch/bzrurl.py",
436+ "hooks/tests/test_peer_hooks.py",
437+ "hooks/tests/test_config_changed_hooks.py",
438+ "hooks/tests/test_reverseproxy_hooks.py",
439+ "hooks/hooks.py",
440+ "hooks/tests/utils_for_tests.py",
441+ "hooks/charmhelpers/core/host.py",
442+ "hooks/start",
443+ "hooks/config-changed",
444+ "hooks/reverseproxy-relation-broken",
445+ "metadata.yaml",
446+ "hooks/stop",
447+ "hooks/tests/test_website_hooks.py",
448+ "hooks/charmhelpers/contrib/charmsupport/volumes.py",
449+ "hooks/munin-relation-changed",
450+ "hooks/reverseproxy-relation-departed",
451+ "hooks/peer-relation-joined",
452+ "hooks/website-relation-changed",
453+ "config.yaml",
454+ "hooks/peer-relation-changed",
455+ "hooks/charmhelpers/contrib/charmsupport/nrpe.py",
456+ "hooks/reverseproxy-relation-changed",
457+ "hooks/upgrade-charm",
458+ "hooks/charmhelpers/fetch/archiveurl.py",
459+ "README.md",
460+ "hooks/tests/__init__.py",
461+ "hooks/charmhelpers/core/hookenv.py",
462+ "hooks/install",
463+ "hooks/local-monitors-relation-joined",
464+ "hooks/tests/test_helpers.py"
465+ ],
466+ "id": "precise/haproxy-21",
467+ "is_approved": true,
468+ "is_subordinate": false,
469+ "maintainer": {
470+ "email": "Juan Negron <juan@ubuntu.com>Tom Haddon <tom.haddon@canonical.com>",
471+ "name": ""
472+ },
473+ "name": "haproxy",
474+ "options": {
475+ "default_log": {
476+ "default": "global",
477+ "description": "Default log",
478+ "type": "string"
479+ },
480+ "default_mode": {
481+ "default": "http",
482+ "description": "Default mode",
483+ "type": "string"
484+ },
485+ "default_options": {
486+ "default": "httplog, dontlognull",
487+ "description": "Default options",
488+ "type": "string"
489+ },
490+ "default_retries": {
491+ "default": 3,
492+ "description": "Set the number of retries to perform on a server after a connection\nfailure. It is important to understand that this value applies to the\nnumber of connection attempts, not full requests. When a connection \nhas effectively been established to a server, there will be no more \nretry.\nIn order to avoid immediate reconnections to a server which is \nrestarting, a turn-around timer of 1 second is applied before a retry\noccurs.\n",
493+ "type": "int"
494+ },
495+ "default_timeouts": {
496+ "default": "queue 20000, client 50000, connect 5000, server 50000",
497+ "description": "Default timeouts",
498+ "type": "string"
499+ },
500+ "enable_monitoring": {
501+ "default": false,
502+ "description": "Enable monitoring",
503+ "type": "boolean"
504+ },
505+ "global_debug": {
506+ "default": false,
507+ "description": "Debug or not",
508+ "type": "boolean"
509+ },
510+ "global_group": {
511+ "default": "haproxy",
512+ "description": "Group",
513+ "type": "string"
514+ },
515+ "global_log": {
516+ "default": "127.0.0.1 local0, 127.0.0.1 local1 notice",
517+ "description": "Global log line ( multiples ... comma separated list )",
518+ "type": "string"
519+ },
520+ "global_maxconn": {
521+ "default": 4096,
522+ "description": "Sets the maximum per-process number of concurrent connections to\n<number>.\n",
523+ "type": "int"
524+ },
525+ "global_quiet": {
526+ "default": false,
527+ "description": "Quiet",
528+ "type": "boolean"
529+ },
530+ "global_spread_checks": {
531+ "default": 0,
532+ "descriptions": "Sometimes it is desirable to avoid sending health checks to servers at\nexact intervals, for instance when many logical servers are located on\nthe same physical server. With the help of this parameter, it becomes \npossible to add some randomness in the check interval between 0 and \n+/- 50%. A value between 2 and 5 seems to show good results.\n",
533+ "type": "int"
534+ },
535+ "global_user": {
536+ "default": "haproxy",
537+ "description": "User",
538+ "type": "string"
539+ },
540+ "monitoring_allowed_cidr": {
541+ "default": "127.0.0.1/32",
542+ "description": "CIDR allowed ( multiple CIDRs separated by space ) access to the\nmonitoring interface.\n",
543+ "type": "string"
544+ },
545+ "monitoring_password": {
546+ "default": "changeme",
547+ "description": "Password to the monitoring interface ( if \"changeme\", a new password\nwill be generated and displayed in juju-log )\n",
548+ "type": "string"
549+ },
550+ "monitoring_port": {
551+ "default": 10000,
552+ "description": "Default monitoring port",
553+ "type": "int"
554+ },
555+ "monitoring_stats_refresh": {
556+ "default": 3,
557+ "description": "Monitoring interface refresh interval (in seconds)",
558+ "type": "int"
559+ },
560+ "monitoring_username": {
561+ "default": "haproxy",
562+ "description": "Monitoring username",
563+ "type": "string"
564+ },
565+ "nagios_context": {
566+ "default": "juju",
567+ "description": "Used by the nrpe-external-master subordinate charm.\nA string that will be prepended to instance name to set the host name\nin nagios. So for instance the hostname would be something like:\n juju-postgresql-0\nIf you're running multiple environments with the same services in them\nthis allows you to differentiate between them.\n",
568+ "type": "string"
569+ },
570+ "package_status": {
571+ "default": "install",
572+ "description": "The status of service-affecting packages will be set to this value in the dpkg database.\nUseful valid values are \"install\" and \"hold\".\n",
573+ "type": "string"
574+ },
575+ "services": {
576+ "default": "- service_name: haproxy_service\n service_host: \"0.0.0.0\"\n service_port: 80\n service_options: [balance leastconn]\n server_options: maxconn 100\n",
577+ "description": "Services definition(s). Although the variable type is a string, this is\ninterpreted in the charm as yaml. To use multiple services within the\nsame haproxy instance, specify all of the variables (service_name,\nservice_host, service_port, service_options, server_options) with a \"-\"\nbefore the first variable, service_name, as above. Service options is a\ncomma separated list, server options will be appended as a string to\nthe individual server lines for a given listen stanza.\n",
578+ "type": "string"
579+ },
580+ "sysctl": {
581+ "default": "",
582+ "description": "YAML-formatted list of sysctl values, e.g.: '{ net.ipv4.tcp_max_syn_backlog : 65536 }'\n",
583+ "type": "string"
584+ }
585+ },
586+ "owner": "charmers",
587+ "rating_denominator": 0,
588+ "rating_numerator": 0,
589+ "relations": {
590+ "provides": {
591+ "local-monitors": {
592+ "interface": "local-monitors",
593+ "scope": "container"
594+ },
595+ "munin": {
596+ "interface": "munin-node"
597+ },
598+ "nrpe-external-master": {
599+ "interface": "nrpe-external-master",
600+ "scope": "container"
601+ },
602+ "website": {
603+ "interface": "http"
604+ }
605+ },
606+ "requires": {
607+ "reverseproxy": {
608+ "interface": "http"
609+ }
610+ }
611+ },
612+ "revision": 0,
613+ "summary": "fast and reliable load balancing reverse proxy",
614+ "tested_providers": {},
615+ "url": "cs:precise/haproxy-21"
616+ },
617+ "mediawiki": {
618+ "categories": [
619+ "applications"
620+ ],
621+ "code_source": {
622+ "bugs_link": "https://bugs.launchpad.net/charms/+source/mediawiki",
623+ "last_log": "merging lp:~dave-cheney/charms/precise/mediawiki/trunk as per https://code.launchpad.net/~dave-cheney/charms/precise/mediawiki/trunk/+merge/182803",
624+ "location": "lp:~charmers/charms/precise/mediawiki/trunk",
625+ "revision": "72",
626+ "revisions": [
627+ {
628+ "authors": [
629+ {
630+ "email": "mark.mims@canonical.com",
631+ "name": "Mark Mims"
632+ }
633+ ],
634+ "date": "2013-09-20T19:13:28Z",
635+ "message": "merging lp:~dave-cheney/charms/precise/mediawiki/trunk as per https://code.launchpad.net/~dave-cheney/charms/precise/mediawiki/trunk/+merge/182803",
636+ "revno": 72
637+ },
638+ {
639+ "authors": [
640+ {
641+ "email": "marco@ceppi.net",
642+ "name": "Marco Ceppi"
643+ }
644+ ],
645+ "date": "2013-08-14T05:16:21Z",
646+ "message": "Santize input from realtion-list",
647+ "revno": 71
648+ },
649+ {
650+ "authors": [
651+ {
652+ "email": "marco@ceppi.net",
653+ "name": "Marco Ceppi"
654+ }
655+ ],
656+ "date": "2013-04-25T18:19:21Z",
657+ "message": "Added icon.svg",
658+ "revno": 70
659+ },
660+ {
661+ "authors": [
662+ {
663+ "email": "jorge@ubuntu.com",
664+ "name": "Jorge O. Castro"
665+ }
666+ ],
667+ "date": "2013-04-22T19:36:55Z",
668+ "message": "Add a category\n",
669+ "revno": 69
670+ },
671+ {
672+ "authors": [
673+ {
674+ "email": "marco@ceppi.net",
675+ "name": "Marco Ceppi"
676+ }
677+ ],
678+ "date": "2013-01-24T18:26:58Z",
679+ "message": "Cleanup of PHP files according to http://www.mediawiki.org/wiki/Coding_conventions\n",
680+ "revno": 68
681+ },
682+ {
683+ "authors": [
684+ {
685+ "email": "marco@ceppi.net",
686+ "name": "Marco Ceppi"
687+ }
688+ ],
689+ "date": "2012-12-20T03:12:05Z",
690+ "message": "Typo in multi-unit command line",
691+ "revno": 67
692+ },
693+ {
694+ "authors": [
695+ {
696+ "email": "marco@ceppi.net",
697+ "name": "Marco Ceppi"
698+ }
699+ ],
700+ "date": "2012-12-19T20:23:25Z",
701+ "message": "Minor clean up and new README file\n",
702+ "revno": 66
703+ },
704+ {
705+ "authors": [
706+ {
707+ "email": "clint@fewbar.com",
708+ "name": "Clint Byrum"
709+ }
710+ ],
711+ "date": "2012-06-30T14:37:14Z",
712+ "message": "Bumping revision for modernizations",
713+ "revno": 65
714+ },
715+ {
716+ "authors": [
717+ {
718+ "email": "clint@fewbar.com",
719+ "name": "Clint Byrum"
720+ }
721+ ],
722+ "date": "2012-06-30T14:36:55Z",
723+ "message": "cleanups and modernizing things",
724+ "revno": 64
725+ },
726+ {
727+ "authors": [
728+ {
729+ "email": "clint@ubuntu.com",
730+ "name": "Clint Byrum"
731+ }
732+ ],
733+ "date": "2012-06-28T00:02:47Z",
734+ "message": "removing old broken munin bits",
735+ "revno": 63
736+ }
737+ ],
738+ "type": "bzr"
739+ },
740+ "date_created": "2012-04-16T18:29:51Z",
741+ "description": "MediaWiki is a wiki engine (a program for creating a collaboratively\nedited website). It is designed to handle heavy websites containing\nlibrary-like document collections, and supports user uploads of\nimages/sounds, multilingual content, TOC autogeneration, ISBN links,\netc.\n",
742+ "distro_series": "precise",
743+ "downloads": 2206,
744+ "downloads_in_past_30_days": 169,
745+ "files": [
746+ "hooks/slave-relation-departed",
747+ "hooks/combine-dbservers",
748+ "hooks/cache-relation-changed",
749+ "hooks/website-relation-joined",
750+ "revision",
751+ "icon.svg",
752+ "hooks/upgrade-charm",
753+ "hooks/stop",
754+ "README.md",
755+ "hooks/db-relation-changed",
756+ "hooks/db-relation-departed",
757+ "hooks/install",
758+ "metadata.yaml",
759+ "hooks/config-changed",
760+ "hooks/slave-relation-changed",
761+ "config.yaml",
762+ "hooks/slave-relation-broken"
763+ ],
764+ "id": "precise/mediawiki-10",
765+ "is_approved": true,
766+ "is_subordinate": false,
767+ "maintainer": {
768+ "email": "clint@ubuntu.com",
769+ "name": "Clint Byrum"
770+ },
771+ "name": "mediawiki",
772+ "options": {
773+ "admins": {
774+ "description": "Admin users to create, user:pass",
775+ "type": "string"
776+ },
777+ "debug": {
778+ "default": false,
779+ "description": "turn on debugging features of mediawiki",
780+ "type": "boolean"
781+ },
782+ "logo": {
783+ "description": "URL to fetch logo from",
784+ "type": "string"
785+ },
786+ "name": {
787+ "default": "Please set name of wiki",
788+ "description": "The name, or Title of the Wiki",
789+ "type": "string"
790+ },
791+ "skin": {
792+ "default": "vector",
793+ "description": "skin for the Wiki",
794+ "type": "string"
795+ }
796+ },
797+ "owner": "charmers",
798+ "rating_denominator": 0,
799+ "rating_numerator": 0,
800+ "relations": {
801+ "provides": {
802+ "website": {
803+ "interface": "http"
804+ }
805+ },
806+ "requires": {
807+ "cache": {
808+ "interface": "memcache"
809+ },
810+ "db": {
811+ "interface": "mysql"
812+ },
813+ "slave": {
814+ "interface": "mysql"
815+ }
816+ }
817+ },
818+ "revision": 90,
819+ "summary": "Website engine for collaborative work",
820+ "tested_providers": {
821+ "ec2": "SUCCESS",
822+ "openstack": "SUCCESS"
823+ },
824+ "url": "cs:precise/mediawiki-10"
825+ },
826+ "memcached": {
827+ "categories": [
828+ "applications"
829+ ],
830+ "code_source": {
831+ "bugs_link": "https://bugs.launchpad.net/charms/+source/memcached",
832+ "last_log": "Pavel Pachkovskij 2013-07-30 fix factor default value\n",
833+ "location": "lp:~charmers/charms/precise/memcached/trunk",
834+ "revision": "55",
835+ "revisions": [
836+ {
837+ "authors": [
838+ {
839+ "email": "marco@ceppi.net",
840+ "name": "Marco Ceppi"
841+ }
842+ ],
843+ "date": "2013-07-31T12:29:00Z",
844+ "message": "Pavel Pachkovskij 2013-07-30 fix factor default value\n",
845+ "revno": 55
846+ },
847+ {
848+ "authors": [
849+ {
850+ "email": "marco@ceppi.net",
851+ "name": "Marco Ceppi"
852+ }
853+ ],
854+ "date": "2013-04-27T00:13:33Z",
855+ "message": "Added icon.svg\n",
856+ "revno": 54
857+ },
858+ {
859+ "authors": [
860+ {
861+ "email": "jorge@ubuntu.com",
862+ "name": "Jorge O. Castro"
863+ }
864+ ],
865+ "date": "2013-04-22T19:50:20Z",
866+ "message": "Add categories\n",
867+ "revno": 53
868+ },
869+ {
870+ "authors": [
871+ {
872+ "email": "matthew.wedgwood@canonical.com",
873+ "name": "Matthew Wedgwood"
874+ }
875+ ],
876+ "date": "2013-04-18T16:23:02Z",
877+ "message": "[mthaddon] support for pre-install hook structure, support for the nrpe-external-master charm\n\nThis adds support for pre-install hook structure, as supported in a number of other charms, which allows you to do things like set timezone, install custom apt repositories, etc.. It also adds support for the nrpe-external-master charm\n",
878+ "revno": 52
879+ },
880+ {
881+ "authors": [
882+ {
883+ "email": "nmurata@ashisuto.co.jp",
884+ "name": "Nobuto MURATA"
885+ }
886+ ],
887+ "date": "2012-09-20T11:43:25Z",
888+ "message": "fix sh syntax error (LP: #1053356)\n",
889+ "revno": 51
890+ },
891+ {
892+ "authors": [
893+ {
894+ "email": "juan.negron@canonical.com",
895+ "name": "Juan L. Negron"
896+ }
897+ ],
898+ "date": "2012-09-14T20:14:21Z",
899+ "message": "Some fixes for things I noticed while reviewing the charm. MP:124280",
900+ "revno": 50
901+ },
902+ {
903+ "authors": [
904+ {
905+ "email": "clint@ubuntu.com",
906+ "name": "Clint Byrum"
907+ }
908+ ],
909+ "date": "2012-05-22T22:30:53Z",
910+ "message": "setting maintainer",
911+ "revno": 49
912+ },
913+ {
914+ "authors": [
915+ {
916+ "email": "mark.mims@canonical.com",
917+ "name": "Mark Mims"
918+ }
919+ ],
920+ "date": "2012-01-28T01:11:44Z",
921+ "message": "strong config types\n",
922+ "revno": 48
923+ },
924+ {
925+ "authors": [
926+ {
927+ "email": "clint@ubuntu.com",
928+ "name": "Clint Byrum"
929+ }
930+ ],
931+ "date": "2011-12-05T22:55:46Z",
932+ "message": "Making memcached fully configurable using config.yaml",
933+ "revno": 47
934+ },
935+ {
936+ "authors": [
937+ {
938+ "email": "mark.mims@canonical.com",
939+ "name": "Mark Mims"
940+ }
941+ ],
942+ "date": "2011-10-11T19:17:17Z",
943+ "message": "revision split-out\n",
944+ "revno": 46
945+ }
946+ ],
947+ "type": "bzr"
948+ },
949+ "date_created": "2012-04-16T18:29:50Z",
950+ "description": "Danga Interactive developed memcached to enhance the speed of LiveJournal.com, a site which was already doing 20 million+ dynamic page views per day for 1 million users with a bunch of webservers and a bunch of database servers. memcached dropped the database load to almost nothing, yielding faster page load times for users, better resource utilization, and faster access to the databases on a memcache miss.\nmemcached optimizes specific high-load serving applications that are designed to take advantage of its versatile no-locking memory access system. Clients are available in several different programming languages, to suit the needs of the specific application. Traditionally this has been used in mod_perl apps to avoid storing large chunks of data in Apache memory, and to share this burden across several machines.",
951+ "distro_series": "precise",
952+ "downloads": 708,
953+ "downloads_in_past_30_days": 72,
954+ "files": [
955+ "hooks/cache-relation-joined",
956+ "hooks/munin-relation-changed",
957+ "hooks/nrpe-external-master-relation-changed",
958+ "icon.svg",
959+ "hooks/upgrade-charm",
960+ "hooks/stop",
961+ "hooks/start",
962+ "hooks/config-changed",
963+ "hooks/install",
964+ "metadata.yaml",
965+ "config.yaml",
966+ "revision"
967+ ],
968+ "id": "precise/memcached-7",
969+ "is_approved": true,
970+ "is_subordinate": false,
971+ "maintainer": {
972+ "email": "clint@ubuntu.com",
973+ "name": "Clint Byrum"
974+ },
975+ "name": "memcached",
976+ "options": {
977+ "connection-limit": {
978+ "default": 1024,
979+ "description": "maximum simultaneous connections (memcached option -c)",
980+ "type": "int"
981+ },
982+ "disable-auto-cleanup": {
983+ "default": "no",
984+ "description": "do not remove things automatically from the cache on OOM\n(memcached option -M)\n",
985+ "type": "string"
986+ },
987+ "disable-cas": {
988+ "default": "no",
989+ "description": "disable use of CAS (and reduce the per-item size by 8 bytes)",
990+ "type": "string"
991+ },
992+ "disable-large-pages": {
993+ "default": "no",
994+ "description": "The charm will will try to use large pages if given more than 2GB of RAM. You may want to disable this behavior. (memcached option -L)",
995+ "type": "string"
996+ },
997+ "extra-options": {
998+ "default": "",
999+ "description": "memcached has many other options documented in its man page. You may pass them here as a string which will be appended to memcached's execution.",
1000+ "type": "string"
1001+ },
1002+ "factor": {
1003+ "default": 1.25,
1004+ "description": "Use <factor> as the multiplier for computing the sizes of memory\nchunks that items are stored in. A lower value may result in less\nwasted memory depending on the total amount of memory available\nand the distribution of item sizes. The default is 1.25.\n",
1005+ "type": "float"
1006+ },
1007+ "min-item-size": {
1008+ "default": -1,
1009+ "description": "Allocate a minimum of <size> bytes for the item key, value,\nand flags. The default is 48. If you have a lot of small\nkeys and values, you can get a significant memory efficiency\ngain with a lower value. If you use a high chunk growth factor\n(-f option), on the other hand, you may want to\nincrease the size to allow a bigger percentage of your\nitems to fit in the most densely packed (smallest) chunks.\n(memcached option -n)\n",
1010+ "type": "int"
1011+ },
1012+ "nagios_context": {
1013+ "default": "juju",
1014+ "description": "Used by the nrpe-external-master subordinate charm. A string that will be prepended to instance name to set the host name in nagios. So for instance the hostname would be something like:\n juju-memcached-0\nIf you're running multiple environments with the same services in them this allows you to differentiate between them.\n",
1015+ "type": "string"
1016+ },
1017+ "request-limit": {
1018+ "default": -1,
1019+ "description": "limit of requests a single client can make at one time\n(memcached option -R) -1 takes memcached default (20)\n",
1020+ "type": "int"
1021+ },
1022+ "size": {
1023+ "default": 768,
1024+ "description": "Size of memcache pool in MiB (memcached option -m)",
1025+ "type": "int"
1026+ },
1027+ "slab-page-size": {
1028+ "default": -1,
1029+ "description": "Override the size of each slab page in bytes. In mundane\nwords, it adjusts the maximum item size that memcached\nwill accept. You can use the suffixes K and M to specify\nthe size as well, so use 2000000 or 2000K or 2M if you want\na maximum size of 2 MB per object. It is not recommended\nto raise this limit above 1 MB due just to performance reasons.\nThe default value is 1 MB. (memcached option -I) -1 takes\nthe memcached default.\n",
1030+ "type": "int"
1031+ },
1032+ "tcp-port": {
1033+ "default": 11211,
1034+ "description": "TCP port to listen on. (memcached option -p)",
1035+ "type": "int"
1036+ },
1037+ "threads": {
1038+ "default": -1,
1039+ "description": "number of threads to use. default is 4. (memcached option -t)",
1040+ "type": "int"
1041+ },
1042+ "udp-port": {
1043+ "default": 0,
1044+ "description": "UDP port to listen on (memcached option -U)",
1045+ "type": "int"
1046+ }
1047+ },
1048+ "owner": "charmers",
1049+ "rating_denominator": 0,
1050+ "rating_numerator": 0,
1051+ "relations": {
1052+ "provides": {
1053+ "cache": {
1054+ "interface": "memcache"
1055+ },
1056+ "munin": {
1057+ "interface": "munin-node"
1058+ },
1059+ "nrpe-external-master": {
1060+ "interface": "nrpe-external-master",
1061+ "scope": "container"
1062+ }
1063+ },
1064+ "requires": {}
1065+ },
1066+ "revision": 28,
1067+ "summary": "A high-performance memory object caching system",
1068+ "tested_providers": {
1069+ "ec2": "SUCCESS",
1070+ "local": "SUCCESS",
1071+ "openstack": "SUCCESS"
1072+ },
1073+ "url": "cs:precise/memcached-7"
1074+ },
1075+ "mysql": {
1076+ "categories": [
1077+ "databases"
1078+ ],
1079+ "code_source": {
1080+ "bugs_link": "https://bugs.launchpad.net/charms/+source/mysql",
1081+ "last_log": "[gnuoy] Execute any preinstall code that's in exec.d as part of the install hook.\n",
1082+ "location": "lp:~charmers/charms/precise/mysql/trunk",
1083+ "revision": "106",
1084+ "revisions": [
1085+ {
1086+ "authors": [
1087+ {
1088+ "email": "marco@ceppi.net",
1089+ "name": "Marco Ceppi"
1090+ }
1091+ ],
1092+ "date": "2013-11-12T21:31:27Z",
1093+ "message": "[gnuoy] Execute any preinstall code that's in exec.d as part of the install hook.\n",
1094+ "revno": 106
1095+ },
1096+ {
1097+ "authors": [
1098+ {
1099+ "email": "marco@ceppi.net",
1100+ "name": "Marco Ceppi"
1101+ }
1102+ ],
1103+ "date": "2013-10-25T16:37:07Z",
1104+ "message": "Updated README",
1105+ "revno": 105
1106+ },
1107+ {
1108+ "authors": [
1109+ {
1110+ "email": "adamg@ubuntu.com",
1111+ "name": "Adam Gandelman"
1112+ }
1113+ ],
1114+ "date": "2013-08-09T11:08:20Z",
1115+ "message": "[ahasenack] Wait for the rbd device to be available before attempting to format it.",
1116+ "revno": 104
1117+ },
1118+ {
1119+ "authors": [
1120+ {
1121+ "email": "adamg@canonical.com",
1122+ "name": "Adam Gandelman"
1123+ }
1124+ ],
1125+ "date": "2013-07-23T22:59:11Z",
1126+ "message": "Merge juju-core compat. fix from James Page.",
1127+ "revno": 103
1128+ },
1129+ {
1130+ "authors": [
1131+ {
1132+ "email": "jorge@ubuntu.com",
1133+ "name": "Jorge O. Castro"
1134+ }
1135+ ],
1136+ "date": "2013-07-08T13:40:01Z",
1137+ "message": "Fix category.\n",
1138+ "revno": 102
1139+ },
1140+ {
1141+ "authors": [
1142+ {
1143+ "email": "mark.mims@canonical.com",
1144+ "name": "Mark Mims"
1145+ }
1146+ ],
1147+ "date": "2013-06-07T16:38:50Z",
1148+ "message": "merging lp:~dannf/charms/precise/mysql/lp1188424 as per https://code.launchpad.net/~dannf/charms/precise/mysql/lp1188424/+merge/167881",
1149+ "revno": 101
1150+ },
1151+ {
1152+ "authors": [
1153+ {
1154+ "email": "marco@ceppi.net",
1155+ "name": "Marco Ceppi"
1156+ }
1157+ ],
1158+ "date": "2013-06-06T12:32:17Z",
1159+ "message": "James Page 2013-06-06 Stop using socket.getfqdn in shared-db hooks as this assumes DNS resolution between instances is functional\n",
1160+ "revno": 100
1161+ },
1162+ {
1163+ "authors": [
1164+ {
1165+ "email": "marco@ceppi.net",
1166+ "name": "Marco Ceppi"
1167+ }
1168+ ],
1169+ "date": "2013-06-05T16:02:08Z",
1170+ "message": "Fixes master/slave relation",
1171+ "revno": 99
1172+ },
1173+ {
1174+ "authors": [
1175+ {
1176+ "email": "marco@ceppi.net",
1177+ "name": "Marco Ceppi"
1178+ }
1179+ ],
1180+ "date": "2013-05-30T16:03:12Z",
1181+ "message": "Maintainership change lp:1178384",
1182+ "revno": 98
1183+ },
1184+ {
1185+ "authors": [
1186+ {
1187+ "email": "marco@ceppi.net",
1188+ "name": "Marco Ceppi"
1189+ }
1190+ ],
1191+ "date": "2013-05-30T16:00:48Z",
1192+ "message": "ha-support: https://code.launchpad.net/~openstack-charmers/charms/precise/mysql/ha-support/+merge/165059\n",
1193+ "revno": 97
1194+ }
1195+ ],
1196+ "type": "bzr"
1197+ },
1198+ "date_created": "2012-04-16T18:30:00Z",
1199+ "description": "MySQL is a fast, stable and true multi-user, multi-threaded SQL database\nserver. SQL (Structured Query Language) is the most popular database query\nlanguage in the world. The main goals of MySQL are speed, robustness and\nease of use.\n",
1200+ "distro_series": "precise",
1201+ "downloads": 11388,
1202+ "downloads_in_past_30_days": 1191,
1203+ "files": [
1204+ "hooks/munin-relation-joined",
1205+ "hooks/monitors.common.bash",
1206+ "hooks/db-relation-joined",
1207+ "hooks/shared-db-relation-changed",
1208+ "hooks/master-relation-departed",
1209+ "hooks/monitors-relation-departed",
1210+ "hooks/master-relation-broken",
1211+ "hooks/lib/cluster_utils.py",
1212+ "hooks/shared_db_relations.py",
1213+ "hooks/slave-relation-changed",
1214+ "README.md",
1215+ "hooks/ha-relation-changed",
1216+ "hooks/munin-relation-changed",
1217+ "hooks/common.py",
1218+ "hooks/start",
1219+ "hooks/config-changed",
1220+ "hooks/db-relation-broken",
1221+ "hooks/shared-db-relation-joined",
1222+ "hooks/ha_relations.py",
1223+ "hooks/cluster-relation-changed",
1224+ "hooks/slave-relation-departed",
1225+ "hooks/install",
1226+ "hooks/ceph-relation-changed",
1227+ "metadata.yaml",
1228+ "hooks/ha-relation-joined",
1229+ "hooks/stop",
1230+ "hooks/local-monitors-relation-joined",
1231+ "hooks/db-admin-relation-joined",
1232+ "config.yaml",
1233+ "hooks/monitors-relation-joined",
1234+ "icon.svg",
1235+ "hooks/upgrade-charm",
1236+ "hooks/lib/utils.py",
1237+ "hooks/ceph-relation-joined",
1238+ "hooks/master-relation-changed",
1239+ "hooks/lib/__init__.py",
1240+ "hooks/slave-relation-joined",
1241+ "hooks/lib/ceph_utils.py",
1242+ "hooks/slave-relation-broken",
1243+ "revision",
1244+ "hooks/monitors-relation-broken"
1245+ ],
1246+ "id": "precise/mysql-29",
1247+ "is_approved": true,
1248+ "is_subordinate": false,
1249+ "maintainer": {
1250+ "email": "marco@ceppi.net",
1251 "name": "Marco Ceppi"
1252- }
1253- ],
1254- "date": "2012-10-29T21:04:13Z",
1255- "message": "No more hard coded paths",
1256- "revno": 61
1257- },
1258- {
1259- "authors": [
1260- {
1261- "email": "juan.negron@canonical.com",
1262- "name": "Juan L. Negron"
1263- }
1264- ],
1265- "date": "2012-10-03T14:23:30Z",
1266- "message": "Adding changes in MP:127191 by gnoy",
1267- "revno": 60
1268- },
1269- {
1270- "authors": [
1271- {
1272- "email": "juan.negron@canonical.com",
1273- "name": "Juan L. Negron"
1274- }
1275- ],
1276- "date": "2012-10-03T14:15:01Z",
1277- "message": "PEP8 changes",
1278- "revno": 59
1279- },
1280- {
1281- "authors": [
1282- {
1283- "email": "juan.negron@canonical.com",
1284- "name": "Juan L. Negron"
1285- }
1286- ],
1287- "date": "2012-09-17T16:50:34Z",
1288- "message": "Merging changes by Liam in MP:124731",
1289- "revno": 58
1290- }
1291- ],
1292- "type": "bzr"
1293- },
1294- "date_created": "2012-04-16T18:29:51Z",
1295- "description": "HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high availability environments. It features connection persistence through HTTP cookies, load balancing, header addition, modification, deletion both ways. It has request blocking capabilities and provides interface to display server status.",
1296- "distro_series": "precise",
1297- "downloads": 940,
1298- "downloads_in_past_30_days": 66,
1299- "files": [
1300- "hooks/nrpe.py",
1301- "hooks/munin-relation-changed",
1302- "hooks/hooks.py",
1303- "hooks/website-relation-joined",
1304- "revision",
1305- "metadata.yaml",
1306- "hooks/stop",
1307- "hooks/test_hooks.py",
1308- "README.md",
1309- "hooks/start",
1310- "hooks/config-changed",
1311- "hooks/nrpe-external-master-relation-changed",
1312- "hooks/reverseproxy-relation-broken",
1313- "hooks/install",
1314- "hooks/reverseproxy-relation-departed",
1315- "hooks/website-relation-changed",
1316- "config.yaml",
1317- "hooks/reverseproxy-relation-changed"
1318- ],
1319- "id": "precise/haproxy-18",
1320- "is_approved": true,
1321- "is_subordinate": false,
1322- "maintainer": {
1323- "email": "Juan Negron <juan@ubuntu.com>Tom Haddon <tom.haddon@canonical.com>",
1324- "name": ""
1325- },
1326- "name": "haproxy",
1327- "options": {
1328- "default_log": {
1329- "default": "global",
1330- "description": "Default log",
1331- "type": "string"
1332- },
1333- "default_mode": {
1334- "default": "http",
1335- "description": "Default mode",
1336- "type": "string"
1337- },
1338- "default_options": {
1339- "default": "httplog, dontlognull",
1340- "description": "Default options",
1341- "type": "string"
1342- },
1343- "default_retries": {
1344- "default": 3,
1345- "description": "Set the number of retries to perform on a server after a connection\nfailure. It is important to understand that this value applies to the\nnumber of connection attempts, not full requests. When a connection \nhas effectively been established to a server, there will be no more \nretry.\nIn order to avoid immediate reconnections to a server which is \nrestarting, a turn-around timer of 1 second is applied before a retry\noccurs.\n",
1346- "type": "int"
1347- },
1348- "default_timeouts": {
1349- "default": "queue 1000, connect 1000, client 1000, server 1000",
1350- "description": "Default timeouts",
1351- "type": "string"
1352- },
1353- "enable_monitoring": {
1354- "default": false,
1355- "description": "Enable monitoring",
1356- "type": "boolean"
1357- },
1358- "global_debug": {
1359- "default": false,
1360- "description": "Debug or not",
1361- "type": "boolean"
1362- },
1363- "global_group": {
1364- "default": "haproxy",
1365- "description": "Group",
1366- "type": "string"
1367- },
1368- "global_log": {
1369- "default": "127.0.0.1 local0, 127.0.0.1 local1 notice",
1370- "description": "Global log line ( multiples ... comma separated list )",
1371- "type": "string"
1372- },
1373- "global_maxconn": {
1374- "default": 4096,
1375- "description": "Sets the maximum per-process number of concurrent connections to\n<number>.\n",
1376- "type": "int"
1377- },
1378- "global_quiet": {
1379- "default": false,
1380- "description": "Quiet",
1381- "type": "boolean"
1382- },
1383- "global_spread_checks": {
1384- "default": 0,
1385- "descriptions": "Sometimes it is desirable to avoid sending health checks to servers at\nexact intervals, for instance when many logical servers are located on\nthe same physical server. With the help of this parameter, it becomes \npossible to add some randomness in the check interval between 0 and \n+/- 50%. A value between 2 and 5 seems to show good results.\n",
1386- "type": "int"
1387- },
1388- "global_user": {
1389- "default": "haproxy",
1390- "description": "User",
1391- "type": "string"
1392- },
1393- "monitoring_allowed_cidr": {
1394- "default": "127.0.0.1/32",
1395- "description": "CIDR allowed ( multiple CIDRs separated by space ) access to the\nmonitoring interface.\n",
1396- "type": "string"
1397- },
1398- "monitoring_password": {
1399- "default": "changeme",
1400- "description": "Password to the monitoring interface ( if \"changeme\", a new password\nwill be generated and displayed in juju-log )\n",
1401- "type": "string"
1402- },
1403- "monitoring_port": {
1404- "default": 10000,
1405- "description": "Default monitoring port",
1406- "type": "int"
1407- },
1408- "monitoring_stats_refresh": {
1409- "default": 3,
1410- "description": "Monitoring interface refresh interval (in seconds)",
1411- "type": "int"
1412- },
1413- "monitoring_username": {
1414- "default": "haproxy",
1415- "description": "Monitoring username",
1416- "type": "string"
1417- },
1418- "nagios_context": {
1419- "default": "juju",
1420- "description": "Used by the nrpe-external-master subordinate charm.\nA string that will be prepended to instance name to set the host name\nin nagios. So for instance the hostname would be something like:\n juju-postgresql-0\nIf you're running multiple environments with the same services in them\nthis allows you to differentiate between them.\n",
1421- "type": "string"
1422- },
1423+ },
1424+ "name": "mysql",
1425+ "options": {
1426+ "binlog-format": {
1427+ "default": "MIXED",
1428+ "description": "If binlogging is enabled, this is the format that will be used. Ignored when tuning-level == fast.",
1429+ "type": "string"
1430+ },
1431+ "block-size": {
1432+ "default": 5,
1433+ "description": "Default block storage size to create when setting up MySQL block storage.\nThis value should be specified in GB (e.g. 100 not 100GB).\n",
1434+ "type": "int"
1435+ },
1436+ "dataset-size": {
1437+ "default": "80%",
1438+ "description": "How much data do you want to keep in memory in the DB. This will be used to tune settings in the database server appropriately. Any more specific settings will override these defaults though. This currently sets innodb_buffer_pool_size or key_cache_size depending on the setting in preferred-storage-engine. If query-cache-type is set to 'ON' or 'DEMAND' 20% of this is given to query-cache-size. Suffix this value with 'K','M','G', or 'T' to get the relevant kilo/mega/etc. bytes. If suffixed with %, one will get that percentage of RAM devoted to dataset and (if enabled) query cache.",
1439+ "type": "string"
1440+ },
1441+ "flavor": {
1442+ "default": "distro",
1443+ "description": "Possible values are 'distro' or 'percona'",
1444+ "type": "string"
1445+ },
1446+ "ha-bindiface": {
1447+ "default": "eth0",
1448+ "description": "Default network interface on which HA cluster will bind to communication\nwith the other members of the HA Cluster.\n",
1449+ "type": "string"
1450+ },
1451+ "ha-mcastport": {
1452+ "default": 5411,
1453+ "description": "Default multicast port number that will be used to communicate between\nHA Cluster nodes.\n",
1454+ "type": "int"
1455+ },
1456+ "max-connections": {
1457+ "default": -1,
1458+ "description": "Maximum connections to allow. -1 means use the server's compiled in default.",
1459+ "type": "int"
1460+ },
1461+ "preferred-storage-engine": {
1462+ "default": "InnoDB",
1463+ "description": "Tune the server for usage of this storage engine. Other possible value is MyISAM. Comma separated will cause settings to split resources evenly among given engines.",
1464+ "type": "string"
1465+ },
1466+ "query-cache-size": {
1467+ "default": -1,
1468+ "description": "Override the computed version from dataset-size. Still works if query-cache-type is \"OFF\" since sessions can override the cache type setting on their own.",
1469+ "type": "int"
1470+ },
1471+ "query-cache-type": {
1472+ "default": "OFF",
1473+ "description": "Query cache is usually a good idea, but can hurt concurrency. Valid values are \"OFF\", \"ON\", or \"DEMAND\". http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_query_cache_type",
1474+ "type": "string"
1475+ },
1476+ "rbd-name": {
1477+ "default": "mysql1",
1478+ "description": "The name that will be used to create the Ceph's RBD image with. If the\nimage name exists in Ceph, it will be re-used and the data will be\noverwritten.\n",
1479+ "type": "string"
1480+ },
1481+ "tuning-level": {
1482+ "default": "safest",
1483+ "description": "Valid values are 'safest', 'fast', and 'unsafe'. If set to safest, all settings are tuned to have maximum safety at the cost of performance. Fast will turn off most controls, but may lose data on crashes. unsafe will turn off all protections.",
1484+ "type": "string"
1485+ },
1486+ "vip": {
1487+ "description": "Virtual IP to use to front mysql in ha configuration",
1488+ "type": "string"
1489+ },
1490+ "vip_cidr": {
1491+ "default": 24,
1492+ "description": "Netmask that will be used for the Virtual IP",
1493+ "type": "int"
1494+ },
1495+ "vip_iface": {
1496+ "default": "eth0",
1497+ "description": "Network Interface where to place the Virtual IP",
1498+ "type": "string"
1499+ }
1500+ },
1501+ "owner": "charmers",
1502+ "rating_denominator": 0,
1503+ "rating_numerator": 0,
1504+ "relations": {
1505+ "provides": {
1506+ "db": {
1507+ "interface": "mysql"
1508+ },
1509+ "db-admin": {
1510+ "interface": "mysql-root"
1511+ },
1512+ "local-monitors": {
1513+ "interface": "local-monitors",
1514+ "scope": "container"
1515+ },
1516+ "master": {
1517+ "interface": "mysql-oneway-replication"
1518+ },
1519+ "monitors": {
1520+ "interface": "monitors"
1521+ },
1522+ "munin": {
1523+ "interface": "munin-node"
1524+ },
1525+ "shared-db": {
1526+ "interface": "mysql-shared"
1527+ }
1528+ },
1529+ "requires": {
1530+ "ceph": {
1531+ "interface": "ceph-client"
1532+ },
1533+ "ha": {
1534+ "interface": "hacluster",
1535+ "scope": "container"
1536+ },
1537+ "slave": {
1538+ "interface": "mysql-oneway-replication"
1539+ }
1540+ }
1541+ },
1542+ "revision": 309,
1543+ "summary": "MySQL is a fast, stable and true multi-user, multi-threaded SQL database",
1544+ "tested_providers": {},
1545+ "url": "cs:precise/mysql-29"
1546+ }
1547+ },
1548+ "data": {
1549+ "relations": [
1550+ [
1551+ "mediawiki:cache",
1552+ "memcached:cache"
1553+ ],
1554+ [
1555+ "mediawiki:db",
1556+ "mysql:db"
1557+ ],
1558+ [
1559+ "haproxy:reverseproxy",
1560+ "mediawiki:website"
1561+ ]
1562+ ],
1563+ "series": "precise",
1564 "services": {
1565- "default": "- service_name: haproxy_service\n service_host: \"0.0.0.0\"\n service_port: 80\n service_options: [balance leastconn]\n server_options: maxconn 100\n",
1566- "description": "Services definition(s). Although the variable type is a string, this is\ninterpreted in the charm as yaml. To use multiple services within the\nsame haproxy instance, specify all of the variables (service_name,\nservice_host, service_port, service_options, server_options) with a \"-\"\nbefore the first variable, service_name, as above. Service options is a\ncomma separated list, server options will be appended as a string to\nthe individual server lines for a given listen stanza.\n",
1567- "type": "string"
1568- }
1569- },
1570- "owner": "charmers",
1571- "rating_denominator": 0,
1572- "rating_numerator": 0,
1573- "relations": {
1574- "provides": {
1575- "munin": {
1576- "interface": "munin-node"
1577- },
1578- "nrpe-external-master": {
1579- "interface": "nrpe-external-master",
1580- "scope": "container"
1581- },
1582- "website": {
1583- "interface": "http"
1584- }
1585- },
1586- "requires": {
1587- "reverseproxy": {
1588- "interface": "http"
1589- }
1590- }
1591- },
1592- "revision": 42,
1593- "summary": "fast and reliable load balancing reverse proxy",
1594- "tested_providers": {
1595- "ec2": "SUCCESS",
1596- "local": "SUCCESS",
1597- "openstack": "SUCCESS"
1598- },
1599- "url": "cs:precise/haproxy-18"
1600- },
1601- "mediawiki": {
1602- "categories": [
1603- "applications"
1604- ],
1605- "code_source": {
1606- "bugs_link": "https://bugs.launchpad.net/charms/+source/mediawiki",
1607- "last_log": "merging lp:~dave-cheney/charms/precise/mediawiki/trunk as per https://code.launchpad.net/~dave-cheney/charms/precise/mediawiki/trunk/+merge/182803",
1608- "location": "lp:~charmers/charms/precise/mediawiki/trunk",
1609- "revision": "72",
1610- "revisions": [
1611- {
1612- "authors": [
1613- {
1614- "email": "mark.mims@canonical.com",
1615- "name": "Mark Mims"
1616- }
1617- ],
1618- "date": "2013-09-20T19:13:28Z",
1619- "message": "merging lp:~dave-cheney/charms/precise/mediawiki/trunk as per https://code.launchpad.net/~dave-cheney/charms/precise/mediawiki/trunk/+merge/182803",
1620- "revno": 72
1621- },
1622- {
1623- "authors": [
1624- {
1625- "email": "marco@ceppi.net",
1626- "name": "Marco Ceppi"
1627- }
1628- ],
1629- "date": "2013-08-14T05:16:21Z",
1630- "message": "Santize input from realtion-list",
1631- "revno": 71
1632- },
1633- {
1634- "authors": [
1635- {
1636- "email": "marco@ceppi.net",
1637- "name": "Marco Ceppi"
1638- }
1639- ],
1640- "date": "2013-04-25T18:19:21Z",
1641- "message": "Added icon.svg",
1642- "revno": 70
1643- },
1644- {
1645- "authors": [
1646- {
1647- "email": "jorge@ubuntu.com",
1648- "name": "Jorge O. Castro"
1649- }
1650- ],
1651- "date": "2013-04-22T19:36:55Z",
1652- "message": "Add a category\n",
1653- "revno": 69
1654- },
1655- {
1656- "authors": [
1657- {
1658- "email": "marco@ceppi.net",
1659- "name": "Marco Ceppi"
1660- }
1661- ],
1662- "date": "2013-01-24T18:26:58Z",
1663- "message": "Cleanup of PHP files according to http://www.mediawiki.org/wiki/Coding_conventions\n",
1664- "revno": 68
1665- },
1666- {
1667- "authors": [
1668- {
1669- "email": "marco@ceppi.net",
1670- "name": "Marco Ceppi"
1671- }
1672- ],
1673- "date": "2012-12-20T03:12:05Z",
1674- "message": "Typo in multi-unit command line",
1675- "revno": 67
1676- },
1677- {
1678- "authors": [
1679- {
1680- "email": "marco@ceppi.net",
1681- "name": "Marco Ceppi"
1682- }
1683- ],
1684- "date": "2012-12-19T20:23:25Z",
1685- "message": "Minor clean up and new README file\n",
1686- "revno": 66
1687- },
1688- {
1689- "authors": [
1690- {
1691- "email": "clint@fewbar.com",
1692- "name": "Clint Byrum"
1693- }
1694- ],
1695- "date": "2012-06-30T14:37:14Z",
1696- "message": "Bumping revision for modernizations",
1697- "revno": 65
1698- },
1699- {
1700- "authors": [
1701- {
1702- "email": "clint@fewbar.com",
1703- "name": "Clint Byrum"
1704- }
1705- ],
1706- "date": "2012-06-30T14:36:55Z",
1707- "message": "cleanups and modernizing things",
1708- "revno": 64
1709- },
1710- {
1711- "authors": [
1712- {
1713- "email": "clint@ubuntu.com",
1714- "name": "Clint Byrum"
1715- }
1716- ],
1717- "date": "2012-06-28T00:02:47Z",
1718- "message": "removing old broken munin bits",
1719- "revno": 63
1720- }
1721- ],
1722- "type": "bzr"
1723- },
1724- "date_created": "2012-04-16T18:29:51Z",
1725- "description": "MediaWiki is a wiki engine (a program for creating a collaboratively\nedited website). It is designed to handle heavy websites containing\nlibrary-like document collections, and supports user uploads of\nimages/sounds, multilingual content, TOC autogeneration, ISBN links,\netc.\n",
1726- "distro_series": "precise",
1727- "downloads": 1944,
1728- "downloads_in_past_30_days": 281,
1729- "files": [
1730- "hooks/slave-relation-departed",
1731- "hooks/combine-dbservers",
1732- "hooks/cache-relation-changed",
1733- "hooks/website-relation-joined",
1734- "revision",
1735- "icon.svg",
1736- "hooks/upgrade-charm",
1737- "hooks/stop",
1738- "README.md",
1739- "hooks/db-relation-changed",
1740- "hooks/db-relation-departed",
1741- "hooks/install",
1742- "metadata.yaml",
1743- "hooks/config-changed",
1744- "hooks/slave-relation-changed",
1745- "config.yaml",
1746- "hooks/slave-relation-broken"
1747- ],
1748- "id": "precise/mediawiki-10",
1749- "is_approved": true,
1750- "is_subordinate": false,
1751- "maintainer": {
1752- "email": "clint@ubuntu.com",
1753- "name": "Clint Byrum"
1754- },
1755- "name": "mediawiki",
1756- "options": {
1757- "admins": {
1758- "description": "Admin users to create, user:pass",
1759- "type": "string"
1760- },
1761- "debug": {
1762- "default": false,
1763- "description": "turn on debugging features of mediawiki",
1764- "type": "boolean"
1765- },
1766- "logo": {
1767- "description": "URL to fetch logo from",
1768- "type": "string"
1769- },
1770- "name": {
1771- "default": "Please set name of wiki",
1772- "description": "The name, or Title of the Wiki",
1773- "type": "string"
1774- },
1775- "skin": {
1776- "default": "vector",
1777- "description": "skin for the Wiki",
1778- "type": "string"
1779- }
1780- },
1781- "owner": "charmers",
1782- "rating_denominator": 0,
1783- "rating_numerator": 0,
1784- "relations": {
1785- "provides": {
1786- "website": {
1787- "interface": "http"
1788- }
1789- },
1790- "requires": {
1791- "cache": {
1792- "interface": "memcache"
1793- },
1794- "db": {
1795- "interface": "mysql"
1796- },
1797- "slave": {
1798- "interface": "mysql"
1799- }
1800- }
1801- },
1802- "revision": 90,
1803- "summary": "Website engine for collaborative work",
1804- "tested_providers": {
1805- "ec2": "SUCCESS",
1806- "openstack": "SUCCESS"
1807- },
1808- "url": "cs:precise/mediawiki-10"
1809- },
1810- "memcached": {
1811- "categories": [
1812- "applications"
1813- ],
1814- "code_source": {
1815- "bugs_link": "https://bugs.launchpad.net/charms/+source/memcached",
1816- "last_log": "Pavel Pachkovskij 2013-07-30 fix factor default value\n",
1817- "location": "lp:~charmers/charms/precise/memcached/trunk",
1818- "revision": "55",
1819- "revisions": [
1820- {
1821- "authors": [
1822- {
1823- "email": "marco@ceppi.net",
1824- "name": "Marco Ceppi"
1825- }
1826- ],
1827- "date": "2013-07-31T12:29:00Z",
1828- "message": "Pavel Pachkovskij 2013-07-30 fix factor default value\n",
1829- "revno": 55
1830- },
1831- {
1832- "authors": [
1833- {
1834- "email": "marco@ceppi.net",
1835- "name": "Marco Ceppi"
1836- }
1837- ],
1838- "date": "2013-04-27T00:13:33Z",
1839- "message": "Added icon.svg\n",
1840- "revno": 54
1841- },
1842- {
1843- "authors": [
1844- {
1845- "email": "jorge@ubuntu.com",
1846- "name": "Jorge O. Castro"
1847- }
1848- ],
1849- "date": "2013-04-22T19:50:20Z",
1850- "message": "Add categories\n",
1851- "revno": 53
1852- },
1853- {
1854- "authors": [
1855- {
1856- "email": "matthew.wedgwood@canonical.com",
1857- "name": "Matthew Wedgwood"
1858- }
1859- ],
1860- "date": "2013-04-18T16:23:02Z",
1861- "message": "[mthaddon] support for pre-install hook structure, support for the nrpe-external-master charm\n\nThis adds support for pre-install hook structure, as supported in a number of other charms, which allows you to do things like set timezone, install custom apt repositories, etc.. It also adds support for the nrpe-external-master charm\n",
1862- "revno": 52
1863- },
1864- {
1865- "authors": [
1866- {
1867- "email": "nmurata@ashisuto.co.jp",
1868- "name": "Nobuto MURATA"
1869- }
1870- ],
1871- "date": "2012-09-20T11:43:25Z",
1872- "message": "fix sh syntax error (LP: #1053356)\n",
1873- "revno": 51
1874- },
1875- {
1876- "authors": [
1877- {
1878- "email": "juan.negron@canonical.com",
1879- "name": "Juan L. Negron"
1880- }
1881- ],
1882- "date": "2012-09-14T20:14:21Z",
1883- "message": "Some fixes for things I noticed while reviewing the charm. MP:124280",
1884- "revno": 50
1885- },
1886- {
1887- "authors": [
1888- {
1889- "email": "clint@ubuntu.com",
1890- "name": "Clint Byrum"
1891- }
1892- ],
1893- "date": "2012-05-22T22:30:53Z",
1894- "message": "setting maintainer",
1895- "revno": 49
1896- },
1897- {
1898- "authors": [
1899- {
1900- "email": "mark.mims@canonical.com",
1901- "name": "Mark Mims"
1902- }
1903- ],
1904- "date": "2012-01-28T01:11:44Z",
1905- "message": "strong config types\n",
1906- "revno": 48
1907- },
1908- {
1909- "authors": [
1910- {
1911- "email": "clint@ubuntu.com",
1912- "name": "Clint Byrum"
1913- }
1914- ],
1915- "date": "2011-12-05T22:55:46Z",
1916- "message": "Making memcached fully configurable using config.yaml",
1917- "revno": 47
1918- },
1919- {
1920- "authors": [
1921- {
1922- "email": "mark.mims@canonical.com",
1923- "name": "Mark Mims"
1924- }
1925- ],
1926- "date": "2011-10-11T19:17:17Z",
1927- "message": "revision split-out\n",
1928- "revno": 46
1929- }
1930- ],
1931- "type": "bzr"
1932- },
1933- "date_created": "2012-04-16T18:29:50Z",
1934- "description": "Danga Interactive developed memcached to enhance the speed of LiveJournal.com, a site which was already doing 20 million+ dynamic page views per day for 1 million users with a bunch of webservers and a bunch of database servers. memcached dropped the database load to almost nothing, yielding faster page load times for users, better resource utilization, and faster access to the databases on a memcache miss.\nmemcached optimizes specific high-load serving applications that are designed to take advantage of its versatile no-locking memory access system. Clients are available in several different programming languages, to suit the needs of the specific application. Traditionally this has been used in mod_perl apps to avoid storing large chunks of data in Apache memory, and to share this burden across several machines.",
1935- "distro_series": "precise",
1936- "downloads": 611,
1937- "downloads_in_past_30_days": 38,
1938- "files": [
1939- "hooks/cache-relation-joined",
1940- "hooks/munin-relation-changed",
1941- "hooks/nrpe-external-master-relation-changed",
1942- "icon.svg",
1943- "hooks/upgrade-charm",
1944- "hooks/stop",
1945- "hooks/start",
1946- "hooks/config-changed",
1947- "hooks/install",
1948- "metadata.yaml",
1949- "config.yaml",
1950- "revision"
1951- ],
1952- "id": "precise/memcached-7",
1953- "is_approved": true,
1954- "is_subordinate": false,
1955- "maintainer": {
1956- "email": "clint@ubuntu.com",
1957- "name": "Clint Byrum"
1958- },
1959- "name": "memcached",
1960- "options": {
1961- "connection-limit": {
1962- "default": 1024,
1963- "description": "maximum simultaneous connections (memcached option -c)",
1964- "type": "int"
1965- },
1966- "disable-auto-cleanup": {
1967- "default": "no",
1968- "description": "do not remove things automatically from the cache on OOM\n(memcached option -M)\n",
1969- "type": "string"
1970- },
1971- "disable-cas": {
1972- "default": "no",
1973- "description": "disable use of CAS (and reduce the per-item size by 8 bytes)",
1974- "type": "string"
1975- },
1976- "disable-large-pages": {
1977- "default": "no",
1978- "description": "The charm will will try to use large pages if given more than 2GB of RAM. You may want to disable this behavior. (memcached option -L)",
1979- "type": "string"
1980- },
1981- "extra-options": {
1982- "default": "",
1983- "description": "memcached has many other options documented in its man page. You may pass them here as a string which will be appended to memcached's execution.",
1984- "type": "string"
1985- },
1986- "factor": {
1987- "default": 1.25,
1988- "description": "Use <factor> as the multiplier for computing the sizes of memory\nchunks that items are stored in. A lower value may result in less\nwasted memory depending on the total amount of memory available\nand the distribution of item sizes. The default is 1.25.\n",
1989- "type": "float"
1990- },
1991- "min-item-size": {
1992- "default": -1,
1993- "description": "Allocate a minimum of <size> bytes for the item key, value,\nand flags. The default is 48. If you have a lot of small\nkeys and values, you can get a significant memory efficiency\ngain with a lower value. If you use a high chunk growth factor\n(-f option), on the other hand, you may want to\nincrease the size to allow a bigger percentage of your\nitems to fit in the most densely packed (smallest) chunks.\n(memcached option -n)\n",
1994- "type": "int"
1995- },
1996- "nagios_context": {
1997- "default": "juju",
1998- "description": "Used by the nrpe-external-master subordinate charm. A string that will be prepended to instance name to set the host name in nagios. So for instance the hostname would be something like:\n juju-memcached-0\nIf you're running multiple environments with the same services in them this allows you to differentiate between them.\n",
1999- "type": "string"
2000- },
2001- "request-limit": {
2002- "default": -1,
2003- "description": "limit of requests a single client can make at one time\n(memcached option -R) -1 takes memcached default (20)\n",
2004- "type": "int"
2005- },
2006- "size": {
2007- "default": 768,
2008- "description": "Size of memcache pool in MiB (memcached option -m)",
2009- "type": "int"
2010- },
2011- "slab-page-size": {
2012- "default": -1,
2013- "description": "Override the size of each slab page in bytes. In mundane\nwords, it adjusts the maximum item size that memcached\nwill accept. You can use the suffixes K and M to specify\nthe size as well, so use 2000000 or 2000K or 2M if you want\na maximum size of 2 MB per object. It is not recommended\nto raise this limit above 1 MB due just to performance reasons.\nThe default value is 1 MB. (memcached option -I) -1 takes\nthe memcached default.\n",
2014- "type": "int"
2015- },
2016- "tcp-port": {
2017- "default": 11211,
2018- "description": "TCP port to listen on. (memcached option -p)",
2019- "type": "int"
2020- },
2021- "threads": {
2022- "default": -1,
2023- "description": "number of threads to use. default is 4. (memcached option -t)",
2024- "type": "int"
2025- },
2026- "udp-port": {
2027- "default": 0,
2028- "description": "UDP port to listen on (memcached option -U)",
2029- "type": "int"
2030- }
2031- },
2032- "owner": "charmers",
2033- "rating_denominator": 0,
2034- "rating_numerator": 0,
2035- "relations": {
2036- "provides": {
2037- "cache": {
2038- "interface": "memcache"
2039- },
2040- "munin": {
2041- "interface": "munin-node"
2042- },
2043- "nrpe-external-master": {
2044- "interface": "nrpe-external-master",
2045- "scope": "container"
2046- }
2047- },
2048- "requires": {}
2049- },
2050- "revision": 28,
2051- "summary": "A high-performance memory object caching system",
2052- "tested_providers": {
2053- "ec2": "SUCCESS",
2054- "local": "SUCCESS",
2055- "openstack": "SUCCESS"
2056- },
2057- "url": "cs:precise/memcached-7"
2058- },
2059- "mysql": {
2060- "categories": [
2061- "databases"
2062- ],
2063- "code_source": {
2064- "bugs_link": "https://bugs.launchpad.net/charms/+source/mysql",
2065- "last_log": "[ahasenack] Wait for the rbd device to be available before attempting to format it.",
2066- "location": "lp:~charmers/charms/precise/mysql/trunk",
2067- "revision": "104",
2068- "revisions": [
2069- {
2070- "authors": [
2071- {
2072- "email": "adamg@ubuntu.com",
2073- "name": "Adam Gandelman"
2074- }
2075- ],
2076- "date": "2013-08-09T11:08:20Z",
2077- "message": "[ahasenack] Wait for the rbd device to be available before attempting to format it.",
2078- "revno": 104
2079- },
2080- {
2081- "authors": [
2082- {
2083- "email": "adamg@canonical.com",
2084- "name": "Adam Gandelman"
2085- }
2086- ],
2087- "date": "2013-07-23T22:59:11Z",
2088- "message": "Merge juju-core compat. fix from James Page.",
2089- "revno": 103
2090- },
2091- {
2092- "authors": [
2093- {
2094- "email": "jorge@ubuntu.com",
2095- "name": "Jorge O. Castro"
2096- }
2097- ],
2098- "date": "2013-07-08T13:40:01Z",
2099- "message": "Fix category.\n",
2100- "revno": 102
2101- },
2102- {
2103- "authors": [
2104- {
2105- "email": "mark.mims@canonical.com",
2106- "name": "Mark Mims"
2107- }
2108- ],
2109- "date": "2013-06-07T16:38:50Z",
2110- "message": "merging lp:~dannf/charms/precise/mysql/lp1188424 as per https://code.launchpad.net/~dannf/charms/precise/mysql/lp1188424/+merge/167881",
2111- "revno": 101
2112- },
2113- {
2114- "authors": [
2115- {
2116- "email": "marco@ceppi.net",
2117- "name": "Marco Ceppi"
2118- }
2119- ],
2120- "date": "2013-06-06T12:32:17Z",
2121- "message": "James Page 2013-06-06 Stop using socket.getfqdn in shared-db hooks as this assumes DNS resolution between instances is functional\n",
2122- "revno": 100
2123- },
2124- {
2125- "authors": [
2126- {
2127- "email": "marco@ceppi.net",
2128- "name": "Marco Ceppi"
2129- }
2130- ],
2131- "date": "2013-06-05T16:02:08Z",
2132- "message": "Fixes master/slave relation",
2133- "revno": 99
2134- },
2135- {
2136- "authors": [
2137- {
2138- "email": "marco@ceppi.net",
2139- "name": "Marco Ceppi"
2140- }
2141- ],
2142- "date": "2013-05-30T16:03:12Z",
2143- "message": "Maintainership change lp:1178384",
2144- "revno": 98
2145- },
2146- {
2147- "authors": [
2148- {
2149- "email": "marco@ceppi.net",
2150- "name": "Marco Ceppi"
2151- }
2152- ],
2153- "date": "2013-05-30T16:00:48Z",
2154- "message": "ha-support: https://code.launchpad.net/~openstack-charmers/charms/precise/mysql/ha-support/+merge/165059\n",
2155- "revno": 97
2156- },
2157- {
2158- "authors": [
2159- {
2160- "email": "marco@ceppi.net",
2161- "name": "Marco Ceppi"
2162- }
2163- ],
2164- "date": "2013-04-25T18:19:45Z",
2165- "message": "Added icon.svg",
2166- "revno": 96
2167- },
2168- {
2169- "authors": [
2170- {
2171- "email": "jorge@ubuntu.com",
2172- "name": "Jorge O. Castro"
2173- }
2174- ],
2175- "date": "2013-04-22T15:04:35Z",
2176- "message": "Use the correct syntax\n",
2177- "revno": 95
2178- }
2179- ],
2180- "type": "bzr"
2181- },
2182- "date_created": "2012-04-16T18:30:00Z",
2183- "description": "MySQL is a fast, stable and true multi-user, multi-threaded SQL database\nserver. SQL (Structured Query Language) is the most popular database query\nlanguage in the world. The main goals of MySQL are speed, robustness and\nease of use.\n",
2184- "distro_series": "precise",
2185- "downloads": 9728,
2186- "downloads_in_past_30_days": 932,
2187- "files": [
2188- "hooks/munin-relation-joined",
2189- "hooks/monitors.common.bash",
2190- "hooks/db-relation-joined",
2191- "hooks/shared-db-relation-changed",
2192- "hooks/master-relation-departed",
2193- "hooks/monitors-relation-departed",
2194- "hooks/master-relation-broken",
2195- "hooks/lib/cluster_utils.py",
2196- "hooks/shared_db_relations.py",
2197- "hooks/slave-relation-changed",
2198- "README.md",
2199- "hooks/ha-relation-changed",
2200- "hooks/munin-relation-changed",
2201- "hooks/common.py",
2202- "hooks/start",
2203- "hooks/config-changed",
2204- "hooks/db-relation-broken",
2205- "hooks/shared-db-relation-joined",
2206- "hooks/ha_relations.py",
2207- "hooks/cluster-relation-changed",
2208- "hooks/slave-relation-departed",
2209- "hooks/install",
2210- "hooks/ceph-relation-changed",
2211- "metadata.yaml",
2212- "hooks/ha-relation-joined",
2213- "hooks/stop",
2214- "hooks/local-monitors-relation-joined",
2215- "hooks/db-admin-relation-joined",
2216- "config.yaml",
2217- "hooks/monitors-relation-joined",
2218- "icon.svg",
2219- "hooks/upgrade-charm",
2220- "hooks/lib/utils.py",
2221- "hooks/ceph-relation-joined",
2222- "hooks/master-relation-changed",
2223- "hooks/lib/__init__.py",
2224- "hooks/slave-relation-joined",
2225- "hooks/lib/ceph_utils.py",
2226- "hooks/slave-relation-broken",
2227- "revision",
2228- "hooks/monitors-relation-broken"
2229- ],
2230- "id": "precise/mysql-27",
2231- "is_approved": true,
2232- "is_subordinate": false,
2233- "maintainer": {
2234- "email": "marco@ceppi.net",
2235- "name": "Marco Ceppi"
2236- },
2237- "name": "mysql",
2238- "options": {
2239- "binlog-format": {
2240- "default": "MIXED",
2241- "description": "If binlogging is enabled, this is the format that will be used. Ignored when tuning-level == fast.",
2242- "type": "string"
2243- },
2244- "block-size": {
2245- "default": 5,
2246- "description": "Default block storage size to create when setting up MySQL block storage.\nThis value should be specified in GB (e.g. 100 not 100GB).\n",
2247- "type": "int"
2248- },
2249- "dataset-size": {
2250- "default": "80%",
2251- "description": "How much data do you want to keep in memory in the DB. This will be used to tune settings in the database server appropriately. Any more specific settings will override these defaults though. This currently sets innodb_buffer_pool_size or key_cache_size depending on the setting in preferred-storage-engine. If query-cache-type is set to 'ON' or 'DEMAND' 20% of this is given to query-cache-size. Suffix this value with 'K','M','G', or 'T' to get the relevant kilo/mega/etc. bytes. If suffixed with %, one will get that percentage of RAM devoted to dataset and (if enabled) query cache.",
2252- "type": "string"
2253- },
2254- "flavor": {
2255- "default": "distro",
2256- "description": "Possible values are 'distro' or 'percona'",
2257- "type": "string"
2258- },
2259- "ha-bindiface": {
2260- "default": "eth0",
2261- "description": "Default network interface on which HA cluster will bind to communication\nwith the other members of the HA Cluster.\n",
2262- "type": "string"
2263- },
2264- "ha-mcastport": {
2265- "default": 5411,
2266- "description": "Default multicast port number that will be used to communicate between\nHA Cluster nodes.\n",
2267- "type": "int"
2268- },
2269- "max-connections": {
2270- "default": -1,
2271- "description": "Maximum connections to allow. -1 means use the server's compiled in default.",
2272- "type": "int"
2273- },
2274- "preferred-storage-engine": {
2275- "default": "InnoDB",
2276- "description": "Tune the server for usage of this storage engine. Other possible value is MyISAM. Comma separated will cause settings to split resources evenly among given engines.",
2277- "type": "string"
2278- },
2279- "query-cache-size": {
2280- "default": -1,
2281- "description": "Override the computed version from dataset-size. Still works if query-cache-type is \"OFF\" since sessions can override the cache type setting on their own.",
2282- "type": "int"
2283- },
2284- "query-cache-type": {
2285- "default": "OFF",
2286- "description": "Query cache is usually a good idea, but can hurt concurrency. Valid values are \"OFF\", \"ON\", or \"DEMAND\". http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_query_cache_type",
2287- "type": "string"
2288- },
2289- "rbd-name": {
2290- "default": "mysql1",
2291- "description": "The name that will be used to create the Ceph's RBD image with. If the\nimage name exists in Ceph, it will be re-used and the data will be\noverwritten.\n",
2292- "type": "string"
2293- },
2294- "tuning-level": {
2295- "default": "safest",
2296- "description": "Valid values are 'safest', 'fast', and 'unsafe'. If set to safest, all settings are tuned to have maximum safety at the cost of performance. Fast will turn off most controls, but may lose data on crashes. unsafe will turn off all protections.",
2297- "type": "string"
2298- },
2299- "vip": {
2300- "description": "Virtual IP to use to front mysql in ha configuration",
2301- "type": "string"
2302- },
2303- "vip_cidr": {
2304- "default": 24,
2305- "description": "Netmask that will be used for the Virtual IP",
2306- "type": "int"
2307- },
2308- "vip_iface": {
2309- "default": "eth0",
2310- "description": "Network Interface where to place the Virtual IP",
2311- "type": "string"
2312- }
2313- },
2314- "owner": "charmers",
2315- "rating_denominator": 0,
2316- "rating_numerator": 0,
2317- "relations": {
2318- "provides": {
2319- "db": {
2320- "interface": "mysql"
2321- },
2322- "db-admin": {
2323- "interface": "mysql-root"
2324- },
2325- "local-monitors": {
2326- "interface": "local-monitors",
2327- "scope": "container"
2328- },
2329- "master": {
2330- "interface": "mysql-oneway-replication"
2331- },
2332- "monitors": {
2333- "interface": "monitors"
2334- },
2335- "munin": {
2336- "interface": "munin-node"
2337- },
2338- "shared-db": {
2339- "interface": "mysql-shared"
2340- }
2341- },
2342- "requires": {
2343- "ceph": {
2344- "interface": "ceph-client"
2345- },
2346- "ha": {
2347- "interface": "hacluster",
2348- "scope": "container"
2349- },
2350- "slave": {
2351- "interface": "mysql-oneway-replication"
2352- }
2353- }
2354- },
2355- "revision": 309,
2356- "summary": "MySQL is a fast, stable and true multi-user, multi-threaded SQL database",
2357- "tested_providers": {
2358- "ec2": "SUCCESS",
2359- "local": "SUCCESS",
2360- "openstack": "SUCCESS"
2361- },
2362- "url": "cs:precise/mysql-27"
2363- }
2364- },
2365- "data": {
2366- "relations": [
2367- [
2368- "mediawiki:cache",
2369- "memcached:cache"
2370- ],
2371- [
2372- "mediawiki:db",
2373- "mysql:db"
2374- ],
2375- [
2376- "haproxy:reverseproxy",
2377- "mediawiki:website"
2378- ]
2379- ],
2380- "series": "precise",
2381- "services": {
2382- "haproxy": {
2383- "charm": "haproxy",
2384- "num_units": 5,
2385- "annotations": {
2386- "gui-x": 1,
2387- "gui-y": 1
2388- }
2389- },
2390- "mediawiki": {
2391- "charm": "mediawiki",
2392- "num_units": 9,
2393- "options": {
2394- "name": "Intranet"
2395- },
2396- "annotations": {
2397- "gui-x": 1,
2398- "gui-y": 1
2399- }
2400- },
2401- "memcached": {
2402- "charm": "memcached",
2403- "num_units": 3,
2404- "annotations": {
2405- "gui-x": 1,
2406- "gui-y": 1
2407- }
2408- },
2409- "mysql": {
2410- "charm": "mysql",
2411- "num_units": 3,
2412- "options": {
2413- "tuning-level": "safest"
2414- },
2415- "annotations": {
2416- "gui-x": 1,
2417- "gui-y": 1
2418- }
2419- }
2420- }
2421- },
2422- "description": "",
2423- "files": [
2424- "README",
2425- "icon.svg",
2426- "bundles.yaml"
2427- ],
2428- "id": "~benji/wiki/5/wiki",
2429- "name": "wiki",
2430- "owner": "benji",
2431- "permanent_url": "jc:~benji/wiki/5/wiki",
2432- "promulgated": false,
2433- "title": ""
2434+ "haproxy": {
2435+ "charm": "haproxy",
2436+ "num_units": 5
2437+ },
2438+ "mediawiki": {
2439+ "charm": "mediawiki",
2440+ "num_units": 9,
2441+ "options": {
2442+ "name": "Intranet"
2443+ }
2444+ },
2445+ "memcached": {
2446+ "charm": "memcached",
2447+ "num_units": 3
2448+ },
2449+ "mysql": {
2450+ "charm": "mysql",
2451+ "num_units": 3,
2452+ "options": {
2453+ "tuning-level": "safest"
2454+ }
2455+ }
2456+ }
2457+ },
2458+ "deployer_file_url": "http://staging.jujucharms.com/bundle/%7Ebenji/wiki/5/wiki/json",
2459+ "description": "",
2460+ "downloads": 5,
2461+ "downloads_in_past_30_days": 3,
2462+ "files": [
2463+ "README",
2464+ "icon.svg",
2465+ "bundles.yaml"
2466+ ],
2467+ "first_change": {
2468+ "authors": [
2469+ "Brad Crittenden <bac@canonical.com>"
2470+ ],
2471+ "committer": "Brad Crittenden <bac@canonical.com>",
2472+ "created": 1375449744.902,
2473+ "message": "Initial checking of working config.",
2474+ "revno": 1
2475+ },
2476+ "id": "~benji/wiki/5/wiki",
2477+ "last_change": {
2478+ "authors": [
2479+ "Benji York <benji.york@canonical.com>"
2480+ ],
2481+ "committer": "Benji York <benji.york@canonical.com>",
2482+ "created": 1380814176.735,
2483+ "message": "add a series to the bundle\n",
2484+ "revno": 5
2485+ },
2486+ "name": "wiki",
2487+ "owner": "benji",
2488+ "permanent_url": "bundle:~benji/wiki/5/wiki",
2489+ "promulgated": false,
2490+ "title": ""
2491 }
2492
2493=== modified file 'test/test_bundle_details_view.js'
2494--- test/test_bundle_details_view.js 2013-11-05 18:10:05 +0000
2495+++ test/test_bundle_details_view.js 2013-11-21 18:07:56 +0000
2496@@ -86,6 +86,9 @@
2497 view.set('entity', new models.Bundle(data));
2498 view.render();
2499 assert.isNotNull(container.one('.yui3-tabview'));
2500+
2501+ assert.notEqual(container.get('innerHTML').indexOf('Deployed 5'), -1,
2502+ 'Download count is not added to the page.');
2503 });
2504
2505 it('fetches the readme when requested', function(done) {
2506
2507=== modified file 'test/test_model_bundle.js'
2508--- test/test_model_bundle.js 2013-10-31 14:34:07 +0000
2509+++ test/test_model_bundle.js 2013-11-21 18:07:56 +0000
2510@@ -153,6 +153,26 @@
2511 assert.equal(instance.get('unitCount'), 20);
2512 });
2513
2514+ it('must provide a downloads attribute', function() {
2515+ instance = new models.Bundle(data);
2516+ assert.equal(instance.get('downloads'), 5);
2517+ });
2518+
2519+ it('must init a downloads attribute to 0', function() {
2520+ instance = new models.Bundle();
2521+ assert.equal(instance.get('downloads'), 0);
2522+ });
2523+
2524+ it('must provide a recent_download_count attribute', function() {
2525+ instance = new models.Bundle(data);
2526+ assert.equal(instance.get('recent_download_count'), 3);
2527+ });
2528+
2529+ it('must init a receent_download_count attribute to 0', function() {
2530+ instance = new models.Bundle();
2531+ assert.equal(instance.get('recent_download_count'), 0);
2532+ });
2533+
2534 it('has an entityType static property', function() {
2535 instance = new models.Bundle(data);
2536 assert.equal(instance.constructor.entityType, 'bundle');
2537@@ -161,17 +181,19 @@
2538 it('has recent commits', function() {
2539 instance = new models.Bundle(data);
2540 var commits = instance.get('recentCommits');
2541- assert.lengthOf(commits, 3);
2542+ assert.lengthOf(commits, 5);
2543 });
2544
2545 it('parses author name correctly', function() {
2546 instance = new models.Bundle(data);
2547 var commits = instance.get('recentCommits');
2548- assert.equal('Brad Crittenden', commits[0].author.name);
2549- assert.equal('bac@example.com', commits[0].author.email);
2550+ assert.equal('Benji York', commits[0].author.name);
2551+ assert.equal('benji.york@canonical.com', commits[0].author.email);
2552 });
2553
2554 it('only the first author is shown', function() {
2555+ // Manually added a second author into the test data from the server.
2556+ // Jorge O. O'Castro <jorge@example.com>
2557 instance = new models.Bundle(data);
2558 var commits = instance.get('recentCommits');
2559 assert.equal('Jorge O. O\'Castro', commits[1].author.name);
2560@@ -181,22 +203,22 @@
2561 it('has the revnos in reverse order', function() {
2562 instance = new models.Bundle(data);
2563 var commits = instance.get('recentCommits');
2564- assert.equal(3, commits[0].revno);
2565- assert.equal(2, commits[1].revno);
2566- assert.equal(1, commits[2].revno);
2567+ assert.equal(5, commits[0].revno);
2568+ assert.equal(4, commits[1].revno);
2569+ assert.equal(3, commits[2].revno);
2570 });
2571
2572 it('has the correct date in GMT', function() {
2573 instance = new models.Bundle(data);
2574 var commits = instance.get('recentCommits');
2575- assert.equal('Tue, 03 Sep 2013 14:22:41 GMT',
2576+ assert.equal('Thu, 03 Oct 2013 15:29:36 GMT',
2577 commits[0].date.toUTCString());
2578 });
2579
2580 it('has the commit message', function() {
2581 instance = new models.Bundle(data);
2582 var commits = instance.get('recentCommits');
2583- assert.equal('Correct icon', commits[0].message);
2584+ assert.equal('add a series to the bundle\n', commits[0].message);
2585 });
2586
2587 it('parses full name-email string', function() {
2588
2589=== modified file 'test/test_token.js'
2590--- test/test_token.js 2013-11-04 16:40:41 +0000
2591+++ test/test_token.js 2013-11-21 18:07:56 +0000
2592@@ -176,9 +176,10 @@
2593
2594 it('renders a bundle token properly with data', function() {
2595 var token = new Token({
2596- size: 'small',
2597 basket_name: 'BASKET-NAME',
2598+ downloads: 5,
2599 serviceCount: 4,
2600+ size: 'small',
2601 unitCount: 5
2602 });
2603
2604@@ -192,6 +193,10 @@
2605 -1
2606 );
2607 assert.notEqual(
2608+ token_container.get('innerHTML').indexOf('Deployed 5 times'),
2609+ -1
2610+ );
2611+ assert.notEqual(
2612 token_container.one('a').getData('charmid').indexOf('bundle'),
2613 -1
2614 );
2615
2616=== modified file 'test/test_utils.js'
2617--- test/test_utils.js 2013-11-19 22:30:18 +0000
2618+++ test/test_utils.js 2013-11-21 18:07:56 +0000
2619@@ -1402,7 +1402,7 @@
2620
2621 var parsed = utils.charmIconParser(bundleData.charm_metadata);
2622 var expected = [{
2623- id: 'precise/haproxy-18',
2624+ id: 'precise/haproxy-21',
2625 name: 'haproxy'
2626 }, {
2627 id: 'precise/mediawiki-10',
2628@@ -1411,7 +1411,7 @@
2629 id: 'precise/memcached-7',
2630 name: 'memcached'
2631 }, {
2632- id: 'precise/mysql-27',
2633+ id: 'precise/mysql-29',
2634 name: 'mysql'
2635 }];
2636 assert.deepEqual(parsed, expected);

Subscribers

People subscribed via source and target branches