Commit b7846669 authored by Seblu's avatar Seblu
Browse files

Extract data compute name correctly

parent e5e56b89
Loading
Loading
Loading
Loading
+0 −32
Original line number Diff line number Diff line
@@ -128,35 +128,3 @@ class Database(object):
            os.rename(newdb_path, self.path)
        except Exception as e:
            raise Exception("Removing metadata fail: %s" % e)

    def databalls(self, name, version):
        '''List data tarballs filenames'''
        try:
            self.file.seek(0)
            db = Tarball.open(fileobj=self.file, mode='r:gz')
            jdesc = json.loads(db.get_str("%s-%s.json" % (name, version)))
            db.close()
            return jdesc["data"]
        except Exception as e:
            raise Exception("List data tarballs fail: %s" % e)

    def find(self, name, version=None):
        '''Find last version of an image'''
        try:
            self.file.seek(0)
            tarb = Tarball.open(fileobj=self.file, mode='r:gz')
            candidates = [ int((os.path.splitext(tpname)[0]).rsplit("-", 1)[1])
                           for tpname in tarb.getnames("%s-\d+" % name) ]
            tarb.close()
        except Exception as e:
            raise Exception("Find in db %s fail: %s" % (self.path, e))
        # no candidates => go west
        if len(candidates) == 0:
            return None
        # get last version
        if version is None:
            version = max(candidates)
        # check if version exists
        if int(version) not in candidates:
            return None
        return self.get(name, version)
+14 −28
Original line number Diff line number Diff line
@@ -293,6 +293,12 @@ class PackageImage(Image):
        # FIXME: we should check valid information here
        return desc

    def data_path(self, name):
        '''Return a data filename from its internal name'''
        if self.md5name:
            return os.path.join(self.base_path, self._metadata["data"][name]["md5"])
        return os.path.join(self.base_path, "%s-%s%s" % (self.id, name, self.extension_data))

    @property
    def tarballs(self):
        '''List path of all related tarballs'''
@@ -300,15 +306,10 @@ class PackageImage(Image):
        name = os.path.join(self.base_path, self.md5) if self.md5name else self.path
        d_d[name] = {"md5": self.md5, "size": self.size}
        for key, value in self._metadata["data"].items():
            if self.md5name:
                name = os.path.join(self.base_path, value["md5"])
            else:
                name = os.path.join(self.base_path,
                                    "%s-%s%s" % (self.id, key, self.extension_data))
            d_d[name] = {"md5": value["md5"], "size": value["size"]}
            d_d[self.data_path(key)] = {"md5": value["md5"], "size": value["size"]}
        return d_d

    def tarcheck(self, message="Check MD5"):
    def check(self, message="Check MD5"):
        '''Check md5 and size of tarballs are correct'''
        arrow(message, 1, self.verbose)
        # open  /dev/null
@@ -368,33 +369,18 @@ class PackageImage(Image):
        # tarball info
        tinfo = self._metadata["data"][dataname]
        # build data tar paths
        paths = [ os.path.join(self.base_path, tinfo["md5"]),
                  os.path.join(self.base_path, "%s-%s%s" % (self.id,
                                                            dataname,
                                                            self.extension_data)) ]
        # try to open path
        fo = None
        for path in paths:
        path = self.data_path(dataname)
        try:
            fo = istools.uopen(path)
                break
            except Exception:
                pass
        # error if no file is openned
        if fo is None:
            raise Exception("Unable to open data tarball")
        except Exception as e:
            raise Exception("Unable to open data tarball %s" % path)
        try:
            # create tar object
            t = Tarball.open(fileobj=fo, mode="r|gz")
        except Exception as e:
            raise Exception("Invalid data tarball: %s" % e)
        # filter on file to extact
        if filelist is not None:
            members = []
            for fi in filelist:
                members += t.gettarinfo(name)
        else:
            members = None
        members = None if filelist is None else [ t.gettarinfo(name) for name in filelist ]
        try:
            t.extractall(target, members)
        except Exception as e:
+5 −6
Original line number Diff line number Diff line
@@ -83,7 +83,7 @@ class Repository(object):
        if istools.pathtype(self.config.path) != "file":
            raise NotImplementedError("Repository addition must be local")
        # checking data tarballs md5 before copy
        package.tarcheck("Check tarballs before copy")
        package.check("Check tarballs before copy")
        # adding file to repository
        arrow("Copying files", 1, self.verbose)
        for src,value in package.tarballs.items():
@@ -98,7 +98,7 @@ class Repository(object):
        r_package = PackageImage(os.path.join(self.config.path, package.md5),
                                 md5name=True, verbose=self.verbose)
        # checking data tarballs md5 after copy
        r_package.tarcheck("Check tarballs after copy")
        r_package.check("Check tarballs after copy")
        # add description to db
        self.db.add(r_package)
        # update last file
@@ -138,15 +138,14 @@ class Repository(object):

    def get(self, name, version):
        '''return a package from a name and version of pakage'''
        debug("Getting %s v%s" % (name, version))
        # get file md5 from db
        r = self.db.ask("select md5 from image where name = ? and version = ? limit 1",
                        (name,version)).fetchone()
        if r is None:
            raise Exception("No such image %s version %s" % name, version)
        return PackageImage(os.path.join(self.config.path, r[0]),
                            md5name=True,
                            verbose=self.verbose)
        path = os.path.join(self.config.path, r[0])
        debug("Getting %s v%s from %s" % (name, version, path))
        return PackageImage(path, md5name=True, verbose=self.verbose)

    def last(self, name):
        '''Return last version of name in repo or -1 if not found'''