167f0893c86f3898fc9c5828af10edd07d9b73adbmbligh#!/usr/bin/python
267f0893c86f3898fc9c5828af10edd07d9b73adbmbligh# Copyright Google, Martin J. Bligh <mbligh@google.com>, Jan 2009
367f0893c86f3898fc9c5828af10edd07d9b73adbmblighimport os, sys
467f0893c86f3898fc9c5828af10edd07d9b73adbmblighimport common
567f0893c86f3898fc9c5828af10edd07d9b73adbmblighfrom autotest_lib.server import frontend
667f0893c86f3898fc9c5828af10edd07d9b73adbmbligh
767f0893c86f3898fc9c5828af10edd07d9b73adbmblightry:
867f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    old = frontend.AFE(web_server='http://' + sys.argv[1])
967f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    new = frontend.AFE(web_server='http://' + sys.argv[2])
1067f0893c86f3898fc9c5828af10edd07d9b73adbmbligh
1167f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    hostname = sys.argv[3]
1267f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    print 'Migrating %s ...' % hostname
1367f0893c86f3898fc9c5828af10edd07d9b73adbmbligh
1467f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    old_host = old.get_hosts(hostname=hostname)[0]
1567f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    print old_host
1667f0893c86f3898fc9c5828af10edd07d9b73adbmblighexcept Exception:
1767f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    print "Usage: atest_migrate_host <old_server> <new_server> <hostname>"
1867f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    raise
1967f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    sys.exit(1)
2067f0893c86f3898fc9c5828af10edd07d9b73adbmbligh
2167f0893c86f3898fc9c5828af10edd07d9b73adbmbligh
2267f0893c86f3898fc9c5828af10edd07d9b73adbmbligh# Create host
2367f0893c86f3898fc9c5828af10edd07d9b73adbmbligh
246463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mblighnew_host = new.create_host(hostname=hostname, locked=True)
2567f0893c86f3898fc9c5828af10edd07d9b73adbmbligh
2667f0893c86f3898fc9c5828af10edd07d9b73adbmbligh# Deal with labels
2767f0893c86f3898fc9c5828af10edd07d9b73adbmblighold_host_labels = old_host.get_labels()
2867f0893c86f3898fc9c5828af10edd07d9b73adbmblighfor label in old_host_labels:
2967f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    # Create any non-existant labels
3067f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    if not new.get_labels(name=label.name):
3167f0893c86f3898fc9c5828af10edd07d9b73adbmbligh        print label
3267f0893c86f3898fc9c5828af10edd07d9b73adbmbligh        new_label = new.create_label(name=label.name,
339c5fbbe29ab7ca7f8b69687de08a55c518378ae7MK Ryu                                     platform=label.platform,
349c5fbbe29ab7ca7f8b69687de08a55c518378ae7MK Ryu                                     only_if_needed=label.only_if_needed)
3567f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    # Add any missing labels to the machine
3667f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    if not [l for l in new_host.get_labels() if l.name == label.name]:
3767f0893c86f3898fc9c5828af10edd07d9b73adbmbligh        new_host.add_labels([label.name])
3867f0893c86f3898fc9c5828af10edd07d9b73adbmbligh
3967f0893c86f3898fc9c5828af10edd07d9b73adbmbligh# Deal with ACLs
4067f0893c86f3898fc9c5828af10edd07d9b73adbmblighold_host_acls = [a for a in old_host.get_acls() if a.name != 'Everyone']
4167f0893c86f3898fc9c5828af10edd07d9b73adbmblighnew_users = [user.login for user in new.get_users()]
4267f0893c86f3898fc9c5828af10edd07d9b73adbmbligh
4367f0893c86f3898fc9c5828af10edd07d9b73adbmblighfor acl in old_host_acls:
4467f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    # Create any non-existant ACLs
456463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh    new_acls = new.get_acls(name=acl.name)
466463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh    if new_acls:
476463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh        new_acl = new_acls[0]
486463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh    else:
4967f0893c86f3898fc9c5828af10edd07d9b73adbmbligh        new_acl = new.create_acl(name=acl.name, description=acl.description)
506463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh    # Add any users to the ACL that we can
516463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh    for user in acl.users:
526463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh        if user in new_users:
536463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh            new_acl.add_users([user])
546463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh        else:
556463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh            print 'Skipping absent user %s' % user
5667f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    # Add any missing ACLs to the machine
5767f0893c86f3898fc9c5828af10edd07d9b73adbmbligh    if not [a for a in new_host.get_acls() if a.name == acl.name]:
5867f0893c86f3898fc9c5828af10edd07d9b73adbmbligh        new_host.add_acl(acl.name)
5967f0893c86f3898fc9c5828af10edd07d9b73adbmbligh
606463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh# Enable the new host
616463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mblighif not old_host.locked:
626463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh    new_host.modify(locked=False)
636463c4b7454f1fe128e1dcdfe71baf0ed7e5bfc2mbligh
6467f0893c86f3898fc9c5828af10edd07d9b73adbmbligh# Delete host from old server
6567f0893c86f3898fc9c5828af10edd07d9b73adbmblighold_host.delete()
66