Allow kernel build to be specified from command line.

This change fixes a few glitches and adds functionality that:
- allow kernel builds to be explicitly specified via parameters,
- allow forced updates of image files,
- include socat in cuttlefish dependencies
- verbosely list transferred files.

Change-Id: I7b05d8f30eed9891c8b18e603c7cf29418c1a395
(cherry picked from commit d3e6aa7a449020f015f075d5966d8c2392d5f538)
diff --git a/deploy/cmdexec.py b/deploy/cmdexec.py
index 1d9bbbb..b14b7a7 100644
--- a/deploy/cmdexec.py
+++ b/deploy/cmdexec.py
@@ -41,7 +41,8 @@
         Returns:
             None
         """
-        proc = Popen(['scp'].append(SSH_ARGS).append([source, '%s:%s' % (self._server, target)]),
+        LOG.info('Transferring file %s -> %s' % (source, target))
+        proc = Popen(['scp'] + SSH_ARGS + [source, '%s:%s' % (self._server, target)],
                      stdin=PIPE, stdout=PIPE, close_fds=True)
         result = proc.wait()
         if result != 0:
@@ -74,6 +75,7 @@
         Returns:
             None
         """
+        LOG.info('Copying file %s -> %s' % (source, target))
         proc = Popen(['cp', source, target], stdin=PIPE, stdout=PIPE, close_fds=True)
         result = proc.wait()
         if result != 0:
diff --git a/deploy/config.py b/deploy/config.py
index a5e111c..5ccf485 100644
--- a/deploy/config.py
+++ b/deploy/config.py
@@ -24,6 +24,10 @@
         """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('newgrp libvirt')
+
             # Give user and libvirt access rights to specified folder.
             # Remote directory appears as 'no access rights' except for included
             # users.
@@ -32,14 +36,12 @@
             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 current user to allow them to use libvirt.
-            ssh_tgt.execute('sudo usermod -a -G libvirt ${USER}')
-
             # 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')
             ssh_tgt.execute('sudo service libvirtd restart')
+            ssh_tgt.execute('virsh net-create /usr/share/cuttlefish-common/network-abr0.xml')
 
         finally:
             pass
diff --git a/deploy/deploy.py b/deploy/deploy.py
index 315d8f3..fcc2114 100644
--- a/deploy/deploy.py
+++ b/deploy/deploy.py
@@ -17,15 +17,15 @@
         parser.add_argument('--system_build', type=str, required=False,
                             default='latest',
                             help='Build number to fetch from Android Build server.')
-        parser.add_argument('--configure', action='store_true',
-                            default=False,
-                            help='Configure remote server for cuttlefish.')
         parser.add_argument('--system_branch', type=str, required=False,
                             default='git_oc-gce-dev',
                             help='Android Build branch providing system images.')
         parser.add_argument('--system_target', type=str, required=False,
                             default='cf_x86_phone-userdebug',
                             help='Android Build target providing system images.')
+        parser.add_argument('--kernel_build', type=str, required=False,
+                            default='latest',
+                            help='Build number to fetch from Android Build server.')
         parser.add_argument('--kernel_branch', type=str, required=False,
                             default='kernel-n-dev-android-gce-3.18-x86_64',
                             help='Android Build branch providing kernel images.')
@@ -43,6 +43,14 @@
         parser.add_argument('--instance_folder', type=str, required=False,
                             default='/srv/cf',
                             help='Folder on the remote machine where images should be deployed.')
+        parser.add_argument('--force_update', type=str, required=False,
+                            help='Comma separated list of artifacts to force update.')
+
+
+    def _to_build_id(self, selector):
+        if selector == 'latest':
+            return '--latest'
+        return '--bid='+selector
 
 
     def execute(self, args):
@@ -57,9 +65,9 @@
             loc_tgt = Target.for_localhost()
             ssh_tgt = Target.for_remote_host(args.instance)
 
-            build_selector = '--latest'
-            if args.system_build != 'latest':
-                build_selector = '--bid=' + args.system_build
+            system_build = self._to_build_id(args.system_build)
+            kernel_build = self._to_build_id(args.kernel_build)
+            force_update = args.force_update.split(',')
 
             if not os.path.exists('system.img'):
                 if not os.path.exists(temp_image):
@@ -67,22 +75,21 @@
                         '/google/data/ro/projects/android/fetch_artifact '
                         '%s --branch=%s --target=%s '
                         '\'cf_x86_phone-img-*\' \'%s\'' %
-                        (build_selector, args.system_branch, args.system_target, temp_image))
+                        (system_build, args.system_branch, args.system_target, temp_image))
                 loc_tgt.execute('unzip -u \'%s\' system.img' % temp_image)
 
-            if not os.path.exists('kernel'):
-                loc_tgt.execute(
-                    '/google/data/ro/projects/android/fetch_artifact '
-                    '--latest --branch=%s --target=%s '
-                    'bzImage kernel' %
-                    (args.kernel_branch, args.kernel_target))
-
             if not os.path.exists('ramdisk.img'):
                 loc_tgt.execute(
                     '/google/data/ro/projects/android/fetch_artifact '
                     '%s --branch=%s --target=%s ramdisk.img' %
-                    (build_selector, args.system_branch, args.system_target))
+                    (system_build, args.system_branch, args.system_target))
 
+            if not os.path.exists('kernel'):
+                loc_tgt.execute(
+                    '/google/data/ro/projects/android/fetch_artifact '
+                    '%s --branch=%s --target=%s '
+                    'bzImage kernel' %
+                    (kernel_build, args.kernel_branch, args.kernel_target))
 
             # Give user and libvirt access rights to specified folder.
             # Remote directory appears as 'no access rights' except for included
@@ -99,10 +106,16 @@
                 'system.img'
             ]
             for file_name in upload_list:
-                out = ssh_tgt.execute('test -f %s/%s; echo $?' % (target_dir, file_name))
-                if out[0] == '1':
+                update = file_name in force_update
+
+                if not update:
+                    out = ssh_tgt.execute('test -f %s/%s; echo $?' % (target_dir, file_name))
+                    update = out[0] == '1'
+
+                if update:
                     ssh_tgt.copy(file_name, target_dir)
 
+            ssh_tgt.execute('cp /usr/share/cuttlefish-common/gce_ramdisk.img %s' % target_dir)
             ssh_tgt.execute('setfacl -m g:libvirt:rw %s/*' % target_dir)
             ssh_tgt.execute('setfacl -m u:libvirt-qemu:rw %s/*' % target_dir)