Skip to content

Commit

Permalink
fix: properly display storage (#708)
Browse files Browse the repository at this point in the history
* fix: do not use ephemeral storage in server responses - use proper storage numbers

* fix: use same format for memory and storage

* fix: use username in pvc name

* chore: fix telepresence script

Co-authored-by: Rok Roškar <[email protected]>
  • Loading branch information
olevski and rokroskar authored Jul 23, 2021
1 parent 448a4f1 commit 9aa1df6
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 35 deletions.
18 changes: 6 additions & 12 deletions helm-chart/renku-notebooks/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -73,18 +73,12 @@ serverOptions:
type: enum
default: 1G
options: [1G, 2G]
# Int values are also supported
# gpu_request:
# displayName: Number of GPUs
# type: int
# default: 0
# range: [0, 0]
# disk_request:
# order: 4
# displayName: Amount of disk space requested
# type: enum
# default: "1G"
# options: ["1G", "10G"]
disk_request:
order: 4
displayName: Amount of storage
type: enum
default: "1G"
options: ["1G"]
## set allow_any_value to true to not enforce value checks
## arbitrary PV sizes
# allow_any_value: true
Expand Down
16 changes: 7 additions & 9 deletions renku_notebooks/api/classes/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import re
from urllib.parse import urlparse

from ...util.kubernetes_ import get_k8s_client, make_server_name
from ...util.kubernetes_ import get_k8s_client, make_pvc_name
from ...util.file_size import parse_file_size


Expand Down Expand Up @@ -123,14 +123,12 @@ def __init__(self, *args, **kwargs):
k8s_client, k8s_namespace = get_k8s_client()
self.k8s_client = k8s_client
self.k8s_namespace = k8s_namespace
self.name = (
make_server_name(
self.namespace,
self.project,
self.root_branch_name,
self.root_commit_sha,
)
+ "-pvc"
self.name = make_pvc_name(
self.user.safe_username,
self.namespace,
self.project,
self.root_branch_name,
self.root_commit_sha,
)
self.creation_date = (
None if not self.exists else self.pvc.metadata.creation_timestamp
Expand Down
33 changes: 29 additions & 4 deletions renku_notebooks/api/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ class UserPodResources(
{
"cpu": fields.Str(required=True),
"memory": fields.Str(required=True),
"ephemeral-storage": fields.Str(required=False),
"storage": fields.Str(required=False),
"gpu": fields.Str(required=False),
}
)
Expand Down Expand Up @@ -223,7 +223,8 @@ def get_pod_status(pod):
status.update(conditions_summary)
return status

def get_pod_resources(pod):
def get_server_resources(server):
pod = server.pod
try:
for container in pod.spec.containers:
if container.name == "notebook":
Expand All @@ -232,14 +233,38 @@ def get_pod_resources(pod):
# ref: https://kubernetes.io/docs/concepts/configuration/
# manage-compute-resources-container/#how-pods-with-resource-limits-are-run
if (
"cpu" in resources
"cpu" in resources.keys()
and isinstance(resources["cpu"], str)
and str.endswith(resources["cpu"], "m")
and resources["cpu"][:-1].isdigit()
):
resources["cpu"] = str(int(resources["cpu"][:-1]) / 1000)
if "memory" in resources.keys():
try:
memory_formatted = (
str(round(int(resources["memory"]) / 1073741824))
+ "G"
)
except ValueError:
pass
else:
resources["memory"] = memory_formatted
except (AttributeError, IndexError):
resources = {}
# add storage if PVCs are used
if server.session_pvc is not None and server.session_pvc.pvc is not None:
resources["storage"] = server.session_pvc.pvc.spec.resources.requests[
"storage"
]
# add storage if emptyDir is used and size limit is set
else:
volume_name = pod.metadata.name[:54] + "-git-repo"
volumes = [i for i in pod.spec.volumes if i.name == volume_name]
if len(volumes) == 1 and volumes[0].empty_dir.size_limit is not None:
resources["storage"] = volumes[0].empty_dir.size_limit
# remove ephemeral-storage if present
if "ephemeral-storage" in resources.keys():
resources.pop("ephemeral-storage")
return resources

pod = server.pod
Expand All @@ -254,7 +279,7 @@ def get_pod_resources(pod):
"started": pod.status.start_time,
"status": get_pod_status(pod),
"url": server.server_url,
"resources": get_pod_resources(pod),
"resources": get_server_resources(server),
"image": server.image,
}

Expand Down
10 changes: 10 additions & 0 deletions renku_notebooks/util/kubernetes_.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,13 @@ def make_server_name(namespace, project, branch, commit_sha):
return "{project}-{hash}".format(
project=project[:54], hash=md5(server_string.encode()).hexdigest()[:8]
)


def make_pvc_name(safe_username, namespace, project, branch, commit_sha):
"""Form a 16-digit hash persistent volume ID."""
server_string = f"{safe_username}{namespace}{project}{branch}{commit_sha}"
return "{username}-{project}-{hash}".format(
username=safe_username[:10],
project=project[:44],
hash=md5(server_string.encode()).hexdigest()[:8],
)
4 changes: 2 additions & 2 deletions run-telepresence.sh
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ export JUPYTERHUB_SERVICE_PREFIX
export JUPYTERHUB_URL
export FLASK_APP=`pwd`/renku_notebooks/wsgi.py
export FLASK_DEBUG=0
export NOTEBOOKS_SERVER_OPTIONS_DEFAULTS_PATH=`pwd`/tests/dummy_server_options_defaults.json
export NOTEBOOKS_SERVER_OPTIONS_UI_PATH=`pwd`/tests/dummy_server_options_ui.json
export NOTEBOOKS_SERVER_OPTIONS_DEFAULTS_PATH=`pwd`/tests/dummy_server_defaults.json
export NOTEBOOKS_SERVER_OPTIONS_UI_PATH=`pwd`/tests/dummy_server_options.json

echo ""
echo "================================================================================================================="
Expand Down
13 changes: 12 additions & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
"NOTEBOOKS_SERVER_OPTIONS_DEFAULTS_PATH"
] = "tests/dummy_server_defaults.json"
os.environ["NOTEBOOKS_SERVER_OPTIONS_UI_PATH"] = "tests/dummy_server_options.json"
os.environ["NOTEBOOKS_SESSION_PVS_ENABLED"] = "false"


@pytest.fixture(scope="session", autouse=True)
Expand Down Expand Up @@ -337,7 +338,17 @@ def create_pod(username, server_name, payload):
}
},
}
]
],
"volumes": [
{
"name": server_name + "-git-repo",
"empty_dir": {
"size_limit": payload.get("serverOptions", {}).get(
"disk_request"
)
},
}
],
},
}

