From c76edec913dbdd847d6d5229d8b8cef090084cef Mon Sep 17 00:00:00 2001
From: Sander Vrijders <sander.vrijders@ugent.be>
Date: Fri, 16 Jun 2017 17:58:40 +0200
Subject: rumba: Better placement of files created by Rumba

Temporary files such as ssh_info, the rspecs, logs, ... are now
created in /tmp/rumba to avoid too many files being created and never
removed. The VM images and jFed CLI are kept in ~/.cache/rumba to
avoid redownloading every reboot.

Closes #18, #19
---
 rumba/model.py            | 21 +++++++++++++++++----
 rumba/prototypes/irati.py |  2 +-
 rumba/testbeds/jfed.py    | 10 ++++++----
 rumba/testbeds/qemu.py    | 47 ++++++++++++++++++++++++-----------------------
 tools/rumba-access        |  2 +-
 5 files changed, 49 insertions(+), 33 deletions(-)

diff --git a/rumba/model.py b/rumba/model.py
index affdcbf..f4f98d1 100644
--- a/rumba/model.py
+++ b/rumba/model.py
@@ -22,10 +22,25 @@
 import abc
 
 import rumba.log as log
-
+import os
+import stat
 
 logger = log.get_logger(__name__)
 
+tmp_dir = '/tmp/rumba'
+try:
+    os.mkdir(tmp_dir)
+    os.chmod(tmp_dir, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+except OSError:
+    # Already there, nothing to do
+    pass
+
+cache_dir = os.path.join(os.path.expanduser("~"), '.cache/rumba/')
+try:
+    os.mkdir(cache_dir)
+except OSError:
+    # Already there, nothing to do
+    pass
 
 # Represents generic testbed info
 #
@@ -222,8 +237,6 @@ class Node:
         s += ", ".join(rl)
         s += " ]\n"
 
-        s += "  Policies: [ "
-
         return s
 
     def __hash__(self):
@@ -628,7 +641,7 @@ class Experiment:
                         break
 
     def dump_ssh_info(self):
-        f = open('ssh_info', 'w')
+        f = open(os.path.join(tmp_dir, 'ssh_info'), 'w')
         for node in self.nodes:
             f.write("%s;%s;%s;%s;%s\n" % (node.name,
                                           self.testbed.username,
diff --git a/rumba/prototypes/irati.py b/rumba/prototypes/irati.py
index c01e413..57901fc 100644
--- a/rumba/prototypes/irati.py
+++ b/rumba/prototypes/irati.py
@@ -58,7 +58,7 @@ class Experiment(mod.Experiment):
         else:
             self.sudo = self.real_sudo
 
-        self._conf_dir = os.path.join(os.getcwd(), 'IRATI_conf')
+        self._conf_dir = os.path.join(mod.tmp_dir, 'IRATI_conf')
         try:
             os.mkdir(self._conf_dir)
         except OSError:
diff --git a/rumba/testbeds/jfed.py b/rumba/testbeds/jfed.py
index e158048..9c72ca7 100644
--- a/rumba/testbeds/jfed.py
+++ b/rumba/testbeds/jfed.py
@@ -51,9 +51,10 @@ class Testbed(mod.Testbed):
         self.cert_file = cert_file
         self.exp_hours = exp_hours
         self.if_id = dict()
-        self.rspec = self.exp_name + ".rspec"
-        self.manifest = self.exp_name + ".rrspec"
-        self.jfed_jar = "jfed_cli/experimenter-cli.jar"
+        self.rspec = os.path.join(mod.tmp_dir, self.exp_name + ".rspec")
+        self.manifest = os.path.join(mod.tmp_dir, self.exp_name + ".rrspec")
+        self.jfed_jar = os.path.join(mod.cache_dir,
+                                     'jfed_cli/experimenter-cli.jar')
         if image is not None:
             self.image = "urn:publicid:IDN+" + authority + \
                          "+image+wall2-ilabt-iminds-be:" + image
@@ -68,7 +69,8 @@ class Testbed(mod.Testbed):
             tar = tarfile.open(tarball)
             tar.extractall()
             tar.close()
-            logger.info("Extracted in current directory")
+            os.rename(os.path.join(os.getcwd(), 'jfed_cli'),
+                      os.path.join(mod.cache_dir, 'jfed_cli'))
             os.remove(tarball)
         self.flags['no_vlan_offload'] = True
 
diff --git a/rumba/testbeds/qemu.py b/rumba/testbeds/qemu.py
index 1d449dc..f0b73a8 100644
--- a/rumba/testbeds/qemu.py
+++ b/rumba/testbeds/qemu.py
@@ -28,23 +28,20 @@ import rumba.log as log
 import rumba.ssh_support as ssh_support
 import wget
 
-
 logger = log.get_logger(__name__)
 
 
 class Testbed(mod.Testbed):
-    def __init__(self, exp_name, bzimage=None, initramfs=None, proj_name="ARCFIRE",
-                 password="root", username="root",
-                 use_vhost=True, qemu_logs_dir=None):
+    def __init__(self, exp_name, bzimage_path=None, initramfs_path=None,
+                 proj_name="ARCFIRE", password="root", username="root",
+                 use_vhost=True):
         mod.Testbed.__init__(self, exp_name, username, password, proj_name)
         self.vms = {}
         self.shims = []
         self.vhost = use_vhost
-        self.qemu_logs_dir = os.getcwd() if qemu_logs_dir is None \
-            else qemu_logs_dir
         self.boot_processes = []
-        self.bzimage = bzimage
-        self.initramfs = initramfs
+        self.bzimage_path = bzimage_path
+        self.initramfs_path = initramfs_path
 
     @staticmethod
     def _run_command_chain(commands, results_queue,
@@ -127,17 +124,19 @@ class Testbed(mod.Testbed):
         # Download the proper buildroot images, if the user did not specify
         # local images
         url_prefix = "https://bitbucket.org/vmaffione/rina-images/downloads/"
-        if not self.bzimage:
-            self.bzimage = '%s.bzImage' % (experiment.prototype_name())
-            if not os.path.exists(self.bzimage):
-                logger.info("Downloading %s" % (url_prefix + self.bzimage))
-                wget.download(url_prefix + self.bzimage)
+        if not self.bzimage_path:
+            bzimage = '%s.bzImage' % (experiment.prototype_name())
+            self.bzimage_path = os.path.join(mod.cache_dir, bzimage)
+            if not os.path.exists(self.bzimage_path):
+                logger.info("Downloading %s" % (url_prefix + bzimage))
+                wget.download(url_prefix + bzimage, out=self.bzimage_path)
                 print("\n")
-        if not self.initramfs:
-            self.initramfs = '%s.rootfs.cpio' % (experiment.prototype_name())
-            if not os.path.exists(self.initramfs):
-                logger.info("Downloading %s" % (url_prefix + self.initramfs))
-                wget.download(url_prefix + self.initramfs)
+        if not self.initramfs_path:
+            initramfs = '%s.rootfs.cpio' % (experiment.prototype_name())
+            self.initramfs_path = os.path.join(mod.cache_dir, initramfs)
+            if not os.path.exists(self.initramfs_path):
+                logger.info("Downloading %s" % (url_prefix + initramfs))
+                wget.download(url_prefix + initramfs, out=self.initramfs_path)
                 print("\n")
 
         logger.info('Setting up interfaces.')
@@ -255,13 +254,15 @@ class Testbed(mod.Testbed):
             vm['id'] = vmid
             node.ssh_config.hostname = "localhost"
             node.ssh_config.port = fwdp
+            log_file = os.path.join(mod.tmp_dir, name + '.log')
 
             vars_dict = {'fwdp': fwdp, 'id': vmid, 'mac': mac,
-                         'bzimage': self.bzimage,
-                         'initramfs': self.initramfs,
+                         'bzimage': self.bzimage_path,
+                         'initramfs': self.initramfs_path,
                          'fwdc': fwdc,
                          'memory': vm_memory, 'frontend': vm_frontend,
-                         'vmname': name}
+                         'vmname': name,
+                         'log_file' : log_file}
 
             host_fwd_str = 'hostfwd=tcp::%(fwdp)s-:22' % vars_dict
             vars_dict['hostfwdstr'] = host_fwd_str
@@ -279,7 +280,7 @@ class Testbed(mod.Testbed):
                         '-m %(memory)sM '
                         '-device %(frontend)s,mac=%(mac)s,netdev=mgmt '
                         '-netdev user,id=mgmt,%(hostfwdstr)s '
-                        '-serial file:%(vmname)s.log '
+                        '-serial file:%(log_file)s '
                         % vars_dict
                         )
 
@@ -307,7 +308,7 @@ class Testbed(mod.Testbed):
                 time.sleep(boot_backoff)
                 booting_budget = boot_batch_size
 
-            with open('%s/qemu_out_%s' % (self.qemu_logs_dir, vmid), 'w')\
+            with open('%s/qemu_out_%s' % (mod.tmp_dir, vmid), 'w')\
                     as out_file:
                 logger.debug('executing >> %s', command)
                 self.boot_processes.append(subprocess.Popen(command.split(),
diff --git a/tools/rumba-access b/tools/rumba-access
index 1cf382e..a2a5e83 100755
--- a/tools/rumba-access
+++ b/tools/rumba-access
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 
-FILE=ssh_info
+FILE=/tmp/rumba/ssh_info
 
 MACHINE_ID=$1
 if [ "$MACHINE_ID" == "" ]; then
-- 
cgit v1.2.3