cloud-maker 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/cloud-maker +7 -2
 - data/lib/cloud-maker.rb +0 -3
 - data/lib/cloud_maker/config.rb +16 -7
 - data/lib/cloud_maker/ec2.rb +42 -1
 - data/lib/cloud_maker/s3_archiver.rb +0 -3
 - metadata +2 -2
 
    
        data/bin/cloud-maker
    CHANGED
    
    | 
         @@ -96,6 +96,11 @@ class CloudMakerCLI < Thor 
     | 
|
| 
       96 
96 
     | 
    
         
             
                :type => :hash,
         
     | 
| 
       97 
97 
     | 
    
         
             
                :default => {},
         
     | 
| 
       98 
98 
     | 
    
         
             
                :desc => "Set tags for EC2, merges with and overrides the tag property in the CloudMaker config"
         
     | 
| 
      
 99 
     | 
    
         
            +
              method_option :yes,
         
     | 
| 
      
 100 
     | 
    
         
            +
                :alias => '-y',
         
     | 
| 
      
 101 
     | 
    
         
            +
                :type => :boolean,
         
     | 
| 
      
 102 
     | 
    
         
            +
                :default => false,
         
     | 
| 
      
 103 
     | 
    
         
            +
                :desc => "Answer yes to any confirmation prompts automatically."
         
     | 
| 
       99 
104 
     | 
    
         
             
              def launch(instance_config_yaml)
         
     | 
| 
       100 
105 
     | 
    
         
             
                puts "--------------------------------------------------------------------------------".green
         
     | 
| 
       101 
106 
     | 
    
         
             
                puts "Launching new EC2 instance"
         
     | 
| 
         @@ -105,7 +110,7 @@ class CloudMakerCLI < Thor 
     | 
|
| 
       105 
110 
     | 
    
         | 
| 
       106 
111 
     | 
    
         
             
                print_config_hash(config.to_hash)
         
     | 
| 
       107 
112 
     | 
    
         | 
| 
       108 
     | 
    
         
            -
                if yes?("Launch a new EC2 instance with the options above? (y/n)")
         
     | 
| 
      
 113 
     | 
    
         
            +
                if options.yes || yes?("Launch a new EC2 instance with the options above? (y/n)")
         
     | 
| 
       109 
