Merge lp:~serge-hallyn/auto-upgrade-testing/uvtool into lp:~auto-upgrade-testing-dev/auto-upgrade-testing/trunk

Proposed by Serge Hallyn
Status: Needs review
Proposed branch: lp:~serge-hallyn/auto-upgrade-testing/uvtool
Merge into: lp:~auto-upgrade-testing-dev/auto-upgrade-testing/trunk
Diff against target: 472 lines (+117/-226)
5 files modified
AutoUpgradeTester/UpgradeTestBackendQemu.py (+103/-219)
debian/changelog (+7/-0)
debian/control (+1/-1)
share/profiles/user-data-script (+5/-0)
share/scripts/jeos-create-base-image (+1/-6)
To merge this branch: bzr merge lp:~serge-hallyn/auto-upgrade-testing/uvtool
Reviewer Review Type Date Requested Status
Jean-Baptiste Lallement Needs Fixing
Review via email: mp+207350@code.launchpad.net

Description of the change

Convert from using vmbuilder and manual qemu commands,
to using uvtool, which uses libvirt to manage vms and
cloud-images as base.

To post a comment you must log in.
99. By Serge Hallyn

updates (addressing rharper's feedback):

1. use --disk option to uvt-kvm create to set disk size
2. remove debug statements
3. add --unsafe-caching to arguments
4. comment that the snapshot functions are not implemented.
   I don't know whether they are used or not - if not they
   should indeed be dropped, else they should be implemented
   using virsh.
5. replace the 'while True: self._runInImage(["/bin/true']) loop
   with uvt-kvm wait
6. remove remaining 'sudo's in commands (leftover from earlier
   attempt)

100. By Serge Hallyn

remove 30 second sleep, and always wait 5 seconds before uvt-kvm wait.

Revision history for this message
Serge Hallyn (serge-hallyn) wrote :

I've addressed some feedback from rharper and pushed the result.

I still need to implement the snapshotting, then I believe it will be at feature parity.

101. By Serge Hallyn

implement snapshotting

Revision history for this message
Jean-Baptiste Lallement (jibel) wrote :

Thanks for your work on this.

I tried your patch on Trusty with upgrade from P->T and S->T

1. The name of the domain should be unique per profile instead of the fixed value "auto-upgrade-tester". Otherwise it is not possible to run several distinct profiles in parallel i.e set it to self.profilename (defined later in __init__())

2. Right after the upgrade is started, the following message is displayed:
----
Domain auto-upgrade-tester started

Warning: Permanently added '192.168.122.236' (ECDSA) to the list of known hosts.
Permission denied (publickey).
----

Then, uvt-kvm crashes
I filed https://bugs.launchpad.net/uvtool/+bug/1287140

3. Line 377 there is a small error
@@ -374,7 +374,7 @@
         # we sleep 5 seconds in the hopes of avoiding any dnsmasq
         # race.
         time.sleep(5)
- subprocess.call(["uvt-kvm", "wait", "--insecure", "self.name"])
+ subprocess.call(["uvt-kvm", "wait", "--insecure", self.name])

4. Release upgrade is executed but not the post upgrade tests.

5. I cancelled a run then restarted another profile and the domain never started.

review: Needs Fixing
102. By Serge Hallyn

use profilename as vm name

103. By Serge Hallyn

fix typo pointed out by jibel - remove quotes from "self.name"

Revision history for this message
Serge Hallyn (serge-hallyn) wrote :

Thanks, jibel, I've addressed 1 and 3. I can't see in my diff what I might have done to cause 4 to happen. do you have any ideas?

With the changes I made, I ran two consecutive runs, as well as two simultaneous runs (using server and server-amd64), and all did start. Perhaps #1 was to blame for #5 originally? Could you give it another try?

Unmerged revisions

103. By Serge Hallyn

fix typo pointed out by jibel - remove quotes from "self.name"

102. By Serge Hallyn

use profilename as vm name

101. By Serge Hallyn

implement snapshotting

100. By Serge Hallyn

remove 30 second sleep, and always wait 5 seconds before uvt-kvm wait.

99. By Serge Hallyn

updates (addressing rharper's feedback):

1. use --disk option to uvt-kvm create to set disk size
2. remove debug statements
3. add --unsafe-caching to arguments
4. comment that the snapshot functions are not implemented.
   I don't know whether they are used or not - if not they
   should indeed be dropped, else they should be implemented
   using virsh.
5. replace the 'while True: self._runInImage(["/bin/true']) loop
   with uvt-kvm wait
