stackmate 0.1.0 → 0.1.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/CHANGELOG.txt CHANGED
@@ -1,7 +1,19 @@
1
1
 
2
2
  = stackmate - CHANGELOG.txt
3
3
 
4
+ == stackmate - 0.1.1
5
+ - Timeout and notification support
6
+ - Rollback notification.
7
+ - No API changes
8
+ - Added templates in CloudStack:: namespace
9
+
4
10
 
5
11
  == stackmate - 0.1.0
6
12
 
7
13
  - replace cloudstack_ruby_client with a simple built-in client
14
+ - support for CloudStack:: namespace in json template.
15
+ - tests
16
+ - rake tasks to simplify generation of code for CS virtual resources and template docs
17
+ - extensibility support by adding your own plugin classes to interface with other services
18
+ - added CS sample template
19
+
data/bin/stackmate.rb CHANGED
@@ -4,6 +4,7 @@ require 'optparse'
4
4
  require 'stackmate'
5
5
  require 'stackmate/classmap'
6
6
  require 'stackmate/waitcondition_server'
7
+ require 'stackmate/logging'
7
8
 
8
9
 
9
10
  options = {}
@@ -34,6 +35,13 @@ opt_parser = OptionParser.new do |opts|
34
35
  opts.on("--plugins DIRS",String, "Comman separated plugins directory") do |plugins|
35
36
  options[:plugins] = plugins
36
37
  end
38
+ options[:timeout] = "600"
39
+ opts.on("--timeout SECONDS",String, "Timeout for stack creation in seconds, defaults to 600 seconds") do |t|
40
+ options[:timeout] = t
41
+ end
42
+ opts.on("-d", "--debug", "Debug level logging") do
43
+ StackMate.set_log_level("debug")
44
+ end
37
45
  end
38
46
 
39
47
  begin
@@ -65,7 +73,7 @@ if options[:file] && stack_name != ''
65
73
  StackMate.configure('NOOP') if options[:dry_run]
66
74
  opts = {}
67
75
  api_opts = {:APIKEY => "#{ENV['APIKEY']}", :SECKEY => "#{ENV['SECKEY']}", :URL => "#{ENV['URL']}" }
68
- p = StackMate::StackExecutor.new(options[:file], stack_name, options[:params], engine, options[:wait_conditions], api_opts, options[:plugins])
76
+ p = StackMate::StackExecutor.new(options[:file], stack_name, options[:params], engine, options[:wait_conditions], api_opts, options[:timeout], options[:plugins])
69
77
  p.launch()
70
78
  nil
71
79
  end
@@ -75,4 +83,4 @@ if options[:file] && stack_name != ''
75
83
  print "Sorry, I don't know how to create resources of type: ", unknown, "\n" if unknown
76
84
  else
77
85
  puts opt_parser.help()
78
- end
86
+ end
@@ -1,6 +1,20 @@
1
1
  require 'logger'
2
2
 
3
3
  module StackMate
4
+ @log_lvl = Logger::INFO
5
+ def StackMate.set_log_level(lvl)
6
+ case lvl
7
+ when 'info'
8
+ @log_lvl = Logger::INFO
9
+ when 'debug'
10
+ @log_lvl = Logger::DEBUG
11
+ end
12
+ end
13
+
14
+ def StackMate.log_level
15
+ @log_lvl
16
+ end
17
+
4
18
  module Logging
5
19
  def logger
6
20
  @logger ||= Logging.logger_for(self.class.name)
@@ -16,6 +30,7 @@ module StackMate
16
30
 
17
31
  def configure_logger_for(classname)
18
32
  logger = Logger.new(STDOUT)
33
+ logger.level = StackMate.log_level
19
34
  logger.progname = classname
20
35
  logger.datetime_format= '%F %T'
21
36
  logger.formatter = proc do |severity, datetime, progname, msg|
@@ -304,7 +304,7 @@ module StackMate
304
304
  v = val['Value']
