]> git.apps.os.sepia.ceph.com Git - teuthology.git/commitdiff
orchestra/remote: add (sudo_)write_file method
authorKyr Shatskyy <kyrylo.shatskyy@suse.com>
Thu, 16 Jul 2020 16:14:57 +0000 (18:14 +0200)
committerKyr Shatskyy <kyrylo.shatskyy@suse.com>
Thu, 3 Sep 2020 21:35:21 +0000 (23:35 +0200)
Add advanced write_file and sudo_write_file to remote context
for more intuitive and handy coding

Signed-off-by: Kyr Shatskyy <kyrylo.shatskyy@suse.com>
teuthology/orchestra/remote.py

index 171c558a2ec6a0b1dbe0091b6ac06f86b2e687cd..2dbfbdd483459419b6805f41497ce808c8f6d7ad 100644 (file)
@@ -458,6 +458,43 @@ class Remote(object):
             ])
         return self.run(args=args, wait=False, stdout=run.PIPE)
 
+    def write_file(self, path, data, sudo=False, mode=None, owner=None,
+                                     mkdir=False, append=False):
+        """
+        Write data to remote file
+
+        :param path:    file path on remote host
+        :param data:    str, binary or fileobj to be written
+        :param sudo:    use sudo to write file, defaults False
+        :param mode:    set file mode bits if provided
+        :param owner:   set file owner if provided
+        :param mkdir:   preliminary create the file directory, defaults False
+        :param append:  append data to the file, defaults False
+        """
+        dd = 'sudo dd' if sudo else 'dd'
+        args = dd + ' of=' + path
+        if append:
+            args += ' conv=notrunc oflag=append'
+        if mkdir:
+            mkdirp = 'sudo mkdir -p' if sudo else 'mkdir -p'
+            dirpath = os.path.dirname(path)
+            if dirpath:
+                args = mkdirp + ' ' + dirpath + '\n' + args
+        if mode:
+            chmod = 'sudo chmod' if sudo else 'chmod'
+            args += '\n' + chmod + ' ' + mode + ' ' + path
+        if owner:
+            chown = 'sudo chown' if sudo else 'chown'
+            args += '\n' + chown + ' ' + owner + ' ' + path
+        args = 'set -ex' + '\n' + args
+        self.run(args=args, stdin=data)
+
+    def sudo_write_file(self, path, data, **kwargs):
+        """
+        Write data to remote file with sudo, for more info see `write_file()`.
+        """
+        self.write_file(path, data, sudo=True, **kwargs)
+
     @property
     def os(self):
         if not hasattr(self, '_os'):