Canonical Voices

Posts tagged with 'testing'

Nicholas Skaggs

Today I thought we'd take a break from the testing all the things series to take a look at what we're doing, how far we've come, and most importantly, where we need to get to.

The core apps project has come a long way since it's inception at the beginning of this cycle. So as the development started maturing, testing was the natural step for me to get involved and check out what the apps had to offer. With that in mind, let's look at the burndown chart for the core apps shall we?


Can you tell where the tests were added?

So even as the work items has increased from adding things like tests, this month the community have been working hard at finishing work items and bringing us back to the trendline. See that nice driving downwards the last couple weeks? Excellent job! Let's get down to that trendline!

From the quality side, we've had several people come forward, learn about autopilot and the core apps and then get a merge in. A special thanks to Carla Sella, Daniel Kessel, Michael Spencer, Adrian Goodyer, Riccardo Padovani and Arturas Norkus for your contributions last week to core apps projects. Well done, and I look forward to seeing and merging more of your work!

For those of you still working on getting commits in, or sitting on the sidelines, let me help! You can be a part of this effort! There's still more work to do, and the entire community around core apps would appreciate your help. Hack on an app, a testcase, wherever your skills and interests lie. For autopilot tests specifically, check out this recipe on developer.ubuntu.com and watch this video.

I look forward to merging your work!


Read more
pitti

I’m happy to announce a new release 0.3 of umockdev.

The big new feature is the ability to fake character devices and provide recording and replaying of communications on them. This work is driven by our need to create automatic tests for the Ubuntu phone stack, i. e. pretending that we have a 3G or phone driver and ensuring that the higher level stacks behaves as expected without actually having to have a particular modem. I don’t currently have a phone capable of running Ubuntu, so I tested this against the standard ModemManager daemon which we use in the desktop. But the principle is the same, it’s “just” capturing and replaying read() and write() calls from/to a device node.

In principle it ought to work in just the same way for other device nodes than tty, e. g. input devices or DRI control; but that will require some slight tweaks in how the fake device nodes are set up; please let me know if you are intested in a particular use case (preferably as a bug report).

With just using the command line tools, this is how you would capture ModemManager’s talking to an USB 3G stick which creates /dev/ttyUSB{0,1,2}. The communication gets recorded into a text file, which umockdev calls “script” (yay my lack of imagination for names!):

# Dump the sysfs device and udev properties
$ umockdev-record /dev/ttyUSB* > huawei.umockdev

# Record the communication
$ umockdev-record -s /dev/ttyUSB0=0.script -s /dev/ttyUSB1=1.script \
     -s /dev/ttyUSB2=2.script -- modem-manager --debug

The –debug option for ModemManager is not necessary, but it’s nice to see what’s going on. Note that you should shut down the running system instance for that, or run this on a private D-BUS.

Now you can disconnect the stick (not necessary, just to clearly prove that the following does not actually talk to the stick), and replay in a test bed:

$ umockdev-run -d huawei.umockdev -s /dev/ttyUSB0=0.script -s /dev/ttyUSB1=1.script \
    -s /dev/ttyUSB2=2.script -- modem-manager --debug

Please note that the CLI options of umockdev-record and umockdev-run changed to be more consistent and fit the new features.

If you use the API, you can do the same with the new umockdev_testbed_load_script() method, which will spawn a thread that replays the script on the faked device node (which is just a PTY underneath).

If you want full control, you can also do all the communication from your test cases manually: umockdev_testbed_get_fd("/dev/mydevice") will give you a (bidirectional) file descriptor of the “master” end, so that whenever your program under test connects to /dev/mydevice you can directly talk to it and pretend that you are an actual device driver. You can look at the t_tty_data() test case for how this looks like (that’s the test for the Vala binding, but it works in just the same way in C or the GI bindings).

I’m sure that there are lots of open ends here still, but as usual this work is use case driven; so if you want to do something with this, please let me know and we can talk about fine-tuning this.

