def pull(self, snap_id, dest, fmt=SnapshotPackage.Format.TAR): """Pulls a snapshot with the given id to the given destination dir as id.tar.gz.""" fn = snap_id + ".tar" if fmt == SnapshotPackage.Format.TARGZ: fn += ".gz" fname = os.path.join(dest, fn) self.logger.debug("Pulling %s -> %s", snap_id, fname) snap = self.info(snap_id) total_size = sum( [img.size for img in snap.details.images if img.present]) try: it = self.stub.pullSnapshot( SnapshotPackage(snapshot_id=snap_id, format=fmt)) with open(fname, "wb") as fn: with tqdm(fn, total=total_size, unit="B", unit_scale=True) as t: for msg in it: if not msg.success: self.logger.error("Failed to pull snapshot: %s", msg.err) return False fn.write(msg.payload) t.update(len(msg.payload)) except grpc._channel._Rendezvous as err: self.logger.error("Low level grpc error: %s ", err) self.logger.debug("Response %s", msg) return msg and msg.success, fname
def push_snap_iterator(fname): """An iterator that returns: 1. A message containing only the id. 2. A stream of byte objects from the tar (.gz) file. """ fmt = SnapshotPackage.Format.TAR if fname.endswith(".tar.gz"): fmt = SnapshotPackage.Format.TARGZ total_size = os.path.getsize(fname) snap_id = os.path.basename(fname).replace(".gz", "").replace(".tar", "") with tqdm(total=total_size, unit="B", unit_scale=True) as t: yield SnapshotPackage(snapshot_id=snap_id, format=fmt) with open(fname, "rb") as snap: for chunk in read_in_chunks(snap): t.update(len(chunk)) yield SnapshotPackage(payload=chunk)
def save(self, snap_id): """Saves a snapshot inside the emulator.""" return self._exec_unary_grpc("saveSnapshot", SnapshotPackage(snapshot_id=snap_id))
def delete(self, snap_id): """Deletes the given snapshot from the emulator.""" return self._exec_unary_grpc("deleteSnapshot", SnapshotPackage(snapshot_id=snap_id))
def load(self, snap_id): """Loads a snapshot inside the emulator.""" return self._exec_unary_grpc("loadSnapshot", SnapshotPackage(snapshot_id=snap_id))