Automated Creation Of Stackstorm Packs

In StackStorm a pack is logical organization that contains related actions, aliases, policies, rules and sensors. To get a good overview of what a pack is please see the excellent StackStorm Pack documentation.

Most users of StackStorm wish to either integrate with a new system that’s not available in the Exchange or use StackStorm to execute custom automation scripts. The way to accomplish this is to create a new Pack.

Pack Format

A Pack is simply a folder structure and set of files:

actions/                # contains all actions and workflows
aliases/                # all action aliases
policies/               # action execution policies
rules/                  # rules for executing actions based on triggers
sensors/                # sensors that monitor external systems and emit triggers
config.schema.yaml      # schema for a pack's config
packname.yaml.example   # example config following the schema in config.schema.yaml
pack.yaml               # pack definition and metadata
requirements-tests.txt  # list of python modules needed for running a pack's tests
requirements.txt        # list of python modules needed for runtime execute of a pack

For more information on this structure please see the StackStorm documentation Create and Contribute a pack.

One option for creating a pack is to manually create all of these folders and files in the proper formats or automatically create them.

Automatic Pack Creation

In true StackStorm and DevOps fashion we at Encore thought it would be best to automate the creation of Packs. To accomplish this we utilize a tool called cookiecutter that creates folder structure and file content based on a template. We’ve created a template in the standard Pack structure and file content. Cookicutter works by prompting a user for a set of variables defined by the template. It then uses these variables to fill in Jinja2 expressions for folder names and file content.

Encore’s cookiecutter template for StackStorm can be found on GitHub at EncoreTechnologies/cookiecutter-stackstorm.

Example

In this example we’re going to showcase how to automatically create a StackStorm Pack using Encore’s coockiecutter-stackstorm template.

# Create a repo on GitHub (or other remote repository)
# Clone the repository
$ git clone [email protected]:YourOrganization/stackstorm-cookiecutterexample.git

# Install the cookiecutter package (could do this in a virtualenv if you like)
$ pip install cookiecutter

# Generate the pack content automatically
$ cookiecutter -f https://github.com/EncoreTechnologies/cookiecutter-stackstorm.git
pack_name [xxx]: cookiecutterexample
pack_description [Pack description.]: An example pack directory structure created using cookiecutter.
version [0.1.0]:
keywords_csv []: cookiecutter,example
author_name [First Last]: Nick Maludy
author_email [[email protected]]: [email protected]

# Check out our newly created Pack (will be in a folder called stackstorm-
$ ls -l stackstorm-cookiecutterexample
actions/
aliases/
policies/
rules/
sensors/
CHANGES.md
circle.yml
config.schema.yaml
CONTRIBUTORS.md
cookiecutterexample.yaml.example
LICENSE
Makefile
pack.yaml
README.md
requirements-tests.txt
requirements.txt

# Commit and push your changes
$ cd stackstorm-cookiecutterexample
$ git add .
$ git commit -m "Initial pack creation using Encore's cookiecutter-stackstorm repo"
$ git push origin master

The name of the folder is based on what the user entered for [pack_name] in this case it is stackstorm-cookciecutterexample/. Several of the files have content filled in based on the variables entered by the user:

############################
$ cat pack.yaml
---
ref: cookiecutterexample
name: cookiecutterexample
description: test
keywords:
    - cookiecutter
    - example
version: 0.1.0
author: nick maludy
email: [email protected]

############################
$ cat CONTRIBUTORS.md 
## Pack Contributors
* nick maludy [email protected]

############################
$ cat README.md 
# cookiecutterexample Integration Pack

## Configuration
TODO: Describe configuration


# Sensors

## Example Sensor
TODO: Describe sensor


# Actions

## example
TODO: Describe action

Encore Extras

As you may have noticed, there are some extra files in this automatically created Pack. We at Encore thought it best to include additional files above and beyond the standard structure to promote better GitHub repos and automated unit testing within Packs.

First the additional files for GitHub are:

CHANGES.md              # a changelog for the pack
CONTRIBUTORS.md         # list of contributors to the pack
LICENSE                 # license information of the pack (default: Apache 2.0)
README.md               # readme for the pack detailing usage and configuration information

These files are just skeletons, but provide a good starting point for pack authors to fill out important information.

Secondly are files related to automated unit testing:

circle.yml              # how to execute unit tests in CircleCI
Makefile                # helper tasks for executing tests

The Makefile is a light wrapper script that clones the Encore StackStorm CI repository that provides tasks for testing a pack. These tests are based off of the testing standard required by the StackStorm Exachange CI repository. If an author wishes to submit their pack to the Exchange, these tests must pass. Encore’s CI Makefile executes all tests required by the Exchange except for testing registration of actions, sensors, rules, etc (this test requires MongoDB be installed).

To execute the tests using the Makefile simple run:

$ make

Individual tests can be executed one at a time:

$ make flake8
$ make pylint
$ make packs-tests

There are other tests available and can be listed by running:

$ make list

When executing tests the Makefile creates a ci/ folder within your Pack’s repository. As with any good makefile it should be able to clean up any cruft it creates. To clean up the CI data simply run:

$ make clean

Conclusion

In this post we’ve detailed how to automatically create a Pack’s structure using cookiecutter and the Encore cookiecutter-stackstorm repository. We’ve also disussed some of the extra features that this repository offers above and beyond a default creation using mkdir and touch.