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

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

Take out do-not-run line - the script works, at least for a simple
case

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