mccloud 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (225) hide show
  1. data/.gitignore +13 -8
  2. data/.rvmrc +2 -0
  3. data/Gemfile +10 -1
  4. data/Guardfile +10 -0
  5. data/README.md +453 -89
  6. data/Rakefile +29 -2
  7. data/bin/mccloud +17 -116
  8. data/bin/mccloud_old +159 -0
  9. data/doc/old-README.md +81 -0
  10. data/lib/mccloud/cli.rb +55 -0
  11. data/lib/mccloud/command/balance.rb +21 -0
  12. data/lib/mccloud/command/base.rb +106 -0
  13. data/lib/mccloud/command/bootstrap.rb +12 -24
  14. data/lib/mccloud/command/define.rb +18 -0
  15. data/lib/mccloud/command/destroy.rb +12 -13
  16. data/lib/mccloud/command/forward.rb +29 -0
  17. data/lib/mccloud/command/group_base.rb +107 -0
  18. data/lib/mccloud/command/halt.rb +11 -13
  19. data/lib/mccloud/command/helpers.rb +13 -0
  20. data/lib/mccloud/command/image.rb +37 -0
  21. data/lib/mccloud/command/init.rb +8 -504
  22. data/lib/mccloud/command/init_vagrant.rb +14 -0
  23. data/lib/mccloud/command/ip.rb +32 -0
  24. data/lib/mccloud/command/ips.rb +22 -0
  25. data/lib/mccloud/command/keypair.rb +27 -0
  26. data/lib/mccloud/command/keystore.rb +29 -0
  27. data/lib/mccloud/command/lb.rb +38 -0
  28. data/lib/mccloud/command/named_base.rb +14 -0
  29. data/lib/mccloud/command/package.rb +17 -0
  30. data/lib/mccloud/command/provider.rb +30 -0
  31. data/lib/mccloud/command/provision.rb +10 -24
  32. data/lib/mccloud/command/reload.rb +12 -6
  33. data/lib/mccloud/command/sorry.rb +20 -0
  34. data/lib/mccloud/command/ssh.rb +11 -45
  35. data/lib/mccloud/command/status.rb +14 -35
  36. data/lib/mccloud/command/template.rb +16 -0
  37. data/lib/mccloud/command/undefine.rb +23 -0
  38. data/lib/mccloud/command/up.rb +8 -62
  39. data/lib/mccloud/command/version.rb +14 -0
  40. data/lib/mccloud/command/vm.rb +27 -0
  41. data/lib/mccloud/command.rb +36 -0
  42. data/lib/mccloud/config/collection.rb +107 -0
  43. data/lib/mccloud/config/component.rb +20 -0
  44. data/lib/mccloud/config/definition.rb +35 -0
  45. data/lib/mccloud/config/keypair.rb +36 -0
  46. data/lib/mccloud/config/mccloud.rb +39 -0
  47. data/lib/mccloud/config/provider.rb +55 -0
  48. data/lib/mccloud/config/template.rb +35 -0
  49. data/lib/mccloud/config.rb +128 -41
  50. data/lib/mccloud/definition.rb +104 -0
  51. data/lib/mccloud/definitions.rb +91 -0
  52. data/lib/mccloud/environment.rb +222 -0
  53. data/lib/mccloud/error.rb +20 -0
  54. data/lib/mccloud/generator.rb +49 -0
  55. data/lib/mccloud/keypair.rb +48 -0
  56. data/lib/mccloud/mccloudfile.rb +78 -0
  57. data/lib/mccloud/provider/aws/image.rb +107 -0
  58. data/lib/mccloud/provider/aws/ip/associate.rb +33 -0
  59. data/lib/mccloud/provider/aws/ip.rb +31 -0
  60. data/lib/mccloud/provider/aws/keystore.rb +21 -0
  61. data/lib/mccloud/provider/aws/lb/associate.rb +53 -0
  62. data/lib/mccloud/provider/aws/lb/sorry.rb +14 -0
  63. data/lib/mccloud/provider/aws/lb.rb +37 -0
  64. data/lib/mccloud/provider/aws/provider/image_destroy.rb +27 -0
  65. data/lib/mccloud/provider/aws/provider/image_list.rb +19 -0
  66. data/lib/mccloud/provider/aws/provider/ip_list.rb +17 -0
  67. data/lib/mccloud/provider/aws/provider/keystore_list.rb +22 -0
  68. data/lib/mccloud/provider/aws/provider/keystore_sync.rb +62 -0
  69. data/lib/mccloud/provider/aws/provider/lb_list.rb +21 -0
  70. data/lib/mccloud/provider/aws/provider/old_deregister.rb +39 -0
  71. data/lib/mccloud/provider/aws/provider/old_flavors.rb +18 -0
  72. data/lib/mccloud/provider/aws/provider/old_ips.rb +42 -0
  73. data/lib/mccloud/provider/aws/provider/old_loadbalance.rb +46 -0
  74. data/lib/mccloud/provider/aws/provider/old_package.rb +75 -0
  75. data/lib/mccloud/provider/aws/provider/old_sorry.rb +51 -0
  76. data/lib/mccloud/provider/aws/provider/old_status.rb +119 -0
  77. data/lib/mccloud/provider/aws/provider/old_validate.rb +51 -0
  78. data/lib/mccloud/provider/aws/provider/status.rb +58 -0
  79. data/lib/mccloud/provider/aws/provider.rb +219 -0
  80. data/lib/mccloud/provider/aws/stack/old_destroy.rb +43 -0
  81. data/lib/mccloud/provider/aws/stack/old_up.rb +59 -0
  82. data/lib/mccloud/provider/aws/stack/old_vm.rb +98 -0
  83. data/lib/mccloud/provider/aws/stack.rb +243 -0
  84. data/lib/mccloud/provider/aws/vm/bootstrap.rb +13 -0
  85. data/lib/mccloud/provider/aws/vm/destroy.rb +21 -0
  86. data/lib/mccloud/provider/aws/vm/forward.rb +17 -0
  87. data/lib/mccloud/provider/aws/vm/halt.rb +24 -0
  88. data/lib/mccloud/provider/aws/vm/package.rb +63 -0
  89. data/lib/mccloud/provider/aws/vm/provision.rb +25 -0
  90. data/lib/mccloud/provider/aws/vm/reload.rb +13 -0
  91. data/lib/mccloud/provider/aws/vm/resume.rb +0 -0
  92. data/lib/mccloud/provider/aws/vm/rsync.rb +11 -0
  93. data/lib/mccloud/provider/aws/vm/scp.rb +21 -0
  94. data/lib/mccloud/provider/aws/vm/ssh.rb +11 -0
  95. data/lib/mccloud/provider/aws/vm/suspend.rb +0 -0
  96. data/lib/mccloud/provider/aws/vm/up.rb +133 -0
  97. data/lib/mccloud/provider/aws/vm.rb +123 -0
  98. data/lib/mccloud/{type → provider/core}/forwarding.rb +6 -3
  99. data/lib/mccloud/provider/core/ip.rb +24 -0
  100. data/lib/mccloud/provider/core/keystore.rb +23 -0
  101. data/lib/mccloud/provider/core/lb.rb +23 -0
  102. data/lib/mccloud/provider/core/provider.rb +99 -0
  103. data/lib/mccloud/provider/core/vm/old_halt.rb +19 -0
  104. data/lib/mccloud/{generators.rb → provider/core/vm/old_init.rb} +0 -0
  105. data/lib/mccloud/provider/core/vm/old_multi.rb +60 -0
  106. data/lib/mccloud/provider/core/vm/old_reload.rb +11 -0
  107. data/lib/mccloud/{command/server.rb → provider/core/vm/old_server.rb} +2 -2
  108. data/lib/mccloud/provider/core/vm/old_ssh_command.rb +21 -0
  109. data/lib/mccloud/{command/suspend.rb → provider/core/vm/old_suspend.rb} +2 -2
  110. data/lib/mccloud/provider/core/vm/old_wizard.rb +511 -0
  111. data/lib/mccloud/provider/core/vm/rsync.rb +67 -0
  112. data/lib/mccloud/provider/core/vm/ssh.rb +137 -0
  113. data/lib/mccloud/provider/core/vm/ssh_bootstrap.rb +62 -0
  114. data/lib/mccloud/provider/core/vm/ssh_forward.rb +47 -0
  115. data/lib/mccloud/provider/core/vm.rb +121 -0
  116. data/lib/mccloud/provider/fog/fogconfig.rb +44 -0
  117. data/lib/mccloud/provider/fog/provider.rb +46 -0
  118. data/lib/mccloud/provider/host/provider/status.rb +12 -0
  119. data/lib/mccloud/provider/host/provider.rb +85 -0
  120. data/lib/mccloud/provider/host/vm/bootstrap.rb +11 -0
  121. data/lib/mccloud/provider/host/vm/forward.rb +12 -0
  122. data/lib/mccloud/provider/host/vm/provision.rb +19 -0
  123. data/lib/mccloud/provider/host/vm/scp.rb +35 -0
  124. data/lib/mccloud/provider/host/vm/ssh.rb +11 -0
  125. data/lib/mccloud/provider/host/vm.rb +28 -0
  126. data/lib/mccloud/provider/libvirt/provider/status.rb +43 -0
  127. data/lib/mccloud/provider/libvirt/provider.rb +96 -0
  128. data/lib/mccloud/provider/libvirt/vm/bootstrap.rb +17 -0
  129. data/lib/mccloud/provider/libvirt/vm/destroy.rb +33 -0
  130. data/lib/mccloud/provider/libvirt/vm/forward.rb +12 -0
  131. data/lib/mccloud/provider/libvirt/vm/halt.rb +20 -0
  132. data/lib/mccloud/provider/libvirt/vm/provision.rb +25 -0
  133. data/lib/mccloud/provider/libvirt/vm/reload.rb +13 -0
  134. data/lib/mccloud/provider/libvirt/vm/rsync.rb +11 -0
  135. data/lib/mccloud/provider/libvirt/vm/scp.rb +15 -0
  136. data/lib/mccloud/provider/libvirt/vm/ssh.rb +11 -0
  137. data/lib/mccloud/provider/libvirt/vm/up.rb +65 -0
  138. data/lib/mccloud/provider/libvirt/vm.rb +67 -0
  139. data/lib/mccloud/provider/script/provider/status.rb +12 -0
  140. data/lib/mccloud/provider/script/provider.rb +125 -0
  141. data/lib/mccloud/provider/script/vm.rb +13 -0
  142. data/lib/mccloud/provider/vagrant/provider/status.rb +14 -0
  143. data/lib/mccloud/provider/vagrant/provider.rb +135 -0
  144. data/lib/mccloud/provider/vagrant/vm/destroy.rb +11 -0
  145. data/lib/mccloud/provider/vagrant/vm/forward.rb +12 -0
  146. data/lib/mccloud/provider/vagrant/vm/halt.rb +11 -0
  147. data/lib/mccloud/provider/vagrant/vm/provision.rb +11 -0
  148. data/lib/mccloud/provider/vagrant/vm/reload.rb +11 -0
  149. data/lib/mccloud/provider/vagrant/vm/resume.rb +11 -0
  150. data/lib/mccloud/provider/vagrant/vm/ssh.rb +11 -0
  151. data/lib/mccloud/provider/vagrant/vm/suspend.rb +11 -0
  152. data/lib/mccloud/provider/vagrant/vm/up.rb +11 -0
  153. data/lib/mccloud/provider/vagrant/vm.rb +46 -0
  154. data/lib/mccloud/provider/vmfusion/provider/status.rb +24 -0
  155. data/lib/mccloud/provider/vmfusion/provider.rb +98 -0
  156. data/lib/mccloud/provider/vmfusion/vm/forward.rb +12 -0
  157. data/lib/mccloud/provider/vmfusion/vm/halt.rb +11 -0
  158. data/lib/mccloud/provider/vmfusion/vm/resume.rb +11 -0
  159. data/lib/mccloud/provider/vmfusion/vm/suspend.rb +11 -0
  160. data/lib/mccloud/provider/vmfusion/vm/up.rb +11 -0
  161. data/lib/mccloud/provider/vmfusion/vm.rb +47 -0
  162. data/lib/mccloud/provisioner/chef_solo.rb +193 -79
  163. data/lib/mccloud/provisioner/puppet.rb +205 -32
  164. data/lib/mccloud/provisioner/shell.rb +48 -0
  165. data/lib/mccloud/template.rb +74 -0
  166. data/lib/mccloud/templates/Mccloudfile.erb +212 -39
  167. data/lib/mccloud/templates/{bootstrap-centos-rubysource-1.8.7.sh → bootstrap/bootstrap-centos-rubysource-1.8.7.sh} +0 -0
  168. data/lib/mccloud/templates/{bootstrap-centos-rvm-1.8.7.sh → bootstrap/bootstrap-centos-rvm-1.8.7.sh} +0 -0
  169. data/lib/mccloud/templates/{bootstrap-centos-rvm-1.9.2.sh → bootstrap/bootstrap-centos-rvm-1.9.2.sh} +0 -0
  170. data/lib/mccloud/templates/{bootstrap-centos-rvm-ree-1.8.7.sh → bootstrap/bootstrap-centos-rvm-ree-1.8.7.sh} +0 -0
  171. data/lib/mccloud/templates/bootstrap/bootstrap-chef-omnibus.sh +8 -0
  172. data/lib/mccloud/templates/{bootstrap-custom.sh → bootstrap/bootstrap-custom.sh} +0 -0
  173. data/lib/mccloud/templates/{bootstrap-ubuntu-rvm-1.8.7.sh → bootstrap/bootstrap-ubuntu-rvm-1.8.7.sh} +0 -0
  174. data/lib/mccloud/templates/{bootstrap-ubuntu-system.sh → bootstrap/bootstrap-ubuntu-system.sh} +0 -0
  175. data/lib/mccloud/templates/locales/en.yml +30 -0
  176. data/lib/mccloud/templates/vm.erb +9 -0
  177. data/lib/mccloud/templates.rb +35 -0
  178. data/lib/mccloud/ui.rb +82 -0
  179. data/lib/mccloud/util/rostruct.rb +24 -0
  180. data/lib/mccloud/util/rsync.rb +12 -8
  181. data/lib/mccloud/util/ssh.rb +18 -12
  182. data/lib/mccloud/util/sshkey.rb +3 -2
  183. data/lib/mccloud/version.rb +4 -1
  184. data/lib/mccloud/vm.rb +62 -0
  185. data/lib/mccloud/vms.rb +60 -0
  186. data/lib/mccloud.rb +24 -1
  187. data/mccloud.gemspec +12 -3
  188. data/samples/Mccloudfile +117 -0
  189. data/samples/bitnami_drupal_cloud.json +102 -0
  190. data/samples/bootstrap-ubuntu-system.sh +16 -0
  191. data/samples/mcollective_cloud.json +198 -0
  192. data/samples/stack_cloud.json +93 -0
  193. data/samples/stacks.txt +5 -0
  194. data/spec/commands/define_spec.rb +96 -0
  195. data/spec/commands/init_spec.rb +30 -0
  196. data/spec/environment/environment_spec.rb +26 -0
  197. data/spec/generator_spec.rb +30 -0
  198. data/spec/keypair_spec.rb +38 -0
  199. data/spec/provider/aws/credentials_spec.rb +37 -0
  200. data/spec/provisioner/puppet/Mccloud-puppet-test +32 -0
  201. data/spec/provisioner/puppet/puppet_spec.rb +110 -0
  202. data/spec/spec_helper.rb +0 -0
  203. data/templates/ubuntu-10.10-server-amd64/aws.json +3 -0
  204. data/templates/ubuntu-10.10-server-amd64/bootstrap.sh +16 -0
  205. data/templates/ubuntu-10.10-server-amd64/definition.old +51 -0
  206. data/templates/ubuntu-10.10-server-amd64/mccloud.erb +6 -0
  207. metadata +293 -67
  208. data/Gemfile.lock +0 -53
  209. data/lib/mccloud/command/boot.rb +0 -12
  210. data/lib/mccloud/command/command.rb +0 -21
  211. data/lib/mccloud/command/multi.rb +0 -60
  212. data/lib/mccloud/configurator/lb.rb +0 -26
  213. data/lib/mccloud/configurator/mccloud.rb +0 -33
  214. data/lib/mccloud/configurator/vm.rb +0 -37
  215. data/lib/mccloud/provisioner/vagrant/base.rb +0 -63
  216. data/lib/mccloud/provisioner/vagrant/chef.rb +0 -130
  217. data/lib/mccloud/provisioner/vagrant/chef_server.rb +0 -103
  218. data/lib/mccloud/provisioner/vagrant/chef_solo.rb +0 -142
  219. data/lib/mccloud/provisioner/vagrant/puppet.rb +0 -137
  220. data/lib/mccloud/provisioner/vagrant/puppet_server.rb +0 -55
  221. data/lib/mccloud/provisioner/vagrant/shell.rb +0 -52
  222. data/lib/mccloud/session.rb +0 -206
  223. data/lib/mccloud/type/lb.rb +0 -34
  224. data/lib/mccloud/type/vm.rb +0 -47
  225. data/lib/mccloud/util/iterator.rb +0 -20