114 
     | 
    
         
             
                  cloud_maker = CloudMaker::Ec2.new(
         
     | 
| 
       110 
115 
     | 
    
         
             
                    :aws_access_key_id => options.aws_access_key_id,
         
     | 
| 
       111 
116 
     | 
    
         
             
                    :aws_secret_access_key => options.aws_secret_access_key
         
     | 
| 
         @@ -162,7 +167,7 @@ class CloudMakerCLI < Thor 
     | 
|
| 
       162 
167 
     | 
    
         
             
              end
         
     | 
| 
       163 
168 
     | 
    
         | 
| 
       164 
169 
     | 
    
         
             
              def build_config(instance_config_yaml, options)
         
     | 
| 
       165 
     | 
    
         
            -
                config = CloudMaker::Config.from_yaml(instance_config_yaml)
         
     | 
| 
      
 170 
     | 
    
         
            +
                config = CloudMaker::Config.from_yaml(instance_config_yaml, 'import_ec2' => true)
         
     | 
| 
       166 
171 
     | 
    
         
             
                options.set.each_pair {|key, val| config[key] = val}
         
     | 
| 
       167 
172 
     | 
    
         | 
| 
       168 
173 
     | 
    
         
             
                config['tags'] ||= {}
         
     | 
    
        data/lib/cloud-maker.rb
    CHANGED
    
    | 
         @@ -1,5 +1,3 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            Bundler.require(ENV['CLOUDMAKER_ENV'].to_sym) if ENV['CLOUDMAKER_ENV']
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
1 
     | 
    
         
             
            require 'yaml'
         
     | 
| 
       4 
2 
     | 
    
         
             
            require 'thor'
         
     | 
| 
       5 
3 
     | 
    
         
             
            require 'colorize'
         
     | 
| 
         @@ -10,4 +8,3 @@ require 'cloud_maker/config' 
     | 
|
| 
       10 
8 
     | 
    
         
             
            require 'cloud_maker/ec2'
         
     | 
| 
       11 
9 
     | 
    
         
             
            require 'cloud_maker/s3_archiver'
         
     | 
| 
       12 
10 
     | 
    
         
             
            require 'cloud_maker/shell_executor'
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
    
        data/lib/cloud_maker/config.rb
    CHANGED
    
    | 
         @@ -61,25 +61,29 @@ module CloudMaker 
     | 
|
| 
       61 
61 
     | 
    
         
             
                #                   be used. If the detailed version is used all properties
         
     | 
| 
       62 
62 
     | 
    
         
             
                #                   are optional and DEFAULT_KEY_PROPERTIES will be used to
         
     | 
| 
       63 
63 
     | 
    
         
             
                #                   fill in the blanks.
         
     | 
| 
       64 
     | 
    
         
            -
                #
         
     | 
| 
       65 
64 
     | 
    
         
             
                #   'include'     - An array of URLs or a String containing 1 URL per line
         
     | 
| 
       66 
65 
     | 
    
         
             
                #                   with optional # prefixed lines as comments.
         
     | 
| 
       67 
66 
     | 
    
         
             
                #   ...           - All valid properties of a Cloud Init config
         
     | 
| 
       68 
67 
     | 
    
         
             
                #                   are also valid here. See:
         
     | 
| 
       69 
68 
     | 
    
         
             
                #                   https://help.ubuntu.com/community/CloudInit
         
     | 
| 
       70 
     | 
    
         
            -
                # 
     | 
| 
       71 
     | 
    
         
            -
                # 
     | 
| 
       72 
     | 
    
         
            -
                # 
     | 
| 
      
 69 
     | 
    
         
            +
                #
         
     | 
| 
      
 70 
     | 
    
         
            +
                # extra_options   - Options that describe the config as opposed to being part
         
     | 
| 
      
 71 
     | 
    
         
            +
                #                   of the config.
         
     | 
| 
      
 72 
     | 
    
         
            +
                #   'config_path' - The path the config was loaded from. Used for archival purposes.
         
     | 
| 
      
 73 
     | 
    
         
            +
                #   'import_ec2'  - CloudMaker::Ec2 defines properties it relies on, if this value
         
     | 
| 
      
 74 
     | 
    
         
            +
                #                   is true then we pull those property definitions in.
         
     | 
| 
       73 
75 
     | 
    
         
             
                #
         
     | 
| 
       74 
76 
     | 
    
         
             
                # Returns a CloudMaker object
         
     | 
| 
       75 
     | 
    
         
            -
                def initialize(cloud_config, extra_options)
         
     | 
| 
      
 77 
     | 
    
         
            +
                def initialize(cloud_config, extra_options={})
         
     | 
| 
       76 
78 
     | 
    
         
             
                  self.extra_options = extra_options
         
     | 
| 
       77 
79 
     | 
    
         
             
                  cloud_config = cloud_config.dup
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
       78 
81 
     | 
    
         
             
                  self.options = extract_cloudmaker_config!(cloud_config)
         
     | 
| 
       79 
82 
     | 
    
         
             
                  self.includes = extract_includes!(cloud_config)
         
     | 
| 
       80 
83 
     | 
    
         
             
                  self.imports = extract_imports!(cloud_config)
         
     | 
| 
       81 
84 
     | 
    
         
             
                  self.cloud_config = cloud_config
         
     | 
| 
       82 
85 
     | 
    
         | 
| 
      
 86 
     | 
    
         
            +
                  self.import(self.class.new(Ec2::CLOUD_MAKER_CONFIG)) if (extra_options['import_ec2'])
         
     | 
| 
       83 
87 
     | 
    
         
             
                  self.imports.reverse.each do |import_path|
         
     | 
| 
       84 
88 
     | 
    
         
             
                    self.import(self.class.from_yaml(import_path))
         
     | 
| 
       85 
89 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -201,11 +205,12 @@ module CloudMaker 
     | 
|
| 
       201 
205 
     | 
    
         
             
                  # from it.
         
     | 
| 
       202 
206 
     | 
    
         
             
                  #
         
     | 
| 
       203 
207 
     | 
    
         
             
                  # instance_config_yaml - The path of the YAML file
         
     | 
| 
      
 208 
     | 
    
         
            +
                  # options - Any options to pass through as options to CloudMaker::Config::initialize
         
     | 
| 
       204 
209 
     | 
    
         
             
                  #
         
     | 
| 
       205 
210 
     | 
    
         
             
                  # Returns a new Config
         
     | 
| 
       206 
211 
     | 
    
         
             
                  # Raises: Exception if the file doesn't exist.
         
     | 
| 
       207 
212 
     | 
    
         
             
                  # Raises: SyntaxError if the YAML file is invalid.
         
     | 
| 
       208 
     | 
    
         
            -
                  def from_yaml(instance_config_yaml)
         
     | 
| 
      
 213 
     | 
    
         
            +
                  def from_yaml(instance_config_yaml, options={})
         
     | 
| 
       209 
214 
     | 
    
         
             
                    begin
         
     | 
| 
       210 
215 
     | 
    
         
             
                      full_path = File.expand_path(instance_config_yaml)
         
     | 
| 
       211 
216 
     | 
    
         
             
                      cloud_yaml = File.open(full_path, "r") #Right_AWS will base64 encode this for us
         
     | 
| 
         @@ -213,7 +218,11 @@ module CloudMaker 
     | 
|
| 
       213 
218 
     | 
    
         
             
                      raise "ERROR: The path to the CloudMaker config is incorrect"
         
     | 
| 
       214 
219 
     | 
    
         
             
                    end
         
     | 
| 
       215 
220 
     | 
    
         | 
| 
       216 
     | 
    
         
            -
                     
     | 
| 
      
 221 
     | 
    
         
            +
                    # loading a blank config file returns false, it's an odd degenerate case but handling
         
     | 
| 
      
 222 
     | 
    
         
            +
                    # it like this makes sanity checking other missing values easy.
         
     | 
| 
      
 223 
     | 
    
         
            +
                    config = YAML::load(cloud_yaml) || {}
         
     | 
| 
      
 224 
     | 
    
         
            +
             
     | 
| 
      
 225 
     | 
    
         
            +
                    CloudMaker::Config.new(config, options.merge('config_path' => full_path))
         
     | 
| 
       217 
226 
     | 
    
         
             
                  end
         
     | 
| 
       218 
227 
     | 
    
         
             
                end
         
     | 
| 
       219 
228 
     | 
    
         | 
    
        data/lib/cloud_maker/ec2.rb
    CHANGED
    
    | 
         @@ -9,6 +9,36 @@ module CloudMaker 
     | 
|
| 
       9 
9 
     | 
    
         
             
                # Internal: Gets/Sets the RightAws::Ec2 instance.
         
     | 
| 
       10 
10 
     | 
    
         
             
                attr_accessor :ec2
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
      
 12 
     | 
    
         
            +
                # Public: A CloudMaker::Config hash that describes the config properties Ec2 relies on.
         
     | 
| 
      
 13 
     | 
    
         
            +
                CLOUD_MAKER_CONFIG = {
         
     | 
| 
      
 14 
     | 
    
         
            +
                  'cloud-maker' => {
         
     | 
| 
      
 15 
     | 
    
         
            +
                    'ami' => {
         
     | 
| 
      
 16 
     | 
    
         
            +
                      'required' => true,
         
     | 
| 
      
 17 
     | 
    
         
            +
                      'description' => "The Amazon AMI ID for the instance."
         
     | 
| 
      
 18 
     | 
    
         
            +
                    },
         
     | 
| 
      
 19 
     | 
    
         
            +
                    'instance_type' => {
         
     | 
| 
      
 20 
     | 
    
         
            +
                      'required' => true,
         
     | 
| 
      
 21 
     | 
    
         
            +
                      'description' => "The Amazon instance type, eg. m1.small."
         
     | 
| 
      
 22 
     | 
    
         
            +
                    },
         
     | 
| 
      
 23 
     | 
    
         
            +
                    'availability_zone' => {
         
     | 
| 
      
 24 
     | 
    
         
            +
                      'required' => true,
         
     | 
| 
      
 25 
     | 
    
         
            +
                      'description' => "The Amazon availability zone, eg. us-east-1a"
         
     | 
| 
      
 26 
     | 
    
         
            +
                    },
         
     | 
| 
      
 27 
     | 
    
         
            +
                    'key_pair' => {
         
     | 
| 
      
 28 
     | 
    
         
            +
                      'default' => "",
         
     | 
| 
      
 29 
     | 
    
         
            +
                      'description' => "The name of an Amazon key pair, so you can actually login to the instance."
         
     | 
| 
      
 30 
     | 
    
         
            +
                    },
         
     | 
| 
      
 31 
     | 
    
         
            +
                    'elastic_ip' => {
         
     | 
| 
      
 32 
     | 
    
         
            +
                      'description' => "An elastic IP address you control that you would like to associate to the instance."
         
     | 
| 
      
 33 
     | 
    
         
            +
                    },
         
     | 
| 
      
 34 
     | 
    
         
            +
                    'security_group' => {
         
     | 
| 
      
 35 
     | 
    
         
            +
                      'default' => 'default',
         
     | 
| 
      
 36 
     | 
    
         
            +
                      'required' => true,
         
     | 
| 
      
 37 
     | 
    
         
            +
                      'description' => 'The Amazon EC2 security group to launch the instance with.'
         
     | 
| 
      
 38 
     | 
    
         
            +
                    }
         
     | 
| 
      
 39 
     | 
    
         
            +
                  }
         
     | 
| 
      
 40 
     | 
    
         
            +
                }
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
       12 
42 
     | 
    
         
             
                # Public: The name of the tag that will be used to find the name of an s3 bucket for archiving/information retrieval
         
     | 
| 
       13 
43 
     | 
    
         
             
                BUCKET_TAG = 's3_archive_bucket'
         
     | 
| 
       14 
44 
     | 
    
         | 
| 
         @@ -66,6 +96,7 @@ module CloudMaker 
     | 
|
| 
       66 
96 
     | 
    
         
             
                    :group_names => cloud_maker_config['security_group'],
         
     | 
| 
       67 
97 
     | 
    
         
             
                    :instance_type => cloud_maker_config['instance_type'],
         
     | 
| 
       68 
98 
     | 
    
         
             
                    :key_name => cloud_maker_config['key_pair'],
         
     | 
| 
      
 99 
     | 
    
         
            +
                    :availability_zone => cloud_maker_config['availability_zone'],
         
     | 
| 
       69 
100 
     | 
    
         
             
                    :user_data => user_data
         
     | 
| 
       70 
101 
     | 
    
         
             
                  ).first
         
     | 
