kuzushi 0.0.8 → 0.0.9

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.
Files changed (3) hide show
  1. data/VERSION +1 -1
  2. data/lib/kuzushi.rb +85 -46
  3. metadata +2 -2
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.8
1
+ 0.0.9
@@ -4,6 +4,12 @@ require 'restclient'
4
4
  require 'ostruct'
5
5
  require 'rush'
6
6
  require 'ohai'
7
+ require 'erb'
8
+
9
+ ## IDEAS
10
+
11
+ ## firewall until ready
12
+ ## ruby 1.9 compatibility
7
13
 
8
14
  class Kuzushi
9
15
  def initialize(url)
@@ -15,10 +21,29 @@ class Kuzushi
15
21
  @tasks = []
16
22
  load_config_stack(@name)
17
23
  @config = @configs.reverse.inject({}) { |i,c| i.merge(c) }
24
+ end
25
+
26
+ def init
27
+ @init = true
28
+ start
29
+ end
30
+
31
+ def start
32
+ process_stack
33
+ puts "----"
34
+ @tasks.each do |t|
35
+ puts "TASK: #{t[:description]}"
36
+ t[:blk].call
37
+ end
38
+ puts "----"
39
+ end
40
+
41
+ protected
42
+
43
+ def system
18
44
  ohai = Ohai::System.new
19
45
  ohai.all_plugins
20
- @system = ohai.data
21
- process_stack
46
+ ohai
22
47
  end
23
48
 
24
49
  def load_config_stack(name)
@@ -36,12 +61,11 @@ class Kuzushi
36
61
  process :local_packages
37
62
  process :gems
38
63
  process :volumes
39
- process :raids
40
- process :mounts
41
64
  process :files
42
65
  process :users
43
66
 
44
67
  script get("after")
68
+ script get("init") if init?
45
69
  end
46
70
 
47
71
  ## magic goes here
@@ -59,6 +83,7 @@ class Kuzushi
59
83
  send("process_#{type}", item)
60
84
  end
61
85
  script item["after"]
86
+ script item["init"] if init?
62
87
  end
63
88
  end
64
89
  end
@@ -66,7 +91,7 @@ class Kuzushi
66
91
  def process_packages
67
92
  @packages = get_array("packages")
68
93
  task "install packages" do
69
- shell "apt-get update && apt-get upgrade -y && apt-get install -y #{@packages.join(" ")}", "DEBIAN_FRONTEND" => "noninteractive", "DEBIAN_PRIORITY" => "critical"
94
+ shell "apt-get update && apt-get upgrade -y && apt-get install -y #{@packages.join(" ")}"
70
95
  end
71
96
  end
72
97
 
@@ -85,39 +110,56 @@ class Kuzushi
85
110
  end
86
111
 
87
112
  def process_volumes(v)
113
+ handle_ebs v if v.type == "ebs"
114
+ handle_raid v if v.type == "raid"
115
+ set_readahead v if v.readahead
116
+ set_scheduler v if v.scheduler
117
+ handle_format v if v.format
118
+ handle_mount v if v.mount
119
+ end
120
+
121
+ def handle_ebs(v)
88
122
  task "wait for volume #{v.device}" do
89
123
  wait_for_volume v.device
90
124
  end
91
- set_readahead v
92
- set_scheduler v
93
- check_format v
94
125
  end
95
126
 
96
- def process_raids(r)
97
- task "assemble raid #{r.device}" do
98
- begin
127
+ def handle_raid(r)
128
+ task "create raid #{r.device}", :init => true do
129
+ shell "mdadm --create #{r.device} -n #{r.drives.size} -l #{r.level} -c #{r.chunksize || 64} #{r.drives.join(" ")}"
130
+ end
131
+ task "assemble raid #{r.device}" do ## assemble fails a lot with device busy - is udev to blame :(
132
+ if not dev_exists? r.device
133
+ shell "service stop udev"
99
134
  shell "mdadm --assemble #{r.device} #{r.drives.join(" ")}"
100
- rescue Object => o
101
- ## sometimes the disks come back with odd error messages - retry seems to be the best option
102
- puts "error: #{o.message}"
103
- retry
135
+ shell "service start udev"
104
136
  end
105
137
  end
106
- set_readahead r
107
- set_scheduler r
108
- check_format r
109
138
  add_package "mdadm"
110
139
  end
111
140
 
