kytoon 1.3.3 → 1.3.4
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/CHANGELOG +6 -0
- data/VERSION +1 -1
- data/lib/kytoon/providers/libvirt/server_group.rb +28 -30
- data/lib/kytoon/thor_tasks.rb +10 -1
- data/lib/kytoon/util.rb +1 -1
- metadata +3 -3
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
* Sun Mar 3 2013 Dan Prince <dprince@redhat.com> - 1.3.4
|
2
|
+
-Improve libvirt file injection so it works with or without LVM. (sthaha)
|
3
|
+
-Fix 'kytoon ssh' so it works with multiple args. (sthaha)
|
4
|
+
-Exits with a non-zero value (1) on task failure. (sthaha)
|
5
|
+
-Verbose output when image creation fails. (sthaha)
|
6
|
+
|
1
7
|
* Tue Feb 12 2013 Dan Prince <dprince@redhat.com> - 1.3.3
|
2
8
|
-Update SELinux to set correct context on /root/.ssh as well.
|
3
9
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.
|
1
|
+
1.3.4
|
@@ -100,18 +100,18 @@ class ServerGroup
|
|
100
100
|
|
101
101
|
def server_names
|
102
102
|
|
103
|
-
names=[]
|
103
|
+
names=[]
|
104
104
|
|
105
105
|
servers.each do |server|
|
106
106
|
if block_given? then
|
107
107
|
yield server['hostname']
|
108
108
|
else
|
109
109
|
names << server['hostname']
|
110
|
-
end
|
110
|
+
end
|
111
111
|
end
|
112
112
|
|
113
113
|
names
|
114
|
-
|
114
|
+
|
115
115
|
end
|
116
116
|
|
117
117
|
def cache_to_disk
|
@@ -297,8 +297,7 @@ fi
|
|
297
297
|
|
298
298
|
def self.create_instance(group_id, inst_name, memory_gigs, original, original_xml, disk_path, create_cow, selinux_enabled, ssh_public_key, sudo)
|
299
299
|
|
300
|
-
selinux_enabled = selinux_enabled =~ /(true|t|yes|y|1)$/i ? "true" : ""
|
301
|
-
|
300
|
+
selinux_enabled, guestfs_selinux_arg = selinux_enabled =~ /(true|t|yes|y|1)$/i ? ["true", '--selinux']: ["", '']
|
302
301
|
puts "Creating instance: #{inst_name}"
|
303
302
|
instance_memory = (KIB_PER_GIG * memory_gigs.to_f).to_i
|
304
303
|
original_disk_path = source_disk_filename(original, original_xml) #cow only
|
@@ -326,7 +325,9 @@ if [ -n "#{create_cow}" ]; then
|
|
326
325
|
--preserve-data \
|
327
326
|
|| { echo "failed to virt-clone"; exit 1; }
|
328
327
|
|
329
|
-
#{sudo} qemu-img create -f qcow2 -o backing_file=#{original_disk_path} "#{disk_path}"
|
328
|
+
#{sudo} qemu-img create -f qcow2 -o backing_file=#{original_disk_path} "#{disk_path}" || { \
|
329
|
+
echo 'Failed to create a copy-on-write image of #{original_disk_path }'; exit 1;
|
330
|
+
}
|
330
331
|
|
331
332
|
else
|
332
333
|
|
@@ -339,27 +340,24 @@ else
|
|
339
340
|
|
340
341
|
fi
|
341
342
|
|
342
|
-
|
343
|
-
#
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
write-append /root/.ssh/authorized_keys "#{ssh_public_key}\n" : \
|
361
|
-
sh "/bin/chmod -R 700 /root/.ssh"
|
362
|
-
fi
|
343
|
+
#Copy the ssh-key
|
344
|
+
#{sudo} guestfish -a #{disk_path} -i <<- __EOF__
|
345
|
+
mkdir-p /root/.ssh
|
346
|
+
write-append /root/.ssh/authorized_keys "#{ssh_public_key}"
|
347
|
+
write-append /root/.ssh/authorized_keys \"\\n\"
|
348
|
+
chmod 0700 /root/.ssh
|
349
|
+
__EOF__
|
350
|
+
|
351
|
+
[ $? -eq 0 ] || { echo 'Error: unable to inject keys into the image #{disk_path}'; exit 1; }
|
352
|
+
|
353
|
+
#Extra magic if selinux is enabled
|
354
|
+
if [ -n "#{selinux_enabled}" ]; then
|
355
|
+
#{sudo} guestfish #{guestfs_selinux_arg} -a #{disk_path} -i <<- __EOF__
|
356
|
+
sh 'load_policy -i'
|
357
|
+
sh 'chcon unconfined_u:object_r:user_home_t:s0 /root/.ssh'
|
358
|
+
sh 'chcon system_u:object_r:ssh_home_t /root/.ssh/authorized_keys'
|
359
|
+
__EOF__
|
360
|
+
[ $? -eq 0 ] || { echo 'Error: unable to perform selinux operations on #{disk_path}'; exit 1; }
|
363
361
|
fi
|
364
362
|
|
365
363
|
#{sudo} virsh --connect=qemu:///system setmaxmem #{domain_name} #{instance_memory}
|
@@ -368,12 +366,12 @@ fi
|
|
368
366
|
|
369
367
|
}
|
370
368
|
retval=$?
|
371
|
-
if not retval.success?
|
369
|
+
if not retval.success?
|
372
370
|
puts out
|
373
371
|
raise KytoonException, "Failed to create instance #{inst_name}."
|
374
372
|
end
|
375
373
|
|
376
|
-
# lookup server IP here...
|
374
|
+
# lookup server IP here...
|
377
375
|
mac_addr = nil
|
378
376
|
network_name = nil
|
379
377
|
dom_xml = %x{#{sudo} virsh --connect=qemu:///system dumpxml #{domain_name}}
|
@@ -419,7 +417,7 @@ fi
|
|
419
417
|
}
|
420
418
|
puts out
|
421
419
|
retval=$?
|
422
|
-
if not retval.success?
|
420
|
+
if not retval.success?
|
423
421
|
puts out
|
424
422
|
raise KytoonException, "Failed to cleanup instances."
|
425
423
|
end
|
data/lib/kytoon/thor_tasks.rb
CHANGED
@@ -7,6 +7,8 @@ class ThorTasks < Thor
|
|
7
7
|
desc "create", "Create a new server group."
|
8
8
|
method_options :group_type => :string
|
9
9
|
method_options :group_config => :string
|
10
|
+
|
11
|
+
|
10
12
|
def create(options=(options or {}))
|
11
13
|
begin
|
12
14
|
ServerGroup.init(options[:group_type])
|
@@ -14,9 +16,11 @@ class ThorTasks < Thor
|
|
14
16
|
puts "Server group ID #{sg.id} created."
|
15
17
|
rescue KytoonException => ke
|
16
18
|
puts ke.message
|
19
|
+
exit 1
|
17
20
|
end
|
18
21
|
end
|
19
22
|
|
23
|
+
|
20
24
|
desc "list", "List existing server groups."
|
21
25
|
method_options :group_type => :string
|
22
26
|
def list(options=(options or {}))
|
@@ -25,6 +29,7 @@ class ThorTasks < Thor
|
|
25
29
|
ServerGroup.index()
|
26
30
|
rescue KytoonException => ke
|
27
31
|
puts ke.message
|
32
|
+
exit 1
|
28
33
|
end
|
29
34
|
end
|
30
35
|
|
@@ -38,6 +43,7 @@ class ThorTasks < Thor
|
|
38
43
|
sg.pretty_print
|
39
44
|
rescue KytoonException => ke
|
40
45
|
puts ke.message
|
46
|
+
exit 1
|
41
47
|
end
|
42
48
|
end
|
43
49
|
|
@@ -52,6 +58,7 @@ class ThorTasks < Thor
|
|
52
58
|
SshUtil.remove_known_hosts_ip(sg.gateway_ip)
|
53
59
|
rescue KytoonException => ke
|
54
60
|
puts ke.message
|
61
|
+
exit 1
|
55
62
|
end
|
56
63
|
end
|
57
64
|
|
@@ -65,13 +72,14 @@ class ThorTasks < Thor
|
|
65
72
|
puts sg.gateway_ip
|
66
73
|
rescue KytoonException => ke
|
67
74
|
puts ke.message
|
75
|
+
exit 1
|
68
76
|
end
|
69
77
|
end
|
70
78
|
|
71
79
|
desc "ssh", "SSH into a group."
|
72
80
|
method_options :group_id => :string
|
73
81
|
method_options :group_type => :string
|
74
|
-
def ssh(
|
82
|
+
def ssh(*)
|
75
83
|
begin
|
76
84
|
ServerGroup.init(options[:group_type])
|
77
85
|
args=ARGV[1, ARGV.length].join(" ")
|
@@ -84,6 +92,7 @@ class ThorTasks < Thor
|
|
84
92
|
exec("ssh -o \"StrictHostKeyChecking no\" root@#{sg.gateway_ip} #{args}")
|
85
93
|
rescue KytoonException => ke
|
86
94
|
puts ke.message
|
95
|
+
exit 1
|
87
96
|
end
|
88
97
|
end
|
89
98
|
|
data/lib/kytoon/util.rb
CHANGED
@@ -47,7 +47,7 @@ module Util
|
|
47
47
|
elsif File.exists?(File.join(ssh_dir, "id_dsa.pub"))
|
48
48
|
File.join(ssh_dir, "id_dsa.pub")
|
49
49
|
else
|
50
|
-
raise ConfigException, "Failed to load SSH key. Please
|
50
|
+
raise ConfigException, "Failed to load SSH key. Please run 'ssh-keygen'."
|
51
51
|
end
|
52
52
|
|
53
53
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kytoon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|
@@ -289,7 +289,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
289
289
|
version: '0'
|
290
290
|
segments:
|
291
291
|
- 0
|
292
|
-
hash:
|
292
|
+
hash: 3688137143086163860
|
293
293
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
294
294
|
none: false
|
295
295
|
requirements:
|