In other news, with this release you can also cleanly remove mocked devices (umockdev_testbed_remove_device()), a feature requested by the Mir developers. Finally there are a couple of bug fixes; see the release notes for details.

I’ll upload this to Saucy today. If you need it for earlier Ubuntu releases, you can have a look into my daily builds PPA.

Let’s test!

Read more
Nicholas Skaggs

It's almost FRIDAY! To celebrate, let's look at the second game that's become part of the core apps, dropping letters.

That best score! It was my first game, I can do much better now :)

The name of the game in dropping letters is to form words as the letters fall and try and prevent the screen from filling up. At the moment, the game is dogfoodable, but needs your help for tests. There are still some bugs within the code, and autopilot tests will help ensure those bugs don't sneak back into the codebase.

Consider helping the dropping letters developers keep development going.  Grab the dropping letters branchadd a testcase from the list of needsfollow the tutorial for help if needed, and propose a merge. Thanks for helping to ensure quality for ubuntu touch!

If you need help getting started, check out the logs, and a FAQ from the workshops. Feel free to contact me with any questions or help. Happy test writing!

Read more
Nicholas Skaggs

Today we look at another important piece of the puzzle for the ubuntu touch platform; the file manager. File managers provide a way for the end users to access there files in an arbitrary manner. Without one on the device you would be stuck viewing your data only through specific applications intended to utilize that data (photos, music, videos) or the terminal. Despite being the bane of simple computing advocates at times, file managers serve an important purpose.

So, let's look at the file manager app for ubuntu touch. Glancing at the dogfooding page you can see many of the basics are already in place. We can browse files and folders, make new folders and view file information.


Quite nice looking isn't it?


And indeed, looking at the list of needs many tests have already been written. This is largely the work of iBelieve, otherwise known as Michael Spencer. Good work! But there is still more to do.

If you are new to writing tests for core applications, adding a test to this application will be much easier for you to pick up. I'm sure Michael won't mind that I'm volunteering him here as well -- we're here to help!

Consider helping Michael and the file manager developers keep development going.  Grab the file manager branchadd a testcase from the list of needsfollow the tutorial for help if needed, and propose a merge. Thanks for helping to ensure quality for ubuntu touch!

If you need help getting started, there is 1 more workshops planned for this week. In addition the logs, and a FAQ from the workshops are now available and ready for you to consume and understand. Happy test writing!

Read more
Nicholas Skaggs

The calculator app is probably the biggest fashion saving application (for me!) on the platform. You might be scratching your heads, so let me share a quick story.

You see not unlike the crazy pebble watch idea, there was a time when I wore a crazy watch on my wrist.

Remember these?

I proudly wore my calculator watch for maybe a year before breaking the band after catching the giant display on something :-) That was the last time a watch graced my arm in a permanent fashion. Ahh the memories.

So, this app will make sure such a fashion disaster doesn't have to happen again. Thanks to the calculator app, I can still perform those geeky tasks of calculating out gas mileage, perfect tipping, supermarket costs, etc without the paying the ultimate fashion price.

The foundations are already in place for you to add tests, but more are needed, including testing the cool "tear-off" feature, swiping to delete, and historical calculations.


Consider helping the calculator developers keep development going.  Grab the calculator branchadd a testcase from the list of needsfollow the tutorial for help if needed, and propose a merge. Thanks for helping to ensure quality for ubuntu touch!

If you need help getting started, there are 2 more workshops planned for this week. In addition the logs, and a FAQ from the workshops are now available and ready for you to consume and understand. Happy test writing!

Read more
Nicholas Skaggs

Ahh, Monday morning! It's time to look at the news headlines and check the stock market. As usual, your ubuntu phone has you covered for this part of your morning routine! Enter stock ticker!

As one of the newest core apps, Stock Ticker has done it's part in catching up quickly. The interface already sports working charting, news and detail views for stock symbols of your choosing via the management page.


