extras-buildsys/server Config.py, 1.2, 1.3 UserInterface.py, 1.49, 1.50

Daniel Williams (dcbw) fedora-extras-commits at redhat.com
Mon Aug 29 14:31:45 UTC 2005


Author: dcbw

Update of /cvs/fedora/extras-buildsys/server
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv31828/server

Modified Files:
	Config.py UserInterface.py 
Log Message:
2005-08-29  Dan Williams <dcbw at redhat.com>

    * server/Config.py
        - Ensure duplicate user_aliases and duplicate target strings
            cannot be loaded
        - Move user target alias resolution into the Config stuff to
            keep it centralized

    * server/UserInterface.py
        - Move target user alias resolution to Config stuff
        - Consolidate 'enqueue' and 'enqueue_srpm' commands into one
            'enqueue' command to enqueue packages that detects what you
            are trying to enqueue by looking at the source
        - Work with new target dict stuff




Index: Config.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/server/Config.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Config.py	25 Aug 2005 18:15:14 -0000	1.2
+++ Config.py	29 Aug 2005 14:31:43 -0000	1.3
@@ -23,6 +23,10 @@
     return "%s-%s-%s" % (distro, target, repo)
 
 
+class InvalidTargetException(Exception): pass
+class InvalidUserAliasException(Exception): pass
+
+
 class ServerConfig(BaseConfig.BaseConfig):
     def __init__(self, filename):
         BaseConfig.BaseConfig.__init__(self, filename)
@@ -32,10 +36,38 @@
             print "Config file did not exist.  Writing %s with default values." % filename
             self.save_default_config()
         self._targets = []
+        self._target_strings = {}
+        self._target_aliases = {}
 
     def targets(self):
         return self._targets
 
+    def resolve_target_user_alias(self, user_alias):
+        try:
+            cfg = self._target_aliases[user_alias.lower()]
+        except KeyError:
+            raise InvalidUserAliasException("Invalid user alias.")
+
+        return cfg
+
+    def _add_target(self, target_cfg):
+        """ Return True if the target name is OK, False otherwise """
+        target_str = target_cfg.target_string()
+        if self._target_strings.has_key(target_str):
+            raise InvalidTargetException("Target name '%s' already exists." % target_str)
+        aliases = target_cfg.get_list("Aliases", "user_aliases")
+        for alias in aliases:
+            alias = alias.lower()
+            if self._target_aliases.has_key(alias):
+                target_str = self._target_aliases[alias].target_string()
+                raise InvalidTargetException("Target alias '%s' already exists in target %s." % (alias, target_str))
+
+        # We're OK, add it to our list
+        self._targets.append(target_cfg)
+        self._target_names[target_cfg.target_string()] = target_cfg
+        for alias in aliases:
+            self._target_aliases[alias.lower()] = target_cfg
+
     def load_target_configs(self):
         cfg_dir = self.get_str("Directories", "target_configs_dir")
         if not os.path.exists(cfg_dir) or not os.access(cfg_dir, os.R_OK):
@@ -49,7 +81,10 @@
                 continue
             cfg_file = os.path.join(cfg_dir, f)
             target_cfg = TargetConfig(self, cfg_file)
-            self._targets.append(target_cfg)
+            try:
+                self._add_target(target_cfg)
+            except InvalidTargetException, e:
+                print "Error: could not add target %s because: %s" % (f, e)           
 
     def save_default_config(self, filename=None):
         self.add_section("General")


Index: UserInterface.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/server/UserInterface.py,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -r1.49 -r1.50
--- UserInterface.py	25 Aug 2005 18:15:14 -0000	1.49
+++ UserInterface.py	29 Aug 2005 14:31:43 -0000	1.50
@@ -80,21 +80,6 @@
         return True
     return False
 
