simple_deploy 0.7.2 → 0.7.3

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.
Files changed (89) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG.md +6 -0
  3. data/lib/simple_deploy/aws/cloud_formation/error.rb +32 -0
  4. data/lib/simple_deploy/aws/cloud_formation.rb +76 -0
  5. data/lib/simple_deploy/aws/instance_reader.rb +59 -0
  6. data/lib/simple_deploy/aws/simpledb.rb +52 -0
  7. data/lib/simple_deploy/aws.rb +4 -0
  8. data/lib/simple_deploy/cli/attributes.rb +7 -18
  9. data/lib/simple_deploy/cli/clone.rb +9 -19
  10. data/lib/simple_deploy/cli/create.rb +5 -14
  11. data/lib/simple_deploy/cli/deploy.rb +8 -11
  12. data/lib/simple_deploy/cli/destroy.rb +4 -10
  13. data/lib/simple_deploy/cli/environments.rb +1 -1
  14. data/lib/simple_deploy/cli/events.rb +5 -11
  15. data/lib/simple_deploy/cli/execute.rb +6 -9
  16. data/lib/simple_deploy/cli/instances.rb +4 -9
  17. data/lib/simple_deploy/cli/list.rb +5 -10
  18. data/lib/simple_deploy/cli/outputs.rb +5 -11
  19. data/lib/simple_deploy/cli/parameters.rb +5 -11
  20. data/lib/simple_deploy/cli/protect.rb +5 -10
  21. data/lib/simple_deploy/cli/resources.rb +5 -11
  22. data/lib/simple_deploy/cli/shared.rb +6 -6
  23. data/lib/simple_deploy/cli/status.rb +5 -11
  24. data/lib/simple_deploy/cli/template.rb +8 -13
  25. data/lib/simple_deploy/cli/update.rb +6 -10
  26. data/lib/simple_deploy/configuration.rb +102 -0
  27. data/lib/simple_deploy/entry.rb +71 -0
  28. data/lib/simple_deploy/entry_lister.rb +30 -0
  29. data/lib/simple_deploy/exceptions.rb +8 -0
  30. data/lib/simple_deploy/misc/attribute_merger.rb +2 -5
  31. data/lib/simple_deploy/notifier/campfire.rb +15 -12
  32. data/lib/simple_deploy/notifier.rb +6 -11
  33. data/lib/simple_deploy/stack/deployment/status.rb +5 -3
  34. data/lib/simple_deploy/stack/deployment.rb +8 -10
  35. data/lib/simple_deploy/stack/execute.rb +2 -3
  36. data/lib/simple_deploy/stack/output_mapper.rb +1 -4
  37. data/lib/simple_deploy/stack/ssh.rb +4 -4
  38. data/lib/simple_deploy/stack/{stack_attribute_formater.rb → stack_attribute_formatter.rb} +4 -6
  39. data/lib/simple_deploy/stack/stack_creator.rb +46 -0
  40. data/lib/simple_deploy/stack/stack_destroyer.rb +19 -0
  41. data/lib/simple_deploy/stack/stack_formatter.rb +25 -0
  42. data/lib/simple_deploy/stack/stack_lister.rb +18 -0
  43. data/lib/simple_deploy/stack/stack_reader.rb +56 -0
  44. data/lib/simple_deploy/stack/stack_updater.rb +67 -0
  45. data/lib/simple_deploy/stack/status.rb +53 -0
  46. data/lib/simple_deploy/stack.rb +89 -37
  47. data/lib/simple_deploy/version.rb +1 -1
  48. data/lib/simple_deploy.rb +31 -1
  49. data/simple_deploy.gemspec +6 -3
  50. data/spec/aws/cloud_formation/error_spec.rb +50 -0
  51. data/spec/aws/cloud_formation_spec.rb +207 -0
  52. data/spec/aws/instance_reader_spec.rb +96 -0
  53. data/spec/aws/simpledb_spec.rb +89 -0
  54. data/spec/cli/attributes_spec.rb +5 -15
  55. data/spec/cli/clone_spec.rb +14 -27
  56. data/spec/cli/create_spec.rb +11 -18
  57. data/spec/cli/deploy_spec.rb +24 -63
  58. data/spec/cli/destroy_spec.rb +7 -25
  59. data/spec/cli/outputs_spec.rb +12 -17
  60. data/spec/cli/protect_spec.rb +68 -106
  61. data/spec/cli/shared_spec.rb +12 -15
  62. data/spec/cli/update_spec.rb +9 -27
  63. data/spec/config_spec.rb +47 -14
  64. data/spec/contexts/config_contexts.rb +28 -0
  65. data/spec/contexts/logger_contexts.rb +9 -0
  66. data/spec/contexts/stack_contexts.rb +40 -0
  67. data/spec/entry_lister_spec.rb +31 -0
  68. data/spec/entry_spec.rb +86 -0
  69. data/spec/misc/attribute_merger_spec.rb +3 -8
  70. data/spec/notifier/campfire_spec.rb +21 -61
  71. data/spec/notifier_spec.rb +18 -40
  72. data/spec/spec_helper.rb +10 -0
  73. data/spec/stack/deployment/status_spec.rb +13 -13
  74. data/spec/stack/deployment_spec.rb +26 -21
  75. data/spec/stack/execute_spec.rb +7 -3
  76. data/spec/stack/output_mapper_spec.rb +3 -15
  77. data/spec/stack/ssh_spec.rb +14 -13
  78. data/spec/stack/{stack_attribute_formater_spec.rb → stack_attribute_formatter_spec.rb} +19 -16
  79. data/spec/stack/stack_creator_spec.rb +46 -0
  80. data/spec/stack/stack_destroyer_spec.rb +18 -0
  81. data/spec/stack/stack_formatter_spec.rb +37 -0
  82. data/spec/stack/stack_lister_spec.rb +17 -0
  83. data/spec/stack/stack_reader_spec.rb +81 -0
  84. data/spec/stack/stack_updater_spec.rb +79 -0
  85. data/spec/stack/status_spec.rb +106 -0
  86. data/spec/stack_spec.rb +160 -133
  87. metadata +112 -19
  88. data/.rvmrc +0 -1
  89. data/lib/simple_deploy/config.rb +0 -87