Consider helping the stock ticker developers keep development going.  Grab the stock ticker branchadd a testcase from the list of needsfollow the tutorial for help if needed, and propose a merge. Thanks for helping to ensure quality for ubuntu touch!

If you need help getting started, there are 2 more workshops planned for this week. In addition the logs, and a FAQ from the workshops are now available and ready for you to consume and understand. Happy test writing!

Read more
Nicholas Skaggs

So you've seen the building excitement and noise around the core apps project and are wishing there was a way for you to help. Perhaps your not a developer or someone with the skills to help write auomated tests. Or maybe you just want a preview of what things are like and play around with the developing ubuntu touch platform.

The good news is that you can! As Jono shared, we want to dogfood the core apps this month. The core apps can all be run on your ubuntu desktop, you don't need to flash a phone or tablet, and you don't even need to be running saucy (ubuntu development version). (Of course if you do have a phone, flash it and dogfood there if possible!)

Yummy!

To be fair, running and playing with the core apps is a lot more fun than eating actual dogfood, and it might even be healthier for you too :-p

Enter the core apps ppa. Just a quick command away and you can get access to all of the core apps. Ready?

EDIT: You also need the qt5 and ubuntu-sdk team ppa in order for the dependencies to work. Sorry!

sudo add-apt-repository ppa:canonical-qt5-edgers/qt5-proper
sudo add-apt-repository ppa:ubuntu-sdk-team/ppa
sudo apt-get update && sudo apt-get install ubuntu-sdk

then,

sudo add-apt-repository ppa:ubuntu-touch-coreapps-drivers/daily
sudo apt-get update && sudo apt-get install touch-coreapps


This will install the ppa and all of the core apps. They should run just fine on your desktop.

So now what? Well, even without a phone you can dogfood the apps a little. Try them out. Use them. Find bugs and problems. See if they meet your needs (real or percieved) for usage. Everyone's needs and usage will be different, and thus this early feedback is important to get into the hands of the developers.

Find a bug? See a potential missing feature? Check out the dogfooding page for bug reporting links and instructions as well as blueprints showing work items and status for features. Happy Testing err, Dogfooding!

Read more
Nicholas Skaggs

"What's the weather like? Got a window? Open it!"

Or I suppose I could swipe my gorgeous ubuntu phone and see my weather with lovely icons. I may just decide to stay inside and watch my virtual sun bask it's artificial light upon my skin for hours. I'm only (half) kidding.

Still it's not hard to admit the weather app is shaping up to be one of the sharpest looking applications for ubuntu touch. Martin Borho has already gotten through many of the bugs listed so there is an excellent structure in place for you to add some further tests.

Ok, so today isn't so lovely.

Consider helping the weather developers keep things looking sunny.  Grab the weather branchadd a testcase from the list of needsfollow the tutorial for help if needed, and propose a merge. Thanks for helping to ensure quality for ubuntu touch!

If you need help getting started, there are 2 more workshops planned for next week. In addition the logs, and a FAQ from the workshops are now available and ready for you to consume and understand. Happy test writing!

Read more
Nicholas Skaggs

A big thank you to everyone who made it to the first workshop for automated testing! For those of you who couldn't make it, let me remind you we have 3 more scheduled.

Friday July 5th at 1300 UTC
Tuesday July 9th at 1800 UTC
Thursday July 11th at 2200 UTC

But I also wanted to leave you with a quick log from the session introduction for you to peruse, as well as this list of questions from the session. I hope this helps those of you trying to learn the ropes and contribute new tests!

I'm including some of the questions below as a bit of an FAQ for those starting the journey. Read the workshop introduction and the FAQ below and go automate all the things! I'll see you at the next workshop.

What do I need to develop tests?
A raring or saucy installation (VM or real) and the autopilot and ubuntu-sdk packages installed. You will also need an understanding of how autopilot works (or be willing to learn :-) )

