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,74 @@
1
+ module Mccloud
2
+ class Template
3
+ attr_accessor :file
4
+ attr_accessor :erb
5
+ attr_accessor :params
6
+ attr_accessor :author
7
+ attr_accessor :bootstrap
8
+
9
+ attr_accessor :name
10
+ attr_accessor :env
11
+
12
+ def initialize(name,env)
13
+ @name=name
14
+ @env=env
15
+
16
+ @erb=true
17
+ @file=nil
18
+ @params=Hash.new
19
+ @author="No author specified"
20
+ @bootstrap=nil
21
+ end
22
+
23
+ def path
24
+ File.join(@env.config.templates.path,@name)
25
+ end
26
+
27
+ def exists?
28
+ File.directory?(self.path)
29
+ end
30
+
31
+ # Bindings in ERB http://www.stuartellis.eu/articles/erb/
32
+ # Links:
33
+ # * Trimming whitespace in ERB
34
+ # http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/242656
35
+ # * Appending to ERB output
36
+ # http://blog.jayfields.com/2007/01/appending-to-erb-output-from-block.html
37
+ def comment(flag)
38
+ cur_pos=@output.length
39
+ yield
40
+ new_pos=@output.length
41
+ if flag
42
+
43
+ # Extraxt the block
44
+ block_text=@output[cur_pos..new_pos]
45
+
46
+ # Remove the block
47
+ @output[cur_pos..new_pos]=''
48
+
49
+ # Comment the block, with leading spaces into account
50
+ block_text.gsub!(/^(\s)*/,'\1# ')
51
+
52
+ # Re-insert the block
53
+ @output=@output.insert cur_pos, block_text
54
+ end
55
+
56
+ end
57
+
58
+ def to_s
59
+ "Template #{name}"
60
+ end
61
+
62
+ def to_template(vm_name="noname")
63
+ result=""
64
+ filename=@file
65
+ env.logger.info "Opening template file #{@file}"
66
+ if File.exists?(filename)
67
+ template=File.new(filename).read
68
+ result=ERB.new(template,nil,"-","@output").result(binding)
69
+ end
70
+ return result
71
+ end
72
+
73
+ end
74
+ end
@@ -1,46 +1,219 @@
1
1
  Mccloud::Config.run do |config|
2
- # All Mccloud configuration is done here. For a detailed explanation
3
- # and listing of configuration options, please view the documentation
4
- # online.
5
-
6
- config.mccloud.prefix="<%= mcPrefix %>"
7
- config.mccloud.environment="<%= mcEnvironment %>"
8
- config.mccloud.identity="<%= mcIdentity %>"
9
-
10
- config.vm.define "<%= serverName %>" do |<%= serverName %>_config|
11
- <%= serverName %>_config.vm.provider="<%= providerId %>"
12
-
13
- #<%= serverName %>_config.vm.provisioner=:chef_solo
14
- #<%= serverName %>_config.vm.provisioner=:puppet
15
- <%= serverName %>_config.vm.provider_options={
16
- # ID = "<%= imageId%>" = <%= imageDescription %>
17
- :image_id => "<%= imageId %>" ,
18
- :flavor_id => "<%= flavorId %>",
19
- :groups => %w(<%= securityGroup %>),
20
- :key_name => "<%= keyName %>",
21
- :availability_zone => "<%= availabilityZone %>"
22
- }
23
- #Forward 80 remote to localport 8080
24
- <%= serverName %>_config.vm.forward_port("http", 8080, 80)
25
- <%= serverName %>_config.vm.user="<%= userName %>"
26
- <%= serverName %>_config.vm.bootstrap="<%= bootstrapScript %>"
27
- <%= serverName %>_config.vm.private_key="<%= privateKeyPath %>"
28
- <%= serverName %>_config.vm.public_key="<%= publicKeyPath %>"
29
2
 
3
+ #############################################################
4
+ ## ** Provider Section ** - list alls keys to be used
5
+ #############################################################
6
+
7
+ ######
8
+ ## Example Amazon provider
9
+ ## Defines a provider called aws-us-east
10
+ ## Note 1: specify a provider with a different name for each region you need
11
+ ## Note 2: you need to have a valid .fog file with the correct key and secret-key
12
+
13
+ config.provider.define "aws-us-east" do |provider_config|
14
+ provider_config.provider.flavor = :aws
15
+
16
+ #Note: this are option provided to fog for creation
17
+ provider_config.provider.options = { }
18
+
19
+ # Region in which to create the VM
20
+ provider_config.provider.region = "us-east-1"
21
+
22
+ ## Check if necessary keypairs exist
23
+ ## To speed things up, set it to false
24
+ provider_config.provider.check_keypairs = true
25
+
26
+ ## Disable check if required security groups exist
27
+ ## To speed things up, set it to false
28
+ provider_config.provider.check_security_groups = true
29
+
30
+ ## If you share an amazon account with multiple people
31
+ ## You can use namespaces to separate resources
32
+ ## All resources will take this prefix
33
+ provider_config.provider.namespace = "mccloud-development"
30
34
  end
31
35
 
32
- ### Provisioners
33
- config.vm.provision :puppet do |puppet|
34
- puppet.pp_path = "/tmp/vagrant-puppet"
35
- #puppet.manifests_path = "puppet/manifests"
36
- #puppet.module_path = "puppet/modules"
37
- puppet.manifest_file = "newbox.pp"
36
+ ######
37
+ ## Generic provider to manage host reachable by ssh
38
+ config.provider.define "hosts" do |provider_config|
39
+ provider_config.provider.flavor = :host
38
40
  end
39
41
 
40
- config.vm.provision :chef_solo do |chef|
41
- chef.cookbooks_path = ["<your cookboopath>"]
42
- chef.add_recipe("<some recipe>")
43
- # You may also specify custom JSON attributes:
44
- chef.json.merge!({})
42
+ #############################################################
43
+ ## ** Key Section ** - list alls keys to be used
44
+ #############################################################
45
+ ## Default is :
46
+ ## - keyname = mccloud
47
+ ## - location = in $HOME directory
48
+ ## - private key_path = $HOME/mccloud_rsa
49
+ ## - public key_path = $HOME/mccloud_rsa.pub
50
+ ##
51
+ ## Note 1: keys can be generated with '$ mccloud sshkeygen'
52
+ ## Note 2: Amazon only supports RSA keys
53
+ ## Note 3: You can have multiple keypair listed here
54
+ #############################################################
55
+
56
+ config.keypair.define "mccloud" do |key_config|
57
+ key_config.keypair.public_key_path = "#{File.join(ENV['HOME'],'.ssh','mccloud_rsa.pub')}"
58
+ key_config.keypair.private_key_path = "#{File.join(ENV['HOME'],'.ssh','mccloud_rsa')}"
59
+ end
60
+
61
+ #############################################################
62
+ ## ** Key Store ** - defines a location to store keys in
63
+ #############################################################
64
+ ##
65
+ ## Defines a keystore provided by provider "aws-us-east"
66
+ ## And specifies the keypair(s) to be stored in that keystore
67
+ ## Note 1: this only handles creation, removal of keys needs to be done manual
68
+ ##
69
+ ## :name => "the name as visible on EC2"
70
+ ## :pairname=> "the name specified in the Key Section of this config file"
71
+ #############################################################
72
+
73
+ <% uncomment([:aws]) do %>
74
+ config.keystore.define "aws-us-east-key-store" do |keystore_config|
75
+ keystore_config.keystore.provider = "aws-us-east"
76
+ keystore_config.keystore.keypairs = [
77
+ # :name is the name as it will be displayed on amazon
78
+ # :keypair is the named as defined above
79
+ { :name => "mccloud-key", :keypair => "mccloud"},
80
+ ]
81
+ end
82
+ <% end %>
83
+
84
+ #############################################################
85
+ ## ** Server section ** Specifies server options
86
+ ##
87
+ ## Note: Loosely modelled after Vagrantfile syntax, but not compatible
88
+ #############################################################
89
+
90
+ config.vm.define "<%= @vm_name %>" do |vm_config|
91
+
92
+ # Provider to use for creating this vm
93
+ vm_config.vm.provider = "aws-us-east"
94
+
95
+ # AMI to use for creating the vm
96
+ vm_config.vm.ami = "ami-cef405a7"
97
+
98
+ # Flavor of the vm
99
+ vm_config.vm.flavor = "t1.micro"
100
+
101
+ # Availability zone to create the VM
102
+ vm_config.vm.zone = "us-east-1a"
103
+
104
+ # Security groups
105
+ # Note: if it starts with mccloud, it will be autocreated and port 22 will be opened
106
+ # Note: you can supply your own but you have to create these manual and open port 22
107
+ vm_config.vm.security_groups = [ "mccloud"]
108
+
109
+ # Options required
110
+ # There are directly passed to fog create
111
+ vm_config.vm.create_options = { }
112
+
113
+ # User to log into the new VM created
114
+ vm_config.vm.user = "ubuntu"
115
+
116
+ # Path to script to execute before provisioners are run
117
+ # Only run on vm creation
118
+ vm_config.vm.bootstrap = "samples/bootstrap-ubuntu-system.sh"
119
+
120
+ # Name of the key pair to use to login
121
+ vm_config.vm.key_name = "mccloud-key"
122
+
123
+ # Files to ssh into the create vm
124
+ vm_config.vm.private_key_path = "#{File.join(ENV['HOME'],'.ssh','mccloud_rsa')}"
125
+
126
+ # If no server is specified in mccloud subcommands,
127
+ # It will go over all server
128
+ # Setting auto_selection to false, will not include this server
129
+ vm_config.vm.auto_selection = false
130
+
131
+ # ###
132
+ # ### Server Provisioners
133
+ # ### Mccloud supports 3 provisioners : :chef_solo, :puppet , and :shell
134
+ # ### Note: if multiple are provided, they are run in the sequence as described in the vm_config file
135
+ # ###
136
+ #
137
+ # ##
138
+ # ## Sample chef solo provider
139
+ # ##
140
+ # vm_config.vm.provision :chef_solo do |chef|
141
+ # # Path to load cookbooks of
142
+ # chef.cookbooks_path = ["chefrepo/cookbooks","chefrepo/site-cookbooks"]
143
+ #
144
+ # # Level to pass on the chef server
145
+ # chef.log_level = "info"
146
+ #
147
+ # ## Add recipes to the runlist
148
+ # ## Can be specified multiple times
149
+ # chef.add_recipe "apache2"
150
+ #
151
+ # ## Note you can use ERB inside the json block
152
+ # ## :private_demo1_ip => "<%%= private_ips['awsdemo1'] %>"
153
+ # ## :public_demo2_ip=> "<%%= public_ips['awsdemo1'] %>"
154
+ # chef.json.merge!( {
155
+ # })
156
+ # end
157
+ #
158
+ # ##
159
+ # ## Sample puppet provider
160
+ # ##
161
+ vm_config.vm.provision :puppet do |puppet|
162
+ puppet.manifest_file = "aws-demo1.pp"
163
+ # puppet.manifest_path = "manifests"
164
+ # puppet.modules_path = ["modules"]
165
+ end
166
+ #
167
+ # ##
168
+ # ## Sample script provider
169
+ # ##
170
+ # vm_config.vm.provision :shell do |command|
171
+ # # Either provide the command to run inline
172
+ # command.inline = ""
173
+ # # Or provide the path to a local script to be executed remotely
174
+ # command.path = "myscript.sh"
175
+ # end
176
+
45
177
  end
46
- end
178
+
179
+
180
+ ##
181
+ # ## Example on how to use the host provider for a server
182
+ # ##
183
+ # vm_config.vm.define "myserver" do |vm_config|
184
+ # vm_config.vm.provider=:hosts
185
+ # # Ip address or hostname that resolves
186
+ # vm_config.vm.ip_address="www.myserver.com"
187
+ # # Login in with user ubuntu on the remote server
188
+ # vm_config.vm.user="ubuntu"
189
+ # # Forward some ports between remote and local
190
+ # # example remote port = 80, local port 8080
191
+ # # Used by 'mccloud server' command
192
+ # vm_config.vm.forward_port("webport",8080,80)
193
+ #
194
+ # # Example provisioner via shell commands
195
+ # vm_config.vm.provision :shell do |command|
196
+ # command.inline="who am i"
197
+ # end
198
+ # end
199
+
200
+ #############################################################
201
+ ## ** Non-server section
202
+ ## Currently only had loadbalancer and ip-address for EC2
203
+ #############################################################
204
+
205
+ # config.lb.define "mccloud-development-lb" do |config|
206
+ # config.lb.provider="aws-eu-east"
207
+ # config.lb.members=["aws-demo1","aws-demo1"]
208
+ # config.lb.sorry_members=["aws-demo2"]
209
+ # end
210
+ #
211
+ # config.ip.define "mccloud-demo1" do |config|
212
+ # config.ip.provider="aws-eu-west"
213
+ # config.ip.address="46.137.72.170"
214
+ # config.ip.vmname = "aws-demo1"
215
+ # end
216
+
217
+
218
+
219
+ end # End Mccloud
@@ -0,0 +1,8 @@
1
+ #!/bin/bash -ex
2
+
3
+ # download omnibus install.sh
4
+ if which curl 2>/dev/null; then
5
+ curl -L https://www.opscode.com/chef/install.sh | sudo bash
6
+ else
7
+ wget -q -O - https://www.opscode.com/chef/install.sh | sudo bash
8
+ fi
@@ -0,0 +1,30 @@
1
+ en:
2
+ mccloud:
3
+ general:
4
+ creating_home_dir: "Creating home directory since it doesn't exist: %{directory}"
5
+ moving_home_dir: "Moving old Vagrant home directory to new location: %{directory}"
6
+ home_dir_migration_failed: |-
7
+ Both an old and new Vagrant home directory exist. Only the new one will
8
+ be used. Please merge the old directory into the new directory if you'd
9
+ like to use the old data as well.
10
+
11
+ Old: %{old}
12
+ New: %{new}
13
+
14
+ #-------------------------------------------------------------------------------
15
+ # Translations for exception classes
16
+ #-------------------------------------------------------------------------------
17
+ errors:
18
+ base_vm_not_found: The base VM with the name '%{name}' was not found.
19
+ box_not_found: Box '%{name}' could not be found.
20
+ chef_not_detected: |-
21
+ The chef (either `chef-solo` or `chef-client`) binary was not found on
22
+ the VM and is required for chef provisioning. Please verify that chef
23
+ is installed and that the binary is available on the PATH.
24
+
25
+
26
+ #-------------------------------------------------------------------------------
27
+ # Translations for config validation errors
28
+ #-------------------------------------------------------------------------------
29
+ config:
30
+
@@ -0,0 +1,9 @@
1
+ Mccloud::Config.run do |config|
2
+ config.vm.define "<%= @name %>" do |vm_config|
3
+
4
+ # You can customize vm setting here if you want
5
+ # to override the settings of a definition
6
+ vm_config.vm.definition = "<%= @definition.name %>"
7
+
8
+ end
9
+ end
@@ -0,0 +1,35 @@
1
+ require 'mccloud/template'
2
+
3
+ module Mccloud
4
+ class Templates < Hash
5
+ attr_reader :env
6
+
7
+ def initialize(env)
8
+ @env=env
9
+ end
10
+
11
+ def load!
12
+ if self.exists?
13
+ Dir[File.join(self.path,"**")].each do |dir|
14
+ template_name=File.basename(dir)
15
+ t=Template.new(template_name,env)
16
+ self[template_name]=t
17
+ end
18
+ else
19
+ env.logger.info "Skipping loading of definitions as the definition_path does exist"
20
+ end
21
+ end
22
+
23
+ def path
24
+ @env.config.mccloud.template_path
25
+ end
26
+
27
+ def exists?
28
+ File.directory?(self.path)
29
+ end
30
+
31
+ def registered?(name)
32
+ return self.has_key?(name)
33
+ end
34
+ end
35
+ end
data/lib/mccloud/ui.rb ADDED
@@ -0,0 +1,82 @@
1
+ module Mccloud
2
+ # Vagrant UIs handle communication with the outside world (typically
3
+ # through a shell). They must respond to the typically logger methods
4
+ # of `warn`, `error`, `info`, and `confirm`.
5
+ class UI
6
+ attr_accessor :env
7
+
8
+ def initialize(env)
9
+ @env = env
10
+ end
11
+
12
+ [:warn, :error, :info, :confirm].each do |method|
13
+ define_method(method) do |message|
14
+ # Log normal console messages
15
+ env.logger.info("ui") { message }
16
+ end
17
+ end
18
+
19
+ [:clear_line, :report_progress, :ask, :no?, :yes?].each do |method|
20
+ # By default do nothing, these aren't logged
21
+ define_method(method) { |*args| }
22
+ end
23
+
24
+ # A shell UI, which uses a `Thor::Shell` object to talk with
25
+ # a terminal.
26
+ class Shell < UI
27
+ def initialize(env, shell)
28
+ super(env)
29
+
30
+ @shell = shell
31
+ end
32
+
33
+ [[:warn, :yellow], [:error, :red], [:info, nil], [:confirm, :green]].each do |method, color|
34
+ class_eval <<-CODE
35
+ def #{method}(message, opts=nil)
36
+ super(message)
37
+ opts ||= {}
38
+ opts[:new_line] = true if !opts.has_key?(:new_line)
39
+ @shell.say("\#{format_message(message, opts)}", #{color.inspect}, opts[:new_line])
40
+ end
41
+ CODE
42
+ end
43
+
44
+ [:ask, :no?, :yes?].each do |method|
45
+ class_eval <<-CODE
46
+ def #{method}(message, opts=nil)
47
+ super(message)
48
+ opts ||= {}
49
+ @shell.send(#{method.inspect}, format_message(message, opts), opts[:color])
50
+ end
51
+ CODE
52
+ end
53
+
54
+ def report_progress(progress, total, show_parts=true)
55
+ percent = (progress.to_f / total.to_f) * 100
56
+ line = "Progress: #{percent.to_i}%"
57
+ line << " (#{progress} / #{total})" if show_parts
58
+
59
+ @shell.say(line, nil, false)
60
+ end
61
+
62
+ def clear_line
63
+ @shell.say(line_reset, nil, false)
64
+ end
65
+
66
+ protected
67
+
68
+ def format_message(message, opts=nil)
69
+ opts = { :prefix => true }.merge(opts || {})
70
+ opts[:prefix]=false if env.resource=="mccloud"
71
+ message = "[#{env.resource}] #{message}" if opts[:prefix]
72
+ message
73
+ end
74
+
75
+ def line_reset
76
+ reset = "\r"
77
+ reset += "\e[0K" unless Util::Platform.windows?
78
+ reset
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,24 @@
1
+ #http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/150311
2
+
3
+ require 'ostruct'
4
+
5
+ class ROpenStruct < OpenStruct
6
+ def method_missing(mid, *args)
7
+ mname = mid.id2name
8
+ len = args.length
9
+ if len == 0
10
+ @table[mname.intern] = ROpenStruct.new
11
+ self.new_ostruct_member(mname)
12
+ @table[mname.intern]
13
+ else
14
+ super
15
+ end
16
+ end
17
+ end
18
+
19
+ test = ROpenStruct.new
20
+ test.p = "hello"
21
+ test.t.s.p.t.z.y.x = "hi"
22
+ test.xyz
23
+
24
+ p test
@@ -1,9 +1,13 @@
1
1
  require "pty"
2
2
  module Mccloud
3
- module Util
4
- def self.rsync(path,vm,instance)
5
- command="rsync --delete -avz -e 'ssh -p 22 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i \"#{vm.private_key}\"' '#{path}/' '#{vm.user}@#{instance.public_ip_address}:/tmp/#{File.basename(path)}/'"
6
- puts command
3
+ module Util
4
+ def self.rsync(path,vm,instance)
5
+ unless !File.exists?(path)
6
+ env.logger.info "[#{vm.name}] - rsyncing #{path}"
7
+ command="rsync --exclude='.DS_Store' --exclude='.git' --exclude='.hg' --delete --delete-excluded -az -e 'ssh -p 22 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i \"#{vm.private_key}\"' '#{path}/' '#{vm.user}@#{instance.public_ip_address}:/tmp/#{File.basename(path)}/'"
8
+ else
9
+ raise Mccloud::Error, "[#{vm.name}] - rsync error: #{path} does no exist"
10
+ end
7
11
  begin
8
12
  PTY.spawn( command ) do |r, w, pid|
9
13
  begin
@@ -13,9 +17,9 @@ module Mccloud
13
17
  end
14
18
  rescue PTY::ChildExited => e
15
19
  puts "The child process exited!"
16
- end
17
- #Kernel.exec(command)
18
- end
19
- end
20
+ end
21
+ #Kernel.exec(command)
22
+ end
23
+ end
20
24
  end
21
25
 
@@ -1,14 +1,15 @@
1
1
  module Mccloud
2
2
  module Util
3
3
 
4
+ class Ssh
4
5
  def self.when_ssh_login_works(ip="localhost", options = { } , &block)
5
6
 
6
- defaults={ :port => '22', :timeout => 200 , :user => 'vagrant', :password => 'vagrant'}
7
+ defaults={ :port => '22', :timeout => 20000 , :user => 'vagrant', :password => 'vagrant'}
7
8
 
8
9
  options=defaults.merge(options)
9
10
 
10
11
  puts
11
- puts "Waiting for ssh login with user #{options[:user]} to sshd on port => #{options[:port]} to work"
12
+ puts "Waiting for ssh login on #{ip} with user #{options[:user]} to sshd on port => #{options[:port]} to work (Timeout in #{options[:timeout]} seconds)"
12
13
 
13
14
  begin
14
15
  Timeout::timeout(options[:timeout]) do
@@ -16,12 +17,12 @@ module Mccloud
16
17
  while !connected do
17
18
  begin
18
19
  print "."
19
- Net::SSH.start(ip, options[:user], { :port => options[:port] , :password => options[:password], :paranoid => false, :timeout => options[:timeout] }) do |ssh|
20
+ Net::SSH.start(ip, options[:user], { :port => options[:port] , :password => options[:password], :paranoid => false, :timeout => options[:timeout] ,:keys => options[:keys] }) do |ssh|
20
21
  block.call(ip);
21
22
  puts ""
22
23
  return true
23
24
  end
24
- rescue Net::SSH::Disconnect,Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ECONNABORTED, Errno::ECONNRESET, Errno::ENETUNREACH
25
+ rescue Net::SSH::AuthenticationFailed,Net::SSH::Disconnect,Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ECONNABORTED, Errno::ECONNRESET, Errno::ENETUNREACH
25
26
  sleep 5
26
27
  end
27
28
  end
@@ -36,6 +37,10 @@ module Mccloud
36
37
 
37
38
  def self.transfer_file(host,filename,destination = '.' , options = {})
38
39
 
40
+ unless File.exists?(filename)
41
+ raise Mccloud::Error,"Can't transfer #{filename}: does not exist"
42
+ end
43
+
39
44
  Net::SSH.start( host,options[:user],options ) do |ssh|
40
45
  puts "Transferring #{filename} to #{destination} "
41
46
  ssh.scp.upload!( filename, destination ) do |ch, name, sent, total|
@@ -43,7 +48,7 @@ module Mccloud
43
48
  print "."
44
49
 
45
50
  end
46
- end
51
+ end
47
52
  puts
48
53
  end
49
54
 
@@ -52,7 +57,7 @@ module Mccloud
52
57
  #after the machine boots
53
58
  def self.execute_when_tcp_available(ip="localhost", options = { } , &block)
54
59
 
55
- defaults={ :port => 22, :timeout => 2 , :pollrate => 5}
60
+ defaults={ :port => 22, :timeout => 20000 , :pollrate => 5}
56
61
 
57
62
  options=defaults.merge(options)
58
63
 
@@ -66,7 +71,7 @@ module Mccloud
66
71
  s.close
67
72
  block.call(ip);
68
73
  return true
69
- rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
74
+ rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH,Errno::ETIMEDOUT
70
75
  sleep options[:pollrate]
71
76
  end
72
77
  end
@@ -79,7 +84,7 @@ module Mccloud
79
84
  end
80
85
 
81
86
  def self.ssh(host ,user , options = { :progress => "on" } ,command=nil ,exitcode=0)
82
-
87
+
83
88
  defaults= { :port => "22", :user => "root", :paranoid => false }
84
89
  options=defaults.merge(options)
85
90
  @pid=""
@@ -97,8 +102,8 @@ module Mccloud
97
102
  channel = ssh.open_channel do |ch|
98
103
 
99
104
  #request pty for sudo stuff and so
100
- ch.request_pty do |ch, success|
101
- raise "Error requesting pty" unless success
105
+ ch.request_pty do |ch, success|
106
+ raise "Error requesting pty" unless success
102
107
  end
103
108
 
104
109
 
@@ -153,7 +158,7 @@ module Mccloud
153
158
  if (exitcode=="*")
154
159
  #its a test so we don't need to worry
155
160
  else
156
- puts "Exitcode = #{exitcode} - #{@status.to_s}"
161
+ puts "Exitcode = #{exitcode} - #{@status.to_s}"
157
162
  raise "Exitcode was not what we expected"
158
163
  end
159
164
 
@@ -161,7 +166,8 @@ module Mccloud
161
166
 
162
167
  end
163
168
 
169
+ end #Class
164
170
 
171
+ end #Module
165
172
 
166
- end #Class
167
173
  end #Module