@@ -19,7 +19,7 @@ EOS
19
19
  opt :help, "Display Help"
20
20
  end
21
21
 
22
- Config.new.environments.keys.each { |e| puts e }
22
+ SimpleDeploy.environments.keys.each { |e| puts e }
23
23
  end
24
24
 
25
25
  def command_summary
@@ -26,22 +26,16 @@ EOS
26
26
  valid_options? :provided => @opts,
27
27
  :required => [:environment, :name]
28
28
 
29
- config = Config.new.environment @opts[:environment]
29
+ SimpleDeploy.create_config @opts[:environment]
30
+ SimpleDeploy.logger @opts[:log_level]
31
+ stack = Stack.new :name => @opts[:name],
32
+ :environment => @opts[:environment]
30
33
 
31
- stack = Stack.new :environment => @opts[:environment],
32
- :name => @opts[:name],
33
- :config => config,
34
- :logger => logger
35
-
36
- rescue_stackster_exceptions_and_exit do
34
+ rescue_exceptions_and_exit do
37
35
  jj stack.events @opts[:count]
38
36
  end
39
37
  end
40
38
 
41
- def logger
42
- @logger ||= SimpleDeployLogger.new :log_level => @opts[:log_level]
43
- end
44
-
45
39
  def command_summary
46
40
  "Show events for a stack"
47
41
  end
@@ -39,14 +39,15 @@ EOS
39
39
  valid_options? :provided => @opts,
40
40
  :required => [:environment, :name]
