#!/usr/bin/python
# Copyright Google, Martin J. Bligh <mbligh@google.com>, Jan 2009
import os, sys
import common
from autotest_lib.server import frontend

try:
    old = frontend.AFE(web_server='http://' + sys.argv[1])
    new = frontend.AFE(web_server='http://' + sys.argv[2])

    hostname = sys.argv[3]
    print 'Migrating %s ...' % hostname

    old_host = old.get_hosts(hostname=hostname)[0]
    print old_host
except Exception:
    print "Usage: atest_migrate_host <old_server> <new_server> <hostname>"
    raise
    sys.exit(1)


# Create host

new_host = new.create_host(hostname=hostname, locked=True)

# Deal with labels
old_host_labels = old_host.get_labels()
for label in old_host_labels:
    # Create any non-existant labels
    if not new.get_labels(name=label.name):
        print label
        new_label = new.create_label(name=label.name,
                                     platform=label.platform,
                                     only_if_needed=label.only_if_needed)
    # Add any missing labels to the machine
    if not [l for l in new_host.get_labels() if l.name == label.name]:
        new_host.add_labels([label.name])

# Deal with ACLs
old_host_acls = [a for a in old_host.get_acls() if a.name != 'Everyone']
new_users = [user.login for user in new.get_users()]

for acl in old_host_acls:
    # Create any non-existant ACLs
    new_acls = new.get_acls(name=acl.name)
    if new_acls:
        new_acl = new_acls[0]
    else:
        new_acl = new.create_acl(name=acl.name, description=acl.description)
    # Add any users to the ACL that we can
    for user in acl.users:
        if user in new_users:
            new_acl.add_users([user])
        else:
            print 'Skipping absent user %s' % user
    # Add any missing ACLs to the machine
    if not [a for a in new_host.get_acls() if a.name == acl.name]:
        new_host.add_acl(acl.name)

# Enable the new host
if not old_host.locked:
    new_host.modify(locked=False)

# Delete host from old server
old_host.delete()