112
- def process_mounts(m)
113
- task "mount #{m.label}" do
114
- shell "mkdir -p #{m.label} && mount -o #{m.options} -L #{m.label} #{m.label}"
141
+ def handle_mount(m)
142
+ task "mount #{m.device}" do
143
+ shell "mkdir -p #{m.mount} && mount -o #{m.options || "noatime"} #{m.device} #{m.mount}" unless mounted?(m.device)
115
144
  end
116
145
  end
117
146
 
147
+ def system_arch
148
+ system.kernel["machine"]
149
+ end
150
+
151
+ def mounted?(dev)
152
+ !!system.filesystem[dev]["mount"]
153
+ end
154
+
155
+ def package_arch
156
+ `dpkg --print-architecture`.chomp
157
+ end
158
+
118
159
  def process_files(f)
119
160
  fetch("/templates/#{f.template}") do |file|
120
161
  task "setting up #{f.file}" do
162
+ @system = system
121
163
  t = ERB.new File.read(file), 0, '<>'
122
164
  File.open(f.file,"w") { |f| f.write(t.render) }
123
165
  end
@@ -129,26 +171,26 @@ class Kuzushi
129
171
  task "add authorized_key for user #{user.name}" do
130
172
  shell "su - #{user.name} -c 'mkdir -p .ssh; echo \"#{key}\" >> .ssh/authorized_keys; chmod -R 0600 .ssh'"
131
173
  end
132
- end
174
+ end
133
175
  end
134
176
 
135
177
  def set_readahead(v)
136
- if v.readahead
137
- task "set readahead for #{v.device}" do
138
- shell "blockdev --setra #{v.readahead} #{v.device}"
139
- end
178
+ task "set readahead for #{v.device}" do
179
+ shell "blockdev --setra #{v.readahead} #{v.device}"
140
180
  end
141
181
  end
142
182
 
143
183
  def set_scheduler(v)
144
- if v.scheduler
145
- task "set scheduler for #{v.device}" do
146
- shell "echo #{v.scheduler} > /sys/block/#{File.basename(v.device)}/queue/scheduler"
147
- end
184
+ task "set scheduler for #{v.device}" do
185
+ shell "echo #{v.scheduler} > /sys/block/#{File.basename(v.device)}/queue/scheduler"
148
186
  end
149
187
  end
150
188
 
151
- def check_format(v)
189
+ def handle_format(v)
190
+ task "formatting #{v.device}", :init => true do
191
+ label = "-L " + v.label rescue ""
192
+ "mkfs.#{v.format} #{label} #{v.device}"
193
+ end
152
194
  add_package "xfsprogs" if v.format == "xfs"
153
195
  end
154
196
 
@@ -157,7 +199,7 @@ class Kuzushi
157
199
  end
158
200
 
159
201
  def package(p, &block)
160
- fetch("/packages/#{p}_i386.deb") do |file|
202
+ fetch("/packages/#{p}_#{package_arch}.deb") do |file|
161
203
  block.call(file)
162
204
  end
163
205
  end
@@ -221,31 +263,28 @@ class Kuzushi
221
263
  end
222
264
 
223
265
  def wait_for_volume(vol)
224
- until File.exists?("/sys/block/#{File.basename(vol)}") do
266
+ ## Maybe use ohai here instead -- FIXME
267
+ until dev_exists? vol do
225
268
  puts "waiting for volume #{vol}"
226
269
  sleep 2
227
270
  end
228
271
  end
229
272
 
230
- def start
231
- puts "----"
232
- @tasks.each do |t|
233
- puts "TASK: #{t[:description]}"
234
- t[:blk].call
235
- end
236
- puts "----"
273
+ def shell(cmd)
274
+ puts "# #{cmd}"
275
+ puts Rush.bash cmd
237
276
  end
238
277
 
239
- def shell(cmd, env = {})
240
- puts "# #{cmd}"
241
- puts Rush.bash cmd, :env => env
278
+ def init?
279
+ @init ||= false
242
280
  end
243
281
 
244
- def task(description, &blk)
282
+ def task(description, options = {} &blk)
283
+ return if options[:init] and not init?
245
284
  @tasks << { :description => description, :blk => blk }
246
285
  end
247
286
 
248
- def path
249
- Dir["**/config.json"]
287
+ def dev_exists?(dev)
288
+ File.exists?("/sys/block/#{File.basename(dev)}")
250
289
  end
251
290
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kuzushi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Orion Henry
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-19 00:00:00 -05:00
12
+ date: 2010-02-21 00:00:00 -05:00
13
13
  default_executable: kuzushi
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency