codekingpro/portable-devtools
114k
1##########################################################################2#3# pgAdmin 4 - PostgreSQL Tools4#5# Copyright (C) 2013 - 2024, The pgAdmin Development Team6# This software is released under the PostgreSQL Licence7#8##########################################################################9 10"""Implements Cloud Deployment"""11 12import json13from flask import Response, url_for14from flask import render_template, request15from flask_babel import gettext16from flask_security import current_user17from pgadmin.user_login_check import pga_login_required18 19from pgadmin.utils import PgAdminModule, html20from pgadmin.utils.ajax import make_json_response,\21 internal_server_error, bad_request, success_return22 23from pgadmin.utils.constants import MIMETYPE_APP_JS24from pgadmin.model import db, Server, Process25from pgadmin.misc.cloud.utils import get_my_ip26 27from pgadmin.misc.cloud.biganimal import deploy_on_biganimal,\28 clear_biganimal_session29from pgadmin.misc.cloud.rds import deploy_on_rds, clear_aws_session30from pgadmin.misc.cloud.azure import deploy_on_azure, clear_azure_session31from pgadmin.misc.cloud.google import clear_google_session, deploy_on_google32import config33 34# set template path for sql scripts35MODULE_NAME = 'cloud'36 37 38class CloudModule(PgAdminModule):39 """40 class CloudModule():41 42 It is a wizard which inherits PgAdminModule43 class and define methods to load its own44 javascript file.45 46 """47 48 def get_exposed_url_endpoints(self):49 """50 Returns:51 list: URL endpoints for cloud module52 """53 return ['cloud.deploy_on_cloud',54 'cloud.update_cloud_server',55 'cloud.update_cloud_process',56 'cloud.get_host_ip',57 'cloud.clear_cloud_session']58 59 def register(self, app, options):60 """61 Override the default register function to automagically register62 sub-modules at once.63 """64 super().register(app, options)65 66 from .azure import blueprint as module67 app.register_blueprint(module)68 69 from .biganimal import blueprint as module70 app.register_blueprint(module)71 72 from .rds import blueprint as module73 app.register_blueprint(module)74 75 from .google import blueprint as module76 app.register_blueprint(module)77 78 79# Create blueprint for CloudModule class80blueprint = CloudModule(81 MODULE_NAME, __name__, static_url_path='/misc/cloud')82 83 84@blueprint.route("/")85@pga_login_required86def index():87 return bad_request(88 errormsg=gettext("This URL cannot be called directly.")89 )90 91 92@blueprint.route("/cloud.js")93@pga_login_required94def script():95 """render own javascript"""96 res = Response(response=render_template(97 "cloud/js/cloud.js", _=gettext),98 status=200,99 mimetype=MIMETYPE_APP_JS)100 return res101 102 103@blueprint.route('/clear_cloud_session/',104 methods=['POST'], endpoint='clear_cloud_session')105@pga_login_required106def clear_session():107 """Get host IP Address"""108 clear_cloud_session()109 return make_json_response(success=1)110 111 112@blueprint.route('/get_host_ip/',113 methods=['GET'], endpoint='get_host_ip')114@pga_login_required115def get_host_ip():116 """Get host IP Address"""117 ip = get_my_ip()118 return make_json_response(data=ip)119 120 121@blueprint.route(122 '/deploy', methods=['POST'], endpoint='deploy_on_cloud'123)124@pga_login_required125def deploy_on_cloud():126 """Deploy on Cloud."""127 128 data = json.loads(request.data)129 if data['cloud'] == 'aws':130 status, p, resp = deploy_on_rds(data)131 elif data['cloud'] == 'biganimal':132 status, p, resp = deploy_on_biganimal(data)133 elif data['cloud'] == 'azure':134 status, p, resp = deploy_on_azure(data)135 elif data['cloud'] == 'google':136 status, p, resp = deploy_on_google(data)137 else:138 status = False139 resp = gettext('No cloud implementation.')140 141 if not status:142 return make_json_response(143 status=410,144 success=0,145 errormsg=resp146 )147 148 # Return response149 return make_json_response(150 success=1,151 data={152 'job_id': p.id,153 'desc': p.desc.message,154 'node': {155 '_id': resp['sid'],156 '_pid': data['db_details']['gid'],157 'connected': False,158 '_type': 'server',159 'icon': 'icon-server-cloud-deploy',160 'id': 'server_{}'.format(resp['sid']),161 'inode': True,162 'label': resp['label'],163 'server_type': 'pg',164 'module': 'pgadmin.node.server',165 'cloud_status': -1166 }}167 )168 169 170def update_server(data):171 """Update Server."""172 server_data = data173 pid = data['instance']['pid']174 server = Server.query.filter_by(175 user_id=current_user.id,176 id=server_data['instance']['sid']177 ).first()178 179 if server is None:180 return False, gettext("Could not find the server.")181 182 if server_data['instance'] == '' or\183 not server_data['instance']['status']:184 db.session.delete(server)185 else:186 server.host = server_data['instance']['Hostname']187 server.port = server_data['instance']['Port']188 server.cloud_status = 1189 190 try:191 db.session.commit()192 except Exception as e:193 db.session.rollback()194 return False, e.message195 196 _server = {197 'id': server.id,198 'servergroup_id': server.servergroup_id,199 'name': server.name,200 'cloud_status': server.cloud_status201 }202 if not server_data['instance']['status']:203 _server['status'] = False204 else:205 _server['status'] = True206 clear_cloud_session(pid)207 208 return True, _server209 210 211def clear_cloud_session(pid=None):212 """Clear cloud sessions."""213 clear_aws_session()214 clear_biganimal_session()215 clear_azure_session(pid)216 clear_google_session()217 218 219@blueprint.route(220 '/update_cloud_process/<sid>', methods=['GET'],221 endpoint='update_cloud_process'222)223@pga_login_required224def update_cloud_process(sid):225 """Update Cloud Server Process"""226 _process = Process.query.filter_by(user_id=current_user.id,227 server_id=sid).first()228 _process.acknowledge = None229 db.session.commit()230 return success_return()231 232 233@blueprint.route(234 '/update_cloud_server', methods=['POST'],235 endpoint='update_cloud_server'236)237@pga_login_required238def update_cloud_server():239 """Update Cloud Server."""240 server_data = json.loads(request.data)241 status, server = update_server(server_data)242 243 if not status:244 return make_json_response(245 status=410, success=0, errormsg=server246 )247 248 return make_json_response(249 success=1,250 data={'node': {251 'sid': server.id,252 'gid': server.servergroup_id,253 '_type': 'server',254 'icon': 'icon-server-not-connected',255 'id': 'server_{}'.format(server.id),256 'label': server.name257 }}258 )259 