How do I run/install a core app?
Once you've branched your core app source code, you don't need to install it in order to run it. However there is a ppa with all the core apps you can install. To run the core app from source, run it like so in the root directory:
qmlscene APPNAME.qml, ie qmlscene dropping-letters.qml
In order to install from the ppa, follow the info here: https://wiki.ubuntu.com/Touch/CoreApps/PPA
You can install all the core apps run them as you would any other application. After installing from the ppa, simply run the application name, ie "dropping-letters"

I recieved an error installing from the ppa; qtdeclarative5-* missing, etc
You are missing the ubuntu-sdk and related packages. Install them using
sudo add-apt-repository ppa:canonical-qt5-edgers/qt5-proper && sudo add-apt-repository ppa:ubuntu-sdk-team/ppa && sudo apt-get update && sudo apt-get install ubuntu-sdk

Can we write tests for qml apps using autopilot using precise or quantal?
No, the ubuntu-sdk and the new version of autopilot we're utilizing both require raring and preferably saucy to work.

Where can I see an example of autopilot tests?
The tutorial on developer.ubuntu.com is an excellent first step for seeing an autopilot test in action and seeing an explanation of the test and how it works. In addition, the file manager, clock, weather, calendar and weather core apps already have some autopilot tests written as of this writing.

How much python does one need to know in order to write autopilot tests?
Not as much as you think :-) If you are familiar with programming and can understand and use the basic autopilot functions and the ubuntu sdk emulator, writing a test won't require you to learn any fancy python.

Read more
Nicholas Skaggs

When your like me and work with wonderful people across the world, knowing what time it is turns out to be really important. It's important to know what time it is in my timezone and the timezone of others I work with around the world.

Even sticking with my own timezone, I use my my clock to wake me each morning, keep track of my running, and let me time things while cooking (proper eggs anyone?) :-) Nekhelesh Ramananthan and the other clock developers are tackling all of these problems with the clock app. Sadly unlike sudoku, I haven't found a way how to cheat time.

Tick tock goes the clock

With that in mind, it's important the clock app gets it's fair share of testing! Nekhelesh has added some tests from the buglist, but some of the tests require further feature development. Since we can't stop time (well at least I can't!), it would be a great help to have someone come alongside these developers and add some testcases so they can focus on the application itself.

Consider helping the clock developers keep the clock regression free and well tested as it's features mature.  Grab the clock branchadd a testcase from the list of needsfollow the tutorial for help if needed, and propose a merge. Thanks for helping to ensure quality for ubuntu touch!

Read more
Nicholas Skaggs

Recently we've been on a campaign to help increase the amount of automated tests we have for ubuntu. Specifically the effort is focused around helping out our community developers on the core apps project. The core apps project is building the core applications for ubuntu touch. Excellent stuff, all being done by the community!

The "testing all the things" blog series is currently covering each of these core applications and ends with a call to help the development teams. I've linked to tutorials like this and this on autopilot providing what you need to know. But sometimes seeing is understanding, and a helping hand can go a long way.

With that in mind, I am announcing a series of workshops to help you gather the skills needed to write automated tests. You can help contribute with just your ubuntu pc, writing and running tests without needing phone hardware! We're going to focus on autopilot, and for the moment the ubuntu core apps. I'll try and alternate to host them at timezone friendly times for everyone (granted I do have to sleep at some point too!). Here's the schedule, with links to the event on G+ page.

Tomorrow!, Wednesday July 3rd at 1800 UTC
Friday July 5th at 1300 UTC
Tuesday July 9th at 1800 UTC
Thursday July 11th at 2200 UTC

The workshops will take place in #ubuntu-quality and will all last an hour (but I won't leave you hanging if we need more time!). I'll host g+ hangouts and provide one on one help as needed to anyone writing tests. See you at the workshops!

Read more
Nicholas Skaggs

In honor of the closing of google reader, I thought I would highlight another core application that needs some attention; namely the RSS Reader, with a proper name Shorts. If your already bored and yawning (RSS is dead, long live RSS), have a look at the design's recently shared by the design team as well as the original post with the user stories. Seems like RSS might not be so dead (or look it!)!