-class InvalidTargetError(exceptions.Exception): pass
-
-def resolve_target(target, cfg):
-    for target_cfg in cfg.targets():
-        target_name = target_cfg.get_str("General", "name")
-        target_aliases = target_cfg.get_list("Aliases", "user_aliases")
-        if target.lower() == target_name.lower():
-            return target
-        for alias in target_aliases:
-            if target.lower() == alias.lower():
-                return target
-
-    raise InvalidTargetError()
-
-
 class UserInterface:
     """
     Base UserInterface class. NO AUTHENTICATION.  Subclass this to provide some.
@@ -124,74 +109,58 @@
         uid = int(req['uid'])
         return uid
 
-    def enqueue(self, email, package, cvs_tag, target, buildreq=None):
+    def enqueue(self, email, package, source, target_alias, buildreq=None):
         """ Accept a job to build and stuff it into the job database """
 
-        if self._cfg.get_bool("CVS", "use_cvs") == False:
-            self.email_result(email, cvs_tag, "Error setting up build for %s on "\
-                    "%s: this server builds SRPMs, not CVS checkouts." % (cvs_tag, target))
-            return (-1, "This build server is set up for building SRPMS only.  "\
-                        "Use the 'enqueue_srpm' command instead.", -1)
-
-        if not validate_package_name(package):
-            self.email_result(email, cvs_tag, "Error setting up build for %s on "\
-                    "%s: Package name '%s' contained an illegal character.  "\
-                    "Submit a bug report?" % (cvs_tag, target, package))
-            return (-1, "The package name contained an illegal character.", -1)
-
-        if not validate_cvs_tag(cvs_tag):
-            self.email_result(email, cvs_tag, "Error setting up build for %s on "\
-                    "%s: The CVS tag '%s' contained an illegal character.  "\
-                    "Submit a bug report?" % (package, target, cvs_tag))
-            return (-1, "The CVS tag contained an illegal character.", -1)
-
-        try:
-            real_target = resolve_target(target, self._cfg)
-        except InvalidTargetError:
-            self.email_result(email, cvs_tag, "Error setting up build for %s on "\
-                    "%s: target does not exist." % (cvs_tag, target))
-            return (-1, "This build server does not support the target %s." % target, -1)
+        is_cvs_tag = True
+        if source.endswith(".src.rpm") or source.find("/") != -1:
+            is_cvs_tag = False
+
+        # Do source-type specifc validation
+        if is_cvs_tag:
+            if self._cfg.get_bool("CVS", "use_cvs") == False:
+                self.email_result(email, source, "Error setting up build for %s on "\
+                        "%s: this server builds SRPMs, not CVS checkouts." % (source, target_alias))
+                return (-1, "This build server is set up for building SRPMS only.  ", -1)
+
+            if not validate_cvs_tag(source):
+                self.email_result(email, source, "Error setting up build for %s on "\
+                        "%s: The CVS tag '%s' contained an illegal character.  "\
+                        "Submit a bug report?" % (package, target_alias, cvs_tag))
+                return (-1, "The CVS tag contained an illegal character.", -1)
         else:
-            print "Request to enqueue '%s' tag '%s' for target '%s' (user '%s')" % (package, cvs_tag, real_target, email)
-            req = self._bm.create_job_request(email, package, cvs_tag, real_target, buildreq, time.time())
-            self._bm.enqueue(req)
-            uid = self._wait_for_uid(req)
-            return (0, "Success: package has been queued.", uid)
-
-    def enqueue_srpm(self, email, package, srpm_file, target, buildreq=None):
-        """ Accept a job to build from SRPM file and stuff it into the job database """
-
-        if self._cfg.get_bool("CVS", "use_cvs") == True:
-            self.email_result(email, srpm_file, "Error setting up build for %s on "\
-                    "%s: this server builds CVS checkouts, not SRPMS." % (srpm_file, target))
-            return (-1, "This build server is set up for building from CVS.  Use the 'enqueue' command instead.", -1)
+            if self._cfg.get_bool("CVS", "use_cvs") == True:
+                self.email_result(email, source, "Error setting up build for %s on "\
+                        "%s: this server builds CVS checkouts, not SRPMs." % (source, target_alias))
+                return (-1, "This build server is set up for building CVS checkouts only.  ", -1)
+
+            # We limit the database field to 255 chars
+            if len(source) > 255:
+                self.email_result(email, source, "Error setting up build for %s on "\
+                        "%s: try using a shorter path to the SRPM (< 255 chars)." % (source, target_alias))
+                return (-1, "Pathname to SRPM is limited to 255 characters.", -1)
+
+            srpm_file = os.path.abspath(source)
+            if not srpm_file or not os.access(srpm_file, os.R_OK):
+                self.email_result(email, source, "Error setting up build for %s on "\
+                        "%s: The SRPM does not exist, or is not accessible.  Remember to use absolute paths." % (source, target_alias))
+                return (-1, "SRPM does not exist or is not accessible, remember to use absolute paths.", -1)
 
         if not validate_package_name(package):
-            self.email_result(email, srpm_file, "Error setting up build for %s on "\
-                    "%s: Package name '%s' contained an illegal character.  Submit a bug report?" % (package, target, package))
+            self.email_result(email, source, "Error setting up build for %s on "\
+                    "%s: Package name '%s' contained an illegal character.  "\
+                    "Submit a bug report?" % (source, target_alias, package))
             return (-1, "The package name contained an illegal character.", -1)
 
-        # We limit the database field to 255 chars
-        if len(srpm_file) > 255:
-            self.email_result(email, srpm_file, "Error setting up build for %s on "\
-                    "%s: try using a shorter path to the SRPM (< 255 chars)." % (srpm_file, target))
-            return (-1, "Pathname to SRPM is limited to 255 characters.", -1)
-
-        srpm_file = os.path.abspath(srpm_file)
-        if not srpm_file or not os.access(srpm_file, os.R_OK):
-            self.email_result(email, srpm_file, "Error setting up build for %s on "\
-                    "%s: The SRPM does not exist, or is not accessible.  Remember to use absolute paths." % (srpm_file, target))
-            return (-1, "SRPM does not exist or is not accessible, remember to use absolute paths.", -1)
-
         try:
-            real_target = resolve_target(target, self._cfg)
-        except InvalidTargetError:
-            self.email_result(email, srpm_file, "Error setting up build for %s on "\
-                    "%s: target does not exist." % (srpm_file, target))
-            return (-1, "This build server does not support the target %s." % target, -1)
+            target_cfg = self._cfg.resolve_target_user_alias(target_alias)
+        except Config.InvalidUserAliasException, e:
+            self.email_result(email, source, "Error setting up build for %s on "\
+                    "%s: target does not exist." % (source, target_alias))
+            return (-1, "This build server does not support the target %s." % target_alias, -1)
         else:
-            print "Request to enqueue '%s' file '%s' for target '%s' (user '%s')" % (package, srpm_file, real_target, email)
-            req = self._bm.create_job_request(email, package, srpm_file, real_target, buildreq, time.time())
+            print "Request to enqueue '%s' tag '%s' for target '%s' (user '%s')" % (package, source, target_alias, email)
+            req = self._bm.create_job_request(email, package, source, target_cfg.target_dict(), buildreq, time.time())
             self._bm.enqueue(req)
             uid = self._wait_for_uid(req)
             return (0, "Success: package has been queued.", uid)
@@ -232,7 +201,8 @@
     def list_jobs(self, args_dict):
         """ Query job information and return it to the user """
 
-        sql = 'SELECT uid, username, package, cvs_tag, target, starttime, endtime, status, result FROM jobs WHERE '
+        sql = 'SELECT uid, username, package, cvs_tag, target_distro, target_target, ' \
+                    'target_repo, starttime, endtime, status, result FROM jobs WHERE '
         sql_args = []
 
         if args_dict.has_key('email') and args_dict['email']:
@@ -283,10 +253,12 @@
 
         if args_dict.has_key('target') and args_dict['target']:
             try:
-                real_target = resolve_target(args_dict['target'], self._cfg)
-            except InvalidTargetError:
-                return (-1, "Error: Invalid job UID.", [])
-            sql_args.append('target="%s"' % real_target)
+                target_cfg = self._cfg.resolve_target_user_alias(args_dict['target'])
+            except Config.InvalidUserAliasException:
+                return (-1, "Error: Invalid target.", [])
+            sql_args.append('target_distro="%s"' % target_cfg.distro())
+            sql_args.append('target_target="%s"' % target_cfg.target())
+            sql_args.append('target_repo="%s"' % target_cfg.repo())
 
         if not len(sql_args):
             return (-1, "Error: Invalid query.", [])




More information about the scm-commits mailing list