toft 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- toft (0.0.3)
4
+ toft (0.0.4)
5
5
  net-ssh
6
6
 
7
7
  GEM
data/Rakefile CHANGED
@@ -16,16 +16,16 @@ task :package_deb do
16
16
  src_dir = "#{PROJECT_ROOT}/scripts"
17
17
  content_dir = "#{PROJECT_ROOT}/pkg/#{LXC_PACKAGE_NAME}"
18
18
  mkdir_p content_dir
19
- mkdir_p "#{content_dir}/usr/local/bin"
19
+ mkdir_p "#{content_dir}/usr/bin"
20
20
  mkdir_p "#{content_dir}/var/cache/lxc"
21
21
  mkdir_p "#{content_dir}/usr/lib/lxc/templates"
22
- cp_r Dir.glob("#{src_dir}/bin/share/*"), "#{content_dir}/usr/local/bin"
23
- cp_r Dir.glob("#{src_dir}/bin/ubuntu/*"), "#{content_dir}/usr/local/bin"
22
+ cp_r Dir.glob("#{src_dir}/bin/share/*"), "#{content_dir}/usr/bin"
23
+ cp_r Dir.glob("#{src_dir}/bin/ubuntu/*"), "#{content_dir}/usr/bin"
24
24
  cp_r Dir.glob("#{src_dir}/lxc-templates/*"), "#{content_dir}/usr/lib/lxc/templates"
25
25
 
26
26
  post_install_script = <<-eos
27
27
  #!/bin/sh -e
28
- /usr/local/bin/lxc-prepare-host
28
+ /usr/bin/lxc-prepare-host
29
29
  eos
30
30
  File.open("#{PROJECT_ROOT}/pkg/toft-lxc-post-install.sh", 'w') { |f| f.write(post_install_script) }
31
31
 
@@ -60,17 +60,17 @@ task :package_rpm do
60
60
  src_dir = "#{PROJECT_ROOT}/scripts"
61
61
  content_dir = "#{PROJECT_ROOT}/pkg/#{LXC_PACKAGE_NAME}"
62
62
  mkdir_p content_dir
63
- mkdir_p "#{content_dir}/usr/local/bin"
64
- mkdir_p "#{content_dir}/usr/var/lib/lxc"
63
+ mkdir_p "#{content_dir}/usr/bin"
64
+ mkdir_p "#{content_dir}/var/lib/lxc"
65
65
  mkdir_p "#{content_dir}/var/cache/lxc"
66
66
  mkdir_p "#{content_dir}/usr/lib/lxc/templates"
67
- cp_r Dir.glob("#{src_dir}/bin/share/*"), "#{content_dir}/usr/local/bin"
68
- cp_r Dir.glob("#{src_dir}/bin/centos/*"), "#{content_dir}/usr/local/bin"
67
+ cp_r Dir.glob("#{src_dir}/bin/share/*"), "#{content_dir}/usr/bin"
68
+ cp_r Dir.glob("#{src_dir}/bin/centos/*"), "#{content_dir}/usr/bin"
69
69
  cp_r Dir.glob("#{src_dir}/lxc-templates/*"), "#{content_dir}/usr/lib/lxc/templates"
70
70
 
71
71
  post_install_script = <<-eos
72
72
  #!/bin/sh -e
73
- /usr/local/bin/lxc-prepare-host
73
+ /usr/bin/lxc-prepare-host
74
74
  eos
75
75
  File.open("#{PROJECT_ROOT}/pkg/toft-lxc-post-install.sh", 'w') { |f| f.write(post_install_script) }
76
76
 
@@ -16,5 +16,5 @@ Scenario: Test rm
16
16
  Scenario: Check ssh command result
17
17
  Given I have a clean running node n1
18
18
  Then the result of running ssh command "ps" on "n1" should contain "sshd"
19
- Then the result of running ssh command "chef-solo" on "n1" should contain "No cookbook found"
19
+ Then the result of running ssh command "chef-solo" on "n1" should fail because of "No cookbook found"
20
20
 
@@ -15,5 +15,14 @@ Then /^Rm "([^"]*)" on "([^"]*)" should succeed$/ do |dir, node|
15
15
  end
16
16
 
17
17
  Then /^the result of running ssh command "([^"]*)" on "([^"]*)" should contain "([^"]*)"$/ do |cmd, node, s|
18
- find(node).get_ssh_result(cmd).should include(s)
19
- end
18
+ r = find(node).run_ssh(cmd)
19
+ r.stdout.should include(s)
20
+ end
21
+
22
+ Then /^the result of running ssh command "([^"]*)" on "([^"]*)" should fail because of "([^"]*)"$/ do |cmd, node, s|
23
+ begin
24
+ r = find(node).run_ssh(cmd)
25
+ rescue CommandExecutionError => e
26
+ e.stdout.should include(s)
27
+ end
28
+ end
@@ -42,7 +42,7 @@ end
42
42
 
43
43
  Then /^Node "([^"]*)" should have ip address same with that obtained from inside it through ssh$/ do |node|
44
44
  n = find(node)
45
- n.get_ssh_result("ifconfig eth0 | grep 'inet addr:'").should include(n.ip)
45
+ n.run_ssh("ifconfig eth0 | grep 'inet addr:'").stdout.should include(n.ip)
46
46
  end
47
47
 
