Skip to content
Snippets Groups Projects
Commit b7846669 authored by Seblu's avatar Seblu
Browse files

Extract data compute name correctly

parent e5e56b89
No related branches found
No related tags found
No related merge requests found
......@@ -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)
......@@ -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:
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")
path = self.data_path(dataname)
try:
fo = istools.uopen(path)
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:
......
......@@ -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'''
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment