ironfan 4.4.1 → 4.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +4 -0
- data/VERSION +1 -1
- data/config/knife.bash +153 -0
- data/config/knife.bash.README.md +13 -0
- data/ironfan.gemspec +6 -3
- data/lib/ironfan/provider/ec2/security_group.rb +6 -2
- data/spec/integration/spec/simple_cluster_spec.rb +82 -0
- metadata +7 -3
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# v4.4.2:
|
2
|
+
* Support for intra-cluster ICMP and specs to prove it (thanks @nickmarden)
|
3
|
+
* Knife bash completion script: see config/knife.bash.README.md for installation (thanks @schade)
|
4
|
+
|
1
5
|
# v4.4.1:
|
2
6
|
* Re-enables integration specs, explicitly excluding them from "rake spec" (@nickmarden)
|
3
7
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.4.
|
1
|
+
4.4.2
|
data/config/knife.bash
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
# Original Author: Avishai Ish-Shalom <avishai@fewbytes.com>
|
2
|
+
# Minor Ironfan-esque additions: Jerry Jackson <jerry.w.jackson@gmail.com>
|
3
|
+
|
4
|
+
# first argument set the command level
|
5
|
+
_get_knife_completions() {
|
6
|
+
n=$1
|
7
|
+
shift
|
8
|
+
# first argument is knife, so shift it
|
9
|
+
#[ "$1" == "knife" ] && shift
|
10
|
+
local opts
|
11
|
+
opts="$($@ --help | grep -E '^knife' | cut -f$n -d" " | grep -v -E '[][[:upper:].]+' |grep -v '(options)' | sort -u)"
|
12
|
+
_upvar opts "$opts"
|
13
|
+
return 0
|
14
|
+
}
|
15
|
+
|
16
|
+
_flatten_knife_command() {
|
17
|
+
echo ${words[*]:0:$(( ${#words[*]} -1 ))} | tr ' ' '_'
|
18
|
+
}
|
19
|
+
# Check cache file for category in file ( passed as $1 ) and run command if cache is empty
|
20
|
+
# Designed to be used with _get_knife_completions() and use the opts variables for options
|
21
|
+
_completion_cache() {
|
22
|
+
local flag COMMAND
|
23
|
+
local OPTIND=1
|
24
|
+
while getopts "c" flag "$@"; do
|
25
|
+
case $flag in
|
26
|
+
c)
|
27
|
+
COMMAND=yes
|
28
|
+
;;
|
29
|
+
*)
|
30
|
+
;;
|
31
|
+
esac
|
32
|
+
done
|
33
|
+
shift $(( $OPTIND - 1 ))
|
34
|
+
|
35
|
+
local CACHE_FILE="$1"
|
36
|
+
shift
|
37
|
+
if [ ! -f "$CACHE_FILE" ]; then
|
38
|
+
if [[ "$COMMAND" == "yes" ]]; then
|
39
|
+
opts=$( eval $@ 2>/dev/null )
|
40
|
+
RET=$?
|
41
|
+
else
|
42
|
+
$@ 2>/dev/null
|
43
|
+
RET=$?
|
44
|
+
fi
|
45
|
+
if [[ $RET -eq 0 ]]; then
|
46
|
+
[ -d "$(dirname "$CACHE_FILE")" ] && echo $opts >"$CACHE_FILE"
|
47
|
+
else
|
48
|
+
unset opts
|
49
|
+
fi
|
50
|
+
else
|
51
|
+
opts=$(cat "$CACHE_FILE")
|
52
|
+
fi
|
53
|
+
_upvar opts "$opts"
|
54
|
+
}
|
55
|
+
|
56
|
+
_chef_completion_cache() {
|
57
|
+
local CACHE_DIR=${CHEF_HOME:-"$HOME/.chef"}/.completion_cache
|
58
|
+
unset C
|
59
|
+
local C
|
60
|
+
if [[ "$1" == "-c" ]]; then
|
61
|
+
C="-c"
|
62
|
+
shift
|
63
|
+
fi
|
64
|
+
CACHE_FILE="$CACHE_DIR/$1"; shift
|
65
|
+
_completion_cache $C "$CACHE_FILE" "$@"
|
66
|
+
_upvar opts "$opts"
|
67
|
+
}
|
68
|
+
|
69
|
+
_knife() {
|
70
|
+
if [[ ${cur} =~ /^-/ ]]; then
|
71
|
+
return 0
|
72
|
+
fi
|
73
|
+
local opts cur prev cword words flattened_knife_command
|
74
|
+
_chef_completion_cache knife_commands _get_knife_completions 2 knife
|
75
|
+
_get_comp_words_by_ref cur prev cword words
|
76
|
+
flattened_knife_command=$(_flatten_knife_command)
|
77
|
+
COMPREPLY=()
|
78
|
+
case $flattened_knife_command in
|
79
|
+
*from_file|from_file_*)
|
80
|
+
COMPREPLY=( $(compgen -f -- ${cur} ) )
|
81
|
+
return 0
|
82
|
+
;;
|
83
|
+
*knife_cookbook_upload|*knife_cookbook_test)
|
84
|
+
local chef_repos
|
85
|
+
if [[ -z $CHEF_REPOS ]]; then
|
86
|
+
CHEF_CONFIG="${CHEF_HOME:-$HOME/.chef}/knife.rb"
|
87
|
+
chef_repos=( $( ruby -e "def cookbook_path(*args); args.each{|a| puts a }; end; eval(File.open('$CHEF_CONFIG','r').lines.select{|l| l =~ /cookbook_path/}.first)" ) )
|
88
|
+
else
|
89
|
+
chef_repos=( ${CHEF_REPOS[@]} )
|
90
|
+
fi
|
91
|
+
if [[ -n "$chef_repos" ]]; then
|
92
|
+
opts=$( ls -1p ${chef_repos[@]} | sort -u | ${SED} -n 's/\/$//p' )
|
93
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
94
|
+
fi
|
95
|
+
;;
|
96
|
+
*knife_data)
|
97
|
+
opts="bag"
|
98
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
99
|
+
return 0
|
100
|
+
;;
|
101
|
+
*knife_search)
|
102
|
+
_chef_completion_cache -c ${words[0]}_data_bags "${words[0]} data bag list|${SED} -r -e 's/[\"\ ,]//g' -e '/[^0-9A-Za-z._-]+/d'"
|
103
|
+
OPTS="node ${opts}"
|
104
|
+
COMPREPLY=( $(compgen -W "${OPTS}" -- ${cur}) )
|
105
|
+
return 0
|
106
|
+
;;
|
107
|
+
*knife_node_show|*knife_node_edit|*knife_node_delete|*knife_tag_*)
|
108
|
+
_chef_completion_cache -c ${words[0]}_nodes "${words[0]} node list|${SED} -r -e 's/[\"\ ,]//g' -e '/[^0-9A-Za-z._-]+/d'"
|
109
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
110
|
+
return 0
|
111
|
+
;;
|
112
|
+
*knife_role_edit|*knife_role_show|*knife_role_delete)
|
113
|
+
_chef_completion_cache -c ${words[0]}_roles "${words[0]} role list|${SED} -r -e 's/[\"\ ,]//g' -e '/[^0-9A-Za-z._-]+/d'"
|
114
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
115
|
+
return 0
|
116
|
+
;;
|
117
|
+
*knife_data_bag_delete|*knife_data_bag_show|*knife_data_bag_edit)
|
118
|
+
_chef_completion_cache -c ${words[0]}_data_bags "${words[0]} data bag list|${SED} -r -e 's/[\"\ ,]//g' -e '/[^0-9A-Za-z._-]+/d'"
|
119
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
120
|
+
return 0
|
121
|
+
;;
|
122
|
+
*knife_data_bag_delete_*|*knife_data_bag_show_*|*knife_data_bag_edit_*)
|
123
|
+
_chef_completion_cache -c ${words[0]}_data_bag_$prev "${words[0]} data bag show $prev 2>/dev/null|${SED} -r -e 's/[\"\ ,]//g' -e '/^[^0-9A-Za-z._-]+/d'"
|
124
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
125
|
+
return 0
|
126
|
+
;;
|
127
|
+
*knife_client_list|*knife_client_show|*knife_client_edit)
|
128
|
+
_chef_completion_cache -c ${words[0]}_clients "${words[0]} client list|${SED} -r -e 's/[\"\ ,]//g' -e '/[^0-9A-Za-z._-]+/d'"
|
129
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
130
|
+
return 0
|
131
|
+
;;
|
132
|
+
*knife_environment_show|*knife_environment_edit|*knife_environment_delete)
|
133
|
+
_chef_completion_cache -c ${words[0]}_environments "${words[0]} environment list|${SED} -r -e 's/[\"\ ,]//g' -e '/[^0-9A-Za-z._-]+/d'"
|
134
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
135
|
+
return 0
|
136
|
+
;;
|
137
|
+
*)
|
138
|
+
case $cword in
|
139
|
+
1)
|
140
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
141
|
+
return 0
|
142
|
+
;;
|
143
|
+
*)
|
144
|
+
_chef_completion_cache $flattened_knife_command _get_knife_completions $(( $cword + 1 )) ${words[*]}
|
145
|
+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
146
|
+
return 0
|
147
|
+
;;
|
148
|
+
esac
|
149
|
+
;;
|
150
|
+
esac
|
151
|
+
[[ ${#COMPREPLY[@]} -ge 1 ]] && return 0
|
152
|
+
}
|
153
|
+
complete -F _knife knife
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# knife bash completion
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
=================
|
5
|
+
1) Place the file knife.bash where bash expects to find it's autocompletion scripts.
|
6
|
+
On most modern unices this would equate to '/etc/bash_completion.d/'. This has
|
7
|
+
been verified in, at least, Ubuntu and Gentoo.
|
8
|
+
2) Restart your shell.
|
9
|
+
3) Enjoy tab-completion of your knife commands.
|
10
|
+
|
11
|
+
## Overview
|
12
|
+
=================
|
13
|
+
Credit goes to the original author; Avishai Ish-Shalom <avishai@fewbytes.com>. I have made and will continue to make needed changes; eg. things present in Ironfan but not in vanilla Chef.
|
data/ironfan.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "ironfan"
|
8
|
-
s.version = "4.4.
|
8
|
+
s.version = "4.4.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Infochimps"]
|
12
|
-
s.date = "2012-10-
|
12
|
+
s.date = "2012-10-24"
|
13
13
|
s.description = "Ironfan allows you to orchestrate not just systems but clusters of machines. It includes a powerful layer on top of knife and a collection of cloud cookbooks."
|
14
14
|
s.email = "coders@infochimps.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -31,6 +31,8 @@ Gem::Specification.new do |s|
|
|
31
31
|
"VERSION",
|
32
32
|
"chefignore",
|
33
33
|
"config/client.rb",
|
34
|
+
"config/knife.bash",
|
35
|
+
"config/knife.bash.README.md",
|
34
36
|
"config/proxy.pac",
|
35
37
|
"config/ubuntu10.04-ironfan.erb",
|
36
38
|
"config/ubuntu11.10-ironfan.erb",
|
@@ -129,6 +131,7 @@ Gem::Specification.new do |s|
|
|
129
131
|
"spec/integration/minimal-chef-repo/knife/knife.rb",
|
130
132
|
"spec/integration/minimal-chef-repo/roles/systemwide.rb",
|
131
133
|
"spec/integration/spec/elb_build_spec.rb",
|
134
|
+
"spec/integration/spec/simple_cluster_spec.rb",
|
132
135
|
"spec/integration/spec_helper.rb",
|
133
136
|
"spec/integration/spec_helper/launch_cluster.rb",
|
134
137
|
"spec/ironfan/cluster_spec.rb",
|
@@ -145,7 +148,7 @@ Gem::Specification.new do |s|
|
|
145
148
|
s.require_paths = ["lib"]
|
146
149
|
s.rubygems_version = "1.8.24"
|
147
150
|
s.summary = "Ironfan allows you to orchestrate not just systems but clusters of machines. It includes a powerful layer on top of knife and a collection of cloud cookbooks."
|
148
|
-
s.test_files = ["spec/spec_helper/dummy_chef.rb", "spec/integration/spec_helper/launch_cluster.rb", "spec/integration/minimal-chef-repo/roles/systemwide.rb", "spec/integration/minimal-chef-repo/environments/_default.json", "spec/integration/minimal-chef-repo/chefignore", "spec/integration/minimal-chef-repo/knife/knife.rb", "spec/integration/minimal-chef-repo/knife/credentials/knife-user-ironfantester.rb", "spec/integration/minimal-chef-repo/knife/credentials/knife-org.rb", "spec/integration/spec/elb_build_spec.rb", "spec/integration/spec_helper.rb", "spec/ironfan/cluster_spec.rb", "spec/ironfan/ec2/cloud_provider_spec.rb", "spec/ironfan/ec2/elb_spec.rb", "spec/ironfan/ec2/security_group_spec.rb", "spec/chef/cluster_bootstrap_spec.rb", "spec/fixtures/gunbai_slice.json", "spec/fixtures/ec2/elb/snakeoil.key", "spec/fixtures/ec2/elb/snakeoil.crt", "spec/fixtures/gunbai.rb", "spec/spec_helper.rb", "spec/test_config.rb"]
|
151
|
+
s.test_files = ["spec/spec_helper/dummy_chef.rb", "spec/integration/spec_helper/launch_cluster.rb", "spec/integration/minimal-chef-repo/roles/systemwide.rb", "spec/integration/minimal-chef-repo/environments/_default.json", "spec/integration/minimal-chef-repo/chefignore", "spec/integration/minimal-chef-repo/knife/knife.rb", "spec/integration/minimal-chef-repo/knife/credentials/knife-user-ironfantester.rb", "spec/integration/minimal-chef-repo/knife/credentials/knife-org.rb", "spec/integration/spec/simple_cluster_spec.rb", "spec/integration/spec/elb_build_spec.rb", "spec/integration/spec_helper.rb", "spec/ironfan/cluster_spec.rb", "spec/ironfan/ec2/cloud_provider_spec.rb", "spec/ironfan/ec2/elb_spec.rb", "spec/ironfan/ec2/security_group_spec.rb", "spec/chef/cluster_bootstrap_spec.rb", "spec/fixtures/gunbai_slice.json", "spec/fixtures/ec2/elb/snakeoil.key", "spec/fixtures/ec2/elb/snakeoil.crt", "spec/fixtures/gunbai.rb", "spec/spec_helper.rb", "spec/test_config.rb"]
|
149
152
|
|
150
153
|
if s.respond_to? :specification_version then
|
151
154
|
s.specification_version = 3
|
@@ -3,6 +3,9 @@ module Ironfan
|
|
3
3
|
class Ec2
|
4
4
|
|
5
5
|
class SecurityGroup < Ironfan::Provider::Resource
|
6
|
+
|
7
|
+
WIDE_OPEN = Range.new(1,65535)
|
8
|
+
|
6
9
|
delegate :_dump, :authorize_group_and_owner, :authorize_port_range,
|
7
10
|
:collection, :collection=, :connection, :connection=, :description,
|
8
11
|
:description=, :destroy, :group_id, :group_id=, :identity,
|
@@ -114,14 +117,14 @@ module Ironfan
|
|
114
117
|
other_group_fog = recall_with_vpc(other_group,cloud.vpc)
|
115
118
|
Ironfan.step(dsl_group.name, " ensuring access from #{other_group}", :blue)
|
116
119
|
options = {:group => other_group_fog.group_id}
|
117
|
-
safely_authorize(dsl_group_fog,
|
120
|
+
safely_authorize(dsl_group_fog, WIDE_OPEN, options)
|
118
121
|
end
|
119
122
|
|
120
123
|
dsl_group.group_authorized_by.each do |other_group|
|
121
124
|
other_group_fog = recall_with_vpc(other_group,cloud.vpc)
|
122
125
|
Ironfan.step(dsl_group.name, " ensuring access to #{other_group}", :blue)
|
123
126
|
options = {:group => dsl_group_fog.group_id}
|
124
|
-
safely_authorize(other_group_fog,
|
127
|
+
safely_authorize(other_group_fog, WIDE_OPEN, options)
|
125
128
|
end
|
126
129
|
|
127
130
|
dsl_group.range_authorizations.each do |range_auth|
|
@@ -156,6 +159,7 @@ module Ironfan
|
|
156
159
|
unless options[:ip_protocol]
|
157
160
|
safely_authorize(fog_group,range,options.merge(:ip_protocol => 'tcp'))
|
158
161
|
safely_authorize(fog_group,range,options.merge(:ip_protocol => 'udp'))
|
162
|
+
safely_authorize(fog_group,Range.new(-1,-1),options.merge(:ip_protocol => 'icmp')) if(range == WIDE_OPEN)
|
159
163
|
return
|
160
164
|
end
|
161
165
|
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
Ironfan.cluster "simple" do
|
4
|
+
|
5
|
+
cloud(:ec2) do
|
6
|
+
availability_zones ('b'..'d').map { |z| "us-east-1#{z}" }
|
7
|
+
flavor 't1.micro'
|
8
|
+
backing 'ebs'
|
9
|
+
image_name 'alestic-precise'
|
10
|
+
chef_client_script 'client.rb'
|
11
|
+
security_group :systemwide
|
12
|
+
security_group :ssh do
|
13
|
+
authorize_port_range(22..22)
|
14
|
+
end
|
15
|
+
mount_ephemerals
|
16
|
+
end
|
17
|
+
|
18
|
+
facet :web do
|
19
|
+
instances 1
|
20
|
+
end
|
21
|
+
|
22
|
+
facet :db do
|
23
|
+
instances 1
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
launch_cluster 'simple' do |cluster, computers|
|
29
|
+
describe "the simple cluster" do
|
30
|
+
|
31
|
+
it "should have the correct number of running computers" do
|
32
|
+
computers.size.should == cluster.facets.keys.inject(0) { |size, facet| size + cluster.facets[facet].instances }
|
33
|
+
computers.values.reject { |c| c.running? }.should be_empty
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "the web facet security groups" do
|
37
|
+
subject { cluster.facets[:web].server(0).cloud(:ec2).security_groups.keys.map(&:to_s).sort }
|
38
|
+
it { should == %w[ simple simple-web ssh systemwide ] }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "the db facet security groups" do
|
42
|
+
subject { cluster.facets[:db].server(0).cloud(:ec2).security_groups.keys.map(&:to_s).sort }
|
43
|
+
it { should == %w[ simple simple-db ssh systemwide ] }
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "the cluster-wide security group" do
|
47
|
+
before :each do
|
48
|
+
@sg = Ironfan::Provider::Ec2::SecurityGroup.recall('simple')
|
49
|
+
@ordered_ipp = Hash[ @sg.ip_permissions.map { |s| [ s['ipProtocol'], s ] } ]
|
50
|
+
end
|
51
|
+
|
52
|
+
it "has the right number of inbound security rules" do
|
53
|
+
@ordered_ipp.keys.size == 3
|
54
|
+
end
|
55
|
+
|
56
|
+
it "allows TCP connections on all ports between all servers in the security group" do
|
57
|
+
@ordered_ipp['tcp']['groups'].size.should == 1
|
58
|
+
@ordered_ipp['tcp']['groups'][0]['groupId'].should == @sg.group_id
|
59
|
+
@ordered_ipp['tcp']['groups'][0]['groupName'].should == 'simple'
|
60
|
+
@ordered_ipp['tcp']['fromPort'].to_i.should == 1
|
61
|
+
@ordered_ipp['tcp']['toPort'].to_i.should == 65535
|
62
|
+
end
|
63
|
+
|
64
|
+
it "allows UDP connections on all ports between all servers in the security group" do
|
65
|
+
@ordered_ipp['udp']['groups'].size.should == 1
|
66
|
+
@ordered_ipp['udp']['groups'][0]['groupId'].should == @sg.group_id
|
67
|
+
@ordered_ipp['udp']['groups'][0]['groupName'].should == 'simple'
|
68
|
+
@ordered_ipp['udp']['fromPort'].to_i.should == 1
|
69
|
+
@ordered_ipp['udp']['toPort'].to_i.should == 65535
|
70
|
+
end
|
71
|
+
|
72
|
+
it "allows ICMP connections between all servers in the security group" do
|
73
|
+
@ordered_ipp['icmp']['groups'].size.should == 1
|
74
|
+
@ordered_ipp['icmp']['groups'][0]['groupId'].should == @sg.group_id
|
75
|
+
@ordered_ipp['icmp']['groups'][0]['groupName'].should == 'simple'
|
76
|
+
@ordered_ipp['icmp']['fromPort'].to_i.should == -1
|
77
|
+
@ordered_ipp['icmp']['toPort'].to_i.should == -1
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: ironfan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 4.4.
|
5
|
+
version: 4.4.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Infochimps
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-10-
|
13
|
+
date: 2012-10-24 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: chef
|
@@ -157,6 +157,8 @@ files:
|
|
157
157
|
- VERSION
|
158
158
|
- chefignore
|
159
159
|
- config/client.rb
|
160
|
+
- config/knife.bash
|
161
|
+
- config/knife.bash.README.md
|
160
162
|
- config/proxy.pac
|
161
163
|
- config/ubuntu10.04-ironfan.erb
|
162
164
|
- config/ubuntu11.10-ironfan.erb
|
@@ -255,6 +257,7 @@ files:
|
|
255
257
|
- spec/integration/minimal-chef-repo/knife/knife.rb
|
256
258
|
- spec/integration/minimal-chef-repo/roles/systemwide.rb
|
257
259
|
- spec/integration/spec/elb_build_spec.rb
|
260
|
+
- spec/integration/spec/simple_cluster_spec.rb
|
258
261
|
- spec/integration/spec_helper.rb
|
259
262
|
- spec/integration/spec_helper/launch_cluster.rb
|
260
263
|
- spec/ironfan/cluster_spec.rb
|
@@ -278,7 +281,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
278
281
|
requirements:
|
279
282
|
- - ">="
|
280
283
|
- !ruby/object:Gem::Version
|
281
|
-
hash:
|
284
|
+
hash: -2266640739538756460
|
282
285
|
segments:
|
283
286
|
- 0
|
284
287
|
version: "0"
|
@@ -304,6 +307,7 @@ test_files:
|
|
304
307
|
- spec/integration/minimal-chef-repo/knife/knife.rb
|
305
308
|
- spec/integration/minimal-chef-repo/knife/credentials/knife-user-ironfantester.rb
|
306
309
|
- spec/integration/minimal-chef-repo/knife/credentials/knife-org.rb
|
310
|
+
- spec/integration/spec/simple_cluster_spec.rb
|
307
311
|
- spec/integration/spec/elb_build_spec.rb
|
308
312
|
- spec/integration/spec_helper.rb
|
309
313
|
- spec/ironfan/cluster_spec.rb
|