"""Fetch and Deploy Cuttlefish images to specified GCE instance.
"""

from cmdexec import Target

class ConfigAction(object):
    """This class configures remote instance.
    """
    def __init__(self):
        pass


    @staticmethod
    def configure(parser):
        """Set up command line argument parser."""
        parser.add_argument('-i', '--instance', type=str, required=True,
                            help='IP address of GCE instance.')
        parser.add_argument('--instance_folder', type=str, required=False,
                            default='/srv/cf',
                            help='Folder on the remote machine where images should be deployed.')


    def execute(self, args):
        """Configure remote instance."""
        try:
            ssh_tgt = Target.for_remote_host(args.instance)
            # Configure current user to allow them to use libvirt.
            ssh_tgt.execute('sudo usermod -a -G libvirt ${USER}')
            ssh_tgt.execute_no_wait('newgrp libvirt')

            # Give user and libvirt access rights to specified folder.
            # Remote directory appears as 'no access rights' except for included
            # users.
            ssh_tgt.execute('sudo mkdir -p %s' % args.instance_folder)
            ssh_tgt.execute('sudo chmod ugo= %s' % args.instance_folder)
            ssh_tgt.execute('sudo setfacl -m g:libvirt:rwx %s' % args.instance_folder)
            ssh_tgt.execute('sudo setfacl -m u:libvirt-qemu:rwx %s' % args.instance_folder)

            # Configure libvirt to allow qemu to connect to our sockets.
            ssh_tgt.execute('sudo sed -i\'\' \''
                            's/[#\\s]*security_driver = ".*"\\s*$/security_driver = "none"/g'
                            '\' /etc/libvirt/qemu.conf')
            # Disallow libvirt from altering file permissions.
            ssh_tgt.execute('sudo sed -i\'\' \''
                            's/[#\\s]*dynamic_ownership = .*\\s*$/dynamic_ownership = 0/g'
                            '\' /etc/libvirt/qemu.conf')
            ssh_tgt.execute('sudo service libvirtd restart')
            ssh_tgt.execute('virsh net-create /usr/share/cuttlefish-common/network-abr0.xml')

        finally:
            pass
