From 68b7a53e93225c6e86863675b47091393c34fde2 Mon Sep 17 00:00:00 2001
From: Bryan Brancotte <bryan.brancotte@pasteur.fr>
Date: Mon, 4 Apr 2022 16:19:53 +0200
Subject: [PATCH] move projects into a dedicated folder

---
 .dockerignore                                 |  1 +
 .gitlab-ci.yml                                |  4 ++--
 Dockerfile                                    |  7 +++++--
 chart/pvc-shared-data.yaml                    |  2 +-
 chart/templates/deployment-back.yaml          | 10 +++++-----
 chart/templates/deployment-celery-worker.yaml | 13 +++++++++----
 chart/templates/{pvc-data.yaml => pvc.yaml}   |  6 +++---
 chart/values.yaml                             |  4 ++--
 docker-compose.yaml                           | 11 ++++-------
 jass/config.py                                |  5 +++++
 jass/models/project.py                        | 12 +++++++++---
 projects/README.md                            |  1 +
 12 files changed, 47 insertions(+), 29 deletions(-)
 rename chart/templates/{pvc-data.yaml => pvc.yaml} (54%)
 create mode 100644 projects/README.md

diff --git a/.dockerignore b/.dockerignore
index d3785139..6e142bde 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,3 +1,4 @@
 data/
 client/
+projects/
 .venv/
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e8b9cbe1..edad1bb0 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -41,8 +41,8 @@ test-backend-image:
     - touch data/initTable.hdf5
     - >
       docker run
-      -v $(pwd)/data:/code/data
-      -v $(pwd)/data:/code/data_persistent
+      -v $(pwd)/data:/data
+      -v $(pwd)/projects:/projects
       -v $(pwd)/.eggs:/code/.eggs
       -v $(pwd)/jass.egg-info:/code/jass.egg-info
       "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/backend:$CI_COMMIT_SHA"
diff --git a/Dockerfile b/Dockerfile
index ed07cacf..a11a1960 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,7 @@
 FROM python:3.9 as backend
 
-ENV JASS_DATA_DIR '/code/data'
+ENV JASS_DATA_DIR '/data'
+ENV JASS_PROJECTS_DIR '/projects'
 
 EXPOSE 8080
 
@@ -17,7 +18,9 @@ RUN addgroup --gid 1000 kiwi \
  && pip install --upgrade pip setuptools \
  && mkdir /code \
  && mkdir ${JASS_DATA_DIR} \
- && chown kiwi:kiwi ${JASS_DATA_DIR}
+ && chown kiwi:kiwi ${JASS_DATA_DIR} \
+ && mkdir ${JASS_PROJECTS_DIR} \
+ && chown kiwi:kiwi ${JASS_PROJECTS_DIR}
 WORKDIR /code
 
 COPY requirements*.txt /code/
diff --git a/chart/pvc-shared-data.yaml b/chart/pvc-shared-data.yaml
index 81d85165..24b77916 100644
--- a/chart/pvc-shared-data.yaml
+++ b/chart/pvc-shared-data.yaml
@@ -7,6 +7,6 @@ spec:
     - ReadWriteMany
   resources:
     requests:
-      storage: 25Gi
+      storage: 15Gi
   storageClassName: isilon
 status: {}
\ No newline at end of file
diff --git a/chart/templates/deployment-back.yaml b/chart/templates/deployment-back.yaml
index e97f920d..32bc8814 100644
--- a/chart/templates/deployment-back.yaml
+++ b/chart/templates/deployment-back.yaml
@@ -36,14 +36,14 @@ spec:
         resources:
           {{- toYaml .Values.back.resources | nindent 12 }}
         volumeMounts:
-          - mountPath: /code/data
-            name: data-files
-          - mountPath: /code/shared_data
+          - mountPath: /projects
+            name: projects-files
+          - mountPath: /data
             name: shared-data-files
       volumes:
-        - name: data-files
+        - name: projects-files
           persistentVolumeClaim:
-            claimName: {{ printf "%s-data-files" .Release.Name }}
+            claimName: {{ printf "%s-projects-files" .Release.Name }}
         - name: shared-data-files
           persistentVolumeClaim:
             claimName: "jass-shared-data-files"
\ No newline at end of file
diff --git a/chart/templates/deployment-celery-worker.yaml b/chart/templates/deployment-celery-worker.yaml
index cebf2772..dfab1f0b 100644
--- a/chart/templates/deployment-celery-worker.yaml
+++ b/chart/templates/deployment-celery-worker.yaml
@@ -47,9 +47,14 @@ spec:
         resources:
           {{- toYaml .Values.celery.resources | nindent 12 }}
         volumeMounts:
-          - mountPath: /code/data
-            name: data-files
+          - mountPath: /projects
+            name: projects-files
+          - mountPath: /data
+            name: shared-data-files
       volumes:
-        - name: data-files
+        - name: projects-files
           persistentVolumeClaim:
-            claimName: {{ printf "%s-data-files" .Release.Name }}
\ No newline at end of file
+            claimName: {{ printf "%s-projects-files" .Release.Name }}
+        - name: shared-data-files
+          persistentVolumeClaim:
+            claimName: "jass-shared-data-files"
\ No newline at end of file
diff --git a/chart/templates/pvc-data.yaml b/chart/templates/pvc.yaml
similarity index 54%
rename from chart/templates/pvc-data.yaml
rename to chart/templates/pvc.yaml
index a7067e77..56d822b0 100644
--- a/chart/templates/pvc-data.yaml
+++ b/chart/templates/pvc.yaml
@@ -1,7 +1,7 @@
 apiVersion: v1
 kind: PersistentVolumeClaim
 metadata:
-  name: {{ printf "%s-data-files" .Release.Name }}
+  name: {{ printf "%s-projects-files" .Release.Name }}
   labels:
     {{- include "chart.labels" . | nindent 4 }}
 spec:
@@ -9,6 +9,6 @@ spec:
     - ReadWriteMany
   resources:
     requests:
-      storage: {{ .Values.data.size }}
-  storageClassName: {{ .Values.data.storageClassName }}
+      storage: {{ .Values.projects.size }}
+  storageClassName: {{ .Values.projects.storageClassName }}
 status: {}
\ No newline at end of file
diff --git a/chart/values.yaml b/chart/values.yaml
index 0e2c186d..59d5d0b4 100644
--- a/chart/values.yaml
+++ b/chart/values.yaml
@@ -69,8 +69,8 @@ back:
       memory: 4Gi
       cpu: 2000m
 
-data:
-  size: 50Gi
+projects:
+  size: 20Gi
   storageClassName: isilon
 
 client:
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 427f59e9..fa43015e 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -19,7 +19,8 @@ services:
       JASS_RABBITMQ_URL: 'amqp://guest:guest@rabbitmq:5672'
       WAIT_FOR_DATA_DIR_READY: 1
     volumes:
-      - ./data:/code/data
+      - ./projects:/projects
+      - ./data:/data
       - ./jass:/code/jass
     depends_on:
       - rabbitmq
@@ -31,7 +32,8 @@ services:
     environment:
       JASS_RABBITMQ_URL: 'amqp://guest:guest@rabbitmq:5672'
     volumes:
-      - ./data:/code/data
+      - ./projects:/projects
+      - ./data:/data
       - ./jass:/code/jass
     ports:
       - '8080:8080'
@@ -72,8 +74,3 @@ services:
 #    #   - /client/node_modules
 #    ports:
 #      - '3001:8080'
-    
-
-
-volumes:
-  jass-persistent-data:
\ No newline at end of file
diff --git a/jass/config.py b/jass/config.py
index c8bd6ae4..b2d4ccad 100644
--- a/jass/config.py
+++ b/jass/config.py
@@ -22,6 +22,9 @@ config = {
     "DATA_DIR": os.path.normpath(
         os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "data")
     ),
+    "PROJECTS_DIR": os.path.normpath(
+        os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "projects")
+    ),
     "INITTABLE_CHUNKSIZE": 100000,
 }
 if "JASS_HOST" in os.environ:
@@ -30,3 +33,5 @@ if "JASS_PORT" in os.environ:
     config["PORT"] = os.environ["JASS_PORT"]
 if "JASS_DATA_DIR" in os.environ:
     config["DATA_DIR"] = os.environ["JASS_DATA_DIR"]
+if "JASS_PROJECTS_DIR" in os.environ:
+    config["PROJECTS_DIR"] = os.environ["JASS_PROJECTS_DIR"]
diff --git a/jass/models/project.py b/jass/models/project.py
index 8b2b7124..4280cb7d 100644
--- a/jass/models/project.py
+++ b/jass/models/project.py
@@ -110,10 +110,14 @@ class Project(BaseModel, abc.ABC):
     def create_id(self):
         return self.get_hash().hexdigest()
 
+    @classmethod
+    def get_folder_path_from_id(cls, project_id):
+        return os.path.join(config["PROJECTS_DIR"], f"project_{project_id}")
 
     @classmethod
     def load(cls, id):
-        path = os.path.join(config["DATA_DIR"], f"project_{id}", "meta.json")
+        # path = os.path.join(config["DATA_DIR"], f"project_{id}", "meta.json")
+        path = os.path.join(Project.get_folder_path_from_id(id), "meta.json")
         with open(path, "r") as fp:
             return cls.parse_raw("".join(fp.readlines()))
 
@@ -126,7 +130,8 @@ class Project(BaseModel, abc.ABC):
         """
         Get the path of the folder where the project data are stored
         """
-        return os.path.join(config["DATA_DIR"], f"project_{self.id}")
+        # return os.path.join(config["DATA_DIR"], f"project_{self.id}")
+        return self.get_folder_path_from_id(self.id)
 
     def get_meta_file_path(self):
         """
@@ -284,7 +289,8 @@ class LocalProject(Project):
 
 
 def load_project(project_id):
-    path = os.path.join(config["DATA_DIR"], f"project_{project_id}", "meta.json")
+    path = os.path.join(Project.get_folder_path_from_id(project_id), "meta.json")
+    # path = os.path.join(config["DATA_DIR"], f"project_{project_id}", "meta.json")
     with open(path, "r") as fp:
         project = parse_raw_as(
             Union[
diff --git a/projects/README.md b/projects/README.md
new file mode 100644
index 00000000..10c46d81
--- /dev/null
+++ b/projects/README.md
@@ -0,0 +1 @@
+Projects are created in this directory.
\ No newline at end of file
-- 
GitLab