cluster_chef 3.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +51 -0
- data/.rspec +3 -0
- data/CHANGELOG.md +63 -0
- data/Gemfile +18 -0
- data/LICENSE +201 -0
- data/README.md +332 -0
- data/Rakefile +92 -0
- data/TODO.md +8 -0
- data/VERSION +1 -0
- data/chefignore +41 -0
- data/cluster_chef.gemspec +115 -0
- data/clusters/website_demo.rb +65 -0
- data/config/client.rb +59 -0
- data/lib/cluster_chef/chef_layer.rb +297 -0
- data/lib/cluster_chef/cloud.rb +409 -0
- data/lib/cluster_chef/cluster.rb +118 -0
- data/lib/cluster_chef/compute.rb +144 -0
- data/lib/cluster_chef/cookbook_munger/README.md.erb +47 -0
- data/lib/cluster_chef/cookbook_munger/licenses.yaml +16 -0
- data/lib/cluster_chef/cookbook_munger/metadata.rb.erb +23 -0
- data/lib/cluster_chef/cookbook_munger.rb +588 -0
- data/lib/cluster_chef/deprecated.rb +33 -0
- data/lib/cluster_chef/discovery.rb +158 -0
- data/lib/cluster_chef/dsl_object.rb +123 -0
- data/lib/cluster_chef/facet.rb +144 -0
- data/lib/cluster_chef/fog_layer.rb +134 -0
- data/lib/cluster_chef/private_key.rb +110 -0
- data/lib/cluster_chef/role_implications.rb +49 -0
- data/lib/cluster_chef/security_group.rb +103 -0
- data/lib/cluster_chef/server.rb +265 -0
- data/lib/cluster_chef/server_slice.rb +259 -0
- data/lib/cluster_chef/volume.rb +93 -0
- data/lib/cluster_chef.rb +137 -0
- data/notes/aws_console_screenshot.jpg +0 -0
- data/rspec.watchr +29 -0
- data/spec/cluster_chef/cluster_spec.rb +13 -0
- data/spec/cluster_chef/facet_spec.rb +70 -0
- data/spec/cluster_chef/server_slice_spec.rb +19 -0
- data/spec/cluster_chef/server_spec.rb +112 -0
- data/spec/cluster_chef_spec.rb +193 -0
- data/spec/spec_helper/dummy_chef.rb +25 -0
- data/spec/spec_helper.rb +50 -0
- data/spec/test_config.rb +20 -0
- data/tasks/chef_config.rb +38 -0
- data/tasks/jeweler_use_alt_branch.rb +47 -0
- metadata +227 -0
@@ -0,0 +1,144 @@
|
|
1
|
+
module ClusterChef
|
2
|
+
#
|
3
|
+
# Base class allowing us to layer settings for facet over cluster
|
4
|
+
#
|
5
|
+
class ComputeBuilder < ClusterChef::DslObject
|
6
|
+
attr_reader :cloud, :volumes, :chef_roles
|
7
|
+
has_keys :name, :bogosity, :environment
|
8
|
+
@@role_implications ||= Mash.new
|
9
|
+
@@run_list_rank ||= 0
|
10
|
+
|
11
|
+
def initialize(builder_name, attrs={})
|
12
|
+
super(attrs)
|
13
|
+
set :name, builder_name
|
14
|
+
@run_list_info = attrs[:run_list] || Mash.new
|
15
|
+
@volumes = Mash.new
|
16
|
+
end
|
17
|
+
|
18
|
+
# set the bogosity to a descriptive reason. Anything truthy implies bogusness
|
19
|
+
def bogus?
|
20
|
+
!! self.bogosity
|
21
|
+
end
|
22
|
+
|
23
|
+
# Magic method to produce cloud instance:
|
24
|
+
# * returns the cloud instance, creating it if necessary.
|
25
|
+
# * executes the block in the cloud's object context
|
26
|
+
#
|
27
|
+
# @example
|
28
|
+
# cloud do
|
29
|
+
# image_name 'maverick'
|
30
|
+
# security_group :nagios
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# # defines ec2-specific behavior
|
34
|
+
# cloud(:ec2) do
|
35
|
+
# public_ip '1.2.3.4'
|
36
|
+
# region 'us-east-1d'
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
def cloud(cloud_provider=nil, attrs={}, &block)
|
40
|
+
raise "Only have ec2 so far" if cloud_provider && (cloud_provider != :ec2)
|
41
|
+
@cloud ||= ClusterChef::Cloud::Ec2.new(self)
|
42
|
+
@cloud.configure(attrs, &block)
|
43
|
+
@cloud
|
44
|
+
end
|
45
|
+
|
46
|
+
# sugar for cloud(:ec2)
|
47
|
+
def ec2(attrs={}, &block)
|
48
|
+
cloud(:ec2, attrs, &block)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Magic method to describe a volume
|
52
|
+
# * returns the named volume, creating it if necessary.
|
53
|
+
# * executes the block (if any) in the volume's context
|
54
|
+
#
|
55
|
+
# @example
|
56
|
+
# # a 1 GB volume at '/data' from the given snapshot
|
57
|
+
# volume(:data) do
|
58
|
+
# size 1
|
59
|
+
# mount_point '/data'
|
60
|
+
# snapshot_id 'snap-12345'
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# @param volume_name [String] an arbitrary handle -- you can use the device
|
64
|
+
# name, or a descriptive symbol.
|
65
|
+
# @param attrs [Hash] a hash of attributes to pass down.
|
66
|
+
#
|
67
|
+
def volume(volume_name, attrs={}, &block)
|
68
|
+
volumes[volume_name] ||= ClusterChef::Volume.new(:parent => self, :name => volume_name)
|
69
|
+
volumes[volume_name].configure(attrs, &block)
|
70
|
+
volumes[volume_name]
|
71
|
+
end
|
72
|
+
|
73
|
+
def root_volume(attrs={}, &block)
|
74
|
+
volume(:root, attrs, &block)
|
75
|
+
end
|
76
|
+
|
77
|
+
#
|
78
|
+
# Adds the given role to the run list, and invokes any role_implications it
|
79
|
+
# implies (for instance, defining and applying the 'ssh' security group if
|
80
|
+
# the 'ssh' role is applied.)
|
81
|
+
#
|
82
|
+
# You can specify placement of `:first`, `:normal` (or nil) or `:last`; the
|
83
|
+
# final runlist is assembled as
|
84
|
+
#
|
85
|
+
# * run_list :first items -- cluster, then facet, then server
|
86
|
+
# * run_list :normal items -- cluster, then facet, then server
|
87
|
+
# * run_list :last items -- cluster, then facet, then server
|
88
|
+
#
|
89
|
+
# (see ClusterChef::Server#combined_run_list for full details though)
|
90
|
+
#
|
91
|
+
def role(role_name, placement=nil)
|
92
|
+
add_to_run_list("role[#{role_name}]", placement)
|
93
|
+
self.instance_eval(&@@role_implications[role_name]) if @@role_implications[role_name]
|
94
|
+
end
|
95
|
+
|
96
|
+
# Add the given recipe to the run list. You can specify placement of
|
97
|
+
# `:first`, `:normal` (or nil) or `:last`; the final runlist is assembled as
|
98
|
+
#
|
99
|
+
# * run_list :first items -- cluster, then facet, then server
|
100
|
+
# * run_list :normal items -- cluster, then facet, then server
|
101
|
+
# * run_list :last items -- cluster, then facet, then server
|
102
|
+
#
|
103
|
+
# (see ClusterChef::Server#combined_run_list for full details though)
|
104
|
+
#
|
105
|
+
def recipe(name, placement=nil)
|
106
|
+
add_to_run_list(name, placement)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Roles and recipes for this element only.
|
110
|
+
#
|
111
|
+
# See ClusterChef::Server#combined_run_list for run_list order resolution
|
112
|
+
def run_list
|
113
|
+
groups = run_list_groups
|
114
|
+
[ groups[:first], groups[:normal], groups[:last] ].flatten.compact.uniq
|
115
|
+
end
|
116
|
+
|
117
|
+
# run list elements grouped into :first, :normal and :last
|
118
|
+
def run_list_groups
|
119
|
+
@run_list_info.keys.sort_by{|item| @run_list_info[:rank] }.group_by{|item| @run_list_info[item][:placement] }
|
120
|
+
end
|
121
|
+
|
122
|
+
#
|
123
|
+
# Some roles imply aspects of the machine that have to exist at creation.
|
124
|
+
# For instance, on an ec2 machine you may wish the 'ssh' role to imply a
|
125
|
+
# security group explicity opening port 22.
|
126
|
+
#
|
127
|
+
# @param [String] role_name -- the role that triggers the block
|
128
|
+
# @yield block will be instance_eval'd in the object that calls 'role'
|
129
|
+
#
|
130
|
+
def self.role_implication(name, &block)
|
131
|
+
@@role_implications[name] = block
|
132
|
+
end
|
133
|
+
|
134
|
+
protected
|
135
|
+
|
136
|
+
def add_to_run_list(item, placement)
|
137
|
+
raise "run_list placement must be one of :first, :normal, :last or nil (also means :normal)" unless [:first, :last, nil].include?(placement)
|
138
|
+
@@run_list_rank += 1
|
139
|
+
placement ||= :normal
|
140
|
+
@run_list_info[item] ||= { :rank => @@run_list_rank, :placement => placement }
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# <%= name %> chef cookbook
|
2
|
+
|
3
|
+
<%= description %>
|
4
|
+
|
5
|
+
## Overview
|
6
|
+
|
7
|
+
<%= long_description.present? ? long_description : description %>
|
8
|
+
|
9
|
+
## Attributes
|
10
|
+
|
11
|
+
<%- all_attributes.attrs.each do |attrib| %>
|
12
|
+
* <%= "%-35s" % ('`'+attrib.bracketed_name+'`') %> - <%= attrib.display_name %><%- if attrib.default.is_a?(String) || attrib.default.is_a?(Symbol) %> (default: <%= attrib.default.inspect %>)<%- end %>
|
13
|
+
<%- if attrib.description.present? && (attrib.description != attrib.display_name) %>
|
14
|
+
- <%= attrib.description.gsub(/\n/, "\n ") %>
|
15
|
+
<%- end %>
|
16
|
+
<%- end %>
|
17
|
+
<%- if components[:recipes].present? %>
|
18
|
+
|
19
|
+
## Recipes
|
20
|
+
|
21
|
+
<%- components[:recipes].each do |recipe| %>
|
22
|
+
* <%= "%-26s" % ('`'+recipe.name+'`') %> - <%= recipe.desc %>
|
23
|
+
<%- end %>
|
24
|
+
<%- end %>
|
25
|
+
<%- if all_resources.present? %>
|
26
|
+
|
27
|
+
## Resources / Providers
|
28
|
+
|
29
|
+
<%- end %>
|
30
|
+
## Integration
|
31
|
+
|
32
|
+
Supports platforms: <%= all_supports.to_sentence %>
|
33
|
+
|
34
|
+
<%- if all_depends.present? %>
|
35
|
+
Cookbook dependencies:
|
36
|
+
<%- all_depends.each do |nm, dep| -%>
|
37
|
+
* <%= dep.gsub(/"/, '') %>
|
38
|
+
<%- end -%><%- end -%>
|
39
|
+
|
40
|
+
## License and Author
|
41
|
+
|
42
|
+
Author:: <%= maintainer %> (<<%= maintainer_email %>>)
|
43
|
+
Copyright:: <%= copyright_text %>
|
44
|
+
|
45
|
+
<%= short_license_text %>
|
46
|
+
|
47
|
+
> readme generated by [cluster_chef](http://github.com/infochimps/cluster_chef)'s cookbook_munger
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
:apachev2:
|
4
|
+
:name: "Apache 2.0"
|
5
|
+
:short: |-
|
6
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
you may not use this file except in compliance with the License.
|
8
|
+
You may obtain a copy of the License at
|
9
|
+
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
See the License for the specific language governing permissions and
|
16
|
+
limitations under the License.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
maintainer <%= maintainer.inspect %>
|
2
|
+
maintainer_email <%= maintainer_email.inspect %>
|
3
|
+
license <%= license.inspect %>
|
4
|
+
long_description <%= long_desc_gen %>
|
5
|
+
version <%= version.inspect %>
|
6
|
+
|
7
|
+
description <%= description.inspect %>
|
8
|
+
|
9
|
+
<%- all_depends.each do |nm, dep| -%>
|
10
|
+
depends <%= dep %>
|
11
|
+
<%- end -%>
|
12
|
+
|
13
|
+
<%- all_recipes.each do |recipe_name, recipe| -%>
|
14
|
+
recipe <%= "%-37s" % "\"#{name}::#{recipe_name}\"," %> <%= recipe.desc.inspect %>
|
15
|
+
<%- end -%>
|
16
|
+
|
17
|
+
%w[ <%= all_supports.join(" ") %> ].each do |os|
|
18
|
+
supports os
|
19
|
+
end
|
20
|
+
<%- all_attributes.attrs.each do |attrib| %>
|
21
|
+
|
22
|
+
<%= attrib.pretty_str %>
|
23
|
+
<%- end %>
|