Yes, I still use RSS feeds, mainly as a news aggregator. In many ways honestly RSS feeds have long replaced my idea of bookmarking things. Bookmarks are general stale old content that never updates, is never refreshed and is eventually just purged. The ideas shown in the design of Shorts are great and the development team has a wonderful task ahead of them of implementing them.


With the development team focused on getting the code written, it's our opportunity to help out by adding testcases for there work. For instance, simple things like adding, editing, and removing a rss feed all need tested. The testcases are ready and waiting for you to add a test!

Consider helping the shorts developers get everything in shape. Grab the rss reader branchadd a testcase from the list of needsfollow the tutorial for help if needed, and propose a merge. Thanks for helping to ensure quality for ubuntu touch!

Read more
Nicholas Skaggs

Coming off a lovely weekend, it's time we turned our attention to an app on the lighter side. Anyone up for a game of sudoku?


Sudoku is an example of a simple logic game that can be learned easily enough yet has the staying power to intrigue me to continue to play it. Dinko Osmankovic and the rest of the Sudoku Touch developers have created a version for ubuntu touch to fill those critical mundane moments of the day -- waiting for a train or having your morning coffee. Or perhaps if your like me, fighting insomnia (yikes!).

Apparently using the show hints button to play the entire game makes me a cheat.
So, while it seems the game is smart enough to slap me for trying to cheat my way through, it needs some testcases! Looking at the buglist, there are seven tasty bugs with your potential name on them. This is testing at it's finest! It's rare to count playing a game as helping ubuntu -- but in this case, you would be right!
Themes support!
Consider helping the sudoku touch developers as the game and it's features mature.  Grab the sudoku branch, add a testcase from the list of needs, follow the tutorial for help if needed, and propose a merge. Thanks for helping to ensure quality for ubuntu touch!

Read more
Nicholas Skaggs

With the announcement of MIR being the default display server for 13.10, many folks rightly wonder if it will be stable and ready to ship by then. Well, as part of ensuring that will be the case, I'd like to announce that XMir will become part of the bi-weekly cadence testing we as a community team undertake. Week 2 begins this Saturday and will include XMir testing.

The testcases we'll be using at the moment are basic smoke tests to check the overall state of XMir. As the cycle wears on our goal is to perform a full regression test for XMir against the normal Xorg server to make sure everything is super smooth. The goal is for someone running ubuntu saucy to not even realize something has changed with the display server. So ready to help?

Check out this page to learn about how to install Mir. Those same instructions are linked from the testcase itself. Run through the tests listed and report your results. Make sure your logged in or you won't be able to report anything :-)

New to cadence testing or the tracker? Here's some links you might find useful:

Understanding how to use the QATracker
Understanding how to perform a cadence test

There's video versions too!

QATracker
Cadence Testing
 
Thanks for helping test ubuntu! Your willingness to live on the edge and test ensure others of proper functioning software in the stable release.

Read more
Nicholas Skaggs

A good calendar is essential to me. I'm liable to forget almost everything about my day except eating :-) Things like day of the week and month are important details I definitely rely on a calendar for (I can usually get the month right!).

Fortunately for me (and you!), there is a core app that provides a handy Calendar. Michael Hall featured this application a few weeks ago on his blog covering a development rundown of the application. It covers the list of features nicely. In a word, there's a lot of neat stuff to test in there.

Looking at the buglist of needs there are only 2 showing in-progress -- plenty of room for someone to help out by testing each one of the different views. Monthly, daily, weekly; accessed via swiping.

" Swiping left and right on the month will take you back or forward a month at a time.  Swiping left or right on the bottom half will take you back and forward a day at a time.

Pull the event area down and let it go, and the month will collapse down into a single week. Now swiping left and right there will move you back and forward a week at a time.  Pull down and let it go again and it will snap back to showing the full month.
Finally, you have an option in the toolbar (swipe up from the bottom edge) to switch from an event list to a timeline view of your events."

Are you dizzy yet?

