From 08cbecebdbfdb5c2a545f67b31793e6a1be9fc35 Mon Sep 17 00:00:00 2001
From: Ahmed Bilal <49-ahmedbilal@users.noreply.code.ungleich.ch>
Date: Sat, 7 Sep 2019 12:38:58 +0200
Subject: [PATCH] allow ucloud-api to also be able work without ceph i.e use
 filesystem

---
 .gitignore |  1 +
 config.py  | 13 +++++++++++++
 main.py    | 20 +++++++++++++++-----
 schemas.py |  2 ++
 4 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/.gitignore b/.gitignore
index 209604a..a94f03d 100755
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ venv/
 settings.json
 ucloud_common
 etcd3_wrapper
+log.txt
diff --git a/config.py b/config.py
index 833dc0d..603501c 100644
--- a/config.py
+++ b/config.py
@@ -1,4 +1,17 @@
+import logging
+
 from etcd3_wrapper import Etcd3Wrapper
 from decouple import config
 
+logging.basicConfig(
+    level=logging.DEBUG,
+    filename="log.txt",
+    filemode="a",
+    format="%(asctime)s: %(levelname)s - %(message)s",
+    datefmt="%d-%b-%y %H:%M:%S",
+)
+
+
+WITHOUT_CEPH = config("WITHOUT_CEPH", False, cast=bool)
+
 etcd_client = Etcd3Wrapper(host=config("ETCD_URL"))
diff --git a/main.py b/main.py
index 4cc2e9f..7c2a61d 100755
--- a/main.py
+++ b/main.py
@@ -4,12 +4,14 @@
 
 import json
 import subprocess
+import os
 
 from flask import Flask, request
 from flask_restful import Resource, Api
 from uuid import uuid4
 from os.path import join
 from config import etcd_client as client
+from config import WITHOUT_CEPH, logging
 
 from ucloud_common.vm import VmPool, VMStatus
 from ucloud_common.host import HostPool
@@ -123,15 +125,23 @@ class VMAction(Resource):
             if action == "delete" and vm_entry.hostname == "":
                 try:
                     path_without_protocol = vm_entry.path[vm_entry.path.find(":")+1:]
-                    rc = subprocess.call(f"rbd rm {path_without_protocol}".split(" "))
-                except FileNotFoundError:
-                    return {"message": "VM image does not exists"}
-                else:
-                    if rc == 0:
+
+                    if WITHOUT_CEPH:
+                        command_to_delete = ["rm", os.path.join("/var/vm", vm_entry.uuid)]
+                    else:
+                        command_to_delete = ["rbd", "rm", path_without_protocol]
+
+                    subprocess.check_output(command_to_delete, stderr=subprocess.PIPE)
+                except subprocess.CalledProcessError as e:
+                    if "No such file" in e.stderr.decode("utf-8"):
                         client.client.delete(vm_entry.key)
                         return {"message": "VM successfully deleted"}
                     else:
+                        logging.exception(e)
                         return {"message": "Some error occurred while deleting VM"}
+                else:
+                    client.client.delete(vm_entry.key)
+                    return {"message": "VM successfully deleted"}
 
             r = RequestEntry.from_scratch(type=f"{action.title()}VM",
                                           uuid=data['uuid'],
diff --git a/schemas.py b/schemas.py
index 2e46b11..90acd50 100755
--- a/schemas.py
+++ b/schemas.py
@@ -99,8 +99,10 @@ class CreateImageSchema(BaseSchema):
         self.uuid: Field = Field("uuid", str, data.get("uuid", KeyError))
         self.name = Field("name", str, data.get("name", KeyError))
         self.image_store = Field("image_store", str, data.get("image_store", KeyError))
+
         # Validations
         self.uuid.validation = self.file_uuid_validation
+        self.image_store.validation = self.image_store_name_validation
 
         # All Fields
         fields = [self.uuid, self.name, self.image_store]