| 
       71 
102 
     | 
    
         | 
| 
         @@ -81,8 +112,18 @@ module CloudMaker 
     | 
|
| 
       81 
112 
     | 
    
         
             
                    end
         
     | 
| 
       82 
113 
     | 
    
         | 
| 
       83 
114 
     | 
    
         
             
                    ec2.associate_address(instance_id, :public_ip => cloud_maker_config["elastic_ip"])
         
     | 
| 
      
 115 
     | 
    
         
            +
                  end
         
     | 
| 
       84 
116 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
      
 117 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 118 
     | 
    
         
            +
                    instance = ec2.describe_instances([instance_id]).first # So we get updated tag/ip info
         
     | 
| 
      
 119 
     | 
    
         
            +
                  rescue RightAws::AwsError => e
         
     | 
| 
      
 120 
     | 
    
         
            +
                    tries ||= 0
         
     | 
| 
      
 121 
     | 
    
         
            +
                    tries += 1
         
     | 
| 
      
 122 
     | 
    
         
            +
                    if tries <= 5
         
     | 
| 
      
 123 
     | 
    
         
            +
                      sleep 2**tries
         
     | 
| 
      
 124 
     | 
    
         
            +
                    else
         
     | 
| 
      
 125 
     | 
    
         
            +
                      raise e
         
     | 
| 
      
 126 
     | 
    
         
            +
                    end
         
     | 
| 
       86 
127 
     | 
    
         
             
                  end
         
     | 
| 
       87 
128 
     | 
    
         | 
| 
       88 
129 
     | 
    
         
             
                  archiver = S3Archiver.new(
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: cloud-maker
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.2. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.1
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       7 
7 
     | 
    
         
             
            authors:
         
     | 
| 
         @@ -10,7 +10,7 @@ authors: 
     | 
|
| 
       10 
10 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       11 
11 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       12 
12 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       13 
     | 
    
         
            -
            date: 2012-08- 
     | 
| 
      
 13 
     | 
    
         
            +
            date: 2012-08-09 00:00:00.000000000 Z
         
     | 
| 
       14 
14 
     | 
    
         
             
            dependencies:
         
     | 
| 
       15 
15 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       16 
16 
     | 
    
         
             
              name: colorize
         
     |