These seamless transitions could use some cool testcases! At the moment, the app is seeing it's first merge requests being made by Carla Sella and Kunal Parmar. The team has faced some issues with uncovering some unique requirements for autopilot, which have now been fixed. Excellent work both of you!

Consider helping Carla, Kunal and the ubuntu calendar developers as the application and it's features mature.  Grab the calendar branch, add a testcase from the list of needs, follow the tutorial for help if needed, and propose a merge. Thanks for helping be a part of ubuntu!


Read more
pitti

I was asked to pour some love over autopilot-gtk, a GTK module to provide introspection of widget states to Autopilot. For those who don’t know, Autopilot is a QA tool to write automatic testing of GUI applications, without the race conditions and limitations that previous tools had with using only the ATK level. Please see the documentation and tutorial for more information. There are a lot of community members who do great things with it already, such as automating testing for Ubiquity or writing tests for GNOME applications like evince, gedit, nautilus, or Shotwell. This should now hopefully become easier.

Now autopilot-gtk has a proper testsuite, I triaged all bug reports, wrote reproducers for them, and fixed them all in today’s upload to Saucy. In particular, you can now do the following:

  • Access to the GtkBuilder names: Instead of having to find a particular widgets in terms of class, position, label contents, or other (sometimes) non-unique or unstable properties, you can now pick it by its unique and stable GtkBuilder name, which is the ID that most upstream code uses to manipulate widgets: b = self.app.select_single(BuilderName='entry_searchquery')
  • GtkTextBuffer type GObject properties are now translated into plain strings, which allows you to access the textual contents of a GtkTextView widget with my_textview.buffer (both for simple property access as well as for selecting by buffer contents).
  • GEnum and GFlags properties are now accessible. Enums are translated to strings (self.app.select_many('GtkButton', relief='GTK_RELIEF_HALF') or self.assertEqual(btn_greet.resize_mode, 'GTK_RESIZE_PARENT')), and flags are represented as a simple integer (like my_widget.events)); in theory we could represent them as string like FLAG_FOO | FLAG_BAR, but this becomes too unwieldy; for reliable identity matching one would always need to take care to sort them alphabetically, keep a consistent spacing, etc.
  • Please let me know if you need access to other types of properties, it is now quite easy to support more (as long as there is a reasonable way of mapping them to a standard D-BUS data type). So please report bugs.

    Read more
Nicholas Skaggs

I couldn't help but start with one of the core apps I consider essential (to me anyway!) on my phone, a terminal. The terminal app being developed for ubuntu has some wonderful features built with a touch interface in mind. One of the biggest issues with touch is having a terminal ready keyboard with things like page up and down, arrow keys, and not to mention being able to use keyboard shortcuts like ctrl+d, ctrl+z, ctrl+c, etc. This has been handled rather elegantly with a long tap menu as you can see below, in addition to a panel that optionally appears at the top of the application.


Dmitry Zagnoyko has already landed a few tests for some of the features present, as you can see below. Execellent work Dmitry! A basic testcase exists now for each of the panels and the circle menu.



Help Dmitry and the terminal app team make sure all the features work properly for you upon release. Get involved and add a test. The initial setup work has already been done, and there are existing testcases already written. Grab the terminal branch, add a testcase from the list of needs, follow the tutorial for help if needed, and propose a merge.


Read more
Nicholas Skaggs

As a quality community team, we've been continuing to make progress this cycle on automating our testcases, especially the new applications that are being written for ubuntu touch. These 'core apps' are being written by other community members for the next generation of ubuntu.

We're also making progress on our desktop applications and automating the ubiquity installer. With that in mind, I'm going to start a little blog series highlighting a package a day for automating. I'll dub it rather unoriginally "Testing All The Things". My goal is to showcase the wonderful work going on with testing this cycle in ubuntu, but also to encourage you dear reader to get involved in helping us. All areas of ubuntu (flavors too!) can benefit from some robot friends helping test the packages they work on and utilize.

