2020-04-24 11:48:09 +00:00
|
|
|
from util import remote_fn
|
|
|
|
|
|
|
|
|
|
|
|
@remote_fn
|
|
|
|
def scrub(volume_id):
|
2020-04-24 15:38:18 +00:00
|
|
|
import time
|
|
|
|
import rawfile_util
|
|
|
|
|
|
|
|
rawfile_util.patch_metadata(volume_id, {"deleted_at": time.time()})
|
2020-04-24 11:48:09 +00:00
|
|
|
|
|
|
|
|
|
|
|
@remote_fn
|
2020-07-12 17:47:29 +00:00
|
|
|
def init_rawfile(volume_id, size, fs_type):
|
2020-04-24 15:38:18 +00:00
|
|
|
import time
|
|
|
|
import rawfile_util
|
2020-07-16 15:24:04 +00:00
|
|
|
from volume_schema import LATEST_SCHEMA_VERSION
|
2020-06-13 23:47:32 +00:00
|
|
|
from pathlib import Path
|
|
|
|
|
2020-04-24 11:48:09 +00:00
|
|
|
from util import run
|
|
|
|
|
2020-04-24 15:38:18 +00:00
|
|
|
img_dir = rawfile_util.img_dir(volume_id)
|
2020-06-13 23:47:32 +00:00
|
|
|
img_dir.mkdir(exist_ok=True)
|
|
|
|
img_file = Path(f"{img_dir}/disk.img")
|
|
|
|
if img_file.exists():
|
|
|
|
return
|
2020-04-24 15:38:18 +00:00
|
|
|
rawfile_util.patch_metadata(
|
|
|
|
volume_id,
|
|
|
|
{
|
2020-07-16 15:24:04 +00:00
|
|
|
"schema_version": LATEST_SCHEMA_VERSION,
|
2020-04-24 15:38:18 +00:00
|
|
|
"volume_id": volume_id,
|
|
|
|
"created_at": time.time(),
|
2020-06-13 23:47:32 +00:00
|
|
|
"img_file": img_file.as_posix(),
|
2020-04-24 15:38:18 +00:00
|
|
|
"size": size,
|
2020-07-12 17:47:29 +00:00
|
|
|
"fs_type": fs_type,
|
2020-04-24 15:38:18 +00:00
|
|
|
},
|
|
|
|
)
|
2020-04-24 11:48:09 +00:00
|
|
|
run(f"truncate -s {size} {img_file}")
|
2020-07-12 17:47:29 +00:00
|
|
|
if fs_type == "ext4":
|
|
|
|
run(f"mkfs.ext4 {img_file}")
|
|
|
|
elif fs_type == "btrfs":
|
|
|
|
run(f"mkfs.btrfs {img_file}")
|
|
|
|
else:
|
|
|
|
raise Exception(f"Unsupported fsType: {fs_type}")
|
Support online volume expansion
Summary:
Online volume expansion is a 2 phase process:
1. The backing storage, in this case the raw file, needs to be resized. (i.e. `truncate -s`)
2. The node should be notified, so that it can both refresh its device capacity (i.e. `losetup -c`) and resize the filesystem (`resize2fs`) accordingly.
Although in our case both steps could be performed on the node itself, for the sake of following the semantics of how volume expansion works, we perform step 1 from the controller, and step 2 from the node.
Also, the `external-resizer` component is added which watches for PVC size updates, and notifies the CSI controller about it.
Test Plan:
Setup:
- Deploy
- Create a rawfile-backed pvc, and attach a Deployment to it
- Keep an eye on `rawfile` pod logs in `kube-system` namespace to see if any errors pop out during all scenarios
Scenario 1:
- Increase the size of the pvc
- Exec into the pod and verify that the volume is resized indeed (using `df`)
Scenario 2:
- Decrease deployment's replica to 0
- Increase the size of the pvc. Wait for a couple of minutes.
- Increase deployment's replica to 1
- Exec into the pod and verify that the volume is resized indeed.
Reviewers: bghadiri, mhyousefi, h.marvi, sina_rad
Reviewed By: bghadiri, mhyousefi, sina_rad
Differential Revision: https://phab.hamravesh.ir/D817
2020-06-12 12:12:49 +00:00
|
|
|
|
|
|
|
|
|
|
|
@remote_fn
|
|
|
|
def expand_rawfile(volume_id, size):
|
|
|
|
import rawfile_util
|
|
|
|
from util import run
|
|
|
|
|
|
|
|
img_file = rawfile_util.img_file(volume_id)
|
2020-06-13 23:47:32 +00:00
|
|
|
if rawfile_util.metadata(volume_id)["size"] >= size:
|
|
|
|
return
|
Support online volume expansion
Summary:
Online volume expansion is a 2 phase process:
1. The backing storage, in this case the raw file, needs to be resized. (i.e. `truncate -s`)
2. The node should be notified, so that it can both refresh its device capacity (i.e. `losetup -c`) and resize the filesystem (`resize2fs`) accordingly.
Although in our case both steps could be performed on the node itself, for the sake of following the semantics of how volume expansion works, we perform step 1 from the controller, and step 2 from the node.
Also, the `external-resizer` component is added which watches for PVC size updates, and notifies the CSI controller about it.
Test Plan:
Setup:
- Deploy
- Create a rawfile-backed pvc, and attach a Deployment to it
- Keep an eye on `rawfile` pod logs in `kube-system` namespace to see if any errors pop out during all scenarios
Scenario 1:
- Increase the size of the pvc
- Exec into the pod and verify that the volume is resized indeed (using `df`)
Scenario 2:
- Decrease deployment's replica to 0
- Increase the size of the pvc. Wait for a couple of minutes.
- Increase deployment's replica to 1
- Exec into the pod and verify that the volume is resized indeed.
Reviewers: bghadiri, mhyousefi, h.marvi, sina_rad
Reviewed By: bghadiri, mhyousefi, sina_rad
Differential Revision: https://phab.hamravesh.ir/D817
2020-06-12 12:12:49 +00:00
|
|
|
rawfile_util.patch_metadata(
|
|
|
|
volume_id, {"size": size},
|
|
|
|
)
|
|
|
|
run(f"truncate -s {size} {img_file}")
|