Support for automatic install of RpmFusion repository on PL slivers
authorClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Thu, 30 Jun 2011 09:34:39 +0000 (11:34 +0200)
committerClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Thu, 30 Jun 2011 09:34:39 +0000 (11:34 +0200)
src/nepi/testbeds/planetlab/application.py
src/nepi/testbeds/planetlab/metadata_v01.py
src/nepi/testbeds/planetlab/node.py

index 227cadb..c0bf266 100644 (file)
@@ -46,6 +46,7 @@ class Dependency(object):
         self.depends = None
         self.buildDepends = None
         self.sources = None
+        self.rpmFusion = False
         self.env = {}
         
         self.stdin = None
index 8ca0e99..e8ea963 100644 (file)
@@ -147,6 +147,9 @@ def connect_dep(testbed_instance, node_guid, app_guid):
         for envkey, envval in app.env.iteritems():
             envval = app._replace_paths(envval)
             node.env[envkey].append(envval)
+    
+    if app.rpmFusion:
+        node.rpmFusion = True
 
 def connect_node_netpipe(testbed_instance, node_guid, netpipe_guid):
     node = testbed_instance._elements[node_guid]
@@ -794,6 +797,14 @@ attributes = dict({
                 "flags": Attribute.DesignOnly,
                 "validation_function": validation.is_string
             }),
+    "rpm-fusion": dict({
+                "name": "rpmFusion",
+                "help": "True if required packages can be found in the RpmFusion repository",
+                "type": Attribute.BOOL,
+                "flags": Attribute.DesignOnly,
+                "value": False,
+                "validation_function": validation.is_bool
+            }),
     "sources": dict({
                 "name": "sources",
                 "help": "Space-separated list of regular files to be deployed in the working path prior to building. "
@@ -1007,7 +1018,7 @@ factories_info = dict({
             "configure_function": configure_application,
             "box_attributes": ["command", "sudo", "stdin",
                                "depends", "build-depends", "build", "install",
-                               "sources" ],
+                               "sources", "rpm-fusion" ],
             "connector_types": ["node"],
             "traces": ["stdout", "stderr", "buildlog"]
         }),
@@ -1017,7 +1028,7 @@ factories_info = dict({
             "create_function": create_dependency,
             "preconfigure_function": configure_dependency,
             "box_attributes": ["depends", "build-depends", "build", "install",
-                               "sources" ],
+                               "sources", "rpm-fusion" ],
             "connector_types": ["node"],
             "traces": ["buildlog"]
         }),
index 544c19d..2afdd47 100644 (file)
@@ -40,6 +40,8 @@ class Node(object):
     
     DEPENDS_PIDFILE = '/tmp/nepi-depends.pid'
     DEPENDS_LOGFILE = '/tmp/nepi-depends.log'
+    RPM_FUSION_URL = 'http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm'
+    RPM_FUSION_URL_F12 = 'http://download1.rpmfusion.org/free/fedora/releases/12/Everything/x86_64/os/rpmfusion-free-release-12-1.noarch.rpm'
     
     def __init__(self, api=None):
         if not api:
@@ -65,6 +67,7 @@ class Node(object):
         self.required_packages = set()
         self.required_vsys = set()
         self.pythonpath = []
+        self.rpmFusion = False
         self.env = collections.defaultdict(list)
         
         # Testbed-derived attributes
@@ -313,11 +316,29 @@ class Node(object):
             pidfile = self.DEPENDS_PIDFILE
             logfile = self.DEPENDS_LOGFILE
             
+            # If we need rpmfusion, we must install the repo definition and the gpg keys
+            if self.rpmFusion:
+                if self.operatingSystem == 'f12':
+                    # Fedora 12 requires a different rpmfusion package
+                    RPM_FUSION_URL = self.RPM_FUSION_URL_F12
+                else:
+                    # This one works for f13+
+                    RPM_FUSION_URL = self.RPM_FUSION_URL
+                    
+                rpmFusion = (
+                  '( rpm -q $(rpm -q -p %(RPM_FUSION_URL)s) || rpm -i %(RPM_FUSION_URL)s ) &&'
+                ) % {
+                    'RPM_FUSION_URL' : RPM_FUSION_URL
+                }
+            else:
+                rpmFusion = ''
+            
             # Start process in a "daemonized" way, using nohup and heavy
             # stdin/out redirection to avoid connection issues
             (out,err),proc = rspawn.remote_spawn(
-                "( yum -y install %(packages)s && echo SUCCESS || echo FAILURE )" % {
+                "( %(rpmfusion)s yum -y install %(packages)s && echo SUCCESS || echo FAILURE )" % {
                     'packages' : ' '.join(self.required_packages),
+                    'rpmfusion' : rpmFusion,
                 },
                 pidfile = pidfile,
                 stdout = logfile,