@@ -0,0 +1,222 @@
1
+ require 'mccloud/config'
2
+ require 'mccloud/generator'
3
+
4
+ require 'mccloud/command/init'
5
+ require 'mccloud/command/provider'
6
+ require 'logger'
7
+
8
+ module Mccloud
9
+
10
+ # Represents a single Mccloud environment. A "Mccloud environment" is
11
+ # defined as basically a folder with a "Mccloudfile". This class allows
12
+ # access to the VMs, CLI, etc. all in the scope of this environment
13
+ class Environment
14
+
15
+ include Mccloud::EnvironmentCommand
16
+
17
+ # The `cwd` that this environment represents
18
+ attr_reader :cwd
19
+
20
+ # The valid name for a Mccloudfile for this environment
21
+ attr_reader :mccloud_file
22
+
23
+ # The {UI} Object to communicate with the outside world
24
+ attr_writer :ui
25
+
26
+ # The configuration as loaded by the Mccloudfile
27
+ attr_accessor :config
28
+
29
+ # A generator helper to create a Mccloud project
30
+ attr_accessor :generator
31
+
32
+ # Default ssh keypath
33
+ attr_accessor :ssh_key_path
34
+
35
+ attr_accessor :autoload
36
+ # attr_accessor :providers
37
+
38
+
39
+ def initialize(newoptions=nil)
40
+ options = {
41
+ :cwd => nil,
42
+ :mccloud_file => "Mccloudfile",
43
+ :autoload => true}.merge(newoptions || {})
44
+
45
+ # We need to set this variable before the first call to the logger object
46
+ if options.has_key?("debug")
47
+ ENV['MCCLOUD_LOG']="STDOUT"
48
+ ui.info "Debugging enabled"
49
+ end
50
+
51
+ options.each do |key, value|
52
+ logger.info("environment") { "Setting @#{key} to #{options[key]}" }
53
+ self.instance_variable_set("@#{key}".to_sym, options[key])
54
+ end
55
+
56
+ if options[:cwd].nil?
57
+ @cwd=computed_rootpath(".")
58
+ else
59
+ @cwd=computed_rootpath(options[:cwd])
60
+ end
61
+
62
+ logger.info("environment") { "Autoload activated? #{options[:autoload]}"}
63
+ @autoload=options[:autoload]
64
+
65
+ # Set the default working directory to look for the Mccloudfile
66
+ logger.info("environment") { "Environment initialized (#{self})" }
67
+ logger.info("environment") { " - cwd : #{cwd}" }
68
+
69
+ @config=Config.new({:env => self})
70
+ @generator=Generator.new(self)
71
+
72
+ # Setting the default to path of the sshkey
73
+ @ssh_key_path=File.join(ENV['HOME'],".ssh")
74
+
75
+ return self
76
+ end
77
+
78
+ def root_path
79
+ return File.expand_path(@cwd)
80
+ end
81
+
82
+ def computed_rootpath(start)
83
+ # Let's start at the start path provided
84
+ logger.info("Calculating computed rootpath")
85
+ logger.info("Start provided: #{start}")
86
+ startdir=start
87
+ prevdir="/someunknownpath"
88
+
89
+ until File.exists?(File.join(startdir,@mccloud_file))
90
+ prevdir=startdir
91
+ startdir=File.expand_path(File.join(startdir,".."))
92
+ logger.info("No #{@mccloud_file} found, going up one directory #{startdir}")
93
+
94
+ # Check if aren't at the root dir
95
+ if File.expand_path(prevdir)==File.expand_path(startdir)
96
+ return start
97
+ end
98
+ end
99
+
100
+ return startdir
101
+ end
102
+
103
+ #---------------------------------------------------------------
104
+ # Config Methods
105
+ #---------------------------------------------------------------
106
+
107
+ # The configuration object represented by this environment. This
108
+ # will trigger the environment to load if it hasn't loaded yet (see
109
+ # {#load!}).
110
+ #
111
+ # @return [Config::Top]
112
+ def config
113
+ if @autoload
114
+ load! if !loaded?
115
+ end
116
+ @config
117
+ end
118
+
119
+ # Returns the {UI} for the environment, which is responsible
120
+ # for talking with the outside world.
121
+ #
122
+ # @return [UI]
123
+ def ui
124
+ @ui ||= UI.new(self)
125
+ end
126
+
127
+ #---------------------------------------------------------------
128
+ # Load Methods
129
+ #---------------------------------------------------------------
130
+
131
+ # Returns a boolean representing if the environment has been
132
+ # loaded or not.
133
+ #
134
+ # @return [Bool]
135
+ def loaded?
136
+ !!@loaded
137
+ end
138
+
139
+ # Loads this entire environment, setting up the instance variables
140
+ # such as `vm`, `config`, etc. on this environment. The order this
141
+ # method calls its other methods is very particular.
142
+ def load!
143
+ if !loaded?
144
+ @loaded = true
145
+
146
+ logger.info("environment") { "Loading configuration..." }
147
+ load_config!
148
+
149
+ self
150
+ end
151
+ end
152
+
153
+ ## Does the actual read of the configuration file
154
+ ## @return [self]
155
+ def load_config!
156
+
157
+ # Read the config
158
+ @config.load_mccloud_config()
159
+
160
+ # Read the templates in the template sub-dir
161
+ @config.templates.load!
162
+ @config.definitions.load!
163
+
164
+ # Read the vms specified inthe vm sub-dir
165
+ @config.vms.load!
166
+
167
+ ui.info "Loaded providers[#{@config.providers.length}]"+" vms[#{@config.vms.length}]"+" ips[#{@config.ips.length}]"+" lbs[#{@config.lbs.length}]"+" stacks[#{@config.stacks.length}]"+" templates[#{@config.templates.length}] keypairs[#{@config.keypairs.length}] keystores[#{@config.keystores.length}]"
168
+
169
+ return self
170
+ end
171
+
172
+ # Reloads the configuration of this environment.
173
+ def reload_config!
174
+ @config = nil
175
+ load_config!
176
+ self
177
+ end
178
+
179
+ # Makes a call to the CLI with the given arguments as if they
180
+ # came from the real command line (sometimes they do!). An example:
181
+ #
182
+ # env.cli("package", "--mccloudfile", "Mccloudfile")
183
+ #
184
+ def cli(*args)
185
+ CLI.start(args.flatten, :env => self)
186
+ end
187
+
188
+ def resource
189
+ "mccloud"
190
+ end
191
+
192
+ # Accesses the logger for Mccloud. This logger is a _detailed_
193
+ # logger which should be used to log internals only. For outward
194
+ # facing information, use {#ui}.
195
+ #
196
+ # @return [Logger]
197
+ def logger
198
+ return @logger if @logger
199
+
200
+ # Figure out where the output should go to.
201
+ output = nil
202
+ if ENV["MCCLOUD_LOG"] == "STDOUT"
203
+ output = STDOUT
204
+ elsif ENV["MCCLOUD_LOG"] == "NULL"
205
+ output = nil
206
+ elsif ENV["MCCLOUD_LOG"]
207
+ output = ENV["MCCLOUD_LOG"]
208
+ else
209
+ output = nil #log_path.join("#{Time.now.to_i}.log")
210
+ end
211
+
212
+ # Create the logger and custom formatter
213
+ @logger = ::Logger.new(output)
214
+ @logger.formatter = Proc.new do |severity, datetime, progname, msg|
215
+ "#{datetime} - #{progname} - [#{resource}] #{msg}\n"
216
+ end
217
+
218
+ @logger
219
+ end
220
+
221
+ end #Class
222
+ end #Module
@@ -0,0 +1,20 @@
1
+ module Mccloud
2
+ class Error < StandardError
3
+ attr_reader :orginal
4
+ def initialize(msg, original=$!)
5
+ super(msg)
6
+ @original = original; end
7
+ end
8
+ end
9
+
10
+ #Usage (from the exceptional ruby book)
11
+ #begin
12
+ # begin
13
+ # raise "Error A"
14
+ # rescue => error
15
+ # raise MyError, "Error B"
16
+ # end
17
+ #rescue => error.
18
+ # puts "Current failure: #{error.inspect}"
19
+ # puts "Original failure: #{error.original.inspect}"
20
+ #end
@@ -0,0 +1,49 @@
1
+ require 'mccloud/mccloudfile'
2
+ require 'mccloud/keypair'
3
+
4
+ module Mccloud
5
+
6
+ # This takes care of initializing a new Mccloud project
7
+ class Generator
8
+
9
+ attr_accessor :env
10
+
11
+ def initialize(env)
12
+ @env=env
13
+ @generators=[:aws,:kvm,:host]
14
+ end
15
+
16
+ def generate(options={})
17
+ defaults={ :provider => :aws, :force => false}
18
+ options=defaults.merge(options)
19
+ provider=options[:provider].to_sym
20
+ raise ::Mccloud::Error, "Unsupported provider #{provider}" unless @generators.include?(provider)
21
+ generate_mccloudfile(options)
22
+ generate_mccloud_sshkey(options)
23
+ end
24
+
25
+ def generate_mccloudfile(options)
26
+ begin
27
+ f=Mccloud::Mccloudfile.new(File.join(env.root_path,"Mccloudfile"))
28
+ if f.exists?
29
+ env.ui.error "Mccloudfile already exists"
30
+ else
31
+ env.ui.info "Creating a new Mccloudfile"
32
+ f.generate(options)
33
+ end
34
+ rescue Error => ex
35
+ raise ::Mccloud::Error, "Error creating Mccloudfile.\n#{ex}"
36
+ end
37
+ end
38
+
39
+ def generate_mccloud_sshkey(options)
40
+ k=Mccloud::Keypair.new("mccloud",env)
41
+ if k.exists?
42
+ env.ui.info "Re-using existing mccloud RSA key in #{k.public_key_path}"
43
+ else
44
+ k.generate(options)
45
+ end
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,48 @@
1
+ require 'mccloud/util/sshkey'
2
+
3
+ module Mccloud
4
+ class Keypair
5
+ attr_accessor :public_key_path
6
+ attr_accessor :private_key_path
7
+ attr_accessor :name
8
+ attr_accessor :env
9
+
10
+ def initialize(name,env)
11
+ @name=name
12
+ @env=env
13
+ @private_key_path=File.join(env.ssh_key_path,"#{name}_rsa")
14
+ @public_key_path=File.join(env.ssh_key_path,"#{name}_rsa.pub")
15
+ return self
16
+ end
17
+
18
+ def exists?
19
+ return false unless File.exists?(@public_key_path)
20
+ return false unless File.exists?(@private_key_path)
21
+ return true
22
+ end
23
+
24
+ def generate(options={:force => false})
25
+ force=options[:force]
26
+ if exists? && force==false
27
+ env.ui.error "Keypair: #{@name} already exists"
28
+ env.ui.error "- #{@public_key_path}"
29
+ env.ui.error "- #{@private_key_path}"
30
+ raise ::Mccloud::Error, "Keypair #{@name} already exists"
31
+ else
32
+ env.ui.info "Generating Keypair: #{@name}"
33
+ env.ui.info "- #{@public_key_path}"
34
+ env.ui.info "- #{@private_key_path}"
35
+ env.ui.info ""
36
+ env.ui.warn "Make sure you make a backup!!"
37
+ rsa_key=::Mccloud::Util::SSHKey.generate({ :comment => "Key generated by mccloud #{@name}"})
38
+ begin
39
+ File.open(@public_key_path,'w'){|f| f.write(rsa_key.ssh_public_key)}
40
+ File.open(@private_key_path,'w'){|f| f.write(rsa_key.rsa_private_key)}
41
+ rescue Exception => ex
42
+ env.ui.error "Error generating keypair : #{ex}"
43
+ end
44
+ end
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,78 @@
1
+ require 'erb'
2
+ module Mccloud
3
+ class Mccloudfile
4
+
5
+ attr_accessor :path
6
+ attr_accessor :sections
7
+
8
+ def initialize(path)
9
+ # Path to the file
10
+ @path=path
11
+
12
+ end
13
+
14
+ def exists?
15
+ return File.exists?(@path)
16
+ end
17
+
18
+ # Bindings in ERB http://www.stuartellis.eu/articles/erb/
19
+ # Links:
20
+ # * Trimming whitespace in ERB
21
+ # http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/242656
22
+ # * Appending to ERB output
23
+ # http://blog.jayfields.com/2007/01/appending-to-erb-output-from-block.html
24
+ def uncomment(selection)
25
+
26
+ cur_pos=@output.length
27
+ yield
28
+ new_pos=@output.length
29
+
30
+ if exclude_section?(selection)
31
+ # Extract the block
32
+ block_text=@output[cur_pos..new_pos]
33
+
34
+ # Remove the block
35
+ @output[cur_pos..new_pos]=''
36
+
37
+ # Comment the block, with leading spaces into account
38
+ block_text.gsub!(/^(\s)*/,'\1# ')
39
+
40
+ # Re-insert the block
41
+ @output=@output.insert cur_pos, block_text
42
+ end
43
+ end
44
+
45
+ def exclude_section?(section)
46
+ section.each do |s|
47
+ return false if @sections.include?(s)
48
+ end
49
+ return true
50
+ end
51
+
52
+ def generate(options={:force => false})
53
+ force=options[:force]
54
+ provider=options[:provider]
55
+ raise Mccloud::Error, "You need to specify a provider to generate a Mccloudfile" if provider.nil?
56
+
57
+ @sections=[provider.to_sym]
58
+ # We need at least one provider
59
+
60
+ if exists? && force==false
61
+ raise Mccloud::Error, "Error Mccloudfile already exists."
62
+ else
63
+ begin
64
+ File.open(@path,'w'){ |f| f.write(self.to_s)}
65
+ rescue Exception => ex
66
+ raise Mccloud::Error, "Error saving Mccloudfile: #{ex}"
67
+ end
68
+ end
69
+ end
70
+
71
+ def to_s
72
+ template=File.new(File.join(File.dirname(__FILE__),"templates","Mccloudfile.erb")).read
73
+ result=::ERB.new(template,nil,"-","@output").result(binding)
74
+ return result
75
+ end
76
+
77
+ end
78
+ end
@@ -0,0 +1,107 @@
1
+ module Mccloud::Provider
2
+ module Aws
3
+
4
+ class Image
5
+ attr_accessor :provider
6
+ attr_accessor :name
7
+
8
+ def raw
9
+ end
10
+
11
+ def package(selection=nil,options=nil)
12
+
13
+ if selection.nil?
14
+ env.ui.info "[Error] We need at least a name of a machine."
15
+ exit
16
+ end
17
+
18
+
19
+ #f=Fog::Compute.new({ :region => "eu-west-1", :provider => "AWS"})
20
+ # i=f.create_image("i-c1ac2bb7","name","description")
21
+ # f.images.all({ "Owner" => "self"})
22
+ # f.deregister_image("ami-796d5b0d")
23
+
24
+ on_selected_machines(selection) do |id,vm|
25
+
26
+ time=Time.new
27
+ strtime=time.strftime("%Y-%m-%d-%H-%M-%S")
28
+ name=""
29
+
30
+ if options["name"].nil?
31
+ name="#{vm.name}-#{strtime}"
32
+ else
33
+ name=options["name"]
34
+ end
35
+
36
+ description=""
37
+ if options["description"].nil?
38
+ description="Autogenerated snapshot from machine #{vm.name}"
39
+ else
40
+ description=options["description"]
41
+ end
42
+
43
+ filter=@environment.config.mccloud.filter
44
+ fullname="#{@environment.config.mccloud.filter}#{name}"
45
+
46
+ provider= @environment.config.providers[vm.provider]
47
+ begin
48
+ result=provider.create_image(id,name,description)
49
+ imageId=result.body["imageId"]
50
+ env.ui.info "[#{vm.name}] image #{imageId} with #{description} being created"
51
+
52
+ unless options["dontwait"]
53
+ sleep 3
54
+ counter=0
55
+ max_tries=5
56
+ #Pending
57
+ state="pending"
58
+ until state!="pending" do
59
+ print "."
60
+ sleep 2
61
+ image=provider.images.get(imageId)
62
+
63
+ if image.nil?
64
+ sleep 3
65
+ print "."
66
+ else
67
+ state=image.state
68
+ end
69
+ end
70
+ env.ui.info ""
71
+ env.ui.info "[#{vm.name}] creation done!"
72
+ end
73
+ rescue Fog::Service::Error => fogerror
74
+ env.ui.info "[Error] #{fogerror}"
75
+
76
+ end
77
+ # vm.instance.start
78
+ end
79
+ end
80
+
81
+ def register
82
+ #f=Fog::Compute.new({ :region => "eu-west-1", :provider => "AWS"})
83
+ # i=f.create_image("i-c1ac2bb7","name","description")
84
+ # f.images.all({ "Owner" => "self"})
85
+ # f.deregister_image("ami-796d5b0d")
86
+
87
+ env.ui.info "Looking for imageId: #{imageId}"
88
+ @environment.config.providers.each do |name,provider|
89
+ begin
90
+ image=provider.images.get(imageId)
91
+ if image.nil?
92
+ env.ui.info "[#{name}] - ImageId #{imageId} not found"
93
+ else
94
+ env.ui.info "[#{name}] - ImageId #{imageId} found"
95
+ env.ui.info "[#{name}] - Deregistering #{imageId} now"
96
+ begin
97
+ provider.deregister_image(imageId)
98
+ rescue Fog::Service::Error => fogerror
99
+ env.ui.info "[Error] #{fogerror}"
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,33 @@
1
+ module Mccloud::Provider
2
+ module Aws
3
+ module IpCommand
4
+
5
+ def associate(options)
6
+ unless raw.nil?
7
+ env.ui.info "[#{@name}] Attempting to associate ip #{@name} with vm name #{@vmname}"
8
+ vm=env.config.vms[@vmname]
9
+ if vm.nil?
10
+ env.ui.error "[#{@name}] vm #{@vmname} is not defined"
11
+ return
12
+ else
13
+ if vm.id.nil?
14
+ env.ui.error "[#{@name}] vm #{@vmname} is not yet instantiated"
15
+ return
16
+ else
17
+ env.ui.info "[#{@name}] The ipaddress currently has server_id #{raw.server_id} associated" unless raw.server_id.nil?
18
+ if raw.server_id==vm.id
19
+ env.ui.info "[#{@name}] #{@address} is already associated with #{@vmname} #{vm.id}"
20
+ else
21
+ env.ui.info "[#{@name}] Associating #{@address} with #{@vmname} #{vm.id}"
22
+ raw.server=vm.raw
23
+ end
24
+ end
25
+ end
26
+ else
27
+ env.ui.error "[#{ip.name}] Ipaddress does not (yet) exist"
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,31 @@
1
+ require 'mccloud/provider/core/ip'
2
+ require 'mccloud/provider/aws/ip/associate'
3
+
4
+ module Mccloud::Provider
5
+ module Aws
6
+
7
+ class Ip < ::Mccloud::Provider::Core::Ip
8
+
9
+ #Inherits :name
10
+ # :provider
11
+ attr_accessor :vmname
12
+ attr_accessor :address
13
+
14
+ include Mccloud::Provider::Aws::IpCommand
15
+
16
+ def initialize(env)
17
+ super(env)
18
+ end
19
+
20
+ def raw
21
+ if @raw.nil?
22
+ rawname="#{@provider.filter}#{@name}"
23
+ @raw=@provider.raw.addresses.all('public-ip' => self.address).first
24
+ env.logger.info("IP found #{@raw.server_id} #{@raw.public_ip}")
25
+ end
26
+ return @raw
27
+ end
28
+
29
+ end #Class
30
+ end #module Type
31
+ end #Module Mccloud
@@ -0,0 +1,21 @@
1
+ require 'mccloud/provider/core/keystore'
2
+
3
+ module Mccloud::Provider
4
+ module Aws
5
+
6
+ class Keystore < ::Mccloud::Provider::Core::Keystore
7
+
8
+ #Inherits
9
+ #attr_accesor :name,:provider
10
+ attr_accessor :keypairs
11
+
12
+ # include Mccloud::Provider::Aws::KeystoreCommand
13
+
14
+ def initialize(env)
15
+ super(env)
16
+ @keypairs=Array.new
17
+ end
18
+
19
+ end #Class
20
+ end #module Type
21
+ end #Module Mccloud
@@ -0,0 +1,53 @@
1
+ module Mccloud::Provider
2
+ module Aws
3
+ module LbCommand
4
+
5
+ def associate(options)
6
+ balance(@members,options)
7
+ end
8
+
9
+ def balance(members,options)
10
+ unless raw.nil?
11
+ current_members=raw.instances
12
+ cleanup_members=current_members
13
+ members.each do |member_id|
14
+ env.logger.info "Attempting to associate #{@name} with vm name #{member_id}"
15
+ vm=env.config.vms[member_id]
16
+ if vm.nil?
17
+ env.ui.error "vm #{member_id} is not defined"
18
+ else
19
+ if vm.id.nil?
20
+ env.ui.error "vm #{member_id} is not yet instantiated"
21
+ else
22
+ env.logger.info "The loadbalancer currently has members #{current_members.join(",")} associated" unless raw.instances.nil?
23
+
24
+ # First add new members
25
+ if current_members.include?(vm.id)
26
+ cleanup_members=cleanup_members - [ vm.id ]
27
+ env.ui.info "[#{@name}] Skipping associate #{vm.name} - #{vm.id} as it already is a member"
28
+ else
29
+ env.ui.info "[#{@name}] Associating #{vm.name} - #{vm.id}"
30
+ raw.register_instances(vm.id)
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+
37
+ # And now remove old members
38
+ #unless member_ids.include?(instance_id)
39
+ #lb_instance=lb.instance
40
+ require 'pp'
41
+ cleanup_members.each do |member_id|
42
+ env.ui.info "Cleanup of old member #{member_id}"
43
+ raw.deregister_instances(member_id)
44
+ end
45
+
46
+ else
47
+ env.ui.error "[#{@name}] Loadbalancer does not (yet) exist"
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,14 @@
1
+ require 'mccloud/provider/aws/lb/associate'
2
+
3
+ module Mccloud::Provider
4
+ module Aws
5
+ module LbCommand
6
+
7
+ def sorry(options)
8
+ balance(@sorry_members,options)
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+