Merge lp:~tvansteenburgh/charm-tools/lp-1277652 into lp:charm-tools/1.2
- lp-1277652
- Merge into 1.2
Proposed by
Tim Van Steenburgh
Status: | Merged |
---|---|
Merged at revision: | 321 |
Proposed branch: | lp:~tvansteenburgh/charm-tools/lp-1277652 |
Merge into: | lp:charm-tools/1.2 |
Diff against target: |
716 lines (+251/-134) 27 files modified
Makefile (+7/-7) charmtools/charms.py (+14/-5) charmtools/create.py (+5/-0) charmtools/proof.py (+2/-1) charmtools/templates/charm/README.ex (+5/-5) charmtools/test.py (+22/-5) tests/test_charm_proof.py (+48/-4) tests/test_juju_test.py (+26/-0) tests/test_substrates.py (+9/-1) tests_functional/charms/broken-maintainer/README.ex (+1/-2) tests_functional/charms/icon-template/README.ex (+1/-2) tests_functional/charms/missing-maintainer/README.ex (+1/-2) tests_functional/charms/test/README.ex (+1/-2) tests_functional/charms/unknown-metadata/README.ex (+1/-2) tests_functional/create/no-package-exists/README.ex (+30/-27) tests_functional/create/python-apt/README.ex (+30/-27) tests_functional/proof/expected/broken-categories (+1/-0) tests_functional/proof/expected/broken-config (+1/-0) tests_functional/proof/expected/broken-maintainer (+10/-10) tests_functional/proof/expected/broken-subordinate (+1/-0) tests_functional/proof/expected/broken-subordinate2 (+1/-0) tests_functional/proof/expected/empty-requires (+2/-1) tests_functional/proof/expected/icon-template (+5/-5) tests_functional/proof/expected/missing-maintainer (+10/-10) tests_functional/proof/expected/mod-spdy (+3/-2) tests_functional/proof/expected/test (+10/-10) tests_functional/proof/expected/unknown-metadata (+4/-4) |
To merge this branch: | bzr merge lp:~tvansteenburgh/charm-tools/lp-1277652 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Charles Butler (community) | Approve | ||
Review via email: mp+219866@code.launchpad.net |
Commit message
Description of the change
Change handling of missing default values for config options.
New behavior is as follows:
- If the default KEY is missing, that is a Warning for all data types.
- If the default VALUE is missing, that is a Warning for booleans and
Info for all other data types.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'Makefile' |
2 | --- Makefile 2014-01-10 20:01:51 +0000 |
3 | +++ Makefile 2014-05-16 15:55:55 +0000 |
4 | @@ -89,13 +89,13 @@ |
5 | |
6 | integration: |
7 | tests_functional/helpers/helpers.sh || sh -x tests_functional/helpers/helpers.sh timeout |
8 | - @echo Test shell helpers with dash |
9 | - bash tests/helpers/helpers.sh \ |
10 | - || bash -x tests/helpers/helpers.sh timeout |
11 | - tests/helpers/helpers.bash || sh -x tests/helpers/helpers.bash timeout |
12 | - @echo Test shell helpers with bash |
13 | - bash tests/helpers/helpers.bash \ |
14 | - || bash -x tests/helpers/helpers.bash timeout |
15 | + @echo Test shell helpers with bash |
16 | + bash tests_functional/helpers/helpers.sh \ |
17 | + || bash -x tests_functional/helpers/helpers.sh timeout |
18 | + tests_functional/helpers/helpers.bash || sh -x tests_functional/helpers/helpers.bash timeout |
19 | + @echo Test shell helpers with bash |
20 | + bash tests_functional/helpers/helpers.bash \ |
21 | + || bash -x tests_functional/helpers/helpers.bash timeout |
22 | @echo Test charm proof |
23 | tests_functional/proof/test.sh |
24 | tests_functional/create/test.sh |
25 | |
26 | === modified file 'charmtools/charms.py' |
27 | --- charmtools/charms.py 2014-04-30 19:27:07 +0000 |
28 | +++ charmtools/charms.py 2014-05-16 15:55:55 +0000 |
29 | @@ -42,6 +42,8 @@ |
30 | 'boolean': bool, |
31 | } |
32 | |
33 | +ALLOW_NONE_DEFAULT = (basestring, int, float) |
34 | + |
35 | |
36 | class RelationError(Exception): |
37 | pass |
38 | @@ -184,12 +186,19 @@ |
39 | % (option_name, option_type)) |
40 | elif 'default' in option_value: |
41 | expected_type = KNOWN_OPTION_TYPES[option_value['type']] |
42 | - if not isinstance(option_value['default'], expected_type): |
43 | + actual_value = option_value['default'] |
44 | + if actual_value is None: |
45 | + notify = (self.info if expected_type in ALLOW_NONE_DEFAULT |
46 | + else self.warn) |
47 | + notify( |
48 | + 'config.yaml: option %s has no default value' |
49 | + % option_name) |
50 | + elif not isinstance(actual_value, expected_type): |
51 | self.err( |
52 | 'config.yaml: type of option %s is specified as ' |
53 | '%s, but the type of the default value is %s' |
54 | % (option_name, option_value['type'], |
55 | - type(option_value['default']).__name__)) |
56 | + type(actual_value).__name__)) |
57 | else: |
58 | # Nothing to do: the option type is valid but no default |
59 | # value exists. |
60 | @@ -205,7 +214,7 @@ |
61 | def is_charm(self): |
62 | return os.path.isfile(os.path.join(self.charm_path, 'metadata.yaml')) |
63 | |
64 | - def proof(self, remote=True): |
65 | + def proof(self, remote=True, **kw): |
66 | lint = CharmLinter() |
67 | charm_name = self.charm_path |
68 | if os.path.isdir(charm_name): |
69 | @@ -326,8 +335,8 @@ |
70 | continue |
71 | lc += 1 |
72 | if l in readme_content: |
73 | - err_msg = ('%s Includes line %d of ' |
74 | - 'boilerplate README.ex ') |
75 | + err_msg = ('%s includes line %d of ' |
76 | + 'boilerplate README.ex') |
77 | lint.warn(err_msg % (readme, lc)) |
78 | except IOError as e: |
79 | lint.warn( |
80 | |
81 | === modified file 'charmtools/create.py' |
82 | --- charmtools/create.py 2013-12-11 16:27:55 +0000 |
83 | +++ charmtools/create.py 2014-05-16 15:55:55 +0000 |
84 | @@ -74,6 +74,11 @@ |
85 | print "Found " + package + " package in apt cache, as a result charm" \ |
86 | + " contents have been pre-populated based on package metadata." |
87 | |
88 | + # summary and description attrs moved to Version |
89 | + # object in python-apt 0.7.9 |
90 | + if not hasattr(p, 'summary'): |
91 | + p = p.versions[0] |
92 | + |
93 | v['summary'] = p.summary |
94 | v['description'] = textwrap.fill(p.description, width=72, |
95 | subsequent_indent=' ') |
96 | |
97 | === modified file 'charmtools/proof.py' |
98 | --- charmtools/proof.py 2014-04-02 20:57:06 +0000 |
99 | +++ charmtools/proof.py 2014-05-16 15:55:55 +0000 |
100 | @@ -59,7 +59,8 @@ |
101 | except Exception as e: |
102 | return ["FATAL: %s" % e.message], 200 |
103 | |
104 | - lint, err_code = c.proof(with_remote, server, port, secure) |
105 | + lint, err_code = c.proof( |
106 | + remote=with_remote, server=server, port=port, secure=secure) |
107 | return lint, err_code |
108 | |
109 | |
110 | |
111 | === modified file 'charmtools/templates/charm/README.ex' |
112 | --- charmtools/templates/charm/README.ex 2014-01-16 12:14:41 +0000 |
113 | +++ charmtools/templates/charm/README.ex 2014-05-16 15:55:55 +0000 |
114 | @@ -1,6 +1,6 @@ |
115 | # Overview |
116 | |
117 | -Describe the intended usage of this charm and anything unique about how this charm relates to others here. |
118 | +Describe the intended usage of this charm and anything unique about how this charm relates to others here. |
119 | |
120 | This README will be displayed in the Charm Store, it should be either Markdown or RST. Ideal READMEs include instructions on how to use the charm, expected usage, and charm features that your audience might be interested in. For an example of a well written README check out Hadoop: http://jujucharms.com/charms/precise/hadoop |
121 | |
122 | @@ -16,17 +16,17 @@ |
123 | |
124 | juju deploy servicename |
125 | |
126 | -and so on. If you're providing a web service or something that the end user needs to go to, tell them here, especially if you're deploying a service that might listen to a non-default port. |
127 | +and so on. If you're providing a web service or something that the end user needs to go to, tell them here, especially if you're deploying a service that might listen to a non-default port. |
128 | |
129 | -You can then browse to http://ip-address to configure the service. |
130 | +You can then browse to http://ip-address to configure the service. |
131 | |
132 | ## Scale out Usage |
133 | |
134 | -If the charm has any recommendations for running at scale, outline them in examples here. For example if you have a memcached relation that improves performance, mention it here. |
135 | +If the charm has any recommendations for running at scale, outline them in examples here. For example if you have a memcached relation that improves performance, mention it here. |
136 | |
137 | ## Known Limitations and Issues |
138 | |
139 | -This not only helps users but gives people a place to start if they want to help you add features to your charm. |
140 | +This not only helps users but gives people a place to start if they want to help you add features to your charm. |
141 | |
142 | # Configuration |
143 | |
144 | |
145 | === modified file 'charmtools/test.py' |
146 | --- charmtools/test.py 2014-02-26 17:38:03 +0000 |
147 | +++ charmtools/test.py 2014-05-16 15:55:55 +0000 |
148 | @@ -417,6 +417,8 @@ |
149 | _keys = ['timeout', 'set-e', 'on-timeout', 'fail-on-skip', 'tests'] |
150 | |
151 | def __init__(self, cfg): |
152 | + self.log = logging.getLogger('juju-test.testcfg') |
153 | + |
154 | if isinstance(cfg, basestring): |
155 | cfg = yaml.safe_load(cfg) |
156 | |
157 | @@ -425,7 +427,12 @@ |
158 | if key in self._keys: |
159 | setattr(self, key, val) |
160 | if 'substrates' in cfg: |
161 | - self.substrates = cfg.substrates |
162 | + self.substrates = cfg['substrates'] |
163 | + |
164 | + def update(self, **kw): |
165 | + for key, val in kw.iteritems(): |
166 | + self.log.debug('Overwriting %s to %s from cmd' % (key, val)) |
167 | + setattr(self, key, val) |
168 | |
169 | |
170 | def get_juju_version(): |
171 | @@ -527,8 +534,20 @@ |
172 | |
173 | |
174 | def parse_substrates(spec): |
175 | + """Return a :class:`SubstrateFilter` object parsed from ``spec``. |
176 | + |
177 | + :param spec: |
178 | + |
179 | + Can be a yaml string, a dict with a 'substrates' key, or an object |
180 | + with a 'substrates' attribute. The 'substrates' key or attribute |
181 | + should contain a dict with optional 'order', 'skip', and 'include' |
182 | + keys. |
183 | + |
184 | + """ |
185 | if isinstance(spec, basestring): |
186 | spec = yaml.safe_load(spec) |
187 | + elif not hasattr(spec, '__getitem__'): |
188 | + spec = vars(spec) |
189 | if not spec or 'substrates' not in spec: |
190 | raise ValueError( |
191 | "Invalid data passed to parse_substrates: {}".format(spec)) |
192 | @@ -664,9 +683,7 @@ |
193 | |
194 | if test_cfg: |
195 | cfg = TestCfg(test_cfg) |
196 | - for key, val in args.iteritems(): |
197 | - logger.debug('Overwriting %s to %s from cmd' % (key, val)) |
198 | - setattr(cfg, key, val) |
199 | + cfg.update(**vars(args)) |
200 | else: |
201 | cfg = args |
202 | |
203 | @@ -674,7 +691,7 @@ |
204 | try: |
205 | tester = Conductor(args) |
206 | env_yaml = tester.get_environment(cfg.juju_env) |
207 | - if 'substrates' in cfg: |
208 | + if getattr(cfg, 'substrates', None): |
209 | rules = parse_substrates(cfg) |
210 | allowed = rules.filter(env_yaml['type']) |
211 | if env_yaml['type'] not in allowed: |
212 | |
213 | === modified file 'tests/test_charm_proof.py' |
214 | --- tests/test_charm_proof.py 2014-04-30 19:27:07 +0000 |
215 | +++ tests/test_charm_proof.py 2014-05-16 15:55:55 +0000 |
216 | @@ -241,8 +241,8 @@ |
217 | 'the type of the default value is str') |
218 | self.assertEqual(expected, self.linter.lint[0]) |
219 | |
220 | - def test_option_empty_default_value(self): |
221 | - # An empty default value is treated as an error. |
222 | + def test_option_empty_default_value_string(self): |
223 | + # An empty default value is treated as INFO for strings |
224 | self.write_config(""" |
225 | options: |
226 | foo: |
227 | @@ -253,8 +253,52 @@ |
228 | self.linter.check_config_file(self.charm_dir) |
229 | self.assertEqual(1, len(self.linter.lint)) |
230 | expected = ( |
231 | - 'E: config.yaml: type of option foo is specified as string, ' |
232 | - 'but the type of the default value is NoneType') |
233 | + 'I: config.yaml: option foo has no default value') |
234 | + self.assertEqual(expected, self.linter.lint[0]) |
235 | + |
236 | + def test_option_empty_default_value_int(self): |
237 | + # An empty default value is treated as INFO for ints |
238 | + self.write_config(""" |
239 | + options: |
240 | + foo: |
241 | + type: int |
242 | + default: |
243 | + description: blah |
244 | + """) |
245 | + self.linter.check_config_file(self.charm_dir) |
246 | + self.assertEqual(1, len(self.linter.lint)) |
247 | + expected = ( |
248 | + 'I: config.yaml: option foo has no default value') |
249 | + self.assertEqual(expected, self.linter.lint[0]) |
250 | + |
251 | + def test_option_empty_default_value_float(self): |
252 | + # An empty default value is treated as INFO for floats |
253 | + self.write_config(""" |
254 | + options: |
255 | + foo: |
256 | + type: float |
257 | + default: |
258 | + description: blah |
259 | + """) |
260 | + self.linter.check_config_file(self.charm_dir) |
261 | + self.assertEqual(1, len(self.linter.lint)) |
262 | + expected = ( |
263 | + 'I: config.yaml: option foo has no default value') |
264 | + self.assertEqual(expected, self.linter.lint[0]) |
265 | + |
266 | + def test_option_empty_default_value_boolean(self): |
267 | + # An empty default value is treated as WARN for booleans |
268 | + self.write_config(""" |
269 | + options: |
270 | + foo: |
271 | + type: boolean |
272 | + default: |
273 | + description: blah |
274 | + """) |
275 | + self.linter.check_config_file(self.charm_dir) |
276 | + self.assertEqual(1, len(self.linter.lint)) |
277 | + expected = ( |
278 | + 'W: config.yaml: option foo has no default value') |
279 | self.assertEqual(expected, self.linter.lint[0]) |
280 | |
281 | def test_yaml_with_python_objects(self): |
282 | |
283 | === modified file 'tests/test_juju_test.py' |
284 | --- tests/test_juju_test.py 2014-02-26 17:38:03 +0000 |
285 | +++ tests/test_juju_test.py 2014-05-16 15:55:55 +0000 |
286 | @@ -720,3 +720,29 @@ |
287 | o = juju_test.Orchestra(c, 'test/dummy') |
288 | o.perform() |
289 | mprint_status.assert_called_once() |
290 | + |
291 | + |
292 | +class TestCfgTest(unittest.TestCase): |
293 | + test_config = '''\ |
294 | + options: |
295 | + timeout: 500 |
296 | + substrates: |
297 | + order: include, skip |
298 | + include: local |
299 | + skip: "*" |
300 | + ''' |
301 | + |
302 | + def test_init_str(self): |
303 | + t = juju_test.TestCfg(self.test_config) |
304 | + self.assertEqual(t.timeout, 500) |
305 | + self.assertEqual(t.substrates['include'], 'local') |
306 | + |
307 | + def test_init_dict(self): |
308 | + t = juju_test.TestCfg(yaml.safe_load(self.test_config)) |
309 | + self.assertEqual(t.timeout, 500) |
310 | + self.assertEqual(t.substrates['include'], 'local') |
311 | + |
312 | + def test_update(self): |
313 | + t = juju_test.TestCfg(self.test_config) |
314 | + t.update(timeout=400) |
315 | + self.assertEqual(t.timeout, 400) |
316 | |
317 | === modified file 'tests/test_substrates.py' |
318 | --- tests/test_substrates.py 2014-01-09 20:16:05 +0000 |
319 | +++ tests/test_substrates.py 2014-05-16 15:55:55 +0000 |
320 | @@ -24,9 +24,17 @@ |
321 | self.assertRaises(ValueError, parse_substrates, '') |
322 | self.assertIsNotNone(parse_substrates(self.INCLUDE_SKIP)) |
323 | |
324 | + def test_parse_substrate_dict(self): |
325 | + data = yaml.load(self.INCLUDE_SKIP) |
326 | + self.assertIsNotNone(parse_substrates(data)) |
327 | + |
328 | def test_parse_substrate_object(self): |
329 | + class Object(object): |
330 | + pass |
331 | data = yaml.load(self.INCLUDE_SKIP) |
332 | - self.assertIsNotNone(parse_substrates(data)) |
333 | + o = Object() |
334 | + o.__dict__ = data |
335 | + self.assertIsNotNone(parse_substrates(o)) |
336 | |
337 | def test_parse_substrates_order(self): |
338 | result = parse_substrates(self.INCLUDE_SKIP) |
339 | |
340 | === modified file 'tests_functional/charms/broken-maintainer/README.ex' |
341 | --- tests_functional/charms/broken-maintainer/README.ex 2013-11-11 19:08:11 +0000 |
342 | +++ tests_functional/charms/broken-maintainer/README.ex 2014-05-16 15:55:55 +0000 |
343 | @@ -1,5 +1,4 @@ |
344 | -Describe the intended usage of this charm and anything unique about how |
345 | -this charm relates to others here. |
346 | +Describe the intended usage of this charm and anything unique about how this charm relates to others here. |
347 | |
348 | Be sure to remove this section before submitting this to |
349 | https://launchpad.net/charms for inclusion in the charm store. |
350 | |
351 | === modified file 'tests_functional/charms/icon-template/README.ex' |
352 | --- tests_functional/charms/icon-template/README.ex 2013-11-11 19:08:11 +0000 |
353 | +++ tests_functional/charms/icon-template/README.ex 2014-05-16 15:55:55 +0000 |
354 | @@ -1,5 +1,4 @@ |
355 | -Describe the intended usage of this charm and anything unique about how |
356 | -this charm relates to others here. |
357 | +Describe the intended usage of this charm and anything unique about how this charm relates to others here. |
358 | |
359 | Be sure to remove this section before submitting this to |
360 | https://launchpad.net/charms for inclusion in the charm store. |
361 | |
362 | === modified file 'tests_functional/charms/missing-maintainer/README.ex' |
363 | --- tests_functional/charms/missing-maintainer/README.ex 2013-11-11 19:08:11 +0000 |
364 | +++ tests_functional/charms/missing-maintainer/README.ex 2014-05-16 15:55:55 +0000 |
365 | @@ -1,5 +1,4 @@ |
366 | -Describe the intended usage of this charm and anything unique about how |
367 | -this charm relates to others here. |
368 | +Describe the intended usage of this charm and anything unique about how this charm relates to others here. |
369 | |
370 | Be sure to remove this section before submitting this to |
371 | https://launchpad.net/charms for inclusion in the charm store. |
372 | |
373 | === modified file 'tests_functional/charms/test/README.ex' |
374 | --- tests_functional/charms/test/README.ex 2013-11-11 19:08:11 +0000 |
375 | +++ tests_functional/charms/test/README.ex 2014-05-16 15:55:55 +0000 |
376 | @@ -1,5 +1,4 @@ |
377 | -Describe the intended usage of this charm and anything unique about how |
378 | -this charm relates to others here. |
379 | +Describe the intended usage of this charm and anything unique about how this charm relates to others here. |
380 | |
381 | Be sure to remove this section before submitting this to |
382 | https://launchpad.net/charms for inclusion in the charm store. |
383 | |
384 | === modified file 'tests_functional/charms/unknown-metadata/README.ex' |
385 | --- tests_functional/charms/unknown-metadata/README.ex 2013-11-11 19:08:11 +0000 |
386 | +++ tests_functional/charms/unknown-metadata/README.ex 2014-05-16 15:55:55 +0000 |
387 | @@ -1,5 +1,4 @@ |
388 | -Describe the intended usage of this charm and anything unique about how |
389 | -this charm relates to others here. |
390 | +Describe the intended usage of this charm and anything unique about how this charm relates to others here. |
391 | |
392 | Be sure to remove this section before submitting this to |
393 | https://launchpad.net/charms for inclusion in the charm store. |
394 | |
395 | === modified file 'tests_functional/create/no-package-exists/README.ex' |
396 | --- tests_functional/create/no-package-exists/README.ex 2013-11-11 19:08:11 +0000 |
397 | +++ tests_functional/create/no-package-exists/README.ex 2014-05-16 15:55:55 +0000 |
398 | @@ -1,41 +1,44 @@ |
399 | -Describe the intended usage of this charm and anything unique about how |
400 | -this charm relates to others here. |
401 | +# Overview |
402 | + |
403 | +Describe the intended usage of this charm and anything unique about how this charm relates to others here. |
404 | |
405 | This README will be displayed in the Charm Store, it should be either Markdown or RST. Ideal READMEs include instructions on how to use the charm, expected usage, and charm features that your audience might be interested in. For an example of a well written README check out Hadoop: http://jujucharms.com/charms/precise/hadoop |
406 | |
407 | -Here's an example you might wish to template off of: |
408 | - |
409 | -Overview |
410 | --------- |
411 | - |
412 | -This charm provides (service) from (service homepage). Add a description here of what the service itself actually does. |
413 | - |
414 | - |
415 | -Usage |
416 | ------ |
417 | +Use this as a Markdown reference if you need help with the formatting of this README: http://askubuntu.com/editing-help |
418 | + |
419 | +This charm provides [service](http://example.com). Add a description here of what the service itself actually does. |
420 | + |
421 | +Also remember to check the [icon guidelines](https://juju.ubuntu.com/docs/authors-charm-icon.html) so that your charm looks good in the Juju GUI. |
422 | + |
423 | +# Usage |
424 | |
425 | Step by step instructions on using the charm: |
426 | |
427 | juju deploy servicename |
428 | |
429 | -and so on. If you're providing a web service or something that the end user needs to go to, tell them here, especially if you're deploying a service that might listen to a non-default port. |
430 | - |
431 | -You can then browse to http://ip-address to configure the service. |
432 | - |
433 | -Configuration |
434 | -------------- |
435 | +and so on. If you're providing a web service or something that the end user needs to go to, tell them here, especially if you're deploying a service that might listen to a non-default port. |
436 | + |
437 | +You can then browse to http://ip-address to configure the service. |
438 | + |
439 | +## Scale out Usage |
440 | + |
441 | +If the charm has any recommendations for running at scale, outline them in examples here. For example if you have a memcached relation that improves performance, mention it here. |
442 | + |
443 | +## Known Limitations and Issues |
444 | + |
445 | +This not only helps users but gives people a place to start if they want to help you add features to your charm. |
446 | + |
447 | +# Configuration |
448 | |
449 | The configuration options will be listed on the charm store, however If you're making assumptions or opinionated decisions in the charm (like setting a default administrator password), you should detail that here so the user knows how to change it immediately, etc. |
450 | |
451 | - |
452 | -Contact Information |
453 | -------------------- |
454 | +# Contact Information |
455 | |
456 | Though this will be listed in the charm store itself don't assume a user will know that, so include that information here: |
457 | |
458 | -Author: |
459 | -Report bugs at: http://bugs.launchpad.net/charms/+source/charmname |
460 | -Location: http://jujucharms.com/charms/distro/charmname |
461 | - |
462 | -* Be sure to remove the templated parts before submitting to https://launchpad.net/charms for inclusion in the charm store. |
463 | - |
464 | +## Upstream Project Name |
465 | + |
466 | +- Upstream website |
467 | +- Upstream bug tracker |
468 | +- Upstream mailing list or contact information |
469 | +- Feel free to add things if it's useful for users |
470 | |
471 | === modified file 'tests_functional/create/python-apt/README.ex' |
472 | --- tests_functional/create/python-apt/README.ex 2013-11-11 19:08:11 +0000 |
473 | +++ tests_functional/create/python-apt/README.ex 2014-05-16 15:55:55 +0000 |
474 | @@ -1,41 +1,44 @@ |
475 | -Describe the intended usage of this charm and anything unique about how |
476 | -this charm relates to others here. |
477 | +# Overview |
478 | + |
479 | +Describe the intended usage of this charm and anything unique about how this charm relates to others here. |
480 | |
481 | This README will be displayed in the Charm Store, it should be either Markdown or RST. Ideal READMEs include instructions on how to use the charm, expected usage, and charm features that your audience might be interested in. For an example of a well written README check out Hadoop: http://jujucharms.com/charms/precise/hadoop |
482 | |
483 | -Here's an example you might wish to template off of: |
484 | - |
485 | -Overview |
486 | --------- |
487 | - |
488 | -This charm provides (service) from (service homepage). Add a description here of what the service itself actually does. |
489 | - |
490 | - |
491 | -Usage |
492 | ------ |
493 | +Use this as a Markdown reference if you need help with the formatting of this README: http://askubuntu.com/editing-help |
494 | + |
495 | +This charm provides [service](http://example.com). Add a description here of what the service itself actually does. |
496 | + |
497 | +Also remember to check the [icon guidelines](https://juju.ubuntu.com/docs/authors-charm-icon.html) so that your charm looks good in the Juju GUI. |
498 | + |
499 | +# Usage |
500 | |
501 | Step by step instructions on using the charm: |
502 | |
503 | juju deploy servicename |
504 | |
505 | -and so on. If you're providing a web service or something that the end user needs to go to, tell them here, especially if you're deploying a service that might listen to a non-default port. |
506 | - |
507 | -You can then browse to http://ip-address to configure the service. |
508 | - |
509 | -Configuration |
510 | -------------- |
511 | +and so on. If you're providing a web service or something that the end user needs to go to, tell them here, especially if you're deploying a service that might listen to a non-default port. |
512 | + |
513 | +You can then browse to http://ip-address to configure the service. |
514 | + |
515 | +## Scale out Usage |
516 | + |
517 | +If the charm has any recommendations for running at scale, outline them in examples here. For example if you have a memcached relation that improves performance, mention it here. |
518 | + |
519 | +## Known Limitations and Issues |
520 | + |
521 | +This not only helps users but gives people a place to start if they want to help you add features to your charm. |
522 | + |
523 | +# Configuration |
524 | |
525 | The configuration options will be listed on the charm store, however If you're making assumptions or opinionated decisions in the charm (like setting a default administrator password), you should detail that here so the user knows how to change it immediately, etc. |
526 | |
527 | - |
528 | -Contact Information |
529 | -------------------- |
530 | +# Contact Information |
531 | |
532 | Though this will be listed in the charm store itself don't assume a user will know that, so include that information here: |
533 | |
534 | -Author: |
535 | -Report bugs at: http://bugs.launchpad.net/charms/+source/charmname |
536 | -Location: http://jujucharms.com/charms/distro/charmname |
537 | - |
538 | -* Be sure to remove the templated parts before submitting to https://launchpad.net/charms for inclusion in the charm store. |
539 | - |
540 | +## Upstream Project Name |
541 | + |
542 | +- Upstream website |
543 | +- Upstream bug tracker |
544 | +- Upstream mailing list or contact information |
545 | +- Feel free to add things if it's useful for users |
546 | |
547 | === modified file 'tests_functional/proof/expected/broken-categories' |
548 | --- tests_functional/proof/expected/broken-categories 2013-11-11 19:08:11 +0000 |
549 | +++ tests_functional/proof/expected/broken-categories 2014-05-16 15:55:55 +0000 |
550 | @@ -1,1 +1,2 @@ |
551 | W: Categories metadata must be a list of one or more of: applications, app-servers, databases, file-servers, cache-proxy, misc |
552 | +I: missing recommended hook config-changed |
553 | |
554 | === modified file 'tests_functional/proof/expected/broken-config' |
555 | --- tests_functional/proof/expected/broken-config 2013-11-11 19:08:11 +0000 |
556 | +++ tests_functional/proof/expected/broken-config 2014-05-16 15:55:55 +0000 |
557 | @@ -1,1 +1,2 @@ |
558 | +I: missing recommended hook config-changed |
559 | W: config.yaml: option foo has an invalid type (integer) |
560 | |
561 | === modified file 'tests_functional/proof/expected/broken-maintainer' |
562 | --- tests_functional/proof/expected/broken-maintainer 2013-11-11 19:08:11 +0000 |
563 | +++ tests_functional/proof/expected/broken-maintainer 2014-05-16 15:55:55 +0000 |
564 | @@ -1,12 +1,12 @@ |
565 | W: metadata name (test) must match directory name (broken-maintainer) exactly for local deployment. |
566 | W: Maintainer address should contain a real-name and email only. [test@testhost] |
567 | -E: no copyright file |
568 | -E: Includes template README.ex file |
569 | -E: README.ex Includes boilerplate README.ex line 1 |
570 | -E: README.ex Includes boilerplate README.ex line 2 |
571 | -E: template interface names should be changed: interface-name |
572 | -E: template relations should be renamed to fit charm: relation-name |
573 | -E: template interface names should be changed: interface-name |
574 | -E: template relations should be renamed to fit charm: relation-name |
575 | -E: template interface names should be changed: interface-name |
576 | -E: template relations should be renamed to fit charm: relation-name |
577 | +W: no copyright file |
578 | +W: Includes template README.ex file |
579 | +W: README.ex includes line 1 of boilerplate README.ex |
580 | +E: template interface names should be changed: interface-name |
581 | +E: template relations should be renamed to fit charm: relation-name |
582 | +E: template interface names should be changed: interface-name |
583 | +E: template relations should be renamed to fit charm: relation-name |
584 | +E: template interface names should be changed: interface-name |
585 | +E: template relations should be renamed to fit charm: relation-name |
586 | +I: missing recommended hook config-changed |
587 | |
588 | === modified file 'tests_functional/proof/expected/broken-subordinate' |
589 | --- tests_functional/proof/expected/broken-subordinate 2013-11-11 19:08:11 +0000 |
590 | +++ tests_functional/proof/expected/broken-subordinate 2014-05-16 15:55:55 +0000 |
591 | @@ -1,1 +1,2 @@ |
592 | E: subordinates must have at least one scope: container relation |
593 | +I: missing recommended hook config-changed |
594 | |
595 | === modified file 'tests_functional/proof/expected/broken-subordinate2' |
596 | --- tests_functional/proof/expected/broken-subordinate2 2013-11-11 19:08:11 +0000 |
597 | +++ tests_functional/proof/expected/broken-subordinate2 2014-05-16 15:55:55 +0000 |
598 | @@ -1,1 +1,2 @@ |
599 | E: subordinates must have at least one scope: container relation |
600 | +I: missing recommended hook config-changed |
601 | |
602 | === modified file 'tests_functional/proof/expected/empty-requires' |
603 | --- tests_functional/proof/expected/empty-requires 2013-11-11 19:08:11 +0000 |
604 | +++ tests_functional/proof/expected/empty-requires 2014-05-16 15:55:55 +0000 |
605 | @@ -1,1 +1,2 @@ |
606 | -W: all charms should provide at least one thing |
607 | +I: all charms should provide at least one thing |
608 | +I: missing recommended hook config-changed |
609 | |
610 | === modified file 'tests_functional/proof/expected/icon-template' |
611 | --- tests_functional/proof/expected/icon-template 2013-11-11 19:08:11 +0000 |
612 | +++ tests_functional/proof/expected/icon-template 2014-05-16 15:55:55 +0000 |
613 | @@ -1,8 +1,7 @@ |
614 | -E: Includes template icon.svg file. |
615 | -E: no copyright file |
616 | -E: Includes template README.ex file |
617 | -E: README.ex Includes boilerplate README.ex line 1 |
618 | -E: README.ex Includes boilerplate README.ex line 2 |
619 | +W: Includes template icon.svg file. |
620 | +W: no copyright file |
621 | +W: Includes template README.ex file |
622 | +W: README.ex includes line 1 of boilerplate README.ex |
623 | E: template interface names should be changed: interface-name |
624 | E: Unknown relation field in relation relation-name - (baz) |
625 | E: template relations should be renamed to fit charm: relation-name |
626 | @@ -13,3 +12,4 @@ |
627 | I: relation non-map has no hooks |
628 | E: template interface names should be changed: interface-name |
629 | E: template relations should be renamed to fit charm: relation-name |
630 | +I: missing recommended hook config-changed |
631 | |
632 | === modified file 'tests_functional/proof/expected/missing-maintainer' |
633 | --- tests_functional/proof/expected/missing-maintainer 2013-11-11 19:08:11 +0000 |
634 | +++ tests_functional/proof/expected/missing-maintainer 2014-05-16 15:55:55 +0000 |
635 | @@ -1,12 +1,12 @@ |
636 | W: metadata name (test) must match directory name (missing-maintainer) exactly for local deployment. |
637 | E: Charms need a maintainer (See RFC2822) - Name <email> |
638 | -E: no copyright file |
639 | -E: Includes template README.ex file |
640 | -E: README.ex Includes boilerplate README.ex line 1 |
641 | -E: README.ex Includes boilerplate README.ex line 2 |
642 | -E: template interface names should be changed: interface-name |
643 | -E: template relations should be renamed to fit charm: relation-name |
644 | -E: template interface names should be changed: interface-name |
645 | -E: template relations should be renamed to fit charm: relation-name |
646 | -E: template interface names should be changed: interface-name |
647 | -E: template relations should be renamed to fit charm: relation-name |
648 | +W: no copyright file |
649 | +W: Includes template README.ex file |
650 | +W: README.ex includes line 1 of boilerplate README.ex |
651 | +E: template interface names should be changed: interface-name |
652 | +E: template relations should be renamed to fit charm: relation-name |
653 | +E: template interface names should be changed: interface-name |
654 | +E: template relations should be renamed to fit charm: relation-name |
655 | +E: template interface names should be changed: interface-name |
656 | +E: template relations should be renamed to fit charm: relation-name |
657 | +I: missing recommended hook config-changed |
658 | |
659 | === modified file 'tests_functional/proof/expected/mod-spdy' |
660 | --- tests_functional/proof/expected/mod-spdy 2013-11-11 19:08:11 +0000 |
661 | +++ tests_functional/proof/expected/mod-spdy 2014-05-16 15:55:55 +0000 |
662 | @@ -1,2 +1,3 @@ |
663 | -W: missing recommended hook start |
664 | -W: missing recommended hook stop |
665 | +I: missing recommended hook start |
666 | +I: missing recommended hook stop |
667 | +I: missing recommended hook config-changed |
668 | |
669 | === modified file 'tests_functional/proof/expected/test' |
670 | --- tests_functional/proof/expected/test 2013-11-11 19:08:11 +0000 |
671 | +++ tests_functional/proof/expected/test 2014-05-16 15:55:55 +0000 |
672 | @@ -1,12 +1,12 @@ |
673 | W: Metadata is missing categories. |
674 | W: No icon.svg file. |
675 | -E: no copyright file |
676 | -E: Includes template README.ex file |
677 | -E: README.ex Includes boilerplate README.ex line 1 |
678 | -E: README.ex Includes boilerplate README.ex line 2 |
679 | -E: template interface names should be changed: interface-name |
680 | -E: template relations should be renamed to fit charm: relation-name |
681 | -E: template interface names should be changed: interface-name |
682 | -E: template relations should be renamed to fit charm: relation-name |
683 | -E: template interface names should be changed: interface-name |
684 | -E: template relations should be renamed to fit charm: relation-name |
685 | +W: no copyright file |
686 | +W: Includes template README.ex file |
687 | +W: README.ex includes line 1 of boilerplate README.ex |
688 | +E: template interface names should be changed: interface-name |
689 | +E: template relations should be renamed to fit charm: relation-name |
690 | +E: template interface names should be changed: interface-name |
691 | +E: template relations should be renamed to fit charm: relation-name |
692 | +E: template interface names should be changed: interface-name |
693 | +E: template relations should be renamed to fit charm: relation-name |
694 | +I: missing recommended hook config-changed |
695 | |
696 | === modified file 'tests_functional/proof/expected/unknown-metadata' |
697 | --- tests_functional/proof/expected/unknown-metadata 2013-11-11 19:08:11 +0000 |
698 | +++ tests_functional/proof/expected/unknown-metadata 2014-05-16 15:55:55 +0000 |
699 | @@ -1,9 +1,8 @@ |
700 | E: Unknown root metadata field (foo) |
701 | W: metadata name (test) must match directory name (unknown-metadata) exactly for local deployment. |
702 | -E: no copyright file |
703 | -E: Includes template README.ex file |
704 | -E: README.ex Includes boilerplate README.ex line 1 |
705 | -E: README.ex Includes boilerplate README.ex line 2 |
706 | +W: no copyright file |
707 | +W: Includes template README.ex file |
708 | +W: README.ex includes line 1 of boilerplate README.ex |
709 | E: template interface names should be changed: interface-name |
710 | E: Unknown relation field in relation relation-name - (baz) |
711 | E: template relations should be renamed to fit charm: relation-name |
712 | @@ -14,3 +13,4 @@ |
713 | I: relation non-map has no hooks |
714 | E: template interface names should be changed: interface-name |
715 | E: template relations should be renamed to fit charm: relation-name |
716 | +I: missing recommended hook config-changed |
+1 LGTM