-#
+#
# Copyright 2016 RIFT.IO Inc
#
# Licensed under the Apache License, Version 2.0 (the "License");
pass
+class PackageAppendError(Exception):
+ pass
+
+
class PackageFileChecksumError(PackageValidationError):
def __init__(self, filename):
self.filename = filename
return self.descriptor_msg.id
+ @property
+ def descriptor_name(self):
+ """ The descriptor name of this descriptor in the system """
+ if not self.descriptor_msg.has_field("name"):
+ msg = "Descriptor name not present"
+ self._log.error(msg)
+ raise PackageError(msg)
+
+ return self.descriptor_msg.name
+
@classmethod
def get_descriptor_patterns(cls):
""" Returns a tuple of descriptor regex and Package Types """
# Set the file mode to original
os.chmod(dest_file_path, self._package_file_mode_map[filename])
+ def insert_file(self, new_file, dest_file, rel_path, mode=0o777):
+ self.add_file(rel_path, mode)
+
+ try:
+ # Copy the contents of the file to the correct path
+ # For folder creation (or nested folders), dest_file appears w/ trailing "/" like: dir1/ or dir1/dir2/
+ # For regular file upload, dest_file appears as dir1/abc.txt
+ dest_dir_path = os.path.dirname(dest_file)
+ if not os.path.isdir(dest_dir_path):
+ os.makedirs(dest_dir_path)
+ if not os.path.basename(dest_file):
+ self._log.debug("Created dir path, no filename to insert in {}, skipping..".format(dest_dir_path))
+ return
+
+ with open(dest_file, 'wb') as dst_hdl:
+ with open(new_file, 'rb') as src_hdl:
+ shutil.copyfileobj(src_hdl, dst_hdl, 10 * 1024 * 1024)
+
+ # Set the file mode to original
+ os.chmod(dest_file, self._package_file_mode_map[rel_path])
+ except Exception as e:
+ # Clear the file when an exception happens
+ if os.path.isfile(dest_file):
+ os.remove(dest_file)
+
+ raise PackageAppendError(str(e))
+
+ def delete_file(self, dest_file, rel_path):
+ self.remove_file(rel_path)
+
+ try:
+ os.remove(dest_file)
+ except Exception as e:
+ raise PackageAppendError(str(e))
+
def extract_file(self, src_file, dest_file):
""" Extract a specific package file to dest_file
self._package_file_mode_map[rel_path] = mode
+ def remove_file(self, rel_path):
+ if not rel_path:
+ raise PackageError("Empty file name added")
+
+ if rel_path not in self._package_file_mode_map:
+ raise PackageError("File %s does not in package" % rel_path)
+
+ del self._package_file_mode_map[rel_path]
+
def add_dir(self, rel_path):
""" Add a directory to the package