Log In | Get Help   
Home My Page Projects Code Snippets Project Openings BonFIRE VCOC Demonstration Kit
Summary Activity SCM Files Wiki
[bonfiredemokit] Annotation of /virt-cluster/build-storages.rb
[bonfiredemokit] / virt-cluster / build-storages.rb Repository:
ViewVC logotype

Annotation of /virt-cluster/build-storages.rb

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9 - (view) (download)

1 : agomez 9 #
2 :     # BonFIRE Virtual Clusters on Federated Clouds Demonstration Kit
3 :     #
4 :     # Copyright (c) Fundacion Centro Tecnologico de Supercomputacion de Galicia 2012
5 :     #
6 :     # License GPL Version 3
7 :     #
8 :     # The research leading to these results has received funding from
9 :     # the European Community's Seventh Frameqork Programme (FP7/2007-2013)
10 :     # under agreement number 257386
11 :     #
12 :     # This software is provided with ABSOLUTELY NO WARRANTY
13 :     #
14 : agomez 1 require 'rubygems'
15 :     require 'restfully'
16 :     require 'restfully/addons/bonfire'
17 :    
18 :     ##Editable parameters
19 : agomez 2 #SIZES = "1,2" #Comma separated list of volume sizes in GB
20 :     SIZES = "1" #Comma separated list of volume sizes in GB
21 : agomez 1 #LOCATION = "de-hlrs"
22 :     LOCATION = "fr-inria"
23 :     #LOCATION = "uk-epcc"
24 :     ##
25 :    
26 :     EXPERIMENT_NAME = "Build storages"
27 :     EXPERIMENT_DESCRIPTION = "Build storages test"
28 :     EXPERIMENT_WALLTIME = 2*3600
29 :     MASTER_IMAGE_NAME = "BonFIRE Debian Squeeze 2G v3"
30 :     WAN_NAME = "BonFIRE WAN"
31 :    
32 :     session = Restfully::Session.new(
33 :     :configuration_file => "~/.restfully/api.bonfire-project.eu",
34 :     :cache => false,
35 :     :gateway => "ssh.fr-inria.bonfire-project.eu",
36 :     :keys => ["~/.ssh/id_rsa"]
37 :     )
38 :     session.logger.level = Logger::INFO
39 :     #session.logger.level = Logger::DEBUG
40 :     experiment = nil
41 :     volumes = []
42 :     begin
43 :     session.logger.info "Deploying experiment..."
44 :     experiment = session.root.experiments.submit(
45 :     :name => EXPERIMENT_NAME,
46 :     :description => EXPERIMENT_DESCRIPTION + " - " + Time.now.to_s,
47 :     # :status => "waiting",
48 :     :walltime => EXPERIMENT_WALLTIME
49 :     )
50 :    
51 :     location = session.root.locations[:"#{LOCATION}"]
52 :     session.logger.info "Chosen location is: #{location['name']}"
53 :     fail "Can't select the machine location" if location.nil?
54 :    
55 :     def create_volume(session, location, size)
56 :     session.logger.info "Deploying volume on #{location['name']}..."
57 :     return location.storages.find{|storage|
58 : agomez 2 storage['name'].include?"volume-#{size}GB-empty"
59 : agomez 1 } || location.storages.submit(
60 :     :name => "volume-#{size}GB-empty",
61 :     :size => size*1024,
62 :     :type => "DATABLOCK",
63 :     :group => "private",
64 :     :fstype => "ext3",
65 :     :public => "NO",
66 :     :persistent => "YES"
67 :     )
68 :     end
69 :    
70 :     SIZES.split(',').each{|size| volumes.push(create_volume(session,location,size.to_i))}
71 :     volumes.each{|storage|
72 :     storage.update(:persistent => "YES")
73 :     storage.reload}
74 :    
75 :     session.logger.info "Launching machine..."
76 :    
77 :     disks = [{:storage => location.storages.find{|s| s['name'] == MASTER_IMAGE_NAME },:type => "OS"}]
78 :     volumes.each{|storage| disks.push({:storage => storage,:type => "DATABLOCK"})}
79 :     #pp disks
80 :     machine = experiment.computes.submit(
81 :     :name => "machine-experiment#{experiment['id']}",
82 :     :instance_type => "small",
83 :     :disk => disks,
84 :     :nic => [
85 :     {:network => location.networks.find{|n| n['name'] == WAN_NAME}}
86 :     ],
87 :     :location => location,
88 :     :context => {}
89 :     )
90 :     hostname = "#{machine['name']}-#{machine['id']}"
91 :     session.logger.info "Machine: #{hostname} #{machine['nic'][0]['ip']}"
92 :    
93 :     session.logger.info "Starting experiment..."
94 :     experiment.update(:status => "running")
95 :    
96 :     session.logger.info "Checking if machine is ready..."
97 :     until [machine].all?{|vm|
98 :     vm.reload['state'] == 'RUNNING' && vm.ssh.accessible?
99 :     } do
100 :     fail "Machine has failed" if [machine].any?{|vm| vm['state'] == 'FAILED'}
101 :     session.logger.info "Machine is not ready. Waiting..."
102 :     sleep 20
103 :     end
104 :    
105 :     session.logger.info "Machine is ready"
106 :     #Fill volumes with zeros
107 :     machine.ssh do |ssh|
108 :     ('e'..'i').to_a[0,volumes.size].each do |letter|
109 :     session.logger.info "Formating device xvd#{letter}"
110 :     output = ssh.exec!("blockdev --getsize64 /dev/xvd#{letter}")
111 :     session.logger.info output unless output.nil?
112 :     output = ssh.exec!("dd if=/dev/zero of=/dev/xvd#{letter} bs=1M")
113 :     session.logger.info output unless output.nil?
114 :     end
115 :     end
116 :     session.logger.info "Devices formatted!"
117 :    
118 :     machine.update(:state => 'SHUTDOWN')
119 :    
120 :     until machine.reload['state'] == 'DONE' do
121 :     session.logger.info "Machine is #{machine['state']}."
122 :     sleep 20
123 :     end
124 :    
125 :     session.logger.info "Disable persistence of disks"
126 :     volumes.each{|storage| storage.update(:persistent => "NO") }
127 :    
128 :     session.logger.info "Deleting experiment"
129 :     experiment.delete
130 :    
131 :     session.logger.info "Volumes available:"
132 :     volumes.each{|storage| session.logger.info storage['name']}
133 :     session.logger.warn "Experiment terminated!"
134 :    
135 :     rescue Exception => e
136 :     session.logger.error "#{e.class.name}: #{e.message}"
137 :     session.logger.error e.backtrace.join("\n")
138 :    
139 :     session.logger.warn "Cleaning up in 30 seconds. Hit CTRL-C now to keep your VMs..."
140 :     sleep 30
141 :     experiment.delete unless experiment.nil?
142 :     sleep 30
143 :     volumes.each{|storage| storage.update(:persistent => "NO") }
144 :     volumes.each{|storage| storage.delete}
145 :     end

root@forge.cesga.es
ViewVC Help
Powered by ViewVC 1.0.0  

Powered By FusionForge