bfire 0.2.0
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/LICENSE +0 -0
- data/README.md +90 -0
- data/bin/bfire +120 -0
- data/examples/benchmark.rb +18 -0
- data/examples/dag.rb +26 -0
- data/examples/elasticity.rb +105 -0
- data/examples/ibbt.rb +125 -0
- data/examples/mine.rb +40 -0
- data/examples/modules/apache2/manifests/init.pp +44 -0
- data/examples/modules/app/files/app/app.rb +29 -0
- data/examples/modules/app/files/app/config.ru +2 -0
- data/examples/modules/app/files/app.phtml +4 -0
- data/examples/modules/app/manifests/init.pp +19 -0
- data/examples/modules/common/manifests/init.pp +8 -0
- data/examples/modules/haproxy/files/default +4 -0
- data/examples/modules/haproxy/files/haproxy.rsyslog.conf +2 -0
- data/examples/modules/haproxy/manifests/init.pp +21 -0
- data/examples/modules/mysql/manifests/init.pp +40 -0
- data/examples/modules/rsyslog/files/rsyslog.conf +116 -0
- data/examples/modules/rsyslog/manifests/init.pp +15 -0
- data/examples/modules/sinatra/manifests/init.pp +9 -0
- data/examples/modules/web/files/monitor/app.rb +55 -0
- data/examples/modules/web/files/monitor/config.ru +2 -0
- data/examples/modules/web/files/monitor/haproxy.cfg.erb +50 -0
- data/examples/modules/web/manifests/init.pp +26 -0
- data/examples/simple.rb +58 -0
- data/lib/bfire/aggregator/zabbix.rb +55 -0
- data/lib/bfire/engine.rb +546 -0
- data/lib/bfire/group.rb +241 -0
- data/lib/bfire/metric.rb +36 -0
- data/lib/bfire/provider/puppet.rb +58 -0
- data/lib/bfire/pub_sub/publisher.rb +40 -0
- data/lib/bfire/rule.rb +110 -0
- data/lib/bfire/template.rb +142 -0
- data/lib/bfire/version.rb +3 -0
- data/lib/bfire.rb +10 -0
- metadata +241 -0
data/LICENSE
ADDED
File without changes
|
data/README.md
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# bfire
|
2
|
+
A powerful DSL to launch experiments on BonFIRE.
|
3
|
+
|
4
|
+
What this does for you:
|
5
|
+
|
6
|
+
* Nice DSL to declare the resources you want;
|
7
|
+
* Groups compute resources into... groups;
|
8
|
+
* Supports dependencies between groups, and builds the dependency graph to launch groups in the right order;
|
9
|
+
* Provision software on compute resources using [Puppet](http://www.puppetlabs.com/);
|
10
|
+
* Provides hooks after each deployment step so that you can launch your own commands;
|
11
|
+
* Abstracts SSH connections, including connections going through gateways;
|
12
|
+
* Registers metrics into Zabbix;
|
13
|
+
* Scale up or scale down groups based on any condition you want, including metric values.
|
14
|
+
|
15
|
+
This is very much a work in progress, and a proof of concept.
|
16
|
+
The code is definitely not something you want to look at.
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
|
20
|
+
$ bfire my-experiment.rb
|
21
|
+
|
22
|
+
Or, if you are developing in the project's directory:
|
23
|
+
|
24
|
+
$ git clone git://github.com/crohr/bfire.git
|
25
|
+
$ cd bfire/
|
26
|
+
$ ruby -I lib/ bin/bfire my-experiment.rb
|
27
|
+
|
28
|
+
Content of `my-experiment.rb`:
|
29
|
+
|
30
|
+
set :name, "Simple Experiment using bfire"
|
31
|
+
set :walltime, 3600
|
32
|
+
set :gateway, "ssh.bonfire.grid5000.fr"
|
33
|
+
set :user, ENV['USER']
|
34
|
+
set :logging, INFO
|
35
|
+
|
36
|
+
set :squeeze, "BonFIRE Debian Squeeze 2G v1"
|
37
|
+
set :zabbix, "BonFIRE Zabbix Aggregator v2"
|
38
|
+
set :wan, "BonFIRE WAN"
|
39
|
+
|
40
|
+
group :monitor do
|
41
|
+
at "uk-epcc"
|
42
|
+
instance_type "small"
|
43
|
+
deploy conf[:zabbix]
|
44
|
+
connect_to conf[:wan]
|
45
|
+
end
|
46
|
+
|
47
|
+
group :servers do
|
48
|
+
at "fr-inria"
|
49
|
+
instance_type "small"
|
50
|
+
deploy conf[:squeeze]
|
51
|
+
connect_to conf[:wan]
|
52
|
+
|
53
|
+
# This is not a runtime dependency, it starts right after the resources in
|
54
|
+
# the monitor group have been _created_ (they're not necessarily _running_).
|
55
|
+
depends_on :monitor do |group|
|
56
|
+
{:aggregator_ip => group.take(:first)['nic'][0]['ip']}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
group :clients do
|
61
|
+
at "fr-inria"
|
62
|
+
at "de-hlrs"
|
63
|
+
instance_type "small"
|
64
|
+
deploy conf[:squeeze]
|
65
|
+
connect_to conf[:wan]
|
66
|
+
|
67
|
+
depends_on :monitor do |group|
|
68
|
+
{:aggregator_ip => group.take(:first)['nic'][0]['ip']}
|
69
|
+
end
|
70
|
+
depends_on :servers do |group|
|
71
|
+
{:server_ips => group.map{|vm| vm['nic'][0]['ip']}}
|
72
|
+
end
|
73
|
+
|
74
|
+
on :launched do
|
75
|
+
puts "Yeah, our resources have been launched!"
|
76
|
+
end
|
77
|
+
|
78
|
+
# The ready event is generated once the group resources are launched AND
|
79
|
+
# ssh accessible.
|
80
|
+
on :ready do |group|
|
81
|
+
group.each{|vm|
|
82
|
+
puts "#{group.banner}#{vm['name']} - #{vm['nic'][0]['ip']}"
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
See the `examples` directory for up to date examples.
|
88
|
+
|
89
|
+
## Authors
|
90
|
+
* Cyril Rohr <cyril.rohr@inria.fr>
|
data/bin/bfire
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'bfire'
|
3
|
+
require 'optparse'
|
4
|
+
require 'logger'
|
5
|
+
require 'pp'
|
6
|
+
|
7
|
+
logger = Logger.new(STDERR)
|
8
|
+
logger.level = Logger.const_get(ENV['DEBUG'] || "WARN")
|
9
|
+
|
10
|
+
@options = {
|
11
|
+
:logger => logger,
|
12
|
+
:restfully_config => File.expand_path(
|
13
|
+
"~/.restfully/api.bonfire-project.eu"
|
14
|
+
)
|
15
|
+
}
|
16
|
+
|
17
|
+
filename = ARGV[0]
|
18
|
+
if filename.nil?
|
19
|
+
dir = File.dirname(Dir.pwd)
|
20
|
+
dsl = ""
|
21
|
+
while line = gets do
|
22
|
+
dsl << line
|
23
|
+
end
|
24
|
+
else
|
25
|
+
dir = File.dirname(filename)
|
26
|
+
dsl = File.read(filename)
|
27
|
+
end
|
28
|
+
|
29
|
+
engine = Bfire::Engine.new(:root => dir)
|
30
|
+
engine.instance_eval(dsl)
|
31
|
+
|
32
|
+
option_parser = OptionParser.new do |opts|
|
33
|
+
opts.banner = <<BANNER
|
34
|
+
* Description
|
35
|
+
bfire: Launch experiments on BonFIRE.
|
36
|
+
|
37
|
+
* Usage
|
38
|
+
$ bfire engine-file
|
39
|
+
|
40
|
+
* Options
|
41
|
+
BANNER
|
42
|
+
|
43
|
+
opts.on("-a=", "--authorized-keys=", "Specify an authorized_keys file to use instead of your public key [default=#{engine.conf[:authorized_keys]}].") do |v|
|
44
|
+
authorized_keys = File.expand_path(v)
|
45
|
+
if File.file?(authorized_keys) && File.readable?(authorized_keys)
|
46
|
+
@options[:authorized_keys] = authorized_keys
|
47
|
+
else
|
48
|
+
fail "Cannot find your authorized_keys file at #{authorized_keys.inspect}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
opts.on("-c=", "--config=", "Pass the Restfully YAML configuration file. See <https://github.com/crohr/restfully>.") do |v|
|
52
|
+
@options[:restfully_config] = File.expand_path(v)
|
53
|
+
end
|
54
|
+
opts.on("-u=", "--user=", "Specify your BonFIRE username [default=#{engine.conf[:user]}].") do |v|
|
55
|
+
@options[:user] = v
|
56
|
+
end
|
57
|
+
opts.on("-g=", "--gateway=", "Issues SSH commands via the specified gateway [default=#{engine.conf[:gateway]}].") do |v|
|
58
|
+
@options[:gateway] = v
|
59
|
+
end
|
60
|
+
opts.on("-w=", "--walltime=", "Specify the walltime for the experiment (in seconds) [default=#{engine.conf[:walltime]}].") do |v|
|
61
|
+
@options[:walltime] = v.to_i
|
62
|
+
end
|
63
|
+
opts.on("-k=", "--key=", "Specify the private key to use [default=#{engine.conf[:key]}].") do |v|
|
64
|
+
public_key = File.expand_path(v+".pub")
|
65
|
+
if File.file?(public_key) && File.readable?(public_key)
|
66
|
+
@options[:key] = v
|
67
|
+
# public_key can already be set by --authorized-keys-file,
|
68
|
+
# don't override:
|
69
|
+
@options[:authorized_keys] ||= public_key
|
70
|
+
else
|
71
|
+
fail "Cannot find the public part of your SSH key at #{public_key.inspect}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
{
|
75
|
+
:no_cleanup => "Do not delete experiment at the end.",
|
76
|
+
:no_cancel => "Do not delete experiment at the end, even if an error occurs.",
|
77
|
+
}.each do |flag, description|
|
78
|
+
opts.on("--#{flag.to_s.gsub('_','-')}", description) do |v|
|
79
|
+
@options[flag] = true
|
80
|
+
end
|
81
|
+
end
|
82
|
+
opts.on("--dev", "Attempts to reuse an existing experiment with the same name, in the running state.") do |v|
|
83
|
+
@options[:dev] = true
|
84
|
+
end
|
85
|
+
opts.on("--name=", "Name for your experiment [default=#{engine.conf[:name]}].") do |v|
|
86
|
+
@options[:name] = v
|
87
|
+
end
|
88
|
+
# opts.on("--log=", "Outputs log messages to the given file. Defaults to STDERR.") do |v|
|
89
|
+
# original_logger_level = logger.level
|
90
|
+
# logger = Logger.new(File.expand_path(v))
|
91
|
+
# logger.level = original_logger_level
|
92
|
+
# @options[:logger] = logger
|
93
|
+
# end
|
94
|
+
opts.on("--debug", "Set the logging level (DEBUG,INFO,WARN,ERROR,UNKNOWN) [default=#{engine.conf[:logging]}].") do |v|
|
95
|
+
@options[:logging] = Logger.const_get(v.to_s.upcase)
|
96
|
+
end
|
97
|
+
opts.on("--version", "Display the version.") do |v|
|
98
|
+
puts Bfire::VERSION
|
99
|
+
exit(0)
|
100
|
+
end
|
101
|
+
opts.on_tail("-h", "--help", "Show this message.") do
|
102
|
+
puts opts
|
103
|
+
exit(0)
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
begin
|
110
|
+
option_parser.parse!
|
111
|
+
@options.each do |k,v|
|
112
|
+
engine.set(k, v)
|
113
|
+
end
|
114
|
+
|
115
|
+
engine.run!
|
116
|
+
rescue OptionParser::ParseError => e
|
117
|
+
STDERR.puts "Error when parsing the options: #{e.message} (#{e.class.name})"
|
118
|
+
exit(1)
|
119
|
+
end
|
120
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# $ bfire simple.rb
|
2
|
+
|
3
|
+
set :name, "Benchmark using bfire"
|
4
|
+
set :walltime, 3600
|
5
|
+
set :gateway, "ssh.bonfire.grid5000.fr"
|
6
|
+
set :user, ENV['USER']
|
7
|
+
set :logging, INFO
|
8
|
+
|
9
|
+
set :squeeze, "BonFIRE Debian Squeeze 2G v2"
|
10
|
+
set :wan, "BonFIRE WAN"
|
11
|
+
|
12
|
+
group :servers do
|
13
|
+
at "fr-inria"
|
14
|
+
instance_type "lite"
|
15
|
+
deploy conf[:squeeze]
|
16
|
+
connect_to conf[:wan]
|
17
|
+
scale 1..100, :initial => 2
|
18
|
+
end
|
data/examples/dag.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
group :c do
|
3
|
+
depends_on :a
|
4
|
+
depends_on :b
|
5
|
+
end
|
6
|
+
|
7
|
+
group :f do
|
8
|
+
depends_on :c
|
9
|
+
end
|
10
|
+
|
11
|
+
group :a do
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
group :b do
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
group :d do
|
21
|
+
depends_on :c
|
22
|
+
end
|
23
|
+
|
24
|
+
group :e do
|
25
|
+
depends_on :d
|
26
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# $ bfire elasticity.rb
|
2
|
+
|
3
|
+
# Define global properties
|
4
|
+
set :name, "BonFIRE elasticity experiment"
|
5
|
+
set :key, "~/.ssh/id_rsa"
|
6
|
+
set :authorized_keys, "~/.ssh/authorized_keys"
|
7
|
+
set :walltime, 3600
|
8
|
+
set :gateway, "ssh.bonfire.grid5000.fr"
|
9
|
+
set :user, ENV['USER']
|
10
|
+
set :logging, INFO
|
11
|
+
|
12
|
+
set :squeeze, "BonFIRE Debian Squeeze 2G v2"
|
13
|
+
set :zabbix, "BonFIRE Zabbix Aggregator v4"
|
14
|
+
set :wan, "BonFIRE WAN"
|
15
|
+
|
16
|
+
|
17
|
+
# Monitoring
|
18
|
+
group :eye, :tag => "BonFIRE-monitor" do
|
19
|
+
at "fr-inria"
|
20
|
+
instance_type "small"
|
21
|
+
deploy conf[:zabbix]
|
22
|
+
connect_to conf[:wan]
|
23
|
+
end
|
24
|
+
|
25
|
+
# HTTP Routing
|
26
|
+
group :web do
|
27
|
+
at "fr-inria"
|
28
|
+
instance_type 'small'
|
29
|
+
deploy conf[:squeeze]
|
30
|
+
# Two interfaces for the publicly facing server
|
31
|
+
connect_to conf[:wan]
|
32
|
+
connect_to :public
|
33
|
+
|
34
|
+
provider :puppet,
|
35
|
+
:classes => ['common', 'web'],
|
36
|
+
:modules => "./modules"
|
37
|
+
|
38
|
+
depends_on :eye do |g|
|
39
|
+
{:aggregator_ip => g.take(:first)['nic'][0]['ip']}
|
40
|
+
end
|
41
|
+
|
42
|
+
# Register custom metrics
|
43
|
+
register 'connection_waiting_time',
|
44
|
+
:command => "/usr/bin/tail -n 1 /var/log/haproxy.log | cut -d ' ' -f 10 | cut -d '/' -f 2",
|
45
|
+
:type => :numeric
|
46
|
+
end
|
47
|
+
|
48
|
+
# App servers
|
49
|
+
group :app do
|
50
|
+
at "fr-inria"
|
51
|
+
at "de-hlrs"
|
52
|
+
instance_type "small"
|
53
|
+
connect_to conf[:wan]
|
54
|
+
deploy conf[:squeeze]
|
55
|
+
provider :puppet,
|
56
|
+
:classes => ['common', 'app'],
|
57
|
+
:modules => "./modules"
|
58
|
+
|
59
|
+
depends_on :eye do |g|
|
60
|
+
{:aggregator_ip => g.take(:first)['nic'][0]['ip']}
|
61
|
+
end
|
62
|
+
|
63
|
+
depends_on :web do |g|
|
64
|
+
{:router_ip => g.take(:first)['nic'][0]['ip']}
|
65
|
+
end
|
66
|
+
|
67
|
+
# Scaling
|
68
|
+
scale 1..10, {
|
69
|
+
:initial => 2,
|
70
|
+
:up => lambda {|engine|
|
71
|
+
values = engine.metric("connection_waiting_time",
|
72
|
+
:hosts => engine.group(:web).take(:first),
|
73
|
+
:type => :numeric
|
74
|
+
).values[0..3]
|
75
|
+
puts "Metric values: #{values.inspect}, avg=#{values.avg.inspect}"
|
76
|
+
values.avg >= 600
|
77
|
+
},
|
78
|
+
:down => lambda {|engine|
|
79
|
+
engine.metric("connection_waiting_time",
|
80
|
+
:hosts => engine.group(:web).take(:first),
|
81
|
+
:type => :numeric
|
82
|
+
).values[0..5].avg < 200
|
83
|
+
},
|
84
|
+
:period => 90,
|
85
|
+
:placement => :round_robin
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
# All groups are "ready", launch an HTTP benchmarking tool against web's first
|
90
|
+
# resource on public interface:
|
91
|
+
on :ready do
|
92
|
+
sleep 20
|
93
|
+
cmd = "ab -r -c 8 -n 10000 http://#{group(:web).first['nic'].find{|n| n['ip'] =~ /^131/}['ip']}/delay?delay=0.3"
|
94
|
+
puts "***********"
|
95
|
+
puts cmd
|
96
|
+
system cmd
|
97
|
+
end
|
98
|
+
|
99
|
+
# Define your networks
|
100
|
+
network :public do |name, location|
|
101
|
+
case location['name']
|
102
|
+
when "fr-inria"
|
103
|
+
location.networks.find{|network| network['name'] =~ /Public Network/i}
|
104
|
+
end
|
105
|
+
end
|
data/examples/ibbt.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
# $ bfire elasticity.rb
|
2
|
+
|
3
|
+
# Define global properties
|
4
|
+
set :name, "BonFIRE elasticity experiment"
|
5
|
+
set :key, "~/.ssh/demo"
|
6
|
+
set :authorized_keys, "~/.ssh/demo.pub"
|
7
|
+
set :walltime, 4*3600
|
8
|
+
set :gateway, "ssh.bonfire.grid5000.fr"
|
9
|
+
set :user, ENV['USER']
|
10
|
+
set :logging, DEBUG
|
11
|
+
|
12
|
+
set :squeeze, "BonFIRE Debian Squeeze 2G v2"
|
13
|
+
set :zabbix, "BonFIRE Zabbix Aggregator v4"
|
14
|
+
set :wan, "BonFIRE WAN"
|
15
|
+
|
16
|
+
|
17
|
+
# Monitoring
|
18
|
+
group :eye, :tag => "BonFIRE-monitor" do
|
19
|
+
at "fr-inria"
|
20
|
+
instance_type "small"
|
21
|
+
deploy conf[:zabbix]
|
22
|
+
connect_to conf[:wan]
|
23
|
+
end
|
24
|
+
|
25
|
+
# HTTP Routing
|
26
|
+
# group :web do
|
27
|
+
# at "fr-inria"
|
28
|
+
# instance_type 'small'
|
29
|
+
# deploy conf[:squeeze]
|
30
|
+
# # Two interfaces for the publicly facing server
|
31
|
+
# connect_to conf[:wan]
|
32
|
+
# connect_to :public
|
33
|
+
#
|
34
|
+
# provider :puppet,
|
35
|
+
# :classes => ['common', 'web'],
|
36
|
+
# :modules => "./modules"
|
37
|
+
#
|
38
|
+
# depends_on :eye do |g|
|
39
|
+
# {:aggregator_ip => g.take(:first)['nic'][0]['ip']}
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# # Register custom metrics
|
43
|
+
# register 'connection_waiting_time',
|
44
|
+
# :command => "/usr/bin/tail -n 1 /var/log/haproxy.log | cut -d ' ' -f 10 | cut -d '/' -f 2",
|
45
|
+
# :type => :numeric
|
46
|
+
# end
|
47
|
+
|
48
|
+
group :servers do
|
49
|
+
at "be-ibbt"
|
50
|
+
connect_to conf[:wan]
|
51
|
+
connect_to :private
|
52
|
+
deploy "BonFIRE Debian Squeeze v1"
|
53
|
+
instance_type "small"
|
54
|
+
end
|
55
|
+
|
56
|
+
# App servers
|
57
|
+
group :clients do
|
58
|
+
at "be-ibbt"
|
59
|
+
instance_type "small"
|
60
|
+
connect_to :private
|
61
|
+
deploy "BonFIRE Debian Squeeze v1"
|
62
|
+
# provider :puppet,
|
63
|
+
# :classes => ['common', 'app'],
|
64
|
+
# :modules => "./modules"
|
65
|
+
|
66
|
+
depends_on :eye do |g|
|
67
|
+
{:aggregator_ip => g.take(:first)['nic'][0]['ip']}
|
68
|
+
end
|
69
|
+
|
70
|
+
depends_on :servers do |g|
|
71
|
+
{:iperf_server => g.take(:first)['nic'][0]['ip']}
|
72
|
+
end
|
73
|
+
|
74
|
+
# Scaling
|
75
|
+
scale 1..10, {
|
76
|
+
:initial => 2,
|
77
|
+
# :up => lambda {|engine|
|
78
|
+
# values = engine.metric("connection_waiting_time",
|
79
|
+
# :hosts => engine.group(:web).take(:first),
|
80
|
+
# :type => :numeric
|
81
|
+
# ).values[0..3]
|
82
|
+
# puts "Metric values: #{values.inspect}, avg=#{values.avg.inspect}"
|
83
|
+
# values.avg >= 600
|
84
|
+
# },
|
85
|
+
# :down => lambda {|engine|
|
86
|
+
# engine.metric("connection_waiting_time",
|
87
|
+
# :hosts => engine.group(:web).take(:first),
|
88
|
+
# :type => :numeric
|
89
|
+
# ).values[0..5].avg < 200
|
90
|
+
# },
|
91
|
+
# :period => 90,
|
92
|
+
:placement => :round_robin
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
# All groups are "ready", launch an HTTP benchmarking tool against web's first
|
97
|
+
# resource on public interface:
|
98
|
+
# on :ready do
|
99
|
+
# sleep 20
|
100
|
+
# cmd = "ab -r -c 8 -n 10000 http://#{group(:web).first['nic'].find{|n| n['ip'] =~ /^131/}['ip']}/delay?delay=0.3"
|
101
|
+
# puts "***********"
|
102
|
+
# puts cmd
|
103
|
+
# system cmd
|
104
|
+
# end
|
105
|
+
|
106
|
+
network :private do |name, location, experiment|
|
107
|
+
experiment.networks.submit(
|
108
|
+
:location => location,
|
109
|
+
:name => "network-experiment#{experiment['id']}",
|
110
|
+
:bandwidth => 10,
|
111
|
+
:latency => 0,
|
112
|
+
:size => 24,
|
113
|
+
:lossrate => 0,
|
114
|
+
# You MUST specify the address:
|
115
|
+
:address => "192.168.0.1"
|
116
|
+
)
|
117
|
+
end
|
118
|
+
|
119
|
+
# Define your networks
|
120
|
+
# network :public do |name, location|
|
121
|
+
# case location['name']
|
122
|
+
# when "fr-inria"
|
123
|
+
# location.networks.find{|network| network['name'] =~ /Public Network/i}
|
124
|
+
# end
|
125
|
+
# end
|
data/examples/mine.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
use Bfire::API::Bonfire, {
|
2
|
+
:username => "crohr",
|
3
|
+
:password => "toto",
|
4
|
+
:gateway => "ssh.bonfire.grid5000.fr"
|
5
|
+
}
|
6
|
+
|
7
|
+
set :debug, INFO
|
8
|
+
|
9
|
+
set :walltime, 3600
|
10
|
+
set :logging, INFO
|
11
|
+
|
12
|
+
set :squeeze, "BonFIRE Debian Squeeze 2G v1"
|
13
|
+
set :zabbix, "BonFIRE Zabbix Aggregator v2"
|
14
|
+
set :wan, "BonFIRE WAN"
|
15
|
+
|
16
|
+
|
17
|
+
group :app do
|
18
|
+
attach :db4g
|
19
|
+
|
20
|
+
at "fr-inria" do
|
21
|
+
type "lite"
|
22
|
+
connect "BonFIRE WAN"
|
23
|
+
connect :private
|
24
|
+
end
|
25
|
+
|
26
|
+
at "us-eastc1" do
|
27
|
+
type "t1.micro"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
network :private do
|
33
|
+
visibility :private
|
34
|
+
cidr "192.168.0.0/24"
|
35
|
+
end
|
36
|
+
|
37
|
+
storage :db4g do
|
38
|
+
size 4.GB
|
39
|
+
fstype "ext3"
|
40
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
class apache2 {
|
2
|
+
include "apache2::${operatingsystem}"
|
3
|
+
}
|
4
|
+
|
5
|
+
# Class: apache2::debian
|
6
|
+
#
|
7
|
+
#
|
8
|
+
class apache2::debian {
|
9
|
+
package { "apache2":
|
10
|
+
ensure => installed,
|
11
|
+
}
|
12
|
+
|
13
|
+
service { "apache2":
|
14
|
+
ensure => running,
|
15
|
+
enable => true,
|
16
|
+
require => Package["apache2"];
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
# Class: apache2::ubuntu
|
21
|
+
#
|
22
|
+
#
|
23
|
+
class apache2::ubuntu {
|
24
|
+
include apache2::debian
|
25
|
+
}
|
26
|
+
|
27
|
+
# Class: apache2::centos
|
28
|
+
#
|
29
|
+
#
|
30
|
+
class apache2::centos {
|
31
|
+
package { "httpd":
|
32
|
+
ensure => installed,
|
33
|
+
}
|
34
|
+
|
35
|
+
service { "httpd":
|
36
|
+
ensure => running,
|
37
|
+
enable => true,
|
38
|
+
require => Package["httpd"];
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
|
3
|
+
def registered?
|
4
|
+
cmd = '. /etc/default/bonfire && curl -f http://$ROUTER_IP:8000/hosts -X POST -d "ip=$WAN_IP"'
|
5
|
+
system(cmd)
|
6
|
+
$?.exitstatus == 0
|
7
|
+
rescue Exception => e
|
8
|
+
puts "Received #{e.class.name}: #{e.message}"
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
12
|
+
Thread.new{
|
13
|
+
# Register with the server on launch
|
14
|
+
# Not efficient but works
|
15
|
+
until registered? do
|
16
|
+
puts "ROUTER not ready yet."
|
17
|
+
sleep 3
|
18
|
+
end
|
19
|
+
}
|
20
|
+
|
21
|
+
get '/' do
|
22
|
+
"UP"
|
23
|
+
end
|
24
|
+
|
25
|
+
get '/delay' do
|
26
|
+
delay = (params[:delay] || 0).to_f
|
27
|
+
sleep delay
|
28
|
+
"Slept for #{delay}s."
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class app {
|
2
|
+
include sinatra
|
3
|
+
|
4
|
+
file{"/tmp/app":
|
5
|
+
recurse => true,
|
6
|
+
source => "puppet:///modules/app/app",
|
7
|
+
notify => Service["myapp"]
|
8
|
+
}
|
9
|
+
|
10
|
+
service{"myapp":
|
11
|
+
ensure => running,
|
12
|
+
start => "/usr/bin/thin -d -l /var/log/thin.log -p 80 -R config.ru -c /tmp/app --tag myapp start",
|
13
|
+
stop => "/usr/bin/thin -d -l /var/log/thin.log -p 80 -R config.ru -c /tmp/app --tag myapp stop",
|
14
|
+
require => [
|
15
|
+
Package["libsinatra-ruby"],
|
16
|
+
File["/tmp/app"]
|
17
|
+
]
|
18
|
+
}
|
19
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class haproxy {
|
2
|
+
include rsyslog
|
3
|
+
|
4
|
+
package{"haproxy":
|
5
|
+
ensure => installed
|
6
|
+
}
|
7
|
+
service{"haproxy":
|
8
|
+
ensure => running,
|
9
|
+
require => Package["haproxy"]
|
10
|
+
}
|
11
|
+
file{"/etc/default/haproxy":
|
12
|
+
source => "puppet:///modules/haproxy/default",
|
13
|
+
require => Package["haproxy"],
|
14
|
+
notify => Service["haproxy"]
|
15
|
+
}
|
16
|
+
file{"/etc/rsyslog.d/haproxy.conf":
|
17
|
+
source => "puppet:///modules/haproxy/haproxy.rsyslog.conf",
|
18
|
+
require => [Package["rsyslog"], Package["haproxy"]],
|
19
|
+
notify => Service["rsyslog"]
|
20
|
+
}
|
21
|
+
}
|