ironfan 3.2.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/CHANGELOG.md +5 -0
  2. data/VERSION +1 -1
  3. data/ironfan.gemspec +33 -20
  4. data/lib/chef/knife/cluster_kick.rb +17 -17
  5. data/lib/chef/knife/cluster_kill.rb +13 -7
  6. data/lib/chef/knife/cluster_launch.rb +60 -66
  7. data/lib/chef/knife/cluster_pry.rb +2 -2
  8. data/lib/chef/knife/cluster_show.rb +3 -6
  9. data/lib/chef/knife/cluster_ssh.rb +5 -11
  10. data/lib/chef/knife/cluster_start.rb +2 -4
  11. data/lib/chef/knife/cluster_stop.rb +1 -3
  12. data/lib/chef/knife/cluster_sync.rb +13 -21
  13. data/lib/chef/knife/ironfan_knife_common.rb +11 -9
  14. data/lib/chef/knife/ironfan_script.rb +2 -1
  15. data/lib/gorillib/resolution.rb +119 -0
  16. data/lib/ironfan/broker/computer.rb +316 -0
  17. data/lib/ironfan/broker/drive.rb +21 -0
  18. data/lib/ironfan/broker.rb +37 -0
  19. data/lib/ironfan/builder.rb +14 -0
  20. data/lib/ironfan/deprecated.rb +16 -58
  21. data/lib/ironfan/dsl/cloud.rb +21 -0
  22. data/lib/ironfan/dsl/cluster.rb +27 -0
  23. data/lib/ironfan/dsl/compute.rb +84 -0
  24. data/lib/ironfan/dsl/ec2.rb +260 -0
  25. data/lib/ironfan/dsl/facet.rb +25 -0
  26. data/lib/ironfan/dsl/role.rb +19 -0
  27. data/lib/ironfan/dsl/server.rb +31 -0
  28. data/lib/ironfan/dsl/virtualbox.rb +8 -0
  29. data/lib/ironfan/dsl/volume.rb +45 -0
  30. data/lib/ironfan/dsl.rb +7 -0
  31. data/lib/ironfan/headers.rb +58 -0
  32. data/lib/ironfan/provider/chef/client.rb +77 -0
  33. data/lib/ironfan/provider/chef/node.rb +133 -0
  34. data/lib/ironfan/provider/chef/role.rb +69 -0
  35. data/lib/ironfan/provider/chef.rb +28 -0
  36. data/lib/ironfan/provider/ec2/ebs_volume.rb +137 -0
  37. data/lib/ironfan/provider/ec2/elastic_ip.rb +10 -0
  38. data/lib/ironfan/provider/ec2/key_pair.rb +65 -0
  39. data/lib/ironfan/provider/ec2/machine.rb +258 -0
  40. data/lib/ironfan/provider/ec2/placement_group.rb +24 -0
  41. data/lib/ironfan/provider/ec2/security_group.rb +118 -0
  42. data/lib/ironfan/provider/ec2.rb +47 -0
  43. data/lib/ironfan/provider/virtualbox/machine.rb +10 -0
  44. data/lib/ironfan/provider/virtualbox.rb +8 -0
  45. data/lib/ironfan/provider.rb +139 -0
  46. data/lib/ironfan/requirements.rb +52 -0
  47. data/lib/ironfan.rb +44 -33
  48. metadata +34 -21
  49. data/lib/chef/knife/cluster_vagrant.rb +0 -144
  50. data/lib/chef/knife/vagrant/ironfan_environment.rb +0 -18
  51. data/lib/chef/knife/vagrant/ironfan_provisioners.rb +0 -27
  52. data/lib/chef/knife/vagrant/skeleton_vagrantfile.rb +0 -119
  53. data/lib/ironfan/chef_layer.rb +0 -300
  54. data/lib/ironfan/cloud.rb +0 -323
  55. data/lib/ironfan/cluster.rb +0 -118
  56. data/lib/ironfan/compute.rb +0 -139
  57. data/lib/ironfan/discovery.rb +0 -190
  58. data/lib/ironfan/dsl_builder.rb +0 -99
  59. data/lib/ironfan/facet.rb +0 -143
  60. data/lib/ironfan/fog_layer.rb +0 -196
  61. data/lib/ironfan/private_key.rb +0 -130
  62. data/lib/ironfan/role_implications.rb +0 -58
  63. data/lib/ironfan/security_group.rb +0 -133
  64. data/lib/ironfan/server.rb +0 -291
  65. data/lib/ironfan/server_slice.rb +0 -265
  66. data/lib/ironfan/volume.rb +0 -146