41
41
 
42
+ SimpleDeploy.create_config @opts[:environment]
43
+ logger = SimpleDeploy.logger @opts[:log_level]
44
+
42
45
  @opts[:name].each do |name|
43
46
  notifier = Notifier.new :stack_name => name,
44
- :environment => @opts[:environment],
45
- :logger => logger
47
+ :environment => @opts[:environment]
46
48
 
47
- stack = Stack.new :environment => @opts[:environment],
48
- :name => name,
49
- :logger => logger,
49
+ stack = Stack.new :name => name,
50
+ :environment => @opts[:environment],
50
51
  :internal => @opts[:internal]
51
52
 
52
53
  begin
@@ -61,10 +62,6 @@ EOS
61
62
  end
62
63
  end
63
64
 
64
- def logger
65
- @logger ||= SimpleDeployLogger.new :log_level => @opts[:log_level]
66
- end
67
-
68
65
  def command_summary
69
66
  'Execute command on given stack(s)'
70
67
  end
@@ -25,12 +25,11 @@ EOS
25
25
  valid_options? :provided => @opts,
26
26
  :required => [:environment, :name]
27
27
 
28
- config = Config.new.environment @opts[:environment]
28
+ SimpleDeploy.create_config @opts[:environment]
29
+ logger = SimpleDeploy.logger @opts[:log_level]
29
30
 
30
- stack = Stack.new :environment => @opts[:environment],
31
- :name => @opts[:name],
32
- :config => config,
33
- :logger => logger,
31
+ stack = Stack.new :name => @opts[:name],
32
+ :environment => @opts[:environment],
34
33
  :internal => @opts[:internal]
35
34
 
36
35
  exit 1 unless stack.exists?
@@ -44,10 +43,6 @@ EOS
44
43
  end
45
44
  end
46
45
 
47
- def logger
48
- @logger ||= SimpleDeployLogger.new :log_level => @opts[:log_level]
49
- end
50
-
51
46
  def command_summary
52
47
  'List instances for stack'
53
48
  end
@@ -1,5 +1,7 @@
1
1
  require 'trollop'
2
2
 
3
+ require 'simple_deploy/stack/stack_lister'
4
+
3
5
  module SimpleDeploy
4
6
  module CLI
5
7
 
@@ -25,20 +27,13 @@ EOS
25
27
  valid_options? :provided => @opts,
26
28
  :required => [:environment]
27
29
 
28
- config = Config.new.environment @opts[:environment]
29
- stacks = Stackster::StackLister.new(:config => config).all.sort
30
+ SimpleDeploy.create_config @opts[:environment]
31
+ SimpleDeploy.logger @opts[:log_level]
30
32
 
31
- stack = Stack.new :environment => @opts[:environment],
32
- :name => @opts[:name],
33
- :config => config,
34
- :logger => logger
33
+ stacks = SimpleDeploy::StackLister.new.all.sort
35
34
  puts stacks
36
35
  end
37
36
 
38
- def logger
39
- @logger ||= SimpleDeployLogger.new :log_level => @opts[:log_level]
40
- end
41
-
42
37
  def command_summary
43
38
  'List stacks in an environment'
44
39
  end
@@ -28,14 +28,12 @@ EOS
28
28
  valid_options? :provided => @opts,
29
29
  :required => [:environment, :name]
30
30
 
31
- config = Config.new.environment @opts[:environment]
31
+ SimpleDeploy.create_config @opts[:environment]
32
+ logger = SimpleDeploy.logger @opts[:log_level]
33
+ stack = Stack.new :name => @opts[:name],
34
+ :environment => @opts[:environment]
32
35
 
33
- stack = Stack.new :environment => @opts[:environment],
34
- :name => @opts[:name],
35
- :config => config,
36
- :logger => logger
37
-
38
- rescue_stackster_exceptions_and_exit do
36
+ rescue_exceptions_and_exit do
39
37
  @outputs = stack.outputs
40
38
 
41
39
  logger.info "No outputs." unless @outputs.any?
@@ -63,10 +61,6 @@ EOS
63
61
  end
64
62
  end
65
63
 
66
- def logger
67
- @logger ||= SimpleDeployLogger.new :log_level => @opts[:log_level]
68
- end
69
-
70
64
  end
71
65
  end
72
66
  end
@@ -26,22 +26,16 @@ EOS
26
26
  valid_options? :provided => @opts,
27
27
  :required => [:environment, :name]
28
28
 
29
- config = Config.new.environment @opts[:environment]
29
+ SimpleDeploy.create_config @opts[:environment]
30
+ SimpleDeploy.logger @opts[:log_level]
31
+ stack = Stack.new :name => @opts[:name],
32
+ :environment => @opts[:environment]
30
33
 
31
- stack = Stack.new :environment => @opts[:environment],
32
- :name => @opts[:name],
33
- :config => config,
34
- :logger => logger
35
-
36
- rescue_stackster_exceptions_and_exit do
34
+ rescue_exceptions_and_exit do
37
35
  puts stack.parameters.sort
38
36
  end
39
37
  end
40
38
 
41
- def logger
42
- @logger ||= SimpleDeployLogger.new :log_level => @opts[:log_level]
43
- end
44
-
45
39
  def command_summary
46
40
  'Show parameters of a stack'
47
41
  end
@@ -29,23 +29,18 @@ EOS
29
29
  valid_options? :provided => @opts,
30
30
  :required => [:environment, :name]
31
31
 
32
- config = Config.new.environment @opts[:environment]
32
+ SimpleDeploy.create_config @opts[:environment]
33
+ SimpleDeploy.logger @opts[:log_level]
33
34
 
34
35
  @opts[:name].each do |name|
35
- stack = Stack.new :environment => @opts[:environment],
36
- :name => name,
37
- :config => config,
38
- :logger => logger
39
- rescue_stackster_exceptions_and_exit do
36
+ stack = Stack.new :name => name,
37
+ :environment => @opts[:environment]
38
+ rescue_exceptions_and_exit do
40
39
  stack.update :attributes => [{ 'protection' => @opts[:protection] }]
41
40
  end
42
41
  end
43
42
  end
44
43
 
45
- def logger
46
- @logger ||= SimpleDeployLogger.new :log_level => @opts[:log_level]
47
- end
48
-
49
44
  def command_summary
50
45
  'Protect/Unprotect one or more stacks'
51
46
  end
@@ -27,22 +27,16 @@ EOS
27
27
  valid_options? :provided => @opts,
28
28
  :required => [:environment, :name]
29
29
 
30
- config = Config.new.environment @opts[:environment]
30
+ SimpleDeploy.create_config @opts[:environment]
31
+ SimpleDeploy.logger @opts[:log_level]
32
+ stack = Stack.new :name => @opts[:name],
33
+ :environment => @opts[:environment]
31
34
 
32
- stack = Stack.new :environment => @opts[:environment],
33
- :name => @opts[:name],
34
- :config => config,
35
- :logger => logger
36
-
37
- rescue_stackster_exceptions_and_exit do
35
+ rescue_exceptions_and_exit do
38
36
  jj stack.resources
39
37
  end
40
38
  end
41
39
 
42
- def logger
43
- @logger ||= SimpleDeployLogger.new :log_level => @opts[:log_level]
44
- end
45
-
46
40
  def command_summary
47
41
  'Show resources of a stack'
48
42
  end
@@ -10,7 +10,7 @@ module SimpleDeploy
10
10
  attributes.each do |attribs|
11
11
  key = attribs.split('=').first.gsub(/\s+/, "")
12
12
  value = attribs.gsub(/^.+?=/, '')
