4
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
5
<title>Juju Documentation</title>
6
<link type="text/css" rel="stylesheet" href="http://fonts.googleapis.com/css?family=Droid+Sans&subset=latin">
7
<link type="text/css" rel="stylesheet" href="/css/reset.css">
8
<link type="text/css" rel="stylesheet" href="/css/docs.css">
9
<link type="text/css" rel="stylesheet" href="/css/print.css" media="print">
10
<link type="text/css" rel="stylesheet" href="http://yandex.st/highlightjs/6.1/styles/sunburst.min.css">
12
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
13
<script type="text/javascript" src="http://yandex.st/highlightjs/6.1/highlight.min.js"></script>
15
<script type="text/javascript" src="/js/viewer.js"></script>
22
<h1><a href="/">Juju Documentation</a></h1>
31
<a href="/about.html#about-juju">About juju</a>
40
<a href="/getting-started.html#getting-started">Getting started</a>
44
<li><a href="/getting-started.html#introduction">Introduction</a></li>
46
<li><a href="/getting-started.html#installation">Installation</a></li>
48
<li><a href="/getting-started.html#configuring-your-environment-using-ec2">Configuring your environment using EC2</a></li>
50
<li><a href="/getting-started.html#configuring-a-local-environment">Configuring a local environment</a></li>
52
<li><a href="/getting-started.html#configuring-several-environments">Configuring several environments</a></li>
59
<a href="/user-tutorial.html#user-tutorial">User tutorial</a>
63
<li><a href="/user-tutorial.html#introduction">Introduction</a></li>
65
<li><a href="/user-tutorial.html#bootstrapping">Bootstrapping</a></li>
67
<li><a href="/user-tutorial.html#starting-debug-log">Starting debug-log</a></li>
69
<li><a href="/user-tutorial.html#deploying-service-units">Deploying service units</a></li>
71
<li><a href="/user-tutorial.html#adding-a-relation">Adding a relation</a></li>
73
<li><a href="/user-tutorial.html#exposing-the-service-to-the-world">Exposing the service to the world</a></li>
75
<li><a href="/user-tutorial.html#scaling-your-service">Scaling your service</a></li>
77
<li><a href="/user-tutorial.html#destroying-the-environment">Destroying the environment</a></li>
84
<a href="/write-charm.html#writing-a-charm">Writing a charm</a>
88
<li><a href="/write-charm.html#creating-the-charm">Creating the charm</a></li>
90
<li><a href="/write-charm.html#have-a-plan">Have a plan</a></li>
92
<li><a href="/write-charm.html#write-hooks">Write hooks</a></li>
94
<li><a href="/write-charm.html#test-run">Test run</a></li>
96
<li><a href="/write-charm.html#debugging-hooks">Debugging hooks</a></li>
98
<li><a href="/write-charm.html#learn-more">Learn more</a></li>
105
<a href="/charm.html#charms">Charms</a>
109
<li><a href="/charm.html#introduction">Introduction</a></li>
111
<li><a href="/charm.html#the-metadata-file">The metadata file</a></li>
113
<li><a href="/charm.html#hooks">Hooks</a></li>
115
<li><a href="/charm.html#hook-environment">Hook environment</a></li>
117
<li><a href="/charm.html#hook-commands-for-working-with-relations">Hook commands for working with relations</a></li>
119
<li><a href="/charm.html#hook-commands-for-opening-and-closing-ports">Hook commands for opening and closing ports</a></li>
121
<li><a href="/charm.html#sample-metadatayaml-files">Sample metadata.yaml files</a></li>
123
<li><a href="/charm.html#sample-configyaml-files">Sample config.yaml files</a></li>
130
<a href="/service-config.html#service-configuration">Service configuration</a>
134
<li><a href="/service-config.html#introduction">Introduction</a></li>
136
<li><a href="/service-config.html#using-configuration-options">Using configuration options</a></li>
138
<li><a href="/service-config.html#creating-charms">Creating charms</a></li>
140
<li><a href="/service-config.html#internals">Internals</a></li>
147
<a href="/charm-store.html#the-juju-charm-store">The Juju Charm Store</a>
151
<li><a href="/charm-store.html#charm-store-process">Charm Store Process</a></li>
153
<li><a href="/charm-store.html#submitting-a-new-charm">Submitting a new Charm</a></li>
155
<li><a href="/charm-store.html#submitting-a-fix-to-an-existing-charm">Submitting a fix to an existing Charm</a></li>
157
<li><a href="/charm-store.html#getting-help">Getting Help</a></li>
159
<li><a href="/charm-store.html#reviewers">Reviewers</a></li>
161
<li><a href="/charm-store.html#charm-inclusion-policy-for-reviewers">Charm Inclusion Policy for Reviewers</a></li>
163
<li><a href="/charm-store.html#join-us">Join Us!</a></li>
170
<a href="/charm-quality.html#charm-quality-rating">Charm Quality Rating</a>
174
<li><a href="/charm-quality.html#reliable">Reliable</a></li>
176
<li><a href="/charm-quality.html#secure">Secure</a></li>
178
<li><a href="/charm-quality.html#flexible">Flexible</a></li>
180
<li><a href="/charm-quality.html#handle-data">Handle Data</a></li>
182
<li><a href="/charm-quality.html#scaleable">Scaleable</a></li>
184
<li><a href="/charm-quality.html#easy-to-deploy">Easy to Deploy</a></li>
186
<li><a href="/charm-quality.html#responsive-to-devops-needs">Responsive to DevOps Needs</a></li>
188
<li><a href="/charm-quality.html#upstream-friendly">Upstream Friendly</a></li>
195
<a href="/charm-tests.html#charm-testing">Charm Testing</a>
199
<li><a href="/charm-tests.html#intro">Intro</a></li>
201
<li><a href="/charm-tests.html#phase-1-generic-tests">Phase 1 - Generic tests</a></li>
203
<li><a href="/charm-tests.html#phase-2-charm-specific-tests">Phase 2 - Charm Specific tests</a></li>
205
<li><a href="/charm-tests.html#test-runner">Test Runner</a></li>
212
<a href="/subordinate-services.html#subordinate-services">Subordinate services</a>
216
<li><a href="/subordinate-services.html#motivations">Motivations</a></li>
218
<li><a href="/subordinate-services.html#terms">Terms</a></li>
220
<li><a href="/subordinate-services.html#relations">Relations</a></li>
222
<li><a href="/subordinate-services.html#addressability">Addressability</a></li>
224
<li><a href="/subordinate-services.html#declaring-subordinate-charms">Declaring subordinate charms</a></li>
226
<li><a href="/subordinate-services.html#status-of-subordinates">Status of subordinates</a></li>
228
<li><a href="/subordinate-services.html#usage">Usage</a></li>
230
<li><a href="/subordinate-services.html#restrictions">Restrictions</a></li>
237
<a href="/implicit-relations.html#implicit-relations">Implicit relations</a>
241
<li><a href="/implicit-relations.html#relationship-resolution">Relationship resolution</a></li>
248
<a href="/constraints.html#machine-constraints">Machine Constraints</a>
252
<li><a href="/constraints.html#examples">Examples</a></li>
254
<li><a href="/constraints.html#provider-constraints">Provider Constraints</a></li>
256
<li><a href="/constraints.html#working-with-constraints">Working with constraints</a></li>
258
<li><a href="/constraints.html#distinctions-between-entities">Distinctions Between Entities</a></li>
260
<li><a href="/constraints.html#legacy-deployments">Legacy Deployments</a></li>
267
<a href="/expose-services.html#exposing-a-service">Exposing a service</a>
276
<a href="/hook-debugging.html#hook-debugging">Hook debugging</a>
280
<li><a href="/hook-debugging.html#introduction">Introduction</a></li>
282
<li><a href="/hook-debugging.html#how-it-works">How it works</a></li>
284
<li><a href="/hook-debugging.html#limitations">Limitations</a></li>
286
<li><a href="/hook-debugging.html#internals">Internals</a></li>
288
<li><a href="/hook-debugging.html#screen-vs-tmux">Screen vs. tmux</a></li>
295
<a href="/upgrades.html#upgrades">Upgrades</a>
299
<li><a href="/upgrades.html#charm-upgrades">Charm upgrades</a></li>
301
<li><a href="/upgrades.html#service-upgrades">Service upgrades</a></li>
303
<li><a href="/upgrades.html#juju-upgrades">juju upgrades</a></li>
310
<a href="/charm-upgrades.html#charm-upgrades">Charm Upgrades</a>
314
<li><a href="/charm-upgrades.html#upgrading-a-charm">Upgrading a charm</a></li>
316
<li><a href="/charm-upgrades.html#charm-upgrade-support">Charm upgrade support</a></li>
318
<li><a href="/charm-upgrades.html#futures">Futures</a></li>
320
<li><a href="/charm-upgrades.html#internals">Internals</a></li>
327
<a href="/provider-configuration-ec2.html#ec2-provider-configuration">EC2 provider configuration</a>
336
<a href="/provider-configuration-local.html#local-provider-configuration">Local provider configuration</a>
340
<li><a href="/provider-configuration-local.html#provider-specific-options">Provider specific options</a></li>
347
<a href="/provider-configuration-openstack.html#openstack-provider-configuration">OpenStack provider configuration</a>
351
<li><a href="/provider-configuration-openstack.html#common-configuration">Common configuration</a></li>
353
<li><a href="/provider-configuration-openstack.html#openstack-configuration">OpenStack Configuration</a></li>
355
<li><a href="/provider-configuration-openstack.html#openstack-credentials">OpenStack Credentials</a></li>
357
<li><a href="/provider-configuration-openstack.html#openstack-s3-provider">OpenStack S3 Provider</a></li>
364
<a href="/operating-systems.html#operating-systems">Operating Systems</a>
368
<li><a href="/operating-systems.html#client">Client</a></li>
370
<li><a href="/operating-systems.html#service-machines">Service Machines</a></li>
372
<li><a href="/operating-systems.html#charms">Charms</a></li>
374
<li><a href="/operating-systems.html#local-provider">Local Provider</a></li>
381
<a href="/policy.html#charm-store-policy">Charm Store Policy</a>
385
<li><a href="/policy.html#content">Content</a></li>
387
<li><a href="/policy.html#terminology">Terminology</a></li>
389
<li><a href="/policy.html#metadata">Metadata</a></li>
391
<li><a href="/policy.html#interfaces">Interfaces</a></li>
393
<li><a href="/policy.html#series">Series</a></li>
400
<a href="/relation-reference.html#relation-references">Relation references</a>
404
<li><a href="/relation-reference.html#references">References</a></li>
411
<a href="/relation-info.html#new-relation-ids-hook-command">New `relation-ids` hook command</a>
415
<li><a href="/relation-info.html#references">References</a></li>
422
<a href="/relation-hook-commands.html#commands-to-work-with-relation-settings-and-membership">Commands to work with relation settings and membership</a>
426
<li><a href="/relation-hook-commands.html#references">References</a></li>
433
<a href="/juju-internals.html#implementation-details">Implementation details</a>
442
<a href="/juju-drafts.html#drafts">Drafts</a>
451
<a href="/faq.html#frequently-asked-questions">Frequently Asked Questions</a>
455
<li><a href="/faq.html#where-does-the-name-juju-come-from">Where does the name juju come from?</a></li>
457
<li><a href="/faq.html#why-is-juju-useful">Why is juju useful?</a></li>
459
<li><a href="/faq.html#when-will-it-be-ready-for-production">When will it be ready for production?</a></li>
461
<li><a href="/faq.html#what-language-is-juju-developed-in">What language is juju developed in?</a></li>
463
<li><a href="/faq.html#does-juju-start-from-a-pre-configured-ami-image">Does juju start from a pre-configured AMI Image?</a></li>
465
<li><a href="/faq.html#is-it-possible-to-deploy-multiple-services-per-machine">Is it possible to deploy multiple services per machine?</a></li>
467
<li><a href="/faq.html#is-it-possible-to-pass-parameters-to-juju-charms">Is it possible to pass parameters to juju charms?</a></li>
469
<li><a href="/faq.html#does-juju-only-deploy-to-the-amazon-ec2-cloud">Does juju only deploy to the Amazon EC2 cloud?</a></li>
471
<li><a href="/faq.html#what-directory-are-hooks-executed-in">What directory are hooks executed in?</a></li>
473
<li><a href="/faq.html#how-are-charms-licensed">How are charms licensed?</a></li>
475
<li><a href="/faq.html#how-can-i-choose-between-environments">How can I choose between environments?</a></li>
477
<li><a href="/faq.html#how-can-i-contact-the-juju-team">How can I contact the juju team?</a></li>
479
<li><a href="/faq.html#where-can-i-find-out-more-about-juju">Where can I find out more about juju?</a></li>
486
<a href="/glossary.html#glossary">Glossary</a>
498
<article id="content">
499
<a name="charm-quality-rating"></a><h1>Charm Quality Rating</h1>
500
<p>People demand quality out of their tools, and the Charm Store is no
501
different. So what does a good charm look like? These are some
502
guidelines on what we think an ideal charm provides users. So we rate
503
charms by the following criteria, and give them a score, up to 39.
506
<p>Note: This is an ideal list of what we'd like charms to be. No charm
507
today comes close to getting all of these points; it's a target we set
508
for ourselves so we can determine how we can improve individual charms.
509
It also gives contributors a general idea of where they can spend their
510
time to fix something.
513
<a name="reliable"></a><h2>Reliable</h2>
519
<li><p>Deploy on every provider and pass provider tests</p>
523
<li><p>+1 HP Cloud</p>
525
<li><p>+1 OpenStack</p>
531
<li><p>+1 Check for integrity from upstream source</p>
533
<li><p>+1 Fail gracefully if upstream source goes missing</p>
535
<li><p>+1 Contain a suite of tests with the charm that pass</p>
537
<li><p>+1 Passes tests from Jenkins on jujucharms.com</p>
542
<a name="secure"></a><h2>Secure</h2>
549
<li><p>+1 Contain a well tested AppArmor profile</p>
551
<li><p>+1 Conform to security policies of the charm store</p>
553
<li>Tight access control</li>
556
<li><p>+1 Doesn't run as root</p>
558
<li><p>+1 Per instance or service access control</p>
561
<a name="flexible"></a><h2>Flexible</h2>
568
<li><p>+1 Contain opinionated tuning options</p>
570
<li><p>Examples (depends on the service): "safe", "default", "fast",
571
"real fast, not so safe"</p>
573
<li><p>Don't expose every configuration, pick that reflect real world
576
<li><p>Make it so I don't have to read the book.</p>
580
<li><p>+1 Use existing interfaces with other charms</p>
582
<li>Highly relatable.</li>
586
<a name="handle-data"></a><h2>Handle Data</h2>
593
<li><p>Integrate data storage best practices</p>
595
<li>+1 Backups based on service usage</li>
598
<li><p>Handle the service's user data</p>
600
<li><p>+1 Version control</p>
602
<li><p>+1 Automated snapshots and backup</p>
607
<a name="scaleable"></a><h2>Scaleable</h2>
614
<li><p>+1 Responds to add-unit based on the service's needs</p>
616
<li>Configuration should not require additional steps to scale
620
<li><p>+1 Be tested with a real workload, not just a synthetic benchmark</p>
622
<li><p>Encapsulate scalability best practices</p>
624
<li><p>+1 From upstream and existing devops for that service</p>
626
<li><p>+1 Community peer reviewed</p>
628
<li><p>+1 Have a configure option for most performant configuration
629
if not the default</p>
634
<a name="easy-to-deploy"></a><h2>Easy to Deploy</h2>
641
<li><p>Well documented README with examples of use</p>
643
<li><p>+1 for a typical workload</p>
645
<li><p>+1 for workloads at scale</p>
647
<li><p>+1 Recommend best-practice relationships</p>
651
<li><p>Allow installation of the service from ...</p>
653
<li><p>+1 Pure upstream source</p>
655
<li><p>+1 Your local source</p>
657
<li><p>+1 PPA (if available)</p>
659
<li><p>+1 The Ubuntu repository</p>
664
<a name="responsive-to-devops-needs"></a><h2>Responsive to DevOps Needs</h2>
671
<li><p>+1 Allow for easy upgrade via juju upgrade-charm</p>
673
<li><p>+1 Allow upgrading the service itself.</p>
675
<li><p>Proper maintainership</p>
677
<li><p>+1 Responsive to user bug reports and concerns</p>
679
<li><p>+1 Maintainable, easy to read and modify</p>
684
<a name="upstream-friendly"></a><h2>Upstream Friendly</h2>
691
<li><p>Follow upstream best practices</p>
693
<li>+1 Provide an option for a barebones "pure upstream"
697
<li><p>Should go lock-step with deployment recommendations</p>
699
<li>+1 Provide tip-of-trunk testing if feasible</li>
702
<li><p>Be cognizant of their release schedule</p>
704
<li><p>+1 Fresh charm on release day!</p>
706
<li><p>+1 Endeavour to be upstream's recommended way to deploy that
707
service in the cloud (website mention or something)</p>
717
Powered by <a href="http://github.com/maximebf/beautiful-docs">beautiful-docs</a> -
718
<a href="#top">Back to top</a> - <a href="/all.html">Everything on a single page</a>
719
- <a href="?print=1">Print current page</a> - <a href="/all.html?print=1">Print all pages</a>