6. remove remaining 'sudo's in commands (leftover from earlier
   attempt)

98. By Serge Hallyn

Switch from using vm-builder and manual qemu command-lines to using
the libvirt and ubuntu-cloud-image based uvtool. (LP: #1261416)

With this patch I was able to do a full run of
./bin/auto-upgrade-tester share/profiles/server . It ended with:

======================================================================
FAIL: test_dpkgdist (__main__.TestConfFiles)
Check for existence of *.dpkg-dist files
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/test_conffiles.py", line 76, in test_dpkgdist
self.assertEqual(dpkgdist_files, [])
AssertionError: Lists differ: ['/etc/default/rcS.dpkg-dist'] != []

First list contains 1 additional elements.
First extra element 0:
/etc/default/rcS.dpkg-dist

- ['/etc/default/rcS.dpkg-dist']
+ []

which could have been a legitimate test result, or, (just as likely)
the result of something I did not convert correctly.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'AutoUpgradeTester/UpgradeTestBackendQemu.py'
2--- AutoUpgradeTester/UpgradeTestBackendQemu.py 2014-02-28 11:18:49 +0000
3+++ AutoUpgradeTester/UpgradeTestBackendQemu.py 2014-03-05 04:14:53 +0000
4@@ -27,11 +27,6 @@
5 except ImportError:
6 from DistUpgrade.utils import is_port_already_listening
7
8-# images created with http://bazaar.launchpad.net/~mvo/ubuntu-jeos/mvo
9-# ./ubuntu-jeos-builder --vm kvm --kernel-flavor generic --suite feisty --ssh-key `pwd`/ssh-key.pub --components main,restricted --rootsize 20G
10-#
11-
12-
13 # TODO:
14 # - add support to boot certain images with certain parameters
15 # (dapper-386 needs qemu/kvm with "-no-acpi" to boot reliable)
16@@ -64,92 +59,93 @@
17 class UpgradeTestBackendQemu(UpgradeTestBackendSSH):
18 " qemu/kvm backend - need qemu >= 0.9.0"
19
20- QEMU_DEFAULT_OPTIONS = [
21- "-monitor","stdio",
22- "-localtime",
23- "-no-reboot", # exit on reboot
24- # "-no-kvm", # crashes sometimes with kvm HW
25- ]
26+ def _runInImage(self, command, **kwargs):
27+ ret = self._runInImageAsUser("root", command, **kwargs)
28+ return ret
29+
30+ def _getIp(self):
31+ ret = 1
32+ while ret == 1:
33+ ret = 0
34+ try:
35+ with open(os.devnull, 'wb') as null_file:
36+ self.ip = subprocess.check_output(["uvt-kvm", "ip", self.name], stderr = null_file)
37+ self.ip = self.ip.decode().strip()
38+ except:
39+ print("setting ret to 1 and re-trying to get ip\n")
40+ time.sleep(20)
41+ ret = 1
42+
43+ def _runInImageAsUser(self, user, command, **kwargs):
44+ "run a given command in the image"
45+ ip = self._getIp()
46+ cmd = ["ssh",
47+ "-l", user,
48+ "-q","-q", # shut it up
49+ "-i",self.ssh_key,
50+ "-o", "StrictHostKeyChecking=no",
51+ "-o", "BatchMode=yes", self.ip,
52+ ]+command
53+ ret=subprocess.call(cmd, universal_newlines=True, **kwargs)
54+ return 0
55+
56+ def _copyFromImage(self, fromF, toF):
57+#XXX This needs to be fixed to handle ubuntu login
58+ "copy a file from the given fromF image location"
59+ cmd = ["scp",
60+ "-l",self.ssh_port,
61+ "-q","-q", # shut it up
62+ "-i",self.ssh_key,
63+ "-o", "StrictHostKeyChecking=no",
64+ "-o", "UserKnownHostsFile=%s" % os.path.dirname(self.profile)+"/known_hosts",
65+ "root@%s:%s" % (self.ssh_hostname, fromF),
66+ toF
67+ ]
68+ ret = subprocess.call(cmd)
69+ return ret
70
71 def __init__(self, profile):
72 UpgradeTestBackendSSH.__init__(self, profile)
73- self.qemu_options = self.QEMU_DEFAULT_OPTIONS[:]
74+ self.profilename = self.config.get("NonInteractive","ProfileName")
75+ self.name = "adt-%s" % self.profilename
76+ self.ssh_port = "22"
77 self.qemu_pid = None
78 self.profiledir = profile
79 self.profile_override = os.path.join(
80 self.profiledir, "..", "override.cfg.d")
81- # get the kvm binary
82- self.qemu_binary = self.config.getWithDefault("KVM","KVM","kvm")
83 # setup mount dir/imagefile location
84- self.baseimage = self.config.get("KVM", "BaseImage")
85- if not os.path.exists(self.baseimage):
86- print("Missing '%s' base image, need to build it now" % self.baseimage)
87+ ret = subprocess.call(["virsh", "domuuid", self.name])
88+ if ret != 0:
89+ print("Missing '%s' base image, need to build it now" % self.name)
90 arch = self.config.getWithDefault("KVM", "Arch", "i386")
91 rootsize = self.config.getWithDefault("KVM", "RootSize", "80000")
92- destdir = "ubuntu-kvm-%s-%s" % (arch, self.fromDist)
93- ret = subprocess.call(["sudo",
94- "ubuntu-vm-builder","kvm", self.fromDist,
95- "--kernel-flavour", "generic",
96- "--ssh-key", "%s.pub" % self.ssh_key ,
97- "--components", "main,restricted",
98- "--rootsize", rootsize,
99- "--addpkg", "openssh-server",
100- "--addpkg", "linux-image-generic",
101- "--destdir", destdir,
102- "--arch", arch])
103- # move the disk in place, ubuntu-vm-builder uses a random filename
104- shutil.move(glob.glob("%s/*.qcow2" % destdir)[0],
105- self.baseimage)
106- # remove old tree to ensure that subsequent runs work
107- shutil.rmtree(destdir)
108+ rootsize = str( int( int(rootsize)/1000 ) )
109+ cmd = ["uvt-simplestreams-libvirt", "sync", "release=%s" % self.fromDist, "arch=%s" % arch]
110+ print("Running: %s" % cmd)
111+ ret = subprocess.call(cmd)
112+ if ret != 0:
113+ # the development release may have to come from the daily stream
114+ cmd = ["uvt-simplestreams-libvirt", "sync",
115+ "--source", "http://cloud-images.ubuntu.com/daily",
116+ "release=%s" % self.fromDist, "arch=%s" % arch]
117+ print("Running: %s" % cmd)
118+ ret = subprocess.call(cmd)
119+ if ret != 0:
120+ raise NoImageFoundException
121+ user_data_script = os.path.join(self.profiledir, "..", "user-data-script")
122+ self.ssh_pub_key = "%s.pub" % self.ssh_key
123+ cmd = ["uvt-kvm", "create", self.name, "release=%s" % self.fromDist,
124+ "arch=%s" % arch, "--disk", rootsize,
125+ "--ssh-public-key-file", self.ssh_pub_key, '--unsafe-caching',
126+ '--run-script-once', user_data_script ]
127+ print("Running: %s" % cmd)
128+ ret = subprocess.call(cmd)
129 if ret != 0:
130 raise NoImageFoundException
131- # check if we want virtio here and default to yes
132- try:
133- self.virtio = self.config.getboolean("KVM","Virtio")
134- except configparser.NoOptionError:
135- self.virtio = True
136- if self.virtio:
137- self.qemu_options.extend(["-net","nic,model=virtio"])
138- self.qemu_options.extend(["-net","user"])
139- # swapimage
140- if self.config.getWithDefault("KVM","SwapImage",""):
141- self.qemu_options.append("-hdb")
142- self.qemu_options.append(self.config.get("KVM","SwapImage"))
143- # regular image
144- self.profilename = self.config.get("NonInteractive","ProfileName")
145- imagedir = self.config.get("KVM","ImageDir")
146- self.image = os.path.join(imagedir, "test-image.%s" % self.profilename)
147- # make ssh login possible (localhost 54321) available
148- ssh_port = int(self.config.getWithDefault("KVM","SshPort","54321"))
149- (self.ssh_lock, ssh_port) = self.getFreePort(port_base=ssh_port)
150- if not self.ssh_lock:
151- raise NoPortsException("Couldn't allocate SSH port.")
152- self.ssh_port = str(ssh_port)
153- print("using ssh port: %s" % self.ssh_port)
154- self.ssh_hostname = "localhost"
155- self.qemu_options.append("-redir")
156- self.qemu_options.append("tcp:%s::22" % self.ssh_port)
157- # vnc port/display
158- VNC_BASE_PORT = 5900
159- vncport = int(self.config.getWithDefault("KVM","VncNum", "0")) + VNC_BASE_PORT
160- (self.vnc_lock, vncport) = self.getFreePort(port_base=vncport)
161- if not self.vnc_lock:
162- raise NoPortsException("Couldn't allocate VNC port.")
163- print("using VncNum: %s" % vncport)
164- self.qemu_options.append("-vnc")
165- self.qemu_options.append("localhost:%s" % str(vncport - VNC_BASE_PORT))
166-
167- # make the memory configurable
168- mem = self.config.getWithDefault("KVM","VirtualRam","1536")
169- self.qemu_options.append("-m")
170- self.qemu_options.append(str(mem))
171-
172- # check if the ssh port is in use
173- if subprocess.call("netstat -t -l -n |grep 0.0.0.0:%s" % self.ssh_port,
174- shell=True) == 0:
175- raise PortInUseException("the port is already in use (another upgrade tester is running?)")
176- # register exit handler to ensure that we quit kvm on exit
177+ self.vm_Wait()
178+ self._getIp()
179+ print("Got ip address!\n");
180+ self.ssh_hostname = self.ip
181 atexit.register(self.stop)
182
183 def __del__(self):
184@@ -157,11 +153,7 @@
185 Destructor
186 Clean-up lockfiles
187 """
188- for lock in (self.ssh_lock, self.vnc_lock):
189- lockpath = lock.name
190- print("Releasing lock: %s" % lockpath)
191- lock.close()
192- os.unlink(lockpath)
193+ subprocess.call(["uvt-kvm", "destroy", self.name])
194
195 def genDiff(self):
196 """
197@@ -191,11 +183,6 @@
198 # way to do this currently without running as root
199 # as a workaround we regenerate manually every now and then
200 # and use UpgradeFromDistOnBootstrap=true here
201- self.config.set("KVM","CacheBaseImage", "false")
202- self.config.set("NonInteractive","UpgradeFromDistOnBootstrap","true")
203- self.baseimage = "jeos/%s-i386.qcow2" % self.config.get("Sources","To")
204- self.image = diff_image
205- print("bootstrapping into %s" % diff_image)
206 self.bootstrap()
207 print("bootstrap finished")
208 self.start()
209@@ -215,25 +202,6 @@
210 def bootstrap(self, force=False):
211 print("bootstrap()")
212
213- # move old crash files away so that test() is not
214- # confused by them
215- for f in glob.glob(self.resultdir+"/*.crash"):
216- shutil.move(f, f+".old")
217-
218- # copy image into place, use baseimage as template
219- # we expect to be able to ssh into the baseimage to
220- # set it up
221- if (not force and
222- os.path.exists("%s.%s" % (self.image,self.fromDist)) and
223- self.config.has_option("KVM","CacheBaseImage") and
224- self.config.getboolean("KVM","CacheBaseImage")):
225- print("Not bootstrapping again, we have a cached BaseImage")
226- shutil.copy("%s.%s" % (self.image,self.fromDist), self.image)
227- return True
228-
229- print("Building new image '%s' based on '%s'" % (self.image, self.baseimage))
230- shutil.copy(self.baseimage, self.image)
231-
232 # get common vars
233 basepkg = self.config.get("NonInteractive","BasePkg")
234 additional_base_pkgs = self.config.getlist("Distro","BaseMetaPkgs")
235@@ -373,11 +341,6 @@
236 ret = self._runInImage(["DEBIAN_FRONTEND=noninteractive","apt-get","-y","dist-upgrade"])
237 assert ret == 0, "dist-upgrade returned %s" % ret
238
239- # vm-builder still installs old grub 1, update to grub2
240- print("Installing grub 2")
241- ret = self._runInImage(["grub-install","/dev/sda"])
242- assert ret == 0
243-
244 print("Cleaning image")
245 ret = self._runInImage(["apt-get","clean"])
246 assert ret == 0, "apt-get clean returned %s" % ret
247@@ -389,90 +352,42 @@
248
249 # done with the bootstrap
250 self.stop()
251-
252- # copy cache into place (if needed)
253- if (self.config.has_option("KVM","CacheBaseImage") and
254- self.config.getboolean("KVM","CacheBaseImage")):
255- shutil.copy(self.image, "%s.%s" % (self.image,self.fromDist))
256-
257 return True
258
259 def saveVMSnapshot(self,name):
260- # savevm
261- print("savevm")
262- self.stop()
263- shutil.copy(self.image, self.image+"."+name)
264- return
265- # *sigh* buggy :/
266- #self.qemu_pid.stdin.write("stop\n")
267- #self.qemu_pid.stdin.write("savevm %s\n" % name)
268- #self.qemu_pid.stdin.write("cont\n")
269+ cmd = ["virsh", "snapshot-create-as", self.name, name]
270+ subprocess.call(cmd)
271+
272 def delVMSnapshot(self,name):
273- print("delvm")
274- self.qemu_pid.stdin.write("delvm %s\n" % name)
275+ cmd = ["virsh", "snapshot-delete", self.name, name]
276+ subprocess.call(cmd)
277+
278 def restoreVMSnapshot(self,name):
279- print("restorevm")
280- self.stop()
281- shutil.copy(self.image+"."+name, self.image)
282- return
283- # loadvm
284- # *sigh* buggy :/
285- #self.qemu_pid.stdin.write("stop\n")
286- #self.qemu_pid.stdin.write("loadvm %s\n" % name)
287- #self.qemu_pid.stdin.write("cont\n")
288+ cmd = ["virsh", "snapshot-revert", self.name, name]
289+ subprocess.call(cmd)
290+
291+ def vm_isActive(self):
292+ output = subprocess.getoutput("virsh domstate %s" % self.name)
293+ return output.strip() == "running"
294+
295+ def vm_Wait(self):
296+ # we sleep 5 seconds in the hopes of avoiding any dnsmasq
297+ # race.
298+ time.sleep(5)
299+ subprocess.call(["uvt-kvm", "wait", "--insecure", self.name])
300
301 def start(self):
302- if self.qemu_pid != None:
303- print("already running")
304+ # Should we just use uvt-kvm wait $host here?
305+ if self.vm_isActive():
306 return True
307- # mvo: disabled for now, hardy->lucid does not work well with it
308- # (random hangs)
309- #if self.virtio:
310- # drive = ["-drive", "file=%s,if=virtio,boot=on" % self.image]
311- #else:
312- drive = ["-hda", self.image]
313- # build cmd
314- cmd = [self.qemu_binary]+drive+self.qemu_options
315- print("Starting %s" % cmd)
316- self.qemu_pid = subprocess.Popen(cmd, stdin=subprocess.PIPE)
317- # spin here until ssh has come up and we can login
318- now = time.time()
319- while True:
320- if self.qemu_pid.poll():
321- res = self.qemu_pid.wait()
322- print("qemu stopped unexpectedly with exit code '%s'" % res)
323- return False
324- time.sleep(1)
325- if self._runInImage(["/bin/true"]) == 0:
326- break
327- if (time.time() - now) > 900:
328- print("Could not start image after 900s, exiting")
329- return False
330+ ret = subprocess.call(["virsh", "start", self.name])
331+ if ret != 0:
332+ print("%s failed to start" % self.name)
333+ self.vm_Wait()
334 return True
335
336 def stop(self):
337- " we stop because we run with -no-reboot"
338- print("stop")
339- if self.qemu_pid:
340- print("stop pid: ", self.qemu_pid)
341- self._runInImage(["/sbin/reboot"])
342- print("waiting for qemu to shutdown")
343- for i in range(600):
344- if self.qemu_pid.poll() is not None:
345- print("poll() returned")
346- break
347- time.sleep(1)
348- else:
349- print("Not stopped after 600s, killing ")
350- try:
351- os.kill(int(self.qemu_pid.pid), 15)
352- time.sleep(10)
353- os.kill(int(self.qemu_pid.pid), 9)
354- except Exception as e:
355- print("FAILED to kill %s '%s'" % (self.qemu_pid, e))
356- self.qemu_pid = None
357- print("qemu stopped")
358-
359+ subprocess.call(["virsh", "destroy", self.name])
360
361 def _force_dpkg_unsafe_io(self):
362 print("Adding dpkg force-unsafe-io")
363@@ -522,12 +437,12 @@
364 sources.load(test_repo)
365 # add the uri to the list of valid mirros in the image
366 self._runInImage(["mkdir","-p","/upgrade-tester"])
367- self._runInImage(["echo -e '[Sources]\nValidMirrors=/upgrade-tester/new_mirrors.cfg' > /etc/update-manager/release-upgrades.d/new_mirrors.cfg"])
368+ self._runInImage(["echo -e '[Sources]\nValidMirrors=/upgrade-tester/new_mirrors.cfg' | tee /etc/update-manager/release-upgrades.d/new_mirrors.cfg"])
369 for entry in sources.list:
370 if (not (entry.invalid or entry.disabled) and
371 entry.type == "deb"):
372 print("adding %s to mirrors" % entry.uri)
373- self._runInImage(["echo '%s' >> /upgrade-tester/new_mirrors.cfg" % entry.uri])
374+ self._runInImage(["echo '%s' | tee -a /upgrade-tester/new_mirrors.cfg" % entry.uri])
375
376 # upgrade *before* the regular upgrade runs
377 if self.config.getWithDefault("NonInteractive", "AddRepoUpgradeImmediately", False):
378@@ -576,37 +491,6 @@
379 self.stop()
380 return (ret == 0)
381
382- def getFreePort(self, port_base=1025, prefix='auto-upgrade-tester'):
383- """ Find a free port and lock it when found
384- :param port_base: Base port number.
385- :param prefix: Prefix name for the lock
386- :return: (lockfile, portnumber)
387- """
388-
389- # allows the system to be configurable
390- lockdir = "/var/lock"
391-
392- for port_inc in range(0, 100):
393- port_num = port_base + port_inc
394- if is_port_already_listening(port_num):
395- print("Port %d already in use. Skipping!" % port_num)
396- continue
397-
398- lockfilepath = os.path.join(lockdir, '%s.%d.lock' % (prefix, port_num))
399- # FIXME: we can use apt_pkg.get_lock() here instead
400- if not os.path.exists(lockfilepath):
401- open(lockfilepath, 'w').close()
402- lock = open(lockfilepath, 'r+')
403- try:
404- fcntl.flock(lock, fcntl.LOCK_EX|fcntl.LOCK_NB)
405- return (lock, port_num)
406- except IOError:
407- print("Port %d already locked. Skipping!" % port_num)
408- lock.close()
409-
410- print("No free port found. Aborting!")
411- return (None, None)
412-
413 if __name__ == "__main__":
414
415 # FIXME: very rough proof of conecpt, unify with the chroot
416
417=== modified file 'debian/changelog'
418--- debian/changelog 2013-01-19 14:25:40 +0000
419+++ debian/changelog 2014-03-05 04:14:53 +0000
420@@ -1,3 +1,10 @@
421+auto-upgrade-testing (1:0.167) UNRELEASED; urgency=medium
422+
423+ * Switch from using vm-builder and manual qemu command-lines to using
424+ the libvirt and ubuntu-cloud-image based uvtool. (LP: #1261416)
425+
426+ -- Serge Hallyn <serge.hallyn@ubuntu.com> Wed, 19 Feb 2014 22:08:10 -0600
427+
428 auto-upgrade-testing (1:0.166) raring; urgency=low
429
430 [ Adam Conrad ]
431
432=== modified file 'debian/control'
433--- debian/control 2013-01-19 14:25:40 +0000
434+++ debian/control 2014-03-05 04:14:53 +0000
435@@ -19,7 +19,7 @@
436 python3-distupgrade,
437 lsb-release
438 Recommends: qemu-system (>= 1.3.0) | qemu-kvm | kvm,
439- ubuntu-vm-builder,
440+ uvtool, uvtool-libvirt,
441 python3-lxc
442 Suggests: default-jre-headless | java2-runtime-headless, lxc
443 Description: Test release upgrades in a virtual environment
444
445=== added file 'share/profiles/user-data-script'
446--- share/profiles/user-data-script 1970-01-01 00:00:00 +0000
447+++ share/profiles/user-data-script 2014-03-05 04:14:53 +0000
448@@ -0,0 +1,5 @@
449+#!/bin/bash
450+mkdir -p /root/.ssh
451+chmod 700 /root/.ssh
452+cp /home/ubuntu/.ssh/authorized_keys /root/.ssh/authorized_keys
453+chown root: /root/.ssh/authorized_keys
454
455=== modified file 'share/scripts/jeos-create-base-image'
456--- share/scripts/jeos-create-base-image 2012-06-11 21:27:15 +0000
457+++ share/scripts/jeos-create-base-image 2014-03-05 04:14:53 +0000
458@@ -9,13 +9,8 @@
459 exit 1
460 fi
461
462-# check depends
463-if [ ! -f /usr/bin/ubuntu-vm-builder ]; then
464- apt-get install -y ubuntu-vm-builder
465-fi
466-
467 if [ ! -f /usr/bin/kvm ]; then
468- apt-get install -y kvm
469+ apt-get install -y qemu-kvm uvtool uvtool-libvirt
470 fi
471
472 # create a default ssh key

Subscribers

People subscribed via source and target branches