13
- logger.info "Read #{key}=#{value}"
13
+ SimpleDeploy.logger.info "Read #{key}=#{value}"
14
14
  attrs << { key => value }
15
15
  end
16
16
  attrs
@@ -22,14 +22,14 @@ module SimpleDeploy
22
22
 
23
23
  required.each do |opt|
24
24
  unless provided[opt]
25
- logger.error "Option '#{opt} (-#{opt[0]})' required but not specified."
25
+ SimpleDeploy.logger.error "Option '#{opt} (-#{opt[0]})' required but not specified."
26
26
  exit 1
27
27
  end
28
28
  end
29
29
 
30
30
  if required.include? :environment
31
- unless Config.new.environments.keys.include? provided[:environment]
32
- logger.error "Environment '#{provided[:environment]}' does not exist."
31
+ unless SimpleDeploy.environments.keys.include? provided[:environment]
32
+ SimpleDeploy.logger.error "Environment '#{provided[:environment]}' does not exist."
33
33
  exit 1
34
34
  end
35
35
  end
@@ -39,9 +39,9 @@ module SimpleDeploy
39
39
  self.class.name.split('::').last.downcase
40
40
  end
41
41
 
42
- def rescue_stackster_exceptions_and_exit
42
+ def rescue_exceptions_and_exit
43
43
  yield
44
- rescue Stackster::Exceptions::Base
44
+ rescue SimpleDeploy::Exceptions::Base
45
45
  exit 1
46
46
  end
47
47
 
@@ -24,22 +24,16 @@ EOS
24
24
  valid_options? :provided => @opts,
25
25
  :required => [:environment, :name]
26
26
 
27
- config = Config.new.environment @opts[:environment]
27
+ SimpleDeploy.create_config @opts[:environment]
28
+ SimpleDeploy.logger @opts[:log_level]
29
+ stack = Stack.new :name => @opts[:name],
30
+ :environment => @opts[:environment]
28
31
 
29
- stack = Stack.new :environment => @opts[:environment],
30
- :name => @opts[:name],
31
- :config => config,
32
- :logger => logger
33
-
34
- rescue_stackster_exceptions_and_exit do
32
+ rescue_exceptions_and_exit do
35
33
  puts stack.status
36
34
  end
37
35
  end
38
36
 
39
- def logger
40
- @logger ||= SimpleDeployLogger.new :log_level => @opts[:log_level]
41
- end
42
-
43
37
  def command_summary
44
38
  'Show status of a stack'
45
39
  end
@@ -24,22 +24,17 @@ EOS
24
24
  valid_options? :provided => @opts,
25
25
  :required => [:environment, :name]
26
26
 
27
- config = Config.new.environment @opts[:environment]
28
-
29
- stack = Stack.new :environment => @opts[:environment],
30
- :name => @opts[:name],
31
- :config => config,
32
- :logger => logger
33
-
34
- rescue_stackster_exceptions_and_exit do
35
- jj stack.template
27
+ SimpleDeploy.create_config @opts[:environment]
28
+ SimpleDeploy.logger @opts[:log_level]
29
+ stack = Stack.new :name => @opts[:name],
30
+ :environment => @opts[:environment]
31
+
32
+ rescue_exceptions_and_exit do
33
+ raw_json = JSON.parse stack.template
34
+ puts JSON.pretty_generate raw_json
36
35
  end
37
36
  end
38
37
 
39
- def logger
40
- @logger ||= SimpleDeployLogger.new :log_level => @opts[:log_level]
41
- end
42
-
43
38
  def command_summary
44
39
  'Show current template for stack'
45
40
  end
@@ -30,25 +30,21 @@ EOS
30
30
  valid_options? :provided => @opts,
31
31
  :required => [:environment, :name]
32
32
 
33
- config = Config.new.environment @opts[:environment]
33
+ SimpleDeploy.create_config @opts[:environment]
34
+ SimpleDeploy.logger @opts[:log_level]
34
35
 
