source: trunk/scripts/xvm-migrate-machine @ 1627

Last change on this file since 1627 was 1627, checked in by broder, 15 years ago

Print out some debugging info about the VM getting migrated - just in
case

File size: 3.2 KB
Line 
1#!/bin/python
2# Migrates the machine passed as arguments from the dev cluster.
3# To be run on the prod cluster.
4
5## The present version is NOT A REAL SCRIPT.
6## Things may not even be tested.  Copy and paste.
7not_ready_yet_do_not_run_me
8
9from invirt import remctl as r
10from lib import database
11import subprocess
12import sys
13
14dev_db_uri = 'postgres://sipb-xen@sipb-xen-dev.mit.edu/sipb_xen'
15database.connect(dev_db_uri)
16dev_sess = database.session
17
18database.connect()
19prod_sess = database.session
20
21## dump from dev db
22def take_data(machine_name):
23  dev_sess.begin()
24  machine = dev_sess.query(database.Machine).filter_by(name=machine_name).one()
25 
26  # Clean out the ACL just so we don't have to think about it
27  machine.acl = []
28  dev_sess.update(machine)
29 
30  print 'VM Info:'
31  print '  name: %s' % machine.name
32  print '  description: %s' % machine.description
33  print '  cpus: %s' % machine.cpus
34  print '  memory: %s' % machine.memory
35  print '  owner: %s' % machine.owner
36  print '  contact: %s' % machine.contact
37  print '  administrator: %s' % machine.administrator
38  print '  uuid: %s' % machine.uuid
39  print '  type: %s' % machine.type.type_id
40  print '  autorestart: %s' % machine.autorestart
41  print '  adminable: %s' % machine.adminable
42  print '  Disks:'
43  for disk in machine.disks:
44    print '  - %s (%s)' % (disk.guest_device_name, disk.size)
45  print '  NICs:'
46  for nic in machine.nics:
47    print '  - %s, %s, %s' % (nic.mac_addr, nic.ip, nic.hostname)
48  print '==============================================='
49  print
50 
51  disks = machine.disks
52  nics = machine.nics
53  for r in disks + nics + [machine]:
54    dev_sess.delete(r)
55 
56  dev_sess.commit()
57 
58  for r in disks + nics + [machine]:
59    dev_sess.expunge(r)
60    del r._instance_key
61 
62  return machine
63
64## add to prod db
65def restore_data(machine):
66  # The machine's type is still the one attached to the dev database;
67  # get the right one
68  machine.type = prod_sess.query(database.Type).filter_by(type_id=machine.type.type_id).one()
69  prod_sess.begin()
70  prod_sess.save(machine)
71  prod_sess.commit()
72 
73def migrate_vm(machine_name):
74  # Power off the VM on dev
75  #
76  # This has to be done first, because once the machine is deleted
77  # from the database, we can't remctl for it anymore
78  out, err = r.remctl('xvm-remote.mit.edu', 'control', machine_name, 'destroy', err=True)
79  print out
80 
81  machine = take_data(machine_name)
82 
83  ## copy disk image... copy, copy...
84  for disk in machine.disks:
85    lvname='d_%s_%s' % (machine.name, disk.guest_device_name)
86   
87    subprocess.check_call(['lvcreate', '-L%sM' % str(disk.size), '-n', lvname, 'xenvg'])
88   
89    ssh = subprocess.Popen(['ssh', '-o', 'GSSAPIDelegateCredentials=no',
90                'torchwood-institute.mit.edu',
91                'dd', 'if=/dev/xenvg/%s' % lvname, 'bs=1M'],
92                 stdout=subprocess.PIPE)
93    dd = subprocess.Popen(['dd', 'of=/dev/xenvg/%s' % lvname, 'bs=1M'],
94                stdin=ssh.stdout)
95    dd.wait()
96 
97  restore_data(machine)
98
99if __name__ == '__main__':
100  for vm in sys.argv[1:]:
101    print '==============================================='
102    print 'Migrating %s' % vm
103    print '==============================================='
104    migrate_vm(vm.strip())
Note: See TracBrowser for help on using the repository browser.