Expand Down
17 changes: 10 additions & 7 deletions tests/test_autosaves.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from unittest.mock import patch

from renku_notebooks.api import config
from renku_notebooks.util.kubernetes_ import make_server_name
from renku_notebooks.util.kubernetes_ import make_pvc_name
from tests.conftest import _AttributeDictionary, CustomList

AUTHORIZED_HEADERS = {"Authorization": "token 8f7e09b3bf6b8a20"}
Expand All @@ -43,8 +43,9 @@ def _setup_pvcs(project, branches, commits, commited_datetime):
mocker.patch("renku_notebooks.api.classes.user.User._get_pvcs").return_value = [
V1PersistentVolumeClaim(
metadata=V1ObjectMeta(
name=make_server_name("dummyuser", project, branches[i], commits[i])
+ "-pvc",
name=make_pvc_name(
"dummyuser", "dummyuser", project, branches[i], commits[i]
),
annotations={
config.RENKU_ANNOTATION_PREFIX + "projectName": project,
config.RENKU_ANNOTATION_PREFIX + "namespace": "dummyuser",
Expand Down Expand Up @@ -127,8 +128,9 @@ def test_autosaves_only_pvs(setup_pvcs, setup_project, patch_config, client):
"commit": "1235435",
"date": tstamp.isoformat(),
"pvs": True,
"name": make_server_name("dummyuser", "project", "branch1", "1235435")
+ "-pvc",
"name": make_pvc_name(
"dummyuser", "dummyuser", "project", "branch1", "1235435"
),
}
],
"pvsSupport": True,
Expand Down Expand Up @@ -160,8 +162,9 @@ def test_autosaves_branches_pvs(setup_pvcs, setup_project, patch_config, client)
"commit": "1235435",
"date": tstamp.isoformat(),
"pvs": True,
"name": make_server_name("dummyuser", "project", "branch1", "1235435")
+ "-pvc",
"name": make_pvc_name(
"dummyuser", "dummyuser", "project", "branch1", "1235435"
),
},
{
"branch": "branch2",
Expand Down

0 comments on commit 9aa1df6

Please sign in to comment.