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]