class HealthCheck(View, Controller): """Health Check Page Controller""" def get(self, request): self.__health = Health() self.__helpers = Helpers() self.__logger = self.__helpers.get_logger(__name__) status = Health.OK errors = [] errors.extend(self.__health.check_db()) errors.extend(self.__health.check_io()) errors.extend(self.__health.check_workers()) if len(errors) > 0: status = Health.NOT_OK self.__logger.error( _("Health Check Result: %(status)s %(errors)s") % { "status": status, "errors": self.__helpers.json_dumps(errors) }) else: self.__logger.info( _("Health Check Result: %(status)s %(errors)s") % { "status": status, "errors": self.__helpers.json_dumps(errors) }) return JsonResponse({ "status": status, "messages": [] }, status=200 if status == Health.OK else 503)
class Response(): __private = {} __public = {} __helpers = None __logger = None def __init__(self): self.__helpers = Helpers() self.__logger = self.__helpers.get_logger(__name__) def send_private_success(self, messages, payload={}): self.__private["status"] = "success" self.__private["messages"] = messages if len(payload) > 0: self.__private["payload"] = payload self.__logger.debug( _("App Response: ") + self.__helpers.json_dumps(self.__private) + "\n") return self.__private def send_private_failure(self, messages, payload={}): self.__private["status"] = "failure" self.__private["messages"] = messages if len(payload) > 0: self.__private["payload"] = payload self.__logger.debug( _("App Response: ") + self.__helpers.json_dumps(self.__private) + "\n") return self.__private def send_public_success(self, messages, payload={}): self.__public["status"] = "success" self.__public["messages"] = messages if len(payload) > 0: self.__public["payload"] = payload self.__logger.debug( _("App Response: ") + self.__helpers.json_dumps(self.__public) + "\n") return self.__public def send_public_failure(self, messages, payload={}): self.__public["status"] = "failure" self.__public["messages"] = messages if len(payload) > 0: self.__public["payload"] = payload self.__logger.debug( _("App Response: ") + self.__helpers.json_dumps(self.__public) + "\n") return self.__public
class Request(): __request = None __helpers = None __logger = None def __init__(self, request=None): self.__request = request self.__helpers = Helpers() self.__logger = self.__helpers.get_logger(__name__) def set_request(self, request): self.__request = request def get_request_data(self, method, predicted): request_data = {} data_bag = self.__request.POST if method.lower( ) == "post" else self.__request.GET for key, default in predicted.items(): request_data[key] = data_bag[key] if key in data_bag else default self.__logger.debug( _("App Incoming Request: ") + self.__helpers.json_dumps(request_data)) return request_data
class Request(): def __init__(self, request=None): self.__request = request self.__helpers = Helpers() self.__logger = self.__helpers.get_logger(__name__) def set_request(self, request): self.__request = request def get_request_data(self, method, predicted): request_data = {} log_data = {} data_bag = self.__request.POST if method.lower() == "post" else self.__request.GET for key, default in predicted.items(): if "password" in key: log_data[key] = "<hidden>" if key in data_bag else default elif "token" in key: log_data[key] = "<hidden>" if key in data_bag else default else: log_data[key] = data_bag[key] if key in data_bag else default request_data[key] = data_bag[key] if key in data_bag else default self.__logger.info(_("Required request data: %(data)s") % { "data": self.__helpers.json_dumps(log_data) }) return request_data
class Request(): def __init__(self, request=None): self.__request = request self.__helpers = Helpers() self.__logger = self.__helpers.get_logger(__name__) def set_request(self, request): self.__request = request def get_request_data(self, method, predicted): request_data = {} log_data = {} correlation_id = self.__request.META[ "X-Correlation-ID"] if "X-Correlation-ID" in self.__request.META else "" data_bag = self.__request.POST if method.lower( ) == "post" else self.__request.GET for key, default in predicted.items(): if "password" in key: log_data[key] = "<hidden>" if key in data_bag else default elif "token" in key: log_data[key] = "<hidden>" if key in data_bag else default else: log_data[key] = data_bag[key] if key in data_bag else default request_data[key] = data_bag[key] if key in data_bag else default self.__logger.debug( _("App Incoming Request: %(data)s {'correlationId':'%(correlationId)s'}" ) % { "data": self.__helpers.json_dumps(log_data), "correlationId": correlation_id }) return request_data
class HealthCheck(View): __response = None __correlation_id = None __health = None __helpers = None __logger = None def get(self, request): self.__correlation_id = request.META[ "X-Correlation-ID"] if "X-Correlation-ID" in request.META else "" self.__response = Response() self.__health = Health() self.__helpers = Helpers() self.__logger = self.__helpers.get_logger(__name__) status = Health.OK errors = [] errors.extend(self.__health.check_db()) errors.extend(self.__health.check_io()) errors.extend(self.__health.check_workers()) if len(errors) > 0: status = Health.NOT_OK self.__logger.error( _("Health Check Result: %(status)s %(errors)s {'correlationId':'%(correlationId)s'}" ) % { "status": status, "errors": self.__helpers.json_dumps(errors), "correlationId": self.__correlation_id }) else: self.__logger.debug( _("Health Check Result: %(status)s %(errors)s {'correlationId':'%(correlationId)s'}" ) % { "status": status, "errors": self.__helpers.json_dumps(errors), "correlationId": self.__correlation_id }) return JsonResponse(self.__response.send({"status": status}, self.__correlation_id), status=200 if status == Health.OK else 503)
class Host(View): __request = None __response = None __helpers = None __form = None __logger = None __user_id = None __host_id = None __host_module = None def __init__(self): self.__request = Request() self.__response = Response() self.__helpers = Helpers() self.__form = Form() self.__host_module = Host_Module() self.__logger = self.__helpers.get_logger(__name__) def post(self, request, host_id): self.__user_id = request.user.id self.__host_id = host_id if not self.__host_module.user_owns(self.__host_id, self.__user_id): return JsonResponse( self.__response.send_private_failure([{ "type": "error", "message": _("Error! Invalid Request.") }])) self.__request.set_request(request) request_data = self.__request.get_request_data( "post", { "name": "", "slug": "", "server": "", "type": "", "auth_type": "", "tls_ca_certificate": "", "tls_certificate": "", "tls_key": "" }) self.__form.add_inputs({ 'name': { 'value': request_data["name"], 'validate': { 'host_name': { 'error': _("Error! Host Name is invalid.") }, 'length_between': { 'param': [3, 41], 'error': _("Error! Host slug length must be from 4 to 40 characters." ) } } }, 'slug': { 'value': request_data["slug"], 'validate': { 'host_slug': { 'error': _('Error! Host slug is not valid.') }, 'length_between': { 'param': [3, 21], 'error': _('Error! Host slug length must be from 4 to 20 characters.' ) } } }, 'server': { 'value': request_data["server"], 'validate': { 'host_server': { 'error': _('Error! Host server is not valid.') }, 'length_between': { 'param': [3, 60], 'error': _('Error! Host server length must be from 4 to 20 characters.' ) } } }, 'type': { 'value': request_data["type"], 'validate': { 'any_of': { 'param': [["docker"]], 'error': _('Error! Host type is invalid.') } } }, 'auth_type': { 'value': request_data["auth_type"], 'validate': { 'any_of': { 'param': [[ "no_auth", "tls_server_client", "tls_client_only", "tls_server_only", "tls_only" ]], 'error': _('Error! Auth type is invalid.') } } }, 'tls_ca_certificate': { 'value': request_data["tls_ca_certificate"], 'validate': { 'optional': {}, 'tls_certificate': { 'error': _('Error! TLS CA Certificate is invalid.') } } }, 'tls_certificate': { 'value': request_data["tls_certificate"], 'validate': { 'optional': {}, 'tls_certificate': { 'error': _('Error! TLS Certificate is invalid.') } } }, 'tls_key': { 'value': request_data["tls_key"], 'validate': { 'optional': {}, 'tls_certificate': { 'error': _('Error! TLS Key is invalid.') } } } }) self.__form.process() if not self.__form.is_passed(): return JsonResponse( self.__response.send_private_failure( self.__form.get_errors(with_type=True))) if self.__host_module.slug_used_elsewhere( self.__host_id, self.__form.get_input_value("slug"), self.__user_id): return JsonResponse( self.__response.send_private_failure([{ "type": "error", "message": _("Error! Host slug is already used.") }])) result = self.__host_module.update_one_by_id( self.__host_id, { "name": self.__form.get_input_value("name"), "slug": self.__form.get_input_value("slug"), "server": self.__form.get_input_value("server"), "type": self.__form.get_input_value("type"), "auth_data": self.__helpers.json_dumps({ "auth_type": self.__form.get_input_value("auth_type"), "tls_ca_certificate": self.__form.get_input_value("tls_ca_certificate"), "tls_certificate": self.__form.get_input_value("tls_certificate"), "tls_key": self.__form.get_input_value("tls_key") }), "user_id": self.__user_id }) if result: return JsonResponse( self.__response.send_private_success([{ "type": "success", "message": _("Host updated successfully.") }])) else: return JsonResponse( self.__response.send_private_failure([{ "type": "error", "message": _("Error! Something goes wrong while creating host.") }])) def delete(self, request, host_id): self.__user_id = request.user.id self.__host_id = host_id if not self.__host_module.user_owns(self.__host_id, self.__user_id): return JsonResponse( self.__response.send_private_failure([{ "type": "error", "message": _("Error! Invalid Request.") }])) if self.__host_module.delete_host(self.__host_id): return JsonResponse( self.__response.send_private_success([{ "type": "success", "message": _("Host deleted successfully.") }])) else: return JsonResponse( self.__response.send_private_failure([{ "type": "error", "message": _("Error! Something goes wrong while deleting a host.") }]))
class Hosts(View): __request = None __response = None __helpers = None __form = None __logger = None __user_id = None __host_module = None __status = None def __init__(self): self.__request = Request() self.__response = Response() self.__helpers = Helpers() self.__form = Form() self.__host_module = Host_Module() self.__status = Status() self.__logger = self.__helpers.get_logger(__name__) def get(self, request): self.__user_id = request.user.id return JsonResponse( self.__response.send_private_success( [], { 'hosts': self.__format_host( self.__host_module.get_many_by_user( self.__user_id, "created_at", False)) })) def post(self, request): self.__user_id = request.user.id self.__request.set_request(request) request_data = self.__request.get_request_data( "post", { "name": "", "slug": "", "server": "", "type": "", "auth_type": "", "tls_ca_certificate": "", "tls_certificate": "", "tls_key": "" }) self.__form.add_inputs({ 'name': { 'value': request_data["name"], 'validate': { 'host_name': { 'error': _("Error! Host Name is invalid.") }, 'length_between': { 'param': [3, 41], 'error': _("Error! Host slug length must be from 4 to 40 characters." ) } } }, 'slug': { 'value': request_data["slug"], 'validate': { 'host_slug': { 'error': _('Error! Host slug is not valid.') }, 'length_between': { 'param': [3, 21], 'error': _('Error! Host slug length must be from 4 to 20 characters.' ) } } }, 'server': { 'value': request_data["server"], 'validate': { 'host_server': { 'error': _('Error! Host server is not valid.') }, 'length_between': { 'param': [3, 60], 'error': _('Error! Host server length must be from 4 to 20 characters.' ) } } }, 'type': { 'value': request_data["type"], 'validate': { 'any_of': { 'param': [["docker"]], 'error': _('Error! Host type is invalid.') } } }, 'auth_type': { 'value': request_data["auth_type"], 'validate': { 'any_of': { 'param': [[ "no_auth", "tls_server_client", "tls_client_only", "tls_server_only", "tls_only" ]], 'error': _('Error! Auth type is invalid.') } } }, 'tls_ca_certificate': { 'value': request_data["tls_ca_certificate"], 'validate': { 'optional': {}, 'tls_certificate': { 'error': _('Error! TLS CA Certificate is invalid.') } } }, 'tls_certificate': { 'value': request_data["tls_certificate"], 'validate': { 'optional': {}, 'tls_certificate': { 'error': _('Error! TLS Certificate is invalid.') } } }, 'tls_key': { 'value': request_data["tls_key"], 'validate': { 'optional': {}, 'tls_certificate': { 'error': _('Error! TLS Key is invalid.') } } } }) self.__form.process() if not self.__form.is_passed(): return JsonResponse( self.__response.send_private_failure( self.__form.get_errors(with_type=True))) if self.__host_module.slug_used(self.__form.get_input_value("slug"), self.__user_id): return JsonResponse( self.__response.send_private_failure([{ "type": "error", "message": _("Error! Host slug is already used.") }])) result = self.__host_module.insert_one({ "name": self.__form.get_input_value("name"), "slug": self.__form.get_input_value("slug"), "server": self.__form.get_input_value("server"), "type": self.__form.get_input_value("type"), "auth_data": self.__helpers.json_dumps({ "auth_type": self.__form.get_input_value("auth_type"), "tls_ca_certificate": self.__form.get_input_value("tls_ca_certificate"), "tls_certificate": self.__form.get_input_value("tls_certificate"), "tls_key": self.__form.get_input_value("tls_key") }), "user_id": self.__user_id }) if result: return JsonResponse( self.__response.send_private_success([{ "type": "success", "message": _("Host created successfully.") }])) else: return JsonResponse( self.__response.send_private_failure([{ "type": "error", "message": _("Error! Something goes wrong while creating host.") }])) def __format_host(self, hosts_list): _hosts_list = [] for host in hosts_list: _status = "up" if self.__status.set_host( host.id).ping() else "down" _hosts_list.append({ "id": host.id, "name": host.name, "slug": host.slug, "status": _status, "type": host.type.capitalize(), "created_at": host.created_at.strftime("%b %d %Y %H:%M:%S"), "view_url": reverse("app.web.admin.hosts.view", kwargs={'host_slug': host.slug}), "edit_url": reverse("app.web.admin.hosts.edit", kwargs={'host_slug': host.slug}), "delete_url": reverse("app.api.private.v1.admin.host.endpoint", kwargs={'host_id': host.id}) }) return _hosts_list
class Response(): def __init__(self): self.__helpers = Helpers() self.__logger = self.__helpers.get_logger(__name__) def send_private_success(self, messages, payload={}, correlation_id=""): private = {} private["status"] = "success" private["messages"] = messages if len(payload) > 0: private["payload"] = payload self.__log_response(copy.deepcopy(private), correlation_id) return private def send_private_failure(self, messages, payload={}, correlation_id=""): private = {} private["status"] = "failure" private["messages"] = messages if len(payload) > 0: private["payload"] = payload self.__log_response(copy.deepcopy(private), correlation_id) return private def send_errors_failure(self, messages, payload={}, correlation_id=""): private = {} errors = [] for input_key, error_list in messages.items(): for error in error_list: errors.append({"type": "error", "message": error}) private["status"] = "failure" private["messages"] = errors if len(payload) > 0: private["payload"] = payload self.__log_response(copy.deepcopy(private), correlation_id) return private def send_public_success(self, messages, payload={}, correlation_id=""): public = {} public["status"] = "success" public["messages"] = messages if len(payload) > 0: public["payload"] = payload self.__log_response(copy.deepcopy(public), correlation_id) return public def send_public_failure(self, messages, payload={}, correlation_id=""): public = {} public["status"] = "failure" public["messages"] = messages if len(payload) > 0: public["payload"] = payload self.__log_response(copy.deepcopy(public), correlation_id) return public def send(self, payload={}, correlation_id=""): self.__logger.debug( _("App Response: %(response)s {'correlationId':'%(correlationId)s'}\n" ) % { "response": self.__helpers.json_dumps(payload), "correlationId": correlation_id }) return payload def __log_response(self, response, correlation_id): if "payload" in response: for key, value in response["payload"].items(): if "password" in key: response["payload"][key] = "<hidden>" elif "token" in key: response["payload"][key] = "<hidden>" else: response["payload"][key] = value self.__logger.debug( _("App Response: %(response)s {'correlationId':'%(correlationId)s'}\n" ) % { "response": self.__helpers.json_dumps(response), "correlationId": correlation_id })