diff --git a/storages/api/viewsets.py b/storages/api/viewsets.py index a691402b..7f5d3dbd 100644 --- a/storages/api/viewsets.py +++ b/storages/api/viewsets.py @@ -49,15 +49,20 @@ class StorageViewSet(viewsets.ViewSet): compute.hostname, compute.login, compute.password, compute.type, pk ) + state = conn.is_active() + # first: it refreshes the pool, and libvirt measures a pool's space only then; + # a stopped pool lists none + volumes = conn.update_volumes() if state else None + size, free = conn.get_size() infoset = { - "state": conn.is_active(), - "size": conn.get_size()[0], - "free": conn.get_size()[1], + "state": state, + "size": size, + "free": free, "status": conn.get_status(), "path": conn.get_target_path(), "type": conn.get_type(), "autostart": conn.get_autostart(), - "volumes": conn.update_volumes(), + "volumes": volumes, } serializer = StorageSerializer( diff --git a/storages/jobs.py b/storages/jobs.py index 9f693e4f..166dd921 100644 --- a/storages/jobs.py +++ b/storages/jobs.py @@ -26,6 +26,11 @@ def _log(op, state, action): return compute, "", "", message if state == Operation.SUCCEEDED else f"{message} ({state})" +def is_iso(name): + """An ISO image, by its name: libvirt calls its format raw. It is uploaded, not cloned.""" + return name.lower().endswith(".iso") + + def _storage(params): c = Compute.objects.get(pk=params["compute"]) return c, wvmStorage(c.hostname, c.login, c.password, c.type, params["pool"]) @@ -51,6 +56,8 @@ class CloneVolume(Kind): volumes = stg.get_volumes() if params["image"] not in volumes: raise util.OperationError(f"The pool has no volume named {params['image']}") + if is_iso(params["image"]): + raise util.OperationError("An ISO image is not cloned") target = stg.clone_name(params["name"], params["format"] or stg.get_volume_format_type(params["image"])) if target in volumes: raise util.OperationError("Name of volume already in use") @@ -102,7 +109,7 @@ class UploadVolume(Kind): name = params["name"] if not name or name in (".", "..") or "\x00" in name: raise ValueError("Invalid file name") - if len(name) <= 4 or not name.lower().endswith(".iso"): + if len(name) <= 4 or not is_iso(name): raise ValueError("Only .iso files can be uploaded") if params["size"] <= 0: raise ValueError("Invalid file size") diff --git a/storages/templates/storage.html b/storages/templates/storage.html index 52d574a0..ddaa2447 100644 --- a/storages/templates/storage.html +++ b/storages/templates/storage.html @@ -28,10 +28,18 @@