48
48
  When /^I add cname "([^"]*)" to "([^"]*)"$/ do |cname, node|
@@ -18,5 +18,5 @@ Before do
18
18
  end
19
19
 
20
20
  at_exit do
21
- n1.destroy
21
+ # n1.destroy
22
22
  end
data/lib/toft/node.rb CHANGED
@@ -90,28 +90,36 @@ CQWv13UgQjiHgQILXSb7xdzpWK1wpDoqIEWQugRyPQDeZhPWVbB4Lg==
90
90
 
91
91
  def run_ssh(command)
92
92
  raise ArgumentError, "Trying to run empty command on node #{@hostname}", caller if command.blank?
93
- error = false
93
+ stdout = ""
94
+ stderr = ""
94
95
  Net::SSH.start(fqdn, "root", :key_data => [PRIVATE_KEY]) do |ssh|
95
- ssh.exec! command do |ch, stream, data|
96
- if stream == :stderr
97
- error = true
96
+ ssh.open_channel do |channel|
97
+ channel.exec(command) do |ch, success|
98
+ raise RuntimeError, "Could not execute command: [#{command}]", caller unless success
99
+
100
+ channel.on_data do |c, data|
101
+ puts data
102
+ stdout << data
103
+ yield data if block_given?
104
+ end
105
+ channel.on_extended_data do |c, type, data|
106
+ puts data
107
+ stderr << data
108
+ yield data if block_given?
109
+ end
110
+ channel.on_request("exit-status") do |c, data|
111
+ exit_code = data.read_long
112
+ raise CommandExecutionError.new "Remote command [#{command}] exited with status #{exit_code}", stdout, stderr unless exit_code.zero?
113
+ end
114
+ channel.on_request("exit-signal") do |c, data|
115
+ raise CommandExecutionError.new "Remote command [#{command}] terminated with signal", stdout, stderr
116
+ end
98
117
  end
99
- yield data if block_given?
100
- puts data
101
- end
118
+ end.wait
102
119
  end
103
- raise RuntimeError, "Error happened while executing command [#{command}]!", caller if error
104
- return true
120
+ return CommandResult.new stdout, stderr
105
121
  end
106
122
 
107
- def get_ssh_result(cmd)
108
- output = ""
109
- run_ssh(cmd) do |data|
110
- output += data
111
- end
112
- return output
113
- end
114
-
115
123
  def rm(dir)
116
124
  raise ArgumentError, "Illegal dir path: [#{dir}]", caller if dir.blank? || dir[0] != ?/
117
125
  system "rm -rf #{rootfs}#{dir}"
@@ -182,4 +190,23 @@ lxc.network.ipv4 = #{full_ip}
182
190
  "#{@hostname}.#{Toft::DOMAIN}"
183
191
  end
184
192
  end
193
+
194
+ class CommandResult
195
+ attr_reader :stdout, :stderr
196
+
197
+ def initialize(stdout, stderr)
198
+ @stdout = stdout
199
+ @stderr = stderr
200
+ end
201
+ end
202
+
203
+ class CommandExecutionError < RuntimeError
204
+ attr_reader :message, :stdout, :stderr
205
+
206
+ def initialize(message, stdout, stderr)
207
+ @message = message
208
+ @stdout = stdout
209
+ @stderr = stderr
210
+ end
211
+ end
185
212
  end
data/lib/toft/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Toft
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -19,7 +19,7 @@ if [[ ! -f /usr/bin/lxc-ls ]]; then
19
19
  wget http://lxc.sourceforge.net/download/lxc/lxc-0.7.4.tar.gz && \
20
20
  tar zxf lxc-0.7.4.tar.gz && \
21
21
  cd lxc-0.7.4 && \
22
- ./configure --prefix=/usr && \
22
+ ./configure --prefix=/usr --with-config-path=/var/lib/lxc && \
23
23
  make && \
24
24
  make install)
25
25
  fi
@@ -38,14 +38,14 @@ BOOTPROTO=static
38
38
  DELAY=0
39
39
  TYPE=Bridge
40
40
  IPADDR=$gateway_ip
41
- NETWORK=$subnet
42
41
  NETMASK=$netmask
43
- GATEWAY=$gateway_ip
44
42
  MTU=1500
45
43
  IPV6INIT=no
46
44
  USERCTL=no
47
45
  EOF
48
46
 
47
+ sudo sed -i "s/#*[ ^I]*net\.ipv4\.ip_forward[ ^I]*=[ ^I]*[01]/net\.ipv4\.ip_forward = 1/" /etc/sysctl.conf
48
+
49
49
  # reset iptables
50
50
  cat <<EOF > /etc/sysconfig/iptables
51
51
  *nat
@@ -36,6 +36,8 @@ post-up /usr/sbin/brctl setfd br0 0
36
36
  EOF
37
37
  fi
38
38
 
39
+ sudo sed -i "s/#*[ ^I]*net\.ipv4\.ip_forward[ ^I]*=[ ^I]*[01]/net\.ipv4\.ip_forward = 1/" /etc/sysctl.conf
40
+
39
41
  iptables-save > /etc/firewall.conf
40
42
  echo "#!/bin/sh" > /etc/network/if-up.d/iptables
41
43
  echo "iptables-restore < /etc/firewall.conf" >> /etc/network/if-up.d/iptables
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toft
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 4
10
- version: 0.0.4
9
+ - 5
10
+ version: 0.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Huang Liang
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-19 00:00:00 Z
18
+ date: 2011-10-20 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rspec