35
36
  attributes = parse_attributes :attributes => @opts[:attributes]
36
37
 
37
38
  @opts[:name].each do |name|
38
- stack = Stack.new :environment => @opts[:environment],
39
- :name => name,
40
- :config => config,
41
- :logger => logger
42
- rescue_stackster_exceptions_and_exit do
39
+ stack = Stack.new :name => name,
40
+ :environment => @opts[:environment]
41
+
42
+ rescue_exceptions_and_exit do
43
43
  stack.update :force => @opts[:force], :attributes => attributes
44
44
  end
45
45
  end
46
46
  end
47
47
 
48
- def logger
49
- @logger ||= SimpleDeployLogger.new :log_level => @opts[:log_level]
50
- end
51
-
52
48
  def command_summary
53
49
  'Update the attributes for one more stacks'
54
50
  end
@@ -0,0 +1,102 @@
1
+
2
+ module SimpleDeploy
3
+ module Configuration
4
+ extend self
5
+
6
+ def configure(environment, custom_config = {})
7
+ raw_config = custom_config.fetch(:config) { load_config_file }
8
+ Config.new raw_config['environments'][environment],
9
+ raw_config['notifications']
10
+ end
11
+
12
+ def environments(custom_config = {})
13
+ raw_config = custom_config.fetch(:config) { load_config_file }
14
+ raw_config['environments']
15
+ end
16
+
17
+ private
18
+
19
+ def load_config_file
20
+ begin
21
+ YAML::load File.open(config_file)
22
+ rescue Errno::ENOENT
23
+ raise "#{config_file} not found"
24
+ rescue ArgumentError, Psych::SyntaxError => e
25
+ raise "#{config_file} is corrupt"
26
+ end
27
+ end
28
+
29
+ def config_file
30
+ env_config_file || default_config_file
31
+ end
32
+
33
+ def env_config_file
34
+ env.load 'SIMPLE_DEPLOY_CONFIG_FILE'
35
+ end
36
+
37
+ def default_config_file
38
+ "#{env.load 'HOME'}/.simple_deploy.yml"
39
+ end
40
+
41
+ def env
42
+ @env ||= SimpleDeploy::Env.new
43
+ end
44
+
45
+ class Config
46
+ attr_reader :environment, :notifications
47
+
48
+ def initialize(environment, notifications)
49
+ raise ArgumentError.new("environment must be defined") unless environment
50
+
51
+ @environment = environment
52
+ @notifications = notifications
53
+ end
54
+
55
+ def artifacts
56
+ ['chef_repo', 'cookbooks', 'app']
57
+ end
58
+
59
+ def artifact_deploy_variable(artifact)
60
+ name_to_variable_map = { 'chef_repo' => 'CHEF_REPO_URL',
61
+ 'app' => 'APP_URL',
62
+ 'cookbooks' => 'COOKBOOKS_URL' }
63
+ name_to_variable_map[artifact]
64
+ end
65
+
66
+ def artifact_cloud_formation_url(artifact)
67
+ name_to_url_map = { 'chef_repo' => 'ChefRepoURL',
68
+ 'app' => 'AppArtifactURL',
69
+ 'cookbooks' => 'CookbooksURL' }
70
+ name_to_url_map[artifact]
71
+ end
72
+
73
+ def deploy_script
74
+ '/opt/intu/admin/bin/configure.sh'
75
+ end
76
+
77
+ def access_key
78
+ @environment['access_key']
79
+ end
80
+
81
+ def secret_key
82
+ @environment['secret_key']
83
+ end
84
+
85
+ def region
86
+ @environment['region']
87
+ end
88
+
89
+ private
90
+
91
+ def env_home
92
+ env.load 'HOME'
93
+ end
94
+
95
+ def env_user
96
+ env.load 'USER'
97
+ end
98
+
99
+
100
+ end
101
+ end
102
+ end