Hey folks,

Glad to see all the attention on this topic. Let’s do more testing! :-)

CI that we have internally
--------------------------
At schuberg philis we have a “cloudstack integration test” (CIT) environment. 
It’s grown and evolved incrementally over time along with our use of 
cloudstack, so its strongest test coverage is for the things the folks over 
here have worked on the most.

The current version consists of an assortment of shell and python scripts that 
use knife-cloudstack, various hackery, and various bash and python to bring up 
a fresh environment, and then some custom test cases written using the 4.2/4.3 
version of marvin to provision a zone and do basic tests. It’s pretty closely 
tied to our internal systems (hardcoded template UUIDs are just the start of 
it).

On the upside, this stuff does run fully automatically from our internal 
jenkins. The basic trick we use is to spin up a pristine environment inside of 
our existing internal cloudstack-powered cloud, where we have a dedicated zone 
for it, backed by some dedicated vmware hypervisors (since xen doesn’t nest), 
into which we nest xen server (kvm experiments have never been completed — it 
hasn’t been a big priority since we don’t use KVM).

For an impression of what this kind of code looks like, take a look at the 
workshop scripts hugo put up at
    https://github.com/spark404/cs-workshop
that’s using cloudmonkey instead of knife, but the basic idea is similar. It’s 
not that special, just lots of little bits and gotchas to it. Oh, we do also 
have an open source version of “our” cloudstack cookbook
    https://github.com/schubergphilis/cloudstack-cookbook
though I think that’s not quite the same as what we use.

CI changes I’m working on
-------------------------
I’ve been working on and off to reduce schuberg philis specificness of all the 
scripts so that we can open source (and contribute here if that makes 
sense…though if citrix can open source their internal CI tooling, that might be 
a much better place to start) the end result.

Starting off from Ian’s GSOC-2014 work, we’re now doing the environment 
provisioning using vagrant and vagrant-cloudstack, with various scripts slowly 
being replaced by chef cookbooks. This new setup is at the point where we have 
basic environment provisioning working somewhat robustly, and its decoupled 
from most of our expectations. By using vagrant and some parameterization, we 
can now _almost_ bring up “a personal cloud” for anyone doing cloudstack 
development internally, that is more or less the same as the one used in our 
CIT environment.

The big lesson learned is that _almost_works_ is miles off from _works reliably 
enough to trust the test results_. The nature of the thing being built (and 
rebuilt) is simply that most of the time a test failure is caused by some 
glitch somewhere other than the actual test. I.e. there might be a failure to 
apply a port forwarding rule, or several failures followed by eventual success, 
but success _after_ the test has timed out, and then the whole thing topples 
over and you have to restart a two-hour long build process.

I would love to learn more about how citrix QA handles that kind of thing? I 
imagine, basically, with a lot of patience :-)

Anyway, once we have this vagrant-ified stuff up and running for integration 
needs, in the coming months, we’ll look at aligning it closer to our production 
cloud infrastructure (which is also chef-managed). This is where open source 
“CIT” would pay off, since I imagine such a codified how-to-production-cloud is 
of interest!

Somewhere along the line I am assuming this work can also be fully aligned with 
broader community setup/tooling but I can’t see that far ahead yet, especially 
since I don’t know the shape of what’s "out there” :-)

Marvin...
---------
Last week I started trying to get some of the existing marvin-based component 
tests running on our CIT. Honestly, this has been pretty frustrating and 
slow-going…I’m not exactly sure why just yet. Testing with python is supposed 
to be real fun :-).

I hate pointing at things and saying “I know a better way to do that” without 
fully understanding why they are a certain way. I’d prefer to get a larger 
chunk of the component tests up and running, first, and blame my own 
limitations for my frustration until then. So far, I guess marvin (and/or its 
usage) just doesn’t feel very pythonic (especially when contrasted with, say, 
cloud monkey…was marvin written before there was cloud monkey?). I’m interested 
in contributing to improving this, though, when I figure out how!