305
305
  constructed_value = intrinsic(v, workitem)
306
306
  val['Value'] = constructed_value
307
- workitem['Outputs'][key] = constructed_value
307
+ #workitem['Outputs'][key] = constructed_value
308
308
  logger.debug "Output: key = #{key}, value = #{constructed_value} descr = #{val['Description']}"
309
309
  end
310
310
 
@@ -315,4 +315,4 @@ module StackMate
315
315
  end
316
316
 
317
317
 
318
- end
318
+ end
@@ -153,6 +153,15 @@ module StackMate
153
153
  end
154
154
  end
155
155
 
156
+ class StackNotifier < Ruote::Participant
157
+ include Logging
158
+
159
+ def on_workitem
160
+ logger.error("\n\nINITIATING STACK ROLLBACK\n\n")
161
+ reply
162
+ end
163
+ end
164
+
156
165
  class StackNest < Ruote::Participant
157
166
  include Logging
158
167
  include Intrinsic
@@ -17,12 +17,13 @@ module StackMate
17
17
  class StackExecutor < StackMate::Stacker
18
18
  include Logging
19
19
 
20
- def initialize(templatefile, stackname, params, engine, create_wait_conditions, api_opts, plugins=nil)
20
+ def initialize(templatefile, stackname, params, engine, create_wait_conditions, api_opts, timeout, plugins=nil)
21
21
  stackstr = File.read(templatefile)
22
22
  super(stackstr, stackname, resolve_param_refs(params, stackname))
23
23
  @engine = engine
24
24
  @create_wait_conditions = create_wait_conditions
25
25
  @api_opts = api_opts
26
+ @timeout = timeout
26
27
  load_plugins(plugins)
27
28
  end
28
29
 
@@ -82,6 +83,8 @@ module StackMate
82
83
  resolved_params['AWS::Region'] = 'us-east-1' #TODO handle this better
83
84
  resolved_params['AWS::StackName'] = stackname
84
85
  resolved_params['AWS::StackId'] = stackname
86
+ resolved_params['CloudStack::StackName'] = stackname
87
+ resolved_params['CloudStack::StackId'] = stackname
85
88
  resolved_params
86
89
  end
87
90
 
@@ -104,14 +107,16 @@ module StackMate
104
107
  throw :unknown, t if !StackMate.class_for(t)
105
108
  @engine.register_participant p, StackMate.class_for(t), @api_opts
106
109
  end
107
-
110
+ timeout = @timeout + "s"
108
111
  @engine.register_participant 'Output', StackMate.class_for('Outputs')
112
+ @engine.register_participant 'Notify', StackMate.class_for('StackMate::StackNotifier')
109
113
  @pdef = Ruote.define @stackname.to_s() do
110
- cursor :timeout => '300s', :on_error => 'rollback', :on_timeout => 'rollback' do
114
+ cursor :timeout => timeout, :on_error => 'rollback', :on_timeout => 'rollback' do
111
115
  participants.collect{ |name| __send__(name, :operation => :create) }
112
116
  __send__('Output')
113
117
  end
114
- define 'rollback', :timeout => '300s' do
118
+ define 'rollback', :timeout => timeout do
119
+ __send__('Notify')
115
120
  participants.reverse_each.collect {|name| __send__(name, :operation => :rollback) }
116
121
  end
117
122
  end
@@ -119,7 +124,8 @@ module StackMate
119
124
 
120
125
  def launch
121
126
  wfid = @engine.launch( pdef, @templ)
122
- @engine.wait_for(wfid, :timeout => 600)
127
+ timeout = @timeout.to_i * 2
128
+ @engine.wait_for(wfid, :timeout => timeout)
123
129
  logger.error { "engine error : #{@engine.errors.first.message}"} if @engine.errors.first
124
130
  end
125
131
  end
@@ -1,3 +1,3 @@
1
1
  module StackMate
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stackmate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-15 00:00:00.000000000 Z
12
+ date: 2013-11-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json