initial import of cloudinit utility module

provides utilities for building multi-part userdata which allows
specifying multiple start-up scripts in a single user-data script
cloudinit: add #sc-store mime type and part handler

Add custom #sc-store mime type which is a dummy type for holding pickled
Python data. Added a null part handler which does nothing when called
given that the pickled data is not meant to be executed.
cloudinit: improve invalid user-data type error
cloudinit: auto-attach part handlers as needed

Added part_handler_mappings which maps custom mime types to their
corresponding part handler code (as a string). Currently only the
"#sc-store" custom mime type part-handler is there which simply does
nothing. This is because #sc-store mime type is used by StarCluster
client internally to store pickled Python data and is not meant to be
executed on the remote nodes. Updated mp_userdata_from_* to auto-attach
custom part handlers as needed.
cloudinit: add method to parse multipart userdata

Optionally decompresses the userdata string before attempting to parse
the multipart mail message.
cloudinit: add tests for multipart userdata utils
Added documentation for configuring static security groups for cluster nodes.
Use Linux line endings rather than Windows line endings

The Windows Github client automatically converted LF to CRLF. Undo that.
cluster: fix logging bug in run_plugin
cloudinit: use #ignored instead of custom handler

Use #ignored for storing data that should not be executed. Cloudinit
already handles #ignored with a null part handler that does nothing with
the file which is all the part handler for #sc-store was meant to do.
Removing this saves userdata space.
cloudinit: fix bug in mp_userdata_from_files

Only reopen the 'file' obj if it has a 'name' attribute. This allows
using StringIO objs that contain binary data in the files list. In the
case of StringIO's there's no real underlying file reopen in binary
mode.
cloudinit: utils for non-cloudinit multipart userdata

Added utils to cloudinit that can bundle many userdata scripts into a
single shell script that will extract and run all scripts on any
userdata handling system - cloudinit or not.
cloudinit: only support file interface

Removed convenience method for converting list of strings into file-like
StringIO objects. Will add string to StringIO utils later.
utils: add string_to_file and strings_to_files

These functions convert strings to in-memory file-like objects via
StringIO.
cloudinit: add high-level bundle/unbundle utils

Added new function, bundle_userdata_files, that serves as a high-level
wrapper around both the cloudinit and non-cloudinit approaches to
creating multipart userdata. By default cloudinit is used but this can
be switched by passing use_cloudinit=False.

Added new function, unbundle_userdata_files, that takes a userdata
string and automatically determines whether the string is a cloudinit or
non-cloudinit multipart userdata and unbundles the files accordingly. In
either case this function returns a dictionary of filenames -> file
contents.
tests: update cloudinit tests for latest changes
cluster: always set key_location in master_node property

This avoids a potential issue where Cluster.nodes gets called before the
cluster's key_location has been set which caches the master node object
with a key_location of None. In this case, attempting to use the master
node's ssh object later on, even after the cluster's key_location is set
propertly, would fail due to a null key_location. To avoid this we
simply inject the cluster's key_location everytime the cached or
non-cached master_node object is fetched.
cluster: store cluster metadata in group tags

Split and store metadata in cluster security group tags @sc-version,
@sc-core, and @sc-user instead of the security group's description
field.

Added dump_compress_encode function that converts a dictionary to json,
compresses the json with zlib and base64 encodes the compressed json.
Added decode_uncompress_load function that reverses the output from
dump_compress_encode back into a dictionary. These functions are
utlimately used by StarCluster to compress the data it stores in tags in
order to respect the 255 char limit for tags.
cluster: store aliases and plugins in userdata

First working draft storing and loading cluster aliases and plugins in
all node's userdata. By default the userdata is stored in a compressed
cloudinit format (multipart email). Added disable_cloudinit option to
Cluster class that instead switches to using a self-extracting shell
script to provide multipart userdata support for AMIs that do not use
cloudinit.
rename cloudinit module to userdata