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

Last change on this file since 1640 was 1633, checked in by broder, 16 years ago

Cancel the migration if there's an error in the middle

  • Property svn:executable set to *
File size: 3.4 KB
Line 
1#!/usr/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, session):
62  # The machine's type is still the one attached to the dev database;
63  # get the right one
64  machine.type = session.query(database.Type).filter_by(type_id=machine.type.type_id).one()
65  session.begin()
66  session.save(machine)
67  session.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  success = True
80  ## copy disk image... copy, copy...
81  for disk in machine.disks:
82    lvname='d_%s_%s' % (machine.name, disk.guest_device_name)
83   
84    if 0 != subprocess.call(['lvcreate', '-L%sM' % str(disk.size), '-n', lvname, 'xenvg']):
85      success = False
86      break
87   
88    ssh = subprocess.Popen(['ssh', '-o', 'GSSAPIDelegateCredentials=no',
89                'torchwood-institute.mit.edu',
90                'dd', 'if=/dev/xenvg/%s' % lvname, 'bs=1M'],
91                 stdout=subprocess.PIPE)
92    dd = subprocess.Popen(['dd', 'of=/dev/xenvg/%s' % lvname, 'bs=1M'],
93                stdin=ssh.stdout)
94    if 0 != dd.wait():
95      success = False
96      break
97    if 0 != ssh.wait():
98      success = False
99      break
100 
101  if not success:
102    restore_data(machine, dev_sess)
103   
104    print '==============================================='
105    print 'ERROR: VM %s failed to migrate' % machine.name
106    print '==============================================='
107  else:
108    restore_data(machine, prod_sess)
109
110if __name__ == '__main__':
111  for vm in sys.argv[1:]:
112    print '==============================================='
113    print 'Migrating %s' % vm
114    print '==============================================='
115    migrate_vm(vm.strip())
Note: See TracBrowser for help on using the repository browser.