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-client.rb
[bonfiredemokit] / virt-cluster / build-client.rb Repository:
ViewVC logotype

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8 - (view) (download)

1 : agomez 1 require 'rubygems'
2 :     require 'restfully'
3 :     require 'restfully/addons/bonfire'
4 :    
5 :     ##Editable parameters
6 :     #LOCATION = "de-hlrs"
7 :     LOCATION = "fr-inria"
8 :     #LOCATION = "uk-epcc"
9 :     ##
10 :    
11 :     EXPERIMENT_NAME = "Build image client"
12 :     EXPERIMENT_DESCRIPTION = "Build image client for virtual cluster."
13 :     EXPERIMENT_WALLTIME = 3600
14 :     IMAGE_NAME = "BonFIRE Debian Squeeze 2G v3"
15 :     NEW_IMAGE_DESCRIPTION = "VirtualCluster Client image."
16 :     WAN_NAME = "BonFIRE WAN"
17 :    
18 :     session = Restfully::Session.new(
19 :     :configuration_file => "~/.restfully/api.bonfire-project.eu",
20 :     :cache => false,
21 :     :gateway => "ssh.fr-inria.bonfire-project.eu",
22 :     :keys => ["~/.ssh/id_rsa"]
23 :     )
24 :     session.logger.level = Logger::INFO
25 :     #session.logger.level = Logger::DEBUG
26 :    
27 : agomez 8 NEW_IMAGE_NAME = "VirtualClusterClient-#{session.config[:username]}-v0.1"
28 :    
29 : agomez 1 experiment = nil
30 :    
31 :     begin
32 :     session.logger.info "Deploying experiment..."
33 :     experiment = session.root.experiments.submit(
34 :     :name => EXPERIMENT_NAME,
35 :     :description => EXPERIMENT_DESCRIPTION + " - " + Time.now.to_s,
36 :     :walltime => EXPERIMENT_WALLTIME
37 :     )
38 :    
39 :     location = session.root.locations[:"#{LOCATION}"]
40 :     session.logger.info "Chosen location is: #{location['name']}"
41 :     fail "Can't select the machine location" if location.nil?
42 :    
43 :     session.logger.info "Deleting previous version"
44 :     storage = location.storages.find{|s| s["name"] == NEW_IMAGE_NAME}
45 :     storage.delete unless storage.nil?
46 :    
47 :     session.logger.info "Launching machine..."
48 :     machine = experiment.computes.submit(
49 :     :name => "machine-experiment#{experiment['id']}",
50 :     :instance_type => "small",
51 :     :disk => [{:storage => location.storages.find{|s| s['name'] == IMAGE_NAME}}],
52 :     :nic => [
53 :     {:network => location.networks.find{|n| n['name'] == WAN_NAME}}
54 :     ],
55 :     :location => location,
56 :     :context => {}
57 :     )
58 :     hostname = "#{machine['name']}-#{machine['id']}"
59 :     session.logger.info "Machine: #{hostname} #{machine['nic'][0]['ip']}"
60 :    
61 :     session.logger.info "Starting experiment..."
62 :     experiment.update(:status => "running")
63 :    
64 :     session.logger.info "Checking if machine is ready..."
65 :     until [machine].all?{|vm|
66 :     vm.reload['state'] == 'RUNNING' && vm.ssh.accessible?
67 :     } do
68 :     fail "Machine has failed" if [machine].any?{|vm| vm['state'] == 'FAILED'}
69 :     session.logger.info "Machine is not ready. Waiting..."
70 :     sleep 20
71 :     end
72 :    
73 :     session.logger.info "Machine is ready"
74 :     machine.ssh do |ssh|
75 :     session.logger.info "Preinstallation..."
76 :     output = ssh.scp.upload!('killproc.sh', '/root/')
77 :     session.logger.info output unless output.nil?
78 :     session.logger.info "Installing software..."
79 :     output = ssh.exec!("apt-get update
80 :     apt-get install -y -q nfs-common
81 :     apt-get autoclean
82 :     mkdir -p /root/vc
83 :     mkdir -p /shared
84 :     echo 'source /etc/default/bonfire' >> /root/.bashrc
85 :     sed '2 i\ sleep 5' /etc/rc.local > /tmp/rc.local
86 :     sed -i '2 i\ sleep 5' /etc/rc.local
87 :     sed -i '2 i\ /root/killproc.sh &' /etc/rc.local
88 :     sed -i '/^exit/ i\ nohup python -u /root/vc/vc-node-init.py /var/log/vc-node-init.log &' /etc/rc.local
89 :     chmod 755 /etc/rc.local
90 :     chmod u+x /root/killproc.sh")
91 :     session.logger.info output unless output.nil?
92 :    
93 :     session.logger.info "Uploading Virtual Cluster scripts..."
94 :     output = ssh.exec!("mkdir -p /root/vc")
95 :     session.logger.info output unless output.nil?
96 :     Dir.glob("vc/*.py").each do |file|
97 :     output = ssh.scp.upload!(file, '/root/vc/')
98 :     session.logger.info output unless output.nil?
99 :     end
100 :     end
101 :     session.logger.warn "Image installation finished"
102 :    
103 :     session.logger.warn "Saving image and shutting down"
104 :     machine.update(:disk => [{:save_as => {:name => NEW_IMAGE_NAME}}])
105 :     machine.update(:state => 'SHUTDOWN')
106 :    
107 :     until machine.reload['state'] == 'DONE' do
108 :     session.logger.info "Machine is #{machine['state']}."
109 :     sleep 20
110 :     end
111 :    
112 :     experiment.delete
113 :    
114 :     session.logger.info "Image built: #{NEW_IMAGE_NAME}"
115 :     session.logger.warn "Experiment terminated!"
116 :    
117 :     rescue Exception => e
118 :     session.logger.error "#{e.class.name}: #{e.message}"
119 :     session.logger.error e.backtrace.join("\n")
120 :     session.logger.warn "Cleaning up in 30 seconds. Hit CTRL-C now to keep your VMs..."
121 :     sleep 30
122 :     experiment.delete unless experiment.nil?
123 :     end

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

Powered By FusionForge