Regardless of reservations about how convenient or pretty the code is, there’s 
lots and lots of component tests that work this way, and a lot of people 
working on those tests every day. I think the only realistic approach is to 
build on top of that existing work — so we can have _one_ suite of tests, and 
so that anyone that can work on one test suite can work on all of them. Even if 
I’d personally prefer serverspec to envassert :)

Strategy
--------
> Do we have any CI strategy in place or a starting point at least?

Here’s my take.

* I think Ian’s GSOC-2014 vagrant-based devcloud3 (perhaps a better name? ;-)) 
should become the starting point for everyone doing local development and 
testing. The smoke tests should run and pass against that.

* Automated CI smoke tests should have an environment setup close to / 
compatible with / reusing that devcloud3 stuff, to avoid “test works locally, 
fails on CI”. Having the free TravisCI approach available to any developer is 
great. Some kind of configuration management (i.e. chef) is vital to help spin 
up resources reliably enough. The jobs being ran should have all the detail 
necessary to reproduce them in source control, so that you can figure out how 
to replicate a failure without needing access to the CI system(s) that failed.

* I believe the current split between smoke test w/ simulator and component 
test w/ target hardware/software is about right. I don’t believe more extensive 
non-simulator tests with somehow faked/awkward hardware (i.e. some kind of 
lightweight docker wrapper to act as a hypervisor) is actually very useful, 
since that way you don’t test the component-specific java code, of which there 
is a lot.

* The existing marvin-based component test suite runs need to, piece by piece, 
a step at a time, migrate out of running inside citrix only, to also running on 
open/public/accessible CI resources. The first place to migrate to is probably 
jenkins.buildacloud.org. I don’t think TravisCI should be used for this. Apache 
has buildbot and jenkins, it should be one of those, and since we have jenkins 
already… :)

* It’s possible already to contribute slave nodes to the buildacloud.org 
install that have access to the resources needed to run the component tests. 
For example, I hope we can get (a copy/version of) our own CIT environment 
hooked up to it at some point, so we can contribute test results there. How to 
do this probably needs better documentation (at the moment, I know that “ask 
Hugo” works…but I realize not everyone has the luxury of an on-site Hugo!) and 
call-to-action.

* buildacloud.org needs to become an ASF-hosted resource. I believe some people 
are working on that. I don’t know much about builds.apache.org, but looking at 
how much that’s already doing, I imagine merging the two is out of the 
question. Ideally, I guess, at some point in the future (2016? :)) the “apache 
cloudstack jenkins” spins up a cloud into which builds.apache.org can spin up 
slaves (and apache buildbot for that matter), and that way the “slave running 
hardware” can get pooled.

* All tests _should_ be run for every commit, but there’s no chance of getting 
those kinds of resources in place unless the build is refactored into lots of 
independently testable modules that you can pinpoint commits to. So, tests will 
be ran as frequently as available resources allow.
** I imagine this means doing only 3-10 full CI runs a day. That means picking 
the branches to run, i.e. the active trunk (whether you call it master or 
develop) and active release branches.
** I do imagine there’s room for running a subset of the full suite (i.e. the 
smoke tests) regularly (if not _every_ commit) on, say, active feature branches.
** For this branch-selection it would be nice to have a branch naming 
convention that’s easily pattern matched and followed by all...

* I’m interested to see whether the marvin tests can be clearly split into 
distinct suites that stack on top of each other, i.e. some kind of dependency 
chain where it is quite clear that one pack of tests reuses outputs/config 
results from another pack. The deployDatacenter module for example, that could 
be structured as a set of “stage1” test cases. Down the line I want to be able 
to take a partially provisioned integration environment, drop a new RPM into 
it, and rerun just some of the component tests related to the component I’m 
working on — and I want jenkins to do that for me :-)

* Things that can be broken out into components that can be partially 
integration tested outside of a “full” environment, should be. For example, 
we’re putting a framework around the systemvm so it can be tested without 
having a running management server. I would like to see something similar for 
plugins, so you can have just the plugin + the thing that it plugs in, and run 
a suite of tests for just that.


cheers,


Leo

Reply via email to