But you don't need to wait to see your favorite app hit the list. Hit up the tutorials below for information to dive in and help us!


Core Apps Test Wiki
Writing an autopilot test for ubuntu sdk applications
QML Autopilot Tutorial with example application

Autopilot Tests Project
Writing an autopilot test for desktop applications 


Read more
Michael

logo-jujuHave you ever wished you could just declare the installed state of your juju charm like this?

deploy_user:
    group.present:
        - gid: 1800
    user.present:
        - uid: 1800
        - gid: 1800
        - createhome: False
        - require:
            - group: deploy_user

exampleapp:
    group.present:
        - gid: 1500
    user.present:
        - uid: 1500
        - gid: 1500
        - createhome: False
        - require:
            - group: exampleapp


/srv/{{ service_name }}:
    file.directory:
        - group: exampleapp
        - user: exampleapp
        - require:
            - user: exampleapp
        - recurse:
            - user
            - group


/srv/{{ service_name }}/{{ instance_type }}-logs:
    file.directory:
        - makedirs: True

While writing charms for Juju a long time ago, one of the things that I struggled with was testing the hook code – specifically the install hook code where the machine state is set up (ie. packages installed, directories created with correct permissions, config files setup etc.) Often the test code would be fragile – at best you can patch some attributes of your module (like “code_location = ‘/srv/example.com/code'”) to a tmp dir and test the state correctly, but at worst you end up testing the behaviour of your code (ie. os.mkdir was called with the correct user/group etc.). Either way, it wasn’t fun to write and iterate those tests.

But support has improved over the past year with the charmhelpers library. And recently I landed a branch adding support for declaring saltstack states in yaml, like the above example. That means that the install hook of your hooks.py can be reduced to something like:

import charmhelpers.core.hookenv
import charmhelpers.payload.execd
import charmhelpers.contrib.saltstack


hooks = charmhelpers.core.hookenv.Hooks()


@hooks.hook()
def install():
    """Setup the machine dependencies and installed state."""
    charmhelpers.contrib.saltstack.install_salt_support()
    charmhelpers.contrib.saltstack.update_machine_state(
        'machine_states/dependencies.yaml')
    charmhelpers.contrib.saltstack.update_machine_state(
        'machine_states/installed.yaml')


# Other hooks...

if __name__ == "__main__":
    hooks.execute(sys.argv)

…letting you focus on testing and writing the actual hook functionality (like relation-set’s etc. I’d like to add some test helpers that will automatically check the syntax of the state yaml files and template rendering output, but haven’t yet).

Hopefully we can add similar support for puppet and Ansible soon too, so that the charmer can choose the tools they want to use to declare the local machine state.

A few other things that I found valuable while writing my charm:

  • Use a branch for charmhelpers – this way you can make improvements to the library as you develop and not be dependent on your changes landing straight away to deploy (thanks Sidnei – I think I just copied that idea from one of his charms). The easiest way that I found for that was to install the branch into mycharm/lib so that it’s included in both dev and when you deploy (with a small snippet in your hooks.py.
  • Make it easy to deploy your local charm from the branch… the easiest way I found was a link-test-juju-repo make target – I’m not sure what other people do here?
  • In terms of writing actual hook functionality (like relation-set events etc), I found the easiest way to develop the charm was to iterate within a debug-hook session. Something like:
    1. write new test+code then juju upgrade-charm or add-relation
    2. run the hook and if it fails…
    3. fix and test right there within the debug-hook
    4. put the code back into my actual charm branch and update the test
    5. restore the system state in debug hook
    6. then juju upgrade-charm again to ensure it works, if it fails, iterate from 3.
  • Use the built-in support of template rendering from saltstack for rendering any config files that you need.

I don’t think I’d really appreciated the beauty of what juju is doing until, after testing my charm locally together with a gunicorn charm and a solr backend, I then setup a config using juju-deployer to create a full stack with an Apache front-end, a cache load balancer for multiple squid caches, as well as a load balancer in front of potentially multiple instances of my charms wsgi app, then a back-end loadbalancer in between my app and the (multiple) solr backends… and it just works.


Filed under: juju, python, testing

Read more
Michael

logo-jujuHave you ever wished you could just declare the installed state of your juju charm like this?

deploy_user:
    group.present:
        - gid: 1800
    user.present:
        - uid: 1800
        - gid: 1800
        - createhome: False
        - require:
            - group: deploy_user

exampleapp:
    group.present:
        - gid: 1500
    user.present:
        - uid: 1500
        - gid: 1500
        - createhome: False
        - require:
            - group: exampleapp


/srv/{{ service_name }}:
    file.directory:
        - group: exampleapp
        - user: exampleapp
        - require:
            - user: exampleapp
        - recurse:
            - user
            - group


/srv/{{ service_name }}/{{ instance_type }}-logs:
    file.directory:
        - makedirs: True

While writing charms for Juju a long time ago, one of the things that I struggled with was testing the hook code – specifically the install hook code where the machine state is set up (ie. packages installed, directories created with correct permissions, config files setup etc.) Often the test code would be fragile – at best you can patch some attributes of your module (like “code_location = ‘/srv/example.com/code’”) to a tmp dir and test the state correctly, but at worst you end up testing the behaviour of your code (ie. os.mkdir was called with the correct user/group etc.). Either way, it wasn’t fun to write and iterate those tests.

But support has improved over the past year with the charmhelpers library. And recently I landed a branch adding support for declaring saltstack states in yaml, like the above example. That means that the install hook of your hooks.py can be reduced to something like:

import charmhelpers.core.hookenv
import charmhelpers.payload.execd
import charmhelpers.contrib.saltstack


hooks = charmhelpers.core.hookenv.Hooks()


@hooks.hook()
def install():
    """Setup the machine dependencies and installed state."""
    charmhelpers.contrib.saltstack.install_salt_support()
    charmhelpers.contrib.saltstack.update_machine_state(
        'machine_states/dependencies.yaml')
    charmhelpers.contrib.saltstack.update_machine_state(
        'machine_states/installed.yaml')


# Other hooks...

if __name__ == "__main__":
    hooks.execute(sys.argv)

…letting you focus on testing and writing the actual hook functionality (like relation-set’s etc. I’d like to add some test helpers that will automatically check the syntax of the state yaml files and template rendering output, but haven’t yet).

Hopefully we can add similar support for puppet and Ansible soon too, so that the charmer can choose the tools they want to use to declare the local machine state.

A few other things that I found valuable while writing my charm:

  • Use a branch for charmhelpers – this way you can make improvements to the library as you develop and not be dependent on your changes landing straight away to deploy (thanks Sidnei – I think I just copied that idea from one of his charms). The easiest way that I found for that was to install the branch into mycharm/lib so that it’s included in both dev and when you deploy (with a small snippet in your hooks.py.
  • Make it easy to deploy your local charm from the branch… the easiest way I found was a link-test-juju-repo make target – I’m not sure what other people do here?
  • In terms of writing actual hook functionality (like relation-set events etc), I found the easiest way to develop the charm was to iterate within a debug-hook session. Something like:
    1. write new test+code then juju upgrade-charm or add-relation
    2. run the hook and if it fails…
    3. fix and test right there within the debug-hook
    4. put the code back into my actual charm branch and update the test
    5. restore the system state in debug hook
    6. then juju upgrade-charm again to ensure it works, if it fails, iterate from 3.
  • Use the built-in support of template rendering from saltstack for rendering any config files that you need.

I don’t think I’d really appreciated the beauty of what juju is doing until, after testing my charm locally together with a gunicorn charm and a solr backend, I then setup a config using juju-deployer to create a full stack with an Apache front-end, a cache load balancer for multiple squid caches, as well as a load balancer in front of potentially multiple instances of my charms wsgi app, then a back-end loadbalancer in between my app and the (multiple) solr backends… and it just works.


Filed under: juju, python, testing

Read more