@@ -0,0 +1,84 @@
1
+ module Ironfan
2
+ class Dsl
3
+
4
+ class Compute < Ironfan::Dsl
5
+ @@run_list_rank = 0
6
+ field :name, String
7
+
8
+ # Resolve each of the following as a merge of their container's attributes and theirs
9
+ collection :run_list_items, Hash, :resolver => :merge_resolve
10
+ collection :clouds, Ironfan::Dsl::Cloud, :resolver => :merge_resolve
11
+ collection :volumes, Ironfan::Dsl::Volume, :resolver => :merge_resolve
12
+
13
+ # Resolve these normally (overriding on each layer)
14
+ magic :environment, Symbol, :default => :_default
15
+ magic :use_cloud, Symbol
16
+
17
+ member :cluster_role, Ironfan::Dsl::Role
18
+ member :facet_role, Ironfan::Dsl::Role
19
+
20
+ def initialize(attrs={},&block)
21
+ self.underlay = attrs[:owner] if attrs[:owner]
22
+ super
23
+ end
24
+
25
+ def fullname() name; end
26
+
27
+ # Add the given role/recipe to the run list. You can specify placement of
28
+ # `:first`, `:normal` (or nil) or `:last`; the final runlist is assembled
29
+ # in order by placement, and then by source position.
30
+ def role(role_name, placement=nil)
31
+ add_to_run_list("role[#{role_name}]", placement)
32
+ end
33
+ def recipe(recipe_name, placement=nil)
34
+ add_to_run_list(recipe_name, placement)
35
+ end
36
+ def run_list
37
+ mapper = run_list_items.values.map
38
+ result = mapper.each {|i| i[:name] if i[:placement]==:first }
39
+ result += mapper.each {|i| i[:name] if i[:placement]==:normal }
40
+ result += mapper.each {|i| i[:name] if i[:placement]==:last }
41
+ result.compact
42
+ end
43
+
44
+ def raid_group(rg_name, attrs={}, &block)
45
+ raid = volumes[rg_name] || Ironfan::Dsl::RaidGroup.new
46
+ raid.receive!(attrs, &block)
47
+ raid.sub_volumes.each do |sv_name|
48
+ volume(sv_name){ in_raid(rg_name) ; mountable(false) ; tags({}) }
49
+ end
50
+ volumes[rg_name] = raid
51
+ end
52
+
53
+ # TODO: Expand the logic here to include CLI parameters, probably by injecting
54
+ # the CLI as a layer in the underlay structure
55
+ def selected_cloud
56
+ raise "No clouds defined, cannot select a cloud" if clouds.length == 0
57
+
58
+ # Use the selected cloud for this server
59
+ unless use_cloud.nil?
60
+ return cloud(use_cloud) if clouds.include? use_cloud
61
+ raise "Requested a cloud (#{use_cloud}) that is not defined"
62
+ end
63
+
64
+ # Use the cloud marked default_cloud
65
+ default = clouds.values.select{|c| c.default_cloud == true }
66
+ raise "More than one cloud (#{default.map{|c| c.name}.join(', ')}) marked default" if default.length > 1
67
+ return default[0] unless default.empty?
68
+
69
+ # Use the first cloud defined
70
+ clouds.values.first
71
+ end
72
+
73
+ protected
74
+
75
+ def add_to_run_list(item, placement=nil)
76
+ raise "run_list placement must be one of :first, :normal, :last or nil (also means :normal)" unless [:first, :last, :own, nil].include?(placement)
77
+ placement = :normal if placement.nil?
78
+ @@run_list_rank += 1
79
+ run_list_items[item] = { :name => item, :rank => @@run_list_rank, :placement => placement }
80
+ end
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,260 @@
1
+ module Ironfan
2
+ class Dsl
3
+
4
+ class Compute < Ironfan::Dsl
5
+ def ec2(*attrs,&block) cloud(:ec2,*attrs,&block); end
6
+ end
7
+
8
+ class Ec2 < Cloud
9
+ magic :availability_zones, Array, :default => ['us-east-1d']
10
+ magic :backing, String, :default => 'ebs'
11
+ magic :bootstrap_distro, String
12
+ magic :chef_client_script, String
13
+ magic :default_availability_zone, String, :default => ->{availability_zones.first}
14
+ magic :flavor, String, :default => 't1.micro'
15
+ magic :image_name, String
16
+ magic :image_id, String
17
+ magic :keypair, Whatever
18
+ magic :mount_ephemerals, Hash, :default => {}
19
+ magic :monitoring, String
20
+ magic :permanent, :boolean, :default => false
21
+ magic :public_ip, String
22
+ magic :placement_group, String
23
+ magic :region, String, :default => -> do
24
+ default_availability_zone.gsub(/^(\w+-\w+-\d)[a-z]/, '\1') if default_availability_zone
25
+ end
26
+ collection :security_groups, Ironfan::Dsl::Ec2::SecurityGroup
27
+ magic :ssh_user, String, :default => 'ubuntu'
28
+ magic :ssh_identity_dir, String, :default => ->{ Chef::Config.ec2_key_dir }
29
+ magic :ssh_identity_file, String #, :default => "#{keypair}.pem"
30
+ magic :subnet, String
31
+ magic :validation_key, String, :default => ->{ IO.read(Chef::Config.validation_key) rescue '' }
32
+ magic :vpc, String
33
+
34
+ magic :provider, Ironfan::Provider, :default => Ironfan::Provider::Ec2
35
+
36
+ def ec2_image_info
37
+ keys = [region, flavor_info[:bits], backing, image_name]
38
+ Chef::Config[:ec2_image_info][ keys ] || {}
39
+ end
40
+
41
+ def image_id
42
+ result = read_attribute(:image_id) || ec2_image_info[:image_id]
43
+ end
44
+
45
+ def to_display(style,values={})
46
+ return values if style == :minimal
47
+
48
+ values["Flavor"] = flavor
49
+ values["AZ"] = default_availability_zone
50
+ return values if style == :default
51
+
52
+ values["Elastic IP"] = public_ip if public_ip
53
+ values
54
+ end
55
+
56
+ def flavor_info
57
+ if not Chef::Config[:ec2_flavor_info].has_key?(flavor)
58
+ ui.warn("Unknown machine image flavor '#{val}'")
59
+ list_flavors
60
+ return nil
61
+ end
62
+ Chef::Config[:ec2_flavor_info][flavor]
63
+ end
64
+
65
+ def implied_volumes
66
+ result = []
67
+ if backing == 'ebs'
68
+ result << Ironfan::Dsl::Volume.new(:name => 'root') do
69
+ device '/dev/sda1'
70
+ fstype 'ext4'
71
+ keep false
72
+ mount_point '/'
73
+ end
74
+ end
75
+ return result unless (mount_ephemerals and (flavor_info[:ephemeral_volumes] > 0))
76
+
77
+ layout = { 0 => ['/dev/sdb','/mnt'],
78
+ 1 => ['/dev/sdc','/mnt2'],
79
+ 2 => ['/dev/sdd','/mnt3'],
80
+ 3 => ['/dev/sde','/mnt4'] }
81
+ ( 0 .. (flavor_info[:ephemeral_volumes]-1) ).each do |idx|
82
+ dev, mnt = layout[idx]
83
+ ephemeral = Ironfan::Dsl::Volume.new(:name => "ephemeral#{idx}") do
84
+ attachable 'ephemeral'
85
+ fstype 'ext3'
86
+ device dev
87
+ mount_point mnt
88
+ mount_options 'defaults,noatime'
89
+ tags({:bulk => true, :local => true, :fallback => true})
90
+ end
91
+ ephemeral.receive! mount_ephemerals
92
+ result << ephemeral
93
+ end
94
+ result
95
+ end
96
+
97
+ class SecurityGroup < Ironfan::Dsl
98
+ field :name, String
99
+ field :group_authorized_by, Array, :default => []
100
+ field :range_authorizations, Array, :default => []
101
+
102
+ def authorize_port_range(range, cidr_ip = '0.0.0.0/0', ip_protocol = 'tcp')
103
+ range = (range .. range) if range.is_a?(Integer)
104
+ range_authorizations << [range, cidr_ip, ip_protocol]
105
+ range_authorizations.compact!
106
+ end
107
+
108
+ def authorized_by_group(other_name)
109
+ group_authorized_by << other_name.to_s
110
+ group_authorized_by.compact!
111
+ end
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+ end
118
+
119
+ Chef::Config[:ec2_flavor_info] ||= {}
120
+ Chef::Config[:ec2_flavor_info].merge!({
121
+ 't1.micro' => { :price => 0.02, :bits => '64-bit', :ram => 686, :cores => 1, :core_size => 0.25, :inst_disks => 0, :inst_disk_size => 0, :ephemeral_volumes => 0 },
122
+ 'm1.small' => { :price => 0.08, :bits => '64-bit', :ram => 1740, :cores => 1, :core_size => 1, :inst_disks => 1, :inst_disk_size => 160, :ephemeral_volumes => 1 },
123
+ 'm1.medium' => { :price => 0.165, :bits => '32-bit', :ram => 3840, :cores => 2, :core_size => 1, :inst_disks => 1, :inst_disk_size => 410, :ephemeral_volumes => 1 },
124
+ 'c1.medium' => { :price => 0.17, :bits => '32-bit', :ram => 1740, :cores => 2, :core_size => 2.5, :inst_disks => 1, :inst_disk_size => 350, :ephemeral_volumes => 1 },
125
+ 'm1.large' => { :price => 0.32, :bits => '64-bit', :ram => 7680, :cores => 2, :core_size => 2, :inst_disks => 2, :inst_disk_size => 850, :ephemeral_volumes => 2 },
126
+ 'm2.xlarge' => { :price => 0.45, :bits => '64-bit', :ram => 18124, :cores => 2, :core_size => 3.25, :inst_disks => 1, :inst_disk_size => 420, :ephemeral_volumes => 1 },
127
+ 'c1.xlarge' => { :price => 0.64, :bits => '64-bit', :ram => 7168, :cores => 8, :core_size => 2.5, :inst_disks => 4, :inst_disk_size => 1690, :ephemeral_volumes => 4 },
128
+ 'm1.xlarge' => { :price => 0.66, :bits => '64-bit', :ram => 15360, :cores => 4, :core_size => 2, :inst_disks => 4, :inst_disk_size => 1690, :ephemeral_volumes => 4 },
129
+ 'm2.2xlarge' => { :price => 0.90, :bits => '64-bit', :ram => 35020, :cores => 4, :core_size => 3.25, :inst_disks => 2, :inst_disk_size => 850, :ephemeral_volumes => 2 },
130
+ 'm2.4xlarge' => { :price => 1.80, :bits => '64-bit', :ram => 70041, :cores => 8, :core_size => 3.25, :inst_disks => 4, :inst_disk_size => 1690, :ephemeral_volumes => 4 },
131
+ 'cc1.4xlarge' => { :price => 1.30, :bits => '64-bit', :ram => 23552, :cores => 8, :core_size => 4.19, :inst_disks => 4, :inst_disk_size => 1690, :ephemeral_volumes => 2, :placement_groupable => true, :virtualization => 'hvm' },
132
+ 'cc1.8xlarge' => { :price => 2.40, :bits => '64-bit', :ram => 61952, :cores =>16, :core_size => 5.50, :inst_disks => 8, :inst_disk_size => 3370, :ephemeral_volumes => 4, :placement_groupable => true, :virtualization => 'hvm' },
133
+ 'cg1.4xlarge' => { :price => 2.10, :bits => '64-bit', :ram => 22528, :cores => 8, :core_size => 4.19, :inst_disks => 4, :inst_disk_size => 1690, :ephemeral_volumes => 2, :placement_groupable => true, :virtualization => 'hvm' },
134
+ })
135
+
136
+ Chef::Config[:ec2_image_info] ||= {}
137
+ Chef::Config[:ec2_image_info].merge!({
138
+ #
139
+ # Lucid (Ubuntu 9.10)
140
+ #
141
+ %w[us-east-1 64-bit instance karmic ] => { :image_id => 'ami-55739e3c', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
142
+ %w[us-east-1 32-bit instance karmic ] => { :image_id => 'ami-bb709dd2', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
143
+ %w[us-west-1 64-bit instance karmic ] => { :image_id => 'ami-cb2e7f8e', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
144
+ %w[us-west-1 32-bit instance karmic ] => { :image_id => 'ami-c32e7f86', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
145
+ %w[eu-west-1 64-bit instance karmic ] => { :image_id => 'ami-05c2e971', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
146
+ %w[eu-west-1 32-bit instance karmic ] => { :image_id => 'ami-2fc2e95b', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
147
+
148
+ #
149
+ # Lucid (Ubuntu 10.04.3)
150
+ #
151
+ %w[ap-southeast-1 64-bit ebs lucid ] => { :image_id => 'ami-77f28d25', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
152
+ %w[ap-southeast-1 32-bit ebs lucid ] => { :image_id => 'ami-4df28d1f', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
153
+ %w[ap-southeast-1 64-bit instance lucid ] => { :image_id => 'ami-57f28d05', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
154
+ %w[ap-southeast-1 32-bit instance lucid ] => { :image_id => 'ami-a5f38cf7', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
155
+ %w[eu-west-1 64-bit ebs lucid ] => { :image_id => 'ami-ab4d67df', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
156
+ %w[eu-west-1 32-bit ebs lucid ] => { :image_id => 'ami-a94d67dd', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
157
+ %w[eu-west-1 64-bit instance lucid ] => { :image_id => 'ami-a54d67d1', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
158
+ %w[eu-west-1 32-bit instance lucid ] => { :image_id => 'ami-cf4d67bb', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
159
+ #
160
+ %w[us-east-1 64-bit ebs lucid ] => { :image_id => 'ami-4b4ba522', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
161
+ %w[us-east-1 32-bit ebs lucid ] => { :image_id => 'ami-714ba518', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
162
+ %w[us-east-1 64-bit instance lucid ] => { :image_id => 'ami-fd4aa494', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
163
+ %w[us-east-1 32-bit instance lucid ] => { :image_id => 'ami-2d4aa444', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
164
+ #
165
+ %w[us-west-1 64-bit ebs lucid ] => { :image_id => 'ami-d197c694', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
166
+ %w[us-west-1 32-bit ebs lucid ] => { :image_id => 'ami-cb97c68e', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
167
+ %w[us-west-1 64-bit instance lucid ] => { :image_id => 'ami-c997c68c', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
168
+ %w[us-west-1 32-bit instance lucid ] => { :image_id => 'ami-c597c680', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
169
+
170
+ #
171
+ # Maverick (Ubuntu 10.10)
172
+ #
173
+ %w[ ap-southeast-1 64-bit ebs maverick ] => { :image_id => 'ami-32423c60', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
174
+ %w[ ap-southeast-1 64-bit instance maverick ] => { :image_id => 'ami-12423c40', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
175
+ %w[ ap-southeast-1 32-bit ebs maverick ] => { :image_id => 'ami-0c423c5e', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
176
+ %w[ ap-southeast-1 32-bit instance maverick ] => { :image_id => 'ami-7c423c2e', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
177
+ #
178
+ %w[ eu-west-1 64-bit ebs maverick ] => { :image_id => 'ami-e59ca991', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
179
+ %w[ eu-west-1 64-bit instance maverick ] => { :image_id => 'ami-1b9ca96f', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
180
+ %w[ eu-west-1 32-bit ebs maverick ] => { :image_id => 'ami-fb9ca98f', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
181
+ %w[ eu-west-1 32-bit instance maverick ] => { :image_id => 'ami-339ca947', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
182
+ #
183
+ %w[ us-east-1 64-bit ebs maverick ] => { :image_id => 'ami-cef405a7', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
184
+ %w[ us-east-1 64-bit instance maverick ] => { :image_id => 'ami-08f40561', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
185
+ %w[ us-east-1 32-bit ebs maverick ] => { :image_id => 'ami-ccf405a5', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
186
+ %w[ us-east-1 32-bit instance maverick ] => { :image_id => 'ami-a6f504cf', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
187
+ #
188
+ %w[ us-west-1 64-bit ebs maverick ] => { :image_id => 'ami-af7e2eea', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
189
+ %w[ us-west-1 64-bit instance maverick ] => { :image_id => 'ami-a17e2ee4', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
190
+ %w[ us-west-1 32-bit ebs maverick ] => { :image_id => 'ami-ad7e2ee8', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
191
+ %w[ us-west-1 32-bit instance maverick ] => { :image_id => 'ami-957e2ed0', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
192
+
193
+ #
194
+ # Natty (Ubuntu 11.04)
195
+ #
196
+ %w[ ap-northeast-1 32-bit ebs natty ] => { :image_id => 'ami-00b10501', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
197
+ %w[ ap-northeast-1 32-bit instance natty ] => { :image_id => 'ami-f0b004f1', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
198
+ %w[ ap-northeast-1 64-bit ebs natty ] => { :image_id => 'ami-02b10503', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
199
+ %w[ ap-northeast-1 64-bit instance natty ] => { :image_id => 'ami-fab004fb', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
200
+ #
201
+ %w[ ap-southeast-1 32-bit ebs natty ] => { :image_id => 'ami-06255f54', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
202
+ %w[ ap-southeast-1 32-bit instance natty ] => { :image_id => 'ami-72255f20', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
203
+ %w[ ap-southeast-1 64-bit ebs natty ] => { :image_id => 'ami-04255f56', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
204
+ %w[ ap-southeast-1 64-bit instance natty ] => { :image_id => 'ami-7a255f28', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
205
+ #
206
+ %w[ eu-west-1 32-bit ebs natty ] => { :image_id => 'ami-a4f7c5d0', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
207
+ %w[ eu-west-1 32-bit instance natty ] => { :image_id => 'ami-fef7c58a', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
208
+ %w[ eu-west-1 64-bit ebs natty ] => { :image_id => 'ami-a6f7c5d2', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
209
+ %w[ eu-west-1 64-bit instance natty ] => { :image_id => 'ami-c0f7c5b4', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
210
+ #
211
+ %w[ us-east-1 32-bit ebs natty ] => { :image_id => 'ami-e358958a', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
212
+ %w[ us-east-1 32-bit instance natty ] => { :image_id => 'ami-c15994a8', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
213
+ %w[ us-east-1 64-bit ebs natty ] => { :image_id => 'ami-fd589594', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
214
+ %w[ us-east-1 64-bit instance natty ] => { :image_id => 'ami-71589518', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
215
+ #
216
+ %w[ us-west-1 32-bit ebs natty ] => { :image_id => 'ami-43580406', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
217
+ %w[ us-west-1 32-bit instance natty ] => { :image_id => 'ami-e95f03ac', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
218
+ %w[ us-west-1 64-bit ebs natty ] => { :image_id => 'ami-4d580408', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
219
+ %w[ us-west-1 64-bit instance natty ] => { :image_id => 'ami-a15f03e4', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
220
+
221
+ #
222
+ # Cluster Compute
223
+ #
224
+ # IMAGE ami-6d2ce204 205199409180/Globus Provision 0.4.AMI (Ubuntu 11.04 HVM) 205199409180 available public x86_64 machine ebs hvm xen
225
+ #
226
+ %w[ us-east-1 64-bit ebs natty-cc ] => { :image_id => 'ami-6d2ce204', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
227
+
228
+ #
229
+ # Oneiric (Ubuntu 11.10)
230
+ #
231
+ %w[ ap-northeast-1 32-bit ebs oneiric ] => { :image_id => 'ami-84902785', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
232
+ %w[ ap-northeast-1 32-bit instance oneiric ] => { :image_id => 'ami-5e90275f', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
233
+ %w[ ap-northeast-1 64-bit ebs oneiric ] => { :image_id => 'ami-88902789', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
234
+ %w[ ap-northeast-1 64-bit instance oneiric ] => { :image_id => 'ami-7c90277d', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
235
+ #
236
+ %w[ ap-southeast-1 32-bit ebs oneiric ] => { :image_id => 'ami-0a327758', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
237
+ %w[ ap-southeast-1 32-bit instance oneiric ] => { :image_id => 'ami-00327752', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
238
+ %w[ ap-southeast-1 64-bit ebs oneiric ] => { :image_id => 'ami-0832775a', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
239
+ %w[ ap-southeast-1 64-bit instance oneiric ] => { :image_id => 'ami-04327756', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
240
+ #
241
+ %w[ eu-west-1 32-bit ebs oneiric ] => { :image_id => 'ami-11f0cc65', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
242
+ %w[ eu-west-1 32-bit instance oneiric ] => { :image_id => 'ami-4ff0cc3b', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
243
+ %w[ eu-west-1 64-bit ebs oneiric ] => { :image_id => 'ami-1df0cc69', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
244
+ %w[ eu-west-1 64-bit instance oneiric ] => { :image_id => 'ami-23f0cc57', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
245
+ #
246
+ %w[ us-east-1 32-bit ebs oneiric ] => { :image_id => 'ami-a562a9cc', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
247
+ %w[ us-east-1 32-bit instance oneiric ] => { :image_id => 'ami-3962a950', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
248
+ %w[ us-east-1 64-bit ebs oneiric ] => { :image_id => 'ami-bf62a9d6', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
249
+ %w[ us-east-1 64-bit instance oneiric ] => { :image_id => 'ami-c162a9a8', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
250
+ #
251
+ %w[ us-west-1 32-bit ebs oneiric ] => { :image_id => 'ami-c9a1fe8c', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
252
+ %w[ us-west-1 32-bit instance oneiric ] => { :image_id => 'ami-21a1fe64', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
253
+ %w[ us-west-1 64-bit ebs oneiric ] => { :image_id => 'ami-cba1fe8e', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
254
+ %w[ us-west-1 64-bit instance oneiric ] => { :image_id => 'ami-3fa1fe7a', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
255
+ #
256
+ %w[ us-west-2 32-bit ebs oneiric ] => { :image_id => 'ami-ea9a17da', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
257
+ %w[ us-west-2 32-bit instance oneiric ] => { :image_id => 'ami-f49a17c4', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
258
+ %w[ us-west-2 64-bit ebs oneiric ] => { :image_id => 'ami-ec9a17dc', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
259
+ %w[ us-west-2 64-bit instance oneiric ] => { :image_id => 'ami-fe9a17ce', :ssh_user => 'ubuntu', :bootstrap_distro => "ubuntu10.04-gems", },
260
+ })
@@ -0,0 +1,25 @@
1
+ module Ironfan
2
+ class Dsl
3
+
4
+ class Facet < Ironfan::Dsl::Compute
5
+ magic :instances, Integer, :default => 1
6
+ collection :servers, Ironfan::Dsl::Server, :resolver => :deep_resolve
7
+ field :cluster_name, String
8
+
9
+ def initialize(attrs={},&block)
10
+ self.cluster_name = attrs[:owner].name unless attrs[:owner].nil?
11
+ self.name = attrs[:name] unless attrs[:name].nil?
12
+ self.facet_role Ironfan::Dsl::Role.new(:name => fullname.sub('-','_'))
13
+ super
14
+ end
15
+
16
+ def fullname() "#{cluster_name}-#{name}"; end
17
+
18
+ def expand_servers!
19
+ for i in 0..(instances-1) do server(i); end
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,19 @@
1
+ module Ironfan
2
+ class Dsl
3
+
4
+ class Role < Ironfan::Dsl
5
+ magic :override_attributes, Hash, :default => {}
6
+ magic :default_attributes, Hash, :default => {}
7
+
8
+ def override_attributes(val=nil)
9
+ return super() if val.nil?
10
+ super(read_attribute(:override_attributes).deep_merge(val))
11
+ end
12
+ def default_attributes(val=nil)
13
+ return super() if val.nil?
14
+ super(read_attribute(:default_attributes).deep_merge(val))
15
+ end
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,31 @@
1
+ module Ironfan
2
+ class Dsl
3
+
4
+ class Server < Ironfan::Dsl::Compute
5
+ field :cluster_name, String
6
+ field :facet_name, String
7
+
8
+ def initialize(attrs={},&block)
9
+ unless attrs[:owner].nil?
10
+ self.cluster_name = attrs[:owner].cluster_name
11
+ self.facet_name = attrs[:owner].name
12
+ end
13
+ super
14
+ end
15
+
16
+ def fullname() "#{cluster_name}-#{facet_name}-#{name}"; end
17
+ def index() name.to_i; end
18
+ def implied_volumes() selected_cloud.implied_volumes; end
19
+
20
+ def to_display(style,values={})
21
+ selected_cloud.to_display(style,values)
22
+
23
+ return values if style == :minimal
24
+
25
+ values["Env"] = environment
26
+ values
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,8 @@
1
+ module Ironfan
2
+ module Dsl
3
+
4
+ class VirtualBox < Cloud
5
+ end
6
+
7
+ end
8
+ end
@@ -0,0 +1,45 @@
1
+ module Ironfan
2
+ class Dsl
3
+
4
+ class Volume < Ironfan::Dsl
5
+ field :name, String
6
+
7
+ magic :attachable, String, :default => 'ebs'
8
+ magic :availability_zone, String
9
+ magic :create_at_launch, :boolean, :default => false
10
+ magic :device, String
11
+ magic :formattable, :boolean, :default => false
12
+ magic :fstype, String, :default => 'xfs'
13
+ magic :in_raid, :boolean, :default => false
14
+ magic :keep, :boolean, :default => true
15
+ magic :mount_dump, String
16
+ magic :mount_pass, String
17
+ magic :mount_options, String, :default => 'defaults,nouuid,noatime'
18
+ magic :mount_point, String
19
+ magic :mountable, :boolean, :default => true
20
+ magic :size, String
21
+ magic :volume_id, String
22
+ magic :resizable, :boolean, :default => false
23
+ magic :snapshot_id, String
24
+ magic :snapshot_name, String
25
+ magic :tags, Hash, :default => {}
26
+ end
27
+
28
+ class RaidGroup < Volume
29
+ # volumes that comprise this raid group
30
+ magic :sub_volumes, Array, :default => []
31
+ # RAID level (http://en.wikipedia.org/wiki/RAID#Standard_levels)
32
+ magic :level, String
33
+ # Raid chunk size (https://raid.wiki.kernel.org/articles/r/a/i/RAID_setup_cbb2.html)
34
+ magic :chunk, String
35
+ # read-ahead buffer
36
+ magic :read_ahead, String
37
+
38
+ # Overrides of Volume field defaults
39
+ magic :attachable, :boolean, :default => false
40
+ magic :formattable, :boolean, :default => true
41
+ magic :mount_options, String, :default => 'defaults,nobootwait,noatime,nouuid,comment=ironfan'
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,7 @@
1
+ module Ironfan
2
+
3
+ class Dsl < Builder
4
+ include Gorillib::Resolution
5
+ end
6
+
7
+ end
@@ -0,0 +1,58 @@
1
+ # This file sets up the base class structure before any of it is
2
+ # loaded, to allow parts to declare relationships to each other
3
+ # without regard to declaration order. No active code should
4
+ # be present in this file.
5
+ module Ironfan
6
+
7
+ class Builder
8
+ include Gorillib::Builder
9
+ end
10
+
11
+ class Broker < Builder
12
+ class Computer < Builder; end
13
+ class Computers < Gorillib::ModelCollection; end
14
+ class Drive < Builder; end
15
+ end
16
+
17
+ class Dsl < Builder
18
+ class Compute < Ironfan::Dsl; end
19
+ class Cluster < Ironfan::Dsl::Compute; end
20
+ class Facet < Ironfan::Dsl::Compute; end
21
+ class Server < Ironfan::Dsl::Compute; end
22
+
23
+ class Role < Ironfan::Dsl; end
24
+ class Volume < Ironfan::Dsl; end
25
+
26
+ class Cloud < Ironfan::Dsl; end
27
+ class Ec2 < Cloud
28
+ class SecurityGroup < Ironfan::Dsl; end
29
+ end
30
+ class VirtualBox < Cloud; end
31
+ end
32
+
33
+ class Provider < Builder
34
+ class Resource < Builder; end
35
+ end
36
+ class IaasProvider < Provider
37
+ class Machine < Resource; end
38
+ end
39
+ class Provider
40
+ class ChefServer < Ironfan::Provider
41
+ class Client < Ironfan::Provider::Resource; end
42
+ class Node < Ironfan::Provider::Resource; end
43
+ class Role < Ironfan::Provider::Resource; end
44
+ end
45
+ class Ec2 < Ironfan::IaasProvider
46
+ class EbsVolume < Ironfan::Provider::Resource; end
47
+ class ElasticIp < Ironfan::Provider::Resource; end
48
+ class Machine < Ironfan::IaasProvider::Machine; end
49
+ class KeyPair < Ironfan::Provider::Resource; end
50
+ class PlacementGroup < Ironfan::Provider::Resource; end
51
+ class SecurityGroup < Ironfan::Provider::Resource; end
52
+ end
53
+ class VirtualBox < Ironfan::IaasProvider
54
+ class Machine < Ironfan::IaasProvider::Machine; end
55
+ end
56
+ end
57
+
58
+ end
@@ -0,0 +1,77 @@
1
+ module Ironfan
2
+ class Provider
3
+ class ChefServer
4
+
5
+ class Client < Ironfan::Provider::Resource
6
+ delegate :add_to_index, :admin, :cdb_destroy, :cdb_save,
7
+ :class_from_file, :couchdb, :couchdb=, :couchdb_id, :couchdb_id=,
8
+ :couchdb_rev, :couchdb_rev=, :create, :create_keys,
9
+ :delete_from_index, :destroy, :from_file, :index_id, :index_id=,
10
+ :index_object_type, :name, :public_key, :save, :set_or_return,
11
+ :to_hash, :validate, :with_indexer_metadata,
12
+ :to => :adaptee
13
+ field :key_filename, String,
14
+ :default => ->{ "#{Client.key_dir}/client-#{name}.pem" }
15
+
16
+ def initialize(*args)
17
+ super
18
+ self.adaptee ||= Chef::ApiClient.new
19
+ end
20
+
21
+ def self.shared?() false; end
22
+ def self.multiple?() false; end
23
+ def self.resource_type() :client; end
24
+ def self.expected_ids(computer) [computer.server.fullname]; end
25
+
26
+ def self.key_dir
27
+ Chef::Config.client_key_dir || "/tmp/#{ENV['USER']}-client_keys"
28
+ end
29
+
30
+ def private_key(body=nil)
31
+ if body.nil?
32
+ body = File.open(key_filename, "rb").read
33
+ else
34
+ File.open(key_filename, "w", 0600){|f| f.print( body ) }
35
+ end
36
+ adaptee.private_key(body)
37
+ end
38
+
39
+ #
40
+ # Discovery
41
+ #
42
+ def self.load!(cluster=nil)
43
+ nameq = "name:#{cluster.name}-* OR clientname:#{cluster.name}-*"
44
+ ChefServer.search(:client, nameq) do |client|
45
+ register client unless client.blank?
46
+ end
47
+ end
48
+
49
+ #
50
+ # Manipulation
51
+ #
52
+ def self.create!(computer)
53
+ return if computer.client?
54
+ client = Client.new
55
+ client.name computer.server.fullname
56
+ client.admin false
57
+
58
+ params = {:name => client.name, :admin => client.admin, :private_key => true }
59
+ result = ChefServer.post_rest("clients", params)
60
+ client.private_key(result["private_key"])
61
+
62
+ computer[:client] = client
63
+ remember client
64
+ end
65
+
66
+ def self.destroy!(computer)
67
+ return unless computer.client?
68
+ forget computer.client.name
69
+ computer.client.destroy
70
+ File.delete(computer.client.key_filename)
71
+ computer.delete(:client)
72
+ end
73
+ end
74
+
75
+ end
76
+ end
77
+ end