def _create(server_address, params): """ Creates a new SQL connection pool. """ logger.info("About to create an SQL connection pool, server_address=[%s], params=[%s]" % (server_address, params)) zato_message = _get_edit_create_message(params) invoke_admin_service(server_address, "zato:pool.sql.create", etree.tostring(zato_message)) logger.info("Created SQL connection pool, server_address=[%s], params=[%s]" % (server_address, params))
def _edit(server_address, params): """ Updates SQL connection pool's parameters (everything except for the password). """ logger.info("About to change an SQL connection pool, server_address=[%s], params=[%s]" % (server_address, params)) zato_message = _get_edit_create_message(params, "edit-") # original_pool_name is needed only by 'edit'. zato_message.pool.original_pool_name = params.get("edit-original_pool_name") invoke_admin_service(server_address, "zato:pool.sql.edit", etree.tostring(zato_message)) logger.info("Saved changes to SQL connection pool, server_address=[%s], params=[%s]" % (server_address, params))
def _change_password(server_address, params): """ Changes the SQL connection pool's password. """ params_no_passwords = copy.deepcopy(params) params_no_passwords["password1"] = "***" params_no_passwords["password2"] = "***" logger.info("About to change an SQL connection pool password, server_address=[%s], params=[%s]" % (server_address, params_no_passwords)) config_pub_key = str(params["config_pub_key"]) encrypted_password1 = encrypt(params["password1"], config_pub_key) encrypted_password2 = encrypt(params["password2"], config_pub_key) zato_message = Element("{%s}zato_message" % zato_namespace) zato_message.pool_name = params["pool_name"] zato_message.password1 = encrypted_password1 zato_message.password2 = encrypted_password2 invoke_admin_service(server_address, "zato:pool.sql.change-password", etree.tostring(zato_message))
def _ping_delete(req, soap_action): """ Code common to both deleting and pinging connection pools. """ server_id = req.GET.get("server") pool_name = req.GET.get("pool_name") if not server_id: raise ZatoException("No 'server' parameter found, req.GET=[%s]" % req.GET) if not pool_name: raise ZatoException("No 'pool_name' parameter found, req.GET=[%s]" % req.GET) server = Server.objects.get(id=server_id) zato_message = Element("{%s}zato_message" % zato_namespace) zato_message.pool_name = pool_name return invoke_admin_service(server.address, soap_action, etree.tostring(zato_message))
def index(req): """ Lists SQL connection pools and dispatches the management requests (create, edit and change_password). """ zato_servers = Server.objects.all().order_by("name") pools = [] config_pub_key = "" server_id = None choose_server_form = ChooseClusterForm(zato_servers, req.GET) edit_form = SQLConnectionPoolForm(prefix="edit") # Build a list of SQL connection pools for a given Zato server. server_id = req.GET.get("server") if server_id and req.method == "GET": # We have a server to pick the connection pools from, try to # invoke it now. server = Server.objects.get(id=server_id) _ignored, zato_message, soap_response = invoke_admin_service(server.address, "zato:pool.sql.get-list") # Config pub key is always needed. config_pub_key = zato_path("envelope.config_pub_key", True).get_from(zato_message) if zato_path("data.pool_list.pool").get_from(zato_message) is not None: for pool in zato_message.data.pool_list.pool: original_pool_name = unicode(pool.pool_name) pool_name = unicode(pool.pool_name) engine = unicode(pool.engine) engine_friendly = engine_friendly_name[str(engine)] user = unicode(pool.user) host = unicode(pool.host) db_name = unicode(pool.db_name) pool_size = pool.pool_size if path("pool.extra.item").get_from(pool) is not None: logger.log(TRACE1, "Found 'extra.item' in the response, pool_name=[%s]" % pool_name) extra = [] for extra_elem in pool.extra.item: extra.append(unicode(extra_elem)) extra = "\n".join(extra) else: logger.log(TRACE1, "No 'extra.item' found in the response, pool_name=[%s]" % pool_name) extra = "" pool = SQLConnectionPool(uuid4().hex, original_pool_name, pool_name, engine, engine_friendly, user, host, db_name, pool_size, extra) pools.append(pool) else: logger.info("No pools found, soap_response=[%s]" % soap_response) if req.method == "POST": action = req.POST.get("zato_action") if not action: msg = "Missing 'zato_action' parameter in req.POST" logger.error(msg) return HttpResponseServerError(msg) if not server_id: msg = "Parameter 'server' is missing in GET data." if action != "change_password": msg += " Action [%s], req.POST=[%s], req.GET=[%s]" % (action, pprint(req.POST), pprint(req.GET)) logger.error(msg) return HttpResponseServerError(msg) server = Server.objects.get(id=server_id) handler = globals().get("_" + action) if not handler: msg = "No handler found for action [%s]." % action if action != "change_password": msg += " req.POST=[%s], req.GET=[%s]" % (pprint(req.POST), pprint(req.GET)) logger.error(msg) return HttpResponseServerError(msg) # Finally, invoke the action handler. try: response = handler(server.address, req.POST) response = response if response else "" return HttpResponse(response) except Exception, e: msg = "Could not invoke action [%s], e=[%s]. " % (action, format_exc()) if action != "change_password": msg += " req.POST=[%s], req.GET=[%s]" % (pprint(req.POST), pprint(req.GET)) logger.error(msg) return HttpResponseServerError(msg)