= Launchpad Juju Charm for Developers = Make a Juju charm that can support casual/quick Launchpad development and one-off parallel testing (as opposed to [[LEP/ParallelTesting|automatic parallel testing]]). Build with [[LEP/LaunchpadSetupScripts]] and in support of [[LEP/ParallelEC2Command]]. Launchpad deployment with Juju is out of scope. '''Contact:''' [[mailto:gary.poster@canonical.com|Gary Poster]] <
> '''On Launchpad:''' XXX ''Link to a blueprint, milestone or (best) a bug tag search across launchpad-project'' == Rationale == We needed something like this when Graham gave a UDS training session to teach and entice potential Launchpad contributors who have small itches to scratch. Now, when dedicated Launchpad development has reduced dramatically, enabling easier self-help for Launchpad's customers is a compelling goal to ease their pain and add to Launchpad's velocity. It might also be useful for teams officially assigned to work on Launchpad: they could easily and quickly have another development environment available. That might be useful alone, to try and duplicate and investigate an issue; and it also might be useful for them to have a more powerful machine available, such as the 32-thread EC2 machines. This also is a step along the way toward the proposed approach of [[LEP/ParallelEC2Command]]. == Stakeholders == The Launchpad developers are the primary stakeholders for this LEP. The LEP was developed after discussion with Graham Binns, who could have used something like this for the 12.10 UDS session, and after discussion with other Launchpad developers. The LEP will be announced to the launchpad-dev list for comments. Another group of stakeholders is Launchpad users. Graham Binns has been used as a proxy for this group, but if this is regarded as insufficient then we can call for more comments. == User stories == <> === Launchpad User Learns How to Develop Launchpad === '''As a ''' Launchpad User<
> '''I want ''' to quickly get a temporary development environment<
> '''so that ''' I can be taught how to develop Launchpad at a live event such as a UDS session<
> <> === Launchpad User Develops and Contributes a Quick Patch === '''As a ''' Launchpad User<
> '''I want ''' to quickly get a temporary development environment<
> '''so that '''I can develop, test, and push a Launchpad branch to quickly scratch an itch I have<
> <> === Launchpad Developer Wants Another Machine to Investigate an Issue === '''As a ''' Launchpad Developer<
> '''I want ''' to quickly get a temporary development environment<
> '''so that '''I can investigate an issue, perhaps to see if I can duplicate a problem that I see locally within a clean environment.<
> <> === Launchpad Developer Wants a More Powerful Machine for Tests === '''As a ''' Launchpad Developer<
> '''I want ''' to quickly get a temporary development environment<
> '''so that '''I can interactively run tests more quickly, probably in parallel but maybe just a subset of the full suite.<
> == Constraints and Requirements == === Must === * Provide a working development and testing environment in under five minutes * Configure the environment to be able to use [[LEP/ParallelTesting|parallel testing]] (that is, the developer should be able to run tests with testr --parallel) * Provide a mechanism to update any persistent data (such as an EBS snapshot) that the charm uses * Work in EC2 * Be extendable to other environments, such as Canonistack, in the future. === Nice to have === * Provide support initially for Canonistack * Provide support initially for alternate environments such as HP and Azure * Have the Launchpad charms and any associated subordinate charms published in the official charm repository. * Support juju expose to let people see a running Launchpad environment. This might be a little tricky because Launchpad will be running in an LXC, but I think this is a solved problem. === Must not === * Require people to copy over private SSH keys to the cloud in order to branch code from Launchpad or push code to Launchpad. shh -A should be sufficient. === Out of scope === * Any thoughts, preparation or discussion having to do with making this charm suitable for production deployment. Rationale: preparing for production deployment is a much more difficult task, and one that has many more stakeholders that will introduce many requirements unnecessary for these goals (e.g. Puppet integration). == Subfeatures == We intend to use [[LEP/LaunchpadSetupScripts]] for the initialization. == Success == === How will we know when we are done? === A developer can enter "juju bootstrap" and a "juju deploy..." command or two and within five minutes have a Launchpad development environment in which she can quickly and successfully branch from and push to Launchpad. It would be OK if the developer also had to check out the charm and run it locally, rather than having it available in the official Juju repository, though that would be nice. The user may also have to use "juju ssh -A ..." to get to the machine, and may have to follow a short set of instructions, such as running "bzr launchpad-login" on the remote machine. [[LEP/ParallelEC2Command]] can use this charm to automatically run tests. === How will we measure how well we have done? === Developers and users report success doing the above. == Thoughts? == === Implementation/research Notes === Observations: * Setting up a full Launchpad development environment from scratch takes about an hour. This is too long for our goals. * One approach to making this go faster is to use AMIs. Juju does not support that, and is unlikely to AIUI because doing so would make Juju less platform-agnostic. * Another approach to making this go faster is to use EBS snapshots. There are probably many ways to get this to hang together, but the following notes describe the approach that we investigated before actually proposing this LEP. Current Idea: * Launchpad developer charm has a required relationship with a LXC storage provider subordinate charm. * Launchpad charm does not start to build/update Launchpad developer environment until storage provider subordinate charm joins. * Launchpad charm uses lpsetup to update or build environment. If it finds an lxc environment (see the "fast" story below), it updates it; otherwise (see the "slow" story) it builds one. * The "fast" deploy story is supplied by a subordinate charm that mounts a storage based on an existing EBS snapshot. The storage is then further bind mounted to provide both the home directory of the "ubuntu" user and /var/lib/lxc directory. * The "update" or slow deploy story is supplied by a subordinate charm that mounts an empty storage and again bind mounts it to provide both the home directory of the "ubuntu" user and /var/lib/lxc directory. This is used to make a fresh snapshot to update the "fast" deploy story. * Nice to have: the charm has an option to automatically create a new snapshot after the update or install is complete. * Other LXC storage provider subordinate charms could be developed for other environments in the future, such as canonistack. Verification: Benji followed the above plan manually to verify that it would work, and figured out some of the details. The following are some of his notes on how to mount an EBS volume on an EC2 instance. * Make the EBS volume and the EC2 instance (make sure they are in the same availability zone), associate the volume with the instance, and then do some mounting: {{{ sudo mke2fs -F -j /dev/xvdf sudo mkdir /mnt/ebs sudo mount /dev/xvdf /mnt/ebs }}} * Set up an EBS volume so LXC data will go there instead of the normal mount: {{{ sudo mkdir -p /mnt/ebs/home/ubuntu sudo cp -Rp . /mnt/ebs/home/ubuntu/ sudo mount --bind /mnt/ebs/home/ubuntu /home/ubuntu sudo mkdir -p /mnt/ebs/var/lib/lxc sudo mkdir /var/lib/lxc sudo mount --bind /mnt/ebs/var/lib/lxc /var/lib/lxc }}} * Install Launchpad in an lxc container: {{{ cd sudo add-apt-repository ppa:yellow/ppa sudo add-apt-repository ppa:yellow/experimental sudo apt-get update sudo apt-get install lpsetup lp-setup lxc-install --testing --full-name="Benji York" --email="benji.york@canonical.com" }}} * Make a snapshot of the volume, make a new volume from the snapshot, make a new instance and attach the new volume to the instance. {{{ sudo apt-get install lxc sudo mkdir /mnt/ebs sudo mount /dev/xvdf /mnt/ebs sudo mkdir -p /mnt/ebs/home/ubuntu sudo mount --bind /mnt/ebs/home/ubuntu /home/ubuntu sudo mkdir -p /mnt/ebs/var/lib/lxc sudo mount --bind /mnt/ebs/var/lib/lxc /var/lib/lxc }}}