Spacewalk 1.0 RELEASED! AWESOME!

Almost two years ago, I was involved in the open sourcing effort of Spacewalk. While I’ve moved on to other projects since then, Spacewalk still holds a special place in my heart.

Yesterday the Spacewalk team announced the release of version 1.0! This is an exciting milestone. Here’s a summary of some of the things you’ll find in 1.0.

Features & Enhancements

  • RHN Client code dropped HAL in favor of python-ugdev
  • New script to rename Spacewalk hostname
  • RHN Proxy migrated to mod_wsgi
  • The Spacewalk java stack uses Tomcat 6 on Fedora 12

Known Issues

  • Provider GPG key is sometimes not recognized causing packages to show up as ‘unknown Provider’
  • Still no PostgreSQL support. We need HELP to move this forward.

Checkout the OFFICIAL announcement: here.
Congrats to the Spacewalk team for reaching this important milestone.

Spacewalk 0.8 RELEASED!

Another Spacewalk release hits the interwebs.

Features & Enhancements

  • SHA256 Feature – support for packages with checksums other than MD5. Spacewalk server and proxy can serve and accept rpms with SHA256 digests, show the checksums in webUI and accept them in API calls.
  • Moved from mod_python to mod_wsgi on Fedora 11 and Fedora 12, which promises better performance.
  • Improved performance of SSM and API
  • and more

Known Issues

  • PostgreSQL support still does not work. We will need help with moving this forward.
  • Provider GPG key is not sometimes recognized and packages shows up as unknown Provider.
  • Documentation search does not work, other search are unaffected.
  • Cobbler 2.0 is known to work, but full tests haven’t been done yet.

Congrats to the Spacewalk team for another great release!

Spacewalk 0.7 RELEASED

Sorry for being so late, but I’m happy to see that Spacewalk 0.7 was released on December 4th, 2009.

Here are some of the features in this release:

  • new script “spacewalk-report” allows you to create reports with output to CSV file ScriptBasedReporting
  • pages with erratas have column with links to CVE description, erratas can be filtered by its type
  • Spacewalk can be installed on Fedora 12
  • Top level package spacewalk do not exists any more. It has been split into spacewalk-oracle and spacewalk-postgresql, which depends on oracle or postgresql library. Note: postgresql version is highly experimental.
  • Spacewalk now tracks date and time of package installation
  • Config channels now can handle symlinks
  • Support for WebUI based KVM guest management & provisioning
  • Spacewalk repositories have been split to server and client parts
  • Base client packages are now in Fedora. That means you are now able to register Fedora machine to Spacewalk, without setting up additional repository
  • and much more

Congrats to the Spacewalk team for another great release!

“synergize” with cobbler

I mentioned several days ago that my “Integrating with Cobbler” talk didn’t make the cut at FUDCon Toronto 2009.

Before you can integrate with Cobbler, you need to know a little about its objects and API. Then I can talk about some of the possible integration methods.

Cobbler has the following object types:

  • distro
    • represents the distribution (at a minimum the kernel and initrd locations)
  • profile
    • represents the kickstart description of what you want a machine to look like
  • system
    • represents the actual system
  • repo
    • package repository for mirroring (optional)
  • image
    • virtual guest image

The API that Cobbler exposes is actually very simple. Most of the objects have a set of operations find, get, remove, copy, etc. The convention used by Cobbler’s api is OPERATION_OBJECTTYPE. For example, to get a distro you would call get_distro(). To find a profile simply call find_profile(). Below is a list of the common api methods exposed by Cobbler. The {object*} represents the object type single or plural.

  • get_{object*(s)}
    • returns the object with the given type and id
  • find_{object*}
    • returns the object with the given criteria
  • get_{object*}_handle
    • returns a reference to be used by modify_* and save_*
  • remove_{object*}
    • removes the object with the given id
  • copy_{object*}
    • copies the object with the given id to the new name
  • rename_{object*}
    • renames the object to the new name
  • new_{object*}
    • creates a new object
  • modify_{object*}
    • changes the value of one of the object’s attributes
  • save_{object*}
    • commit all of the object’s changes

As you can see the API is quite simple and pretty straight forward. I’ve seen many APIs, and Cobbler has one of the cleanest ones I’ve seen in quite a long time.

You like the API as well but don’t use python? We you might consider one of Cobbler’s language bindings:

  • cobbler4j – a Java binding that tries to give you POJOs to work with
  • rubygem-cobbler – a Ruby binding
  • XML-RPC – most languages have an XML-RPC library

Cobbler4j was born from the integration of Spacewalk with Cobbler, primarily because working with XML-RPC from Java SUCKS! Also, most Java guys want to deal with objects, so it was only natural to create a binding for those developers.

Cobbler4j is autogenerated from the Cobbler python code which helps keep it up to date, and avoids the problem of ‘oops I updated the python code but forgot to change cobbler4j’. But what does it look like in practice? Ok, here’s an example of cobbler4j in action:

import java.util.*;
import org.fedorahosted.cobbler.*;
import org.fedorahosted.cobbler.autogen.*;

// REQUIRES: cobbler 2.0
public class Cobbler4jExample {
  public static void main(String[] args) {

    // gets connection and login at the same time
    CobblerConnection conn = new CobblerConnection(
      "http://localhost", "testing", "testing");

    Finder finder = Finder.getInstance();

    // see if there are any distros there already
    List distros = (List) finder.listItems(conn, ObjectType.DISTRO);
    System.out.println("there are " + distros.size() + " distros");

    // create a new distro, name, kernel and initrd are required
    Distro distro = new Distro(conn);

    // in order to persist an object, we must call commit method

    // see our new distro
    distros = (List) finder.listItems(conn, ObjectType.DISTRO);
    System.out.println("there are now " + distros.size() + " distros");
    for (Distro d : distros) {

    // cleanup

That’s cool and all, but I already know how to call APIs exposed by services. But what are some of the strategies for putting Cobbler into my application? I’m glad you asked (if not, you really should be thinking this) 🙂

There are basically 3 ways of setting up Cobbler for your application.

  • Standalone
  • Master
  • Slave

Standalone is just that, you simply run Cobbler as a Service (CaaS) and use it to manage your DHCP, PXE infrastructure and deploying your systems. No other integration besides maybe a few scripts to fit into your processes. This is one of the popular use cases.

Next, we have the Master setup. This means you might have an in house integration GUI or other application but you let Cobbler be the canonical location for the provisioning data. Your application simply passes through to Cobbler’s APIs. The Genome project uses Cobbler in this way.

Lastly, there’s what I call the Slave mode. This setup is when you have an application that does a lot more than what Cobbler was meant to do and have more data than Cobbler is meant to handle. Your application will be the canonical source of the data, and will sync it to Cobbler on a periodic basis. Spacewalk is an example of using the Slave method of integration.

So which is the best way of integrating with Cobbler? Honestly it completely depends on your situation and needs. All of the above strategies are correct. So figure out what your application does best and whether you want to have to do synchronization of data or if you need your own application at all.

Happy integrating! If you want to see my presentation on this topic checkout my Fedora people page: (PDF)

Flight to Red Hat Summit

The plan was to leave the house at 7am this morning, but I wanted to make sure
I said goodbye to the family, so it was more like 7:11am when I finally left the

I did not anticipate the traffic I encountered on the way to the airport.
Needless to say I was stressed, I really don’t like time schedules, they
really stress me out. I finally got to the airport at 8am for a 9:10am flight.
Yes cutting it close especially since I have to actually check a bag this time.

Thankfully there was no lines at the curbside baggage checkin as well as
security. Got to the gate by 8:20am, WHEW! Made it. 🙂

When I got on the plane I went to my seat, 27F. I could’ve sworn I picked
an exit row during my reservation. Oh well, at least I got a window seat
and the other two seats next to me were empty so I actually got an
entire row to myself.

On the plane I tried watching 300 on the laptop, but the battery was going
down quickly, I’m down to 45% already. So I settled for listening to the
300 soundtrack on the iPod.

That’s it for now, I’ll post more later.


Are you a Spacewalk user? Have you wished you could easily get in contact with the Spacewalk development team or other Spacewalk user? Then you want to use SpaceTALK 🙂 I spent the last two nights coding up the chat feature in Spacewalk. When you click the banner or the Chat menu in the Help section, a new window is opened with a web-based IRC client on freenode. You will be presented a dialog asking for your freenode nick and preselected #spacewalk IRC channel. There you can interact with the Spacewalk community to get help, share your knowledge, or just come hangout.

You can get access to the feature in the git repository (master). It should appear in the nightly repos sometime tomorrow.

Now here are the obligatory screenshots:

chat menu and chat banner
Connect screen
IRC window showing #spacewalk