From ace73ebb604e7fe83e240edd96c7f8b14982616a Mon Sep 17 00:00:00 2001 From: Aditya Toshniwal Date: Thu, 28 Mar 2024 12:19:34 +0530 Subject: [PATCH] Added support for viewing Log Based Clusters. #7216 Co-authored-by: Akshay Joshi --- docs/en_US/images/replica_nodes_general.png | Bin 0 -> 104223 bytes .../images/replica_nodes_replication.png | Bin 0 -> 74699 bytes docs/en_US/managing_cluster_objects.rst | 1 + docs/en_US/replica_nodes_dialog.rst | 46 +++ .../browser/server_groups/servers/__init__.py | 20 +- .../servers/replica_nodes/__init__.py | 285 ++++++++++++++++++ .../static/img/coll-replica_nodes.svg | 1 + .../static/img/replica_nodes.svg | 1 + .../replica_nodes/static/js/replica_node.js | 61 ++++ .../static/js/replica_node.ui.js | 83 +++++ .../replica_nodes/sql/default/count.sql | 2 + .../replica_nodes/sql/default/nodes.sql | 3 + .../replica_nodes/sql/default/properties.sql | 8 + .../servers/sql/default/replication_type.sql | 7 + .../servers/tests/test_check_connect.py | 4 +- .../browser/server_groups/servers/utils.py | 13 + .../browser/templates/browser/js/utils.js | 3 +- web/pgadmin/dashboard/__init__.py | 50 +++ web/pgadmin/dashboard/static/js/Dashboard.jsx | 203 +++++-------- web/pgadmin/dashboard/static/js/Graphs.jsx | 2 +- .../dashboard/static/js/Replication/index.jsx | 214 +++++++++++++ .../js/Replication/replication_slots.ui.js | 52 ++++ .../js/Replication/replication_stats.ui.js | 80 +++++ .../dashboard/static/js/SystemStats/CPU.jsx | 2 +- .../static/js/SystemStats/Memory.jsx | 2 +- .../static/js/SystemStats/Storage.jsx | 2 +- .../static/js/SystemStats/Summary.jsx | 2 +- .../js/{ => components}/ChartContainer.jsx | 2 +- .../static/js/components/RefreshButtons.jsx | 46 +++ .../static/js/components/SectionContainer.jsx | 60 ++++ .../sql/default/replication_slots.sql | 1 + .../sql/default/replication_stats.sql | 1 + .../dashboard/tests/test_replication.py | 50 +++ .../properties/CollectionNodeProperties.jsx | 19 +- web/pgadmin/static/js/components/PgTable.jsx | 84 +++++- web/pgadmin/static/js/utils.js | 11 + web/webpack.config.js | 1 + web/webpack.shim.js | 1 + 38 files changed, 1264 insertions(+), 159 deletions(-) create mode 100644 docs/en_US/images/replica_nodes_general.png create mode 100644 docs/en_US/images/replica_nodes_replication.png create mode 100644 docs/en_US/replica_nodes_dialog.rst create mode 100644 web/pgadmin/browser/server_groups/servers/replica_nodes/__init__.py create mode 100644 web/pgadmin/browser/server_groups/servers/replica_nodes/static/img/coll-replica_nodes.svg create mode 100644 web/pgadmin/browser/server_groups/servers/replica_nodes/static/img/replica_nodes.svg create mode 100644 web/pgadmin/browser/server_groups/servers/replica_nodes/static/js/replica_node.js create mode 100644 web/pgadmin/browser/server_groups/servers/replica_nodes/static/js/replica_node.ui.js create mode 100644 web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/count.sql create mode 100644 web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/nodes.sql create mode 100644 web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/properties.sql create mode 100644 web/pgadmin/browser/server_groups/servers/templates/servers/sql/default/replication_type.sql create mode 100644 web/pgadmin/dashboard/static/js/Replication/index.jsx create mode 100644 web/pgadmin/dashboard/static/js/Replication/replication_slots.ui.js create mode 100644 web/pgadmin/dashboard/static/js/Replication/replication_stats.ui.js rename web/pgadmin/dashboard/static/js/{ => components}/ChartContainer.jsx (96%) create mode 100644 web/pgadmin/dashboard/static/js/components/RefreshButtons.jsx create mode 100644 web/pgadmin/dashboard/static/js/components/SectionContainer.jsx create mode 100644 web/pgadmin/dashboard/templates/dashboard/sql/default/replication_slots.sql create mode 100644 web/pgadmin/dashboard/templates/dashboard/sql/default/replication_stats.sql create mode 100644 web/pgadmin/dashboard/tests/test_replication.py diff --git a/docs/en_US/images/replica_nodes_general.png b/docs/en_US/images/replica_nodes_general.png new file mode 100644 index 0000000000000000000000000000000000000000..37da75efd1fc3bcb3b7411e26b49927052047a58 GIT binary patch literal 104223 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 CsIo`^ literal 0 HcmV?d00001 diff --git a/docs/en_US/images/replica_nodes_replication.png b/docs/en_US/images/replica_nodes_replication.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7b8c7a57473ea7409d5ea3f5d08aec9f289d66 GIT binary patch literal 74699 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"lZjej1FrC?%W&lVtBjMFxyy1%=vr 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 btb?ci5pevQSwb-$@~ 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 literal 0 HcmV?d00001 diff --git a/docs/en_US/managing_cluster_objects.rst b/docs/en_US/managing_cluster_objects.rst index f18c063a2..0bbe5c039 100644 --- a/docs/en_US/managing_cluster_objects.rst +++ b/docs/en_US/managing_cluster_objects.rst @@ -18,4 +18,5 @@ database, right-click on the *Databases* node, and select *Create Database...* resource_group_dialog role_dialog tablespace_dialog + replica_nodes_dialog role_reassign_dialog \ No newline at end of file diff --git a/docs/en_US/replica_nodes_dialog.rst b/docs/en_US/replica_nodes_dialog.rst new file mode 100644 index 000000000..0ce5f792b --- /dev/null +++ b/docs/en_US/replica_nodes_dialog.rst @@ -0,0 +1,46 @@ +.. _replica_nodes_dialog: + +**************************** +`Replica Node Dialog`:index: +**************************** + +Use The *Replica Node* dialog to view a standby instance being replicated +using log based streaming replication. Streaming replication allows a standby +server to stay more up-to-date than is possible with file-based log shipping. +The standby connects to the primary, which streams WAL records to the standby as +they're generated, without waiting for the WAL file to be filled. + +The *Replica Node* dialog organizes the information through the following tabs: +*General*, *Replication Slot* + +.. image:: images/replica_nodes_general.png + :alt: Replica Node dialog general tab + :align: center + +* The *PID* field is the process ID of a WAL sender process. +* The *Username* field is the name of the user logged into this WAL sender process. +* The *App Name* field is the name of the application that is connected to this WAL sender. +* The *Client Address* field is the IP address of the client connected to this WAL sender. + If this field is null, it indicates that the client is connected via a Unix socket on the server machine. +* The *Client Hostname* field is the host name of the connected client, as reported by a reverse DNS lookup + of client_addr.This field will only be non-null for IP connections, and only when log_hostname is enabled. +* The *Client Port* field is the TCP port number that the client is using for communication with + this WAL sender, or -1 if a Unix socket is used. +* The *State* field is the current WAL sender state. + +Click the *Replication Slot* tab to continue. + +.. image:: images/replica_nodes_replication.png + :alt: Replica Node dialog replication slot tab + :align: center + +* The *Slot Name* field is a unique, cluster-wide identifier for the replication slot. +* The *Slot Type* field is the slot type - physical or logical +* The *Active* field is True if this slot is currently actively being used. + +Other buttons: + +* Click the *Info* button (i) to access online help. +* Click the *Save* button to save work. +* Click the *Close* button to exit without saving work. +* Click the *Reset* button to restore configuration parameters. diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py index e1afde15b..331120338 100644 --- a/web/pgadmin/browser/server_groups/servers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/__init__.py @@ -15,6 +15,7 @@ from flask import render_template, request, make_response, jsonify, \ from flask_babel import gettext from flask_security import current_user, login_required from psycopg.conninfo import make_conninfo, conninfo_to_dict + from pgadmin.browser.server_groups.servers.types import ServerType from pgadmin.browser.utils import PGChildNodeView from pgadmin.utils.ajax import make_json_response, bad_request, forbidden, \ @@ -30,7 +31,8 @@ from pgadmin.utils.driver import get_driver from pgadmin.utils.master_password import get_crypt_key from pgadmin.utils.exception import CryptKeyMissing from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry -from pgadmin.browser.server_groups.servers.utils import is_valid_ipaddress +from pgadmin.browser.server_groups.servers.utils import \ + is_valid_ipaddress, get_replication_type from pgadmin.utils.constants import UNAUTH_REQ, MIMETYPE_APP_JS, \ SERVER_CONNECTION_CLOSED from sqlalchemy import or_ @@ -343,6 +345,9 @@ class ServerModule(sg.ServerGroupPluginModule): from .tablespaces import blueprint as module self.submodules.append(module) + from .replica_nodes import blueprint as module + self.submodules.append(module) + super().register(app, options) # We do not have any preferences for server node. @@ -469,7 +474,7 @@ class ServerNode(PGChildNodeView): }], 'check_pgpass': [{'get': 'check_pgpass'}], 'clear_saved_password': [{'put': 'clear_saved_password'}], - 'clear_sshtunnel_password': [{'put': 'clear_sshtunnel_password'}] + 'clear_sshtunnel_password': [{'put': 'clear_sshtunnel_password'}], }) SSL_MODES = ['prefer', 'require', 'verify-ca', 'verify-full'] @@ -1247,6 +1252,7 @@ class ServerNode(PGChildNodeView): connected = False user = None manager = None + replication_type = None if 'connect_now' in data and data['connect_now']: manager = get_driver(PG_DEFAULT_DRIVER).connection_manager( @@ -1324,6 +1330,8 @@ class ServerNode(PGChildNodeView): server.id), tunnel_password) + replication_type = get_replication_type(conn, + manager.version) user = manager.user_info connected = True @@ -1337,6 +1345,7 @@ class ServerNode(PGChildNodeView): username=server.username, user=user, connected=connected, + replication_type=replication_type, shared=server.shared, server_type=manager.server_type if manager and manager.server_type @@ -1427,6 +1436,7 @@ class ServerNode(PGChildNodeView): in_recovery = None wal_paused = None errmsg = None + replication_type = None if connected: status, result, in_recovery, wal_paused =\ recovery_state(conn, manager.version) @@ -1436,10 +1446,13 @@ class ServerNode(PGChildNodeView): manager.release() errmsg = "{0} : {1}".format(server.name, result) + replication_type = get_replication_type(conn, manager.version) + return make_json_response( data={ 'icon': server_icon_and_background(connected, manager, server), 'connected': connected, + 'replication_type': replication_type, 'in_recovery': in_recovery, 'wal_pause': wal_paused, 'server_type': manager.server_type if connected else "pg", @@ -1709,6 +1722,8 @@ class ServerNode(PGChildNodeView): _, _, in_recovery, wal_paused =\ recovery_state(conn, manager.version) + replication_type = get_replication_type(conn, manager.version) + return make_json_response( success=1, info=gettext("Server connected."), @@ -1716,6 +1731,7 @@ class ServerNode(PGChildNodeView): 'icon': server_icon_and_background(True, manager, server), 'connected': True, 'server_type': manager.server_type, + 'replication_type': replication_type, 'type': manager.server_type, 'version': manager.version, 'db': manager.db, diff --git a/web/pgadmin/browser/server_groups/servers/replica_nodes/__init__.py b/web/pgadmin/browser/server_groups/servers/replica_nodes/__init__.py new file mode 100644 index 000000000..17103c86d --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/replica_nodes/__init__.py @@ -0,0 +1,285 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2024, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +"""Implements Replication Nodes for PG/PPAS 9.4 and above""" + +from functools import wraps + +from pgadmin.browser.server_groups import servers +from flask import render_template +from flask_babel import gettext +from pgadmin.browser.collection import CollectionNodeModule +from pgadmin.browser.utils import PGChildNodeView +from pgadmin.utils.ajax import make_json_response, \ + make_response as ajax_response, internal_server_error, gone +from pgadmin.utils.ajax import precondition_required +from pgadmin.utils.driver import get_driver +from config import PG_DEFAULT_DRIVER +from pgadmin.browser.server_groups.servers.utils import get_replication_type + + +class ReplicationNodesModule(CollectionNodeModule): + """ + class ReplicationNodesModule(CollectionNodeModule) + + A module class for Replication Nodes node derived from + CollectionNodeModule. + + Methods: + ------- + * __init__(*args, **kwargs) + - Method is used to initialize the ReplicationNodesModule and it's + base module. + + * backend_supported(manager, **kwargs) + - This function is used to check the database server type and version. + Replication Nodes only supported in PG/PPAS 9.4 and above. + + * get_nodes(gid, sid, did) + - Method is used to generate the browser collection node. + + * node_inode() + - Method is overridden from its base class to make the node as leaf node. + + * script_load() + - Load the module script for Replication Nodes, when any of the server + node is initialized. + """ + + _NODE_TYPE = 'replica_nodes' + _COLLECTION_LABEL = gettext("Replica Nodes") + + def __init__(self, *args, **kwargs): + """ + Method is used to initialize the ReplicationNodesModule and + it's base module. + + Args: + *args: + **kwargs: + """ + super().__init__(*args, **kwargs) + + def get_nodes(self, gid, sid): + """ + Method is used to generate the browser collection node + + Args: + gid: Server Group ID + sid: Server ID + """ + yield self.generate_browser_collection_node(sid) + + @property + def node_inode(self): + """ + Override this property to make the node as leaf node. + + Returns: False as this is the leaf node + """ + return False + + @property + def script_load(self): + """ + Load the module script for Replication Nodes, when any of the server + node is initialized. + + Returns: node type of the server module. + """ + return servers.ServerModule.NODE_TYPE + + def backend_supported(self, manager, **kwargs): + """ + Load this module if replication type exists + """ + if super().backend_supported(manager, **kwargs): + conn = manager.connection(sid=kwargs['sid']) + + replication_type = get_replication_type(conn, manager.version) + return bool(replication_type) + + +blueprint = ReplicationNodesModule(__name__) + + +class ReplicationNodesView(PGChildNodeView): + """ + class ReplicationNodesView(NodeView) + + A view class for Replication Nodes node derived from NodeView. + This class is responsible for all the stuff related to view like + showing properties/list of Replication Nodes nodes + + Methods: + ------- + * __init__(**kwargs) + - Method is used to initialize the ReplicationNodesView, + and it's base view. + + * check_precondition() + - This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + + * list() + - This function is used to list all the Replication Nodes within + that collection. + + * nodes() + - This function will used to create all the child node within that + collection. Here it will create all the Replication Nodes node. + + * properties(gid, sid, did, pid) + - This function will show the properties of the selected node + """ + + node_type = blueprint.node_type + BASE_TEMPLATE_PATH = 'replica_nodes/sql/#{0}#' + + parent_ids = [ + {'type': 'int', 'id': 'gid'}, + {'type': 'int', 'id': 'sid'} + ] + ids = [ + {'type': 'int', 'id': 'pid'} + ] + + operations = dict({ + 'obj': [ + {'get': 'properties'}, + {'get': 'list'} + ], + 'nodes': [{'get': 'nodes'}, {'get': 'nodes'}], + 'replication_slots': [{'get': 'replication_slots'}, + {'get': 'replication_slots'}], + }) + + def __init__(self, **kwargs): + """ + Method is used to initialize the ReplicationNodesView and, + it's base view. + Also initialize all the variables create/used dynamically like conn, + template_path. + + Args: + **kwargs: + """ + self.conn = None + self.template_path = None + + super().__init__(**kwargs) + + def check_precondition(f): + """ + This function will behave as a decorator which will checks + database connection before running view, it will also attaches + manager,conn & template_path properties to self + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold self & kwargs will hold gid,sid,did + self = args[0] + self.driver = get_driver(PG_DEFAULT_DRIVER) + self.manager = self.driver.connection_manager(kwargs['sid']) + self.conn = self.manager.connection() + + if not self.conn.connected(): + return precondition_required( + gettext( + "Connection to the server has been lost." + ) + ) + + self.template_path = self.BASE_TEMPLATE_PATH.format( + self.manager.version) + + return f(*args, **kwargs) + + return wrap + + @check_precondition + def list(self, gid, sid): + """ + This function is used to list all the Replication Nodes within + that collection. + + Args: + gid: Server Group ID + sid: Server ID + """ + sql = render_template( + "/".join([self.template_path, self._PROPERTIES_SQL])) + status, res = self.conn.execute_dict(sql) + + if not status: + return internal_server_error(errormsg=res) + return ajax_response( + response=res['rows'], + status=200 + ) + + @check_precondition + def nodes(self, gid, sid): + """ + This function will used to create all the child node within that + collection. Here it will create all the Replication Nodes node. + + Args: + gid: Server Group ID + sid: Server ID + """ + res = [] + sql = render_template("/".join([self.template_path, self._NODES_SQL])) + status, result = self.conn.execute_2darray(sql) + if not status: + return internal_server_error(errormsg=result) + + for row in result['rows']: + res.append( + self.blueprint.generate_browser_node( + row['pid'], + sid, + row['name'], + icon="icon-replica_nodes" + )) + + return make_json_response( + data=res, + status=200 + ) + + @check_precondition + def properties(self, gid, sid, pid): + """ + This function will show the properties of the selected node. + + Args: + gid: Server Group ID + sid: Server ID + pid: Replication Nodes ID + """ + sql = render_template( + "/".join([self.template_path, self._PROPERTIES_SQL]), pid=pid) + status, res = self.conn.execute_dict(sql) + + if not status: + return internal_server_error(errormsg=res) + + if len(res['rows']) == 0: + return gone(gettext("""Could not find the Replication Node.""")) + + return ajax_response( + response=res['rows'][0], + status=200 + ) + + +ReplicationNodesView.register_node_view(blueprint) diff --git a/web/pgadmin/browser/server_groups/servers/replica_nodes/static/img/coll-replica_nodes.svg b/web/pgadmin/browser/server_groups/servers/replica_nodes/static/img/coll-replica_nodes.svg new file mode 100644 index 000000000..176a1517b --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/replica_nodes/static/img/coll-replica_nodes.svg @@ -0,0 +1 @@ +server \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/replica_nodes/static/img/replica_nodes.svg b/web/pgadmin/browser/server_groups/servers/replica_nodes/static/img/replica_nodes.svg new file mode 100644 index 000000000..176a1517b --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/replica_nodes/static/img/replica_nodes.svg @@ -0,0 +1 @@ +server \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/replica_nodes/static/js/replica_node.js b/web/pgadmin/browser/server_groups/servers/replica_nodes/static/js/replica_node.js new file mode 100644 index 000000000..820388497 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/replica_nodes/static/js/replica_node.js @@ -0,0 +1,61 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2024, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import ReplicaNodeSchema from './replica_node.ui'; + +define('pgadmin.node.replica_nodes', [ + 'sources/gettext', 'sources/url_for', 'pgadmin.browser', + 'pgadmin.browser.collection', +], function(gettext, url_for, pgBrowser) { + + // Extend the browser's collection class for replica nodes collection + if (!pgBrowser.Nodes['coll-replica_nodes']) { + pgBrowser.Nodes['coll-replica_nodes'] = + pgBrowser.Collection.extend({ + node: 'replica_nodes', + label: gettext('Replica Nodes'), + type: 'coll-replica_nodes', + columns: ['pid', 'name', 'usename', 'state'], + canEdit: false, + canDrop: false, + canDropCascade: false, + }); + } + + // Extend the browser's node class for replica nodes node + if (!pgBrowser.Nodes['replica_nodes']) { + pgBrowser.Nodes['replica_nodes'] = pgBrowser.Node.extend({ + parent_type: 'server', + type: 'replica_nodes', + epasHelp: false, + sqlAlterHelp: '', + sqlCreateHelp: '', + dialogHelp: url_for('help.static', {'filename': 'replica_nodes_dialog.html'}), + label: gettext('Replica Nodes'), + hasSQL: false, + hasScriptTypes: false, + canDrop: false, + Init: function() { + + // Avoid multiple registration of menus + if (this.initialized) { + return; + } + + this.initialized = true; + }, + + getSchema: ()=>{ + return new ReplicaNodeSchema(); + }, + }); + } + + return pgBrowser.Nodes['coll-replica_nodes']; +}); diff --git a/web/pgadmin/browser/server_groups/servers/replica_nodes/static/js/replica_node.ui.js b/web/pgadmin/browser/server_groups/servers/replica_nodes/static/js/replica_node.ui.js new file mode 100644 index 000000000..ab936738d --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/replica_nodes/static/js/replica_node.ui.js @@ -0,0 +1,83 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2024, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import gettext from 'sources/gettext'; +import BaseUISchema from 'sources/SchemaView/base_schema.ui'; + +export default class ReplicaNodeSchema extends BaseUISchema { + get idAttribute() { + return 'pid'; + } + + get baseFields() { + return [ + { + id: 'pid', label: gettext('PID'), type: 'text', mode:['properties', 'edit'], readonly: true, + }, + { + id: 'usename', label: gettext('Username'), type: 'text', mode:['properties', 'edit'], readonly: true, + }, + { + id: 'application_name', label: gettext('App Name'), type: 'text', mode:['properties', 'edit'], readonly: true, + }, + { + id: 'client_addr', label: gettext('Client Address'), type: 'text', mode:['properties', 'edit'], readonly: true, + }, + { + id: 'client_hostname', label: gettext('Client Hostname'), type: 'text', mode:['properties', 'edit'], readonly: true, + }, + { + id: 'client_port', label: gettext('Client Port'), type: 'text', mode:['properties', 'edit'], readonly: true, + }, + { + id: 'state', label: gettext('State'), type: 'text', mode:['properties', 'edit'], readonly: true, + }, + { + id: 'sent_lsn', label: gettext('Sent LSN'), type: 'text', mode:['properties'], readonly: true, + group: gettext('WAL Details') + }, + { + id: 'write_lsn', label: gettext('Write LSN'), type: 'text', mode:['properties'], readonly: true, + group: gettext('WAL Details') + }, + { + id: 'flush_lsn', label: gettext('Flush LSN'), type: 'text', mode:['properties'], readonly: true, + group: gettext('WAL Details') + }, + { + id: 'replay_lsn', label: gettext('Replay LSN'), type: 'text', mode:['properties'], readonly: true, + group: gettext('WAL Details') + }, + { + id: 'write_lag', label: gettext('Write Lag'), type: 'text', mode:['properties'], readonly: true, + group: gettext('WAL Details') + }, + { + id: 'flush_lag', label: gettext('Flush Lag'), type: 'text', mode:['properties'], readonly: true, + group: gettext('WAL Details') + }, + { + id: 'replay_lag', label: gettext('Replay Lag'), type: 'text', mode:['properties'], readonly: true, + group: gettext('WAL Details') + }, + { + id: 'slot_name', label: gettext('Slot Name'), type: 'text', mode:['properties', 'edit'], readonly: true, + group: gettext('Replication Slot') + }, + { + id: 'slot_type', label: gettext('Slot Type'), type: 'text', mode:['properties', 'edit'], readonly: true, + group: gettext('Replication Slot') + }, + { + id: 'active', label: gettext('Active'), type: 'switch', mode:['properties', 'edit'], readonly: true, + group: gettext('Replication Slot') + }, + ]; + } +} diff --git a/web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/count.sql b/web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/count.sql new file mode 100644 index 000000000..3d751e379 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/count.sql @@ -0,0 +1,2 @@ +SELECT count(*) +FROM pg_stat_replication diff --git a/web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/nodes.sql b/web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/nodes.sql new file mode 100644 index 000000000..0c658bf82 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/nodes.sql @@ -0,0 +1,3 @@ +SELECT pid, 'Standby ['||COALESCE(client_addr::text, client_hostname,'Socket')||']' as name +FROM pg_stat_replication +ORDER BY pid diff --git a/web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/properties.sql b/web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/properties.sql new file mode 100644 index 000000000..c9a533a01 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/replica_nodes/templates/replica_nodes/sql/default/properties.sql @@ -0,0 +1,8 @@ +SELECT st.*, 'Standby ['||COALESCE(client_addr::text, client_hostname,'Socket')||']' as name, + sl.slot_name, sl.slot_type, sl.active +FROM pg_stat_replication st JOIN pg_replication_slots sl +ON st.pid = sl.active_pid +{% if pid %} +WHERE st.pid={{pid}} +{% endif %} +ORDER BY st.pid diff --git a/web/pgadmin/browser/server_groups/servers/templates/servers/sql/default/replication_type.sql b/web/pgadmin/browser/server_groups/servers/templates/servers/sql/default/replication_type.sql new file mode 100644 index 000000000..4c644e4cc --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/templates/servers/sql/default/replication_type.sql @@ -0,0 +1,7 @@ +SELECT CASE + WHEN (SELECT count(extname) FROM pg_catalog.pg_extension WHERE extname='bdr') > 0 + THEN 'pgd' + WHEN (SELECT COUNT(*) FROM pg_stat_replication) > 0 + THEN 'log' + ELSE NULL +END as type; diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_check_connect.py b/web/pgadmin/browser/server_groups/servers/tests/test_check_connect.py index 6b0772502..225ce31d9 100644 --- a/web/pgadmin/browser/server_groups/servers/tests/test_check_connect.py +++ b/web/pgadmin/browser/server_groups/servers/tests/test_check_connect.py @@ -158,7 +158,9 @@ class ServersConnectTestCase(BaseTestGenerator): self.manager.connection.connected.side_effect = True connection_mock_result.execute_dict.side_effect = \ - [eval(self.mock_data["return_value"])] + [eval(self.mock_data["return_value"]), + # replication type mock + (True, {'rows': [{'type': None}]})] response = self.get_server_connection(server_id) self.assertEqual(response.status_code, diff --git a/web/pgadmin/browser/server_groups/servers/utils.py b/web/pgadmin/browser/server_groups/servers/utils.py index 4f787f454..d5c869b55 100644 --- a/web/pgadmin/browser/server_groups/servers/utils.py +++ b/web/pgadmin/browser/server_groups/servers/utils.py @@ -9,6 +9,8 @@ """Server helper utilities""" from ipaddress import ip_address +from werkzeug.exceptions import InternalServerError +from flask import render_template from pgadmin.utils.crypto import encrypt, decrypt import config @@ -277,3 +279,14 @@ def remove_saved_passwords(user_id): except Exception: db.session.rollback() raise + + +def get_replication_type(conn, sversion): + status, res = conn.execute_dict(render_template( + "/servers/sql/#{0}#/replication_type.sql".format(sversion) + )) + + if not status: + raise InternalServerError(res) + + return res['rows'][0]['type'] diff --git a/web/pgadmin/browser/templates/browser/js/utils.js b/web/pgadmin/browser/templates/browser/js/utils.js index e0b338c83..1f8ab72f8 100644 --- a/web/pgadmin/browser/templates/browser/js/utils.js +++ b/web/pgadmin/browser/templates/browser/js/utils.js @@ -79,7 +79,8 @@ define('pgadmin.browser.utils', 'server_group', 'server', 'coll-tablespace', 'tablespace', 'coll-role', 'role', 'coll-resource_group', 'resource_group', 'coll-database', 'coll-pga_job', 'coll-pga_schedule', 'coll-pga_jobstep', - 'pga_job', 'pga_schedule', 'pga_jobstep' + 'pga_job', 'pga_schedule', 'pga_jobstep', + 'coll-replica_nodes', 'replica_nodes' ]; pgBrowser.utils = { diff --git a/web/pgadmin/dashboard/__init__.py b/web/pgadmin/dashboard/__init__.py index 507094dd8..2cf92ae72 100644 --- a/web/pgadmin/dashboard/__init__.py +++ b/web/pgadmin/dashboard/__init__.py @@ -245,6 +245,8 @@ class DashboardModule(PgAdminModule): 'dashboard.system_statistics', 'dashboard.system_statistics_sid', 'dashboard.system_statistics_did', + 'dashboard.replication_slots', + 'dashboard.replication_stats', ] @@ -646,3 +648,51 @@ def system_statistics(sid=None, did=None): response=resp_data, status=200 ) + + +@blueprint.route('/replication_stats/', + endpoint='replication_stats', methods=['GET']) +@login_required +@check_precondition +def replication_stats(sid=None): + """ + This function is used to list all the Replication slots of the cluster + """ + + if not sid: + return internal_server_error(errormsg='Server ID not specified.') + + sql = render_template("/".join([g.template_path, 'replication_stats.sql'])) + status, res = g.conn.execute_dict(sql) + + if not status: + return internal_server_error(errormsg=str(res)) + + return ajax_response( + response=res['rows'], + status=200 + ) + + +@blueprint.route('/replication_slots/', + endpoint='replication_slots', methods=['GET']) +@login_required +@check_precondition +def replication_slots(sid=None): + """ + This function is used to list all the Replication slots of the cluster + """ + + if not sid: + return internal_server_error(errormsg='Server ID not specified.') + + sql = render_template("/".join([g.template_path, 'replication_slots.sql'])) + status, res = g.conn.execute_dict(sql) + + if not status: + return internal_server_error(errormsg=str(res)) + + return ajax_response( + response=res['rows'], + status=200 + ) diff --git a/web/pgadmin/dashboard/static/js/Dashboard.jsx b/web/pgadmin/dashboard/static/js/Dashboard.jsx index 63c931f73..b3055dda8 100644 --- a/web/pgadmin/dashboard/static/js/Dashboard.jsx +++ b/web/pgadmin/dashboard/static/js/Dashboard.jsx @@ -19,12 +19,9 @@ import { Box, Tab, Tabs } from '@material-ui/core'; import { PgIconButton } from '../../../static/js/components/Buttons'; import CancelIcon from '@material-ui/icons/Cancel'; import StopSharpIcon from '@material-ui/icons/StopSharp'; -import ArrowRightOutlinedIcon from '@material-ui/icons/ArrowRightOutlined'; -import ArrowDropDownOutlinedIcon from '@material-ui/icons/ArrowDropDownOutlined'; import WelcomeDashboard from './WelcomeDashboard'; import ActiveQuery from './ActiveQuery.ui'; import _ from 'lodash'; -import CachedOutlinedIcon from '@material-ui/icons/CachedOutlined'; import EmptyPanelMessage from '../../../static/js/components/EmptyPanelMessage'; import TabPanel from '../../../static/js/components/TabPanel'; import Summary from './SystemStats/Summary'; @@ -37,6 +34,10 @@ import { usePgAdmin } from '../../../static/js/BrowserComponent'; import usePreferences from '../../../preferences/static/js/store'; import ErrorBoundary from '../../../static/js/helpers/ErrorBoundary'; import { parseApiError } from '../../../static/js/api_instance'; +import SectionContainer from './components/SectionContainer'; +import Replication from './Replication'; +import RefreshButton from './components/RefreshButtons'; +import {getExpandCell } from '../../../static/js/components/PgTable'; function parseData(data) { let res = []; @@ -55,11 +56,6 @@ const useStyles = makeStyles((theme) => ({ padding: '8px', display: 'flex', }, - fixedSizeList: { - overflowX: 'hidden !important', - overflow: 'overlay !important', - height: 'auto !important', - }, dashboardPanel: { height: '100%', background: theme.palette.grey[400], @@ -108,22 +104,9 @@ const useStyles = makeStyles((theme) => ({ display: 'flex', flexDirection: 'column' }, - arrowButton: { - fontSize: '2rem !important', - margin: '-7px' - }, terminateButton: { color: theme.palette.error.main }, - buttonClick: { - backgroundColor: theme.palette.grey[400] - }, - refreshButton: { - marginLeft: 'auto', - height: '1.9rem', - width: '2.2rem', - ...theme.mixins.panelBorder, - }, chartCard: { border: '1px solid '+theme.otherVars.borderColor, }, @@ -156,6 +139,9 @@ function Dashboard({ const classes = useStyles(); let tabs = [gettext('Sessions'), gettext('Locks'), gettext('Prepared Transactions')]; let mainTabs = [gettext('General'), gettext('System Statistics')]; + if(treeNodeInfo?.server?.replication_type) { + mainTabs.push(gettext('Replication')); + } let systemStatsTabs = [gettext('Summary'), gettext('CPU'), gettext('Memory'), gettext('Storage')]; const [dashData, setdashData] = useState([]); const [msg, setMsg] = useState(''); @@ -247,8 +233,10 @@ function Dashboard({ sortable: true, resizable: false, disableGlobalFilter: false, + disableResizing: true, width: 35, - minWidth: 0, + maxWidth: 35, + minWidth: 35, id: 'btn-terminate', // eslint-disable-next-line react/display-name Cell: ({ row }) => { @@ -391,40 +379,21 @@ function Dashboard({ width: 35, minWidth: 0, id: 'btn-edit', - Cell: ({ row }) => { - let canEditRow = true; - return ( - - ) : ( - - ) - } - noBorder - onClick={(e) => { - e.preventDefault(); - row.toggleRowExpanded(!row.isExpanded); - let schema = new ActiveQuery({ - query: row.original.query, - backend_type: row.original.backend_type, - state_change: row.original.state_change, - query_start: row.original.query_start, - }); - setSchemaDict(prevState => ({ - ...prevState, - [row.id]: schema - })); - }} - disabled={!canEditRow} - aria-label="View the active session details" - title={gettext('View the active session details')} - /> - ); - }, + Cell: getExpandCell({ + onClick: (row) => { + let schema = new ActiveQuery({ + query: row.original.query, + backend_type: row.original.backend_type, + state_change: row.original.state_change, + query_start: row.original.query_start, + }); + setSchemaDict(prevState => ({ + ...prevState, + [row.id]: schema + })); + }, + title: gettext('View the active session details') + }), }, { accessor: 'pid', @@ -740,6 +709,11 @@ function Dashboard({ },[nodeData]); useEffect(() => { + // disable replication tab + if(!treeNodeInfo?.server?.replication_type && mainTabVal == 2) { + setMainTabVal(0); + } + let url, ssExtensionCheckUrl = url_for('dashboard.check_system_statistics'), message = gettext( @@ -829,24 +803,6 @@ function Dashboard({ return dashData; }, [dashData, activeOnly, tabVal]); - const RefreshButton = () =>{ - return( - } - onClick={(e) => { - e.preventDefault(); - setRefresh(!refresh); - }} - color="default" - aria-label="Refresh" - title={gettext('Refresh')} - > - ); - }; - const showDefaultContents = () => { return ( sid && !serverConnected ? ( @@ -915,57 +871,52 @@ function Dashboard({ > )} {!_.isUndefined(preferences) && preferences.show_activity && ( - - - {dbConnected ? gettext('Database activity') : gettext('Server activity')}{' '} + + + + {tabs.map((tabValue) => { + return ; + })} + { + e.preventDefault(); + setRefresh(!refresh); + }}/> + - - - - {tabs.map((tabValue) => { - return ; - })} - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + )} {/* System Statistics */} @@ -1031,6 +982,10 @@ function Dashboard({ } + {/* Replication */} + + + diff --git a/web/pgadmin/dashboard/static/js/Graphs.jsx b/web/pgadmin/dashboard/static/js/Graphs.jsx index eb444c14d..17c6236c5 100644 --- a/web/pgadmin/dashboard/static/js/Graphs.jsx +++ b/web/pgadmin/dashboard/static/js/Graphs.jsx @@ -8,7 +8,7 @@ ////////////////////////////////////////////////////////////// import React, { useEffect, useRef, useState, useReducer, useMemo } from 'react'; import { DATA_POINT_SIZE } from 'sources/chartjs'; -import ChartContainer from './ChartContainer'; +import ChartContainer from './components/ChartContainer'; import url_for from 'sources/url_for'; import axios from 'axios'; import gettext from 'sources/gettext'; diff --git a/web/pgadmin/dashboard/static/js/Replication/index.jsx b/web/pgadmin/dashboard/static/js/Replication/index.jsx new file mode 100644 index 000000000..63459040d --- /dev/null +++ b/web/pgadmin/dashboard/static/js/Replication/index.jsx @@ -0,0 +1,214 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2024, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import { Box } from '@material-ui/core'; +import React, { useEffect, useState } from 'react'; + +import gettext from 'sources/gettext'; +import ReplicationSlotsSchema from './replication_slots.ui'; +import PgTable from 'sources/components/PgTable'; +import getApiInstance, { parseApiError } from '../../../../static/js/api_instance'; +import SectionContainer from '../components/SectionContainer'; +import ReplicationStatsSchema from './replication_stats.ui'; +import RefreshButton from '../components/RefreshButtons'; +import { getExpandCell, getSwitchCell } from '../../../../static/js/components/PgTable'; +import { usePgAdmin } from '../../../../static/js/BrowserComponent'; +import url_for from 'sources/url_for'; +import PropTypes from 'prop-types'; + + +const replicationStatsColumns = [{ + accessor: 'view_details', + Header: () => null, + sortable: false, + resizable: false, + disableGlobalFilter: false, + disableResizing: true, + width: 35, + maxWidth: 35, + minWidth: 35, + id: 'btn-edit', + Cell: getExpandCell({ + title: gettext('View details') + }), +}, +{ + accessor: 'pid', + Header: gettext('PID'), + sortable: true, + resizable: true, + disableGlobalFilter: false, + minWidth: 26, + width: 40, +}, +{ + accessor: 'client_addr', + Header: gettext('Client Addr'), + sortable: true, + resizable: true, + disableGlobalFilter: false, + minWidth: 26, + width: 60, +}, +{ + accessor:'state', + Header: gettext('State'), + sortable: true, + resizable: true, + disableGlobalFilter: false, + minWidth: 26, + width: 60 +}, +{ + accessor:'write_lag', + Header: gettext('Write Lag'), + sortable: true, + resizable: true, + disableGlobalFilter: false, + minWidth: 26, + width: 60 +}, +{ + accessor:'flush_lag', + Header: gettext('Flush Lag'), + sortable: true, + resizable: true, + disableGlobalFilter: false, + minWidth: 26, + width: 60 +}, +{ + accessor:'replay_lag', + Header: gettext('Replay Lag'), + sortable: true, + resizable: true, + disableGlobalFilter: false, + minWidth: 26, + width: 60 +}, +{ + accessor:'reply_time', + Header: gettext('Reply Time'), + sortable: true, + resizable: true, + disableGlobalFilter: false, + minWidth: 26, + width: 80 +} +]; + +const replicationSlotsColumns = [{ + accessor: 'view_details', + Header: () => null, + sortable: false, + resizable: false, + disableGlobalFilter: false, + disableResizing: true, + width: 35, + maxWidth: 35, + minWidth: 35, + id: 'btn-details', + Cell: getExpandCell({ + title: gettext('View details') + }), +}, +{ + accessor: 'active_pid', + Header: gettext('Active PID'), + sortable: true, + resizable: true, + disableGlobalFilter: false, + minWidth: 26, + width: 50, +}, +{ + accessor: 'slot_name', + Header: gettext('Slot Name'), + sortable: true, + resizable: true, + disableGlobalFilter: false, + minWidth: 26, + width: 200, +}, +{ + accessor:'active', + Header: gettext('Active'), + sortable: true, + resizable: true, + disableGlobalFilter: false, + minWidth: 26, + width: 60, + Cell: getSwitchCell(), +} +]; + +const replSchemaObj = new ReplicationSlotsSchema(); +const replStatObj = new ReplicationStatsSchema(); + +export default function Replication({treeNodeInfo, pageVisible}) { + const [replicationSlots, setReplicationSlots] = useState([{ + }]); + const [replicationStats, setReplicationStats] = useState([{ + }]); + const pgAdmin = usePgAdmin(); + + const getReplicationData = (endpoint, setter)=>{ + const api = getApiInstance(); + const url = url_for(`dashboard.${endpoint}`, {sid: treeNodeInfo.server._id}); + api.get(url) + .then((res)=>{ + setter(res.data); + }) + .catch((error)=>{ + console.error(error); + pgAdmin.Browser.notifier.error(parseApiError(error)); + }); + }; + + useEffect(()=>{ + if(pageVisible) { + getReplicationData('replication_stats', setReplicationStats); + getReplicationData('replication_slots', setReplicationSlots); + } + }, [pageVisible ]); + + return ( + + { + getReplicationData('replication_stats', setReplicationStats); + }}/>} + title={gettext('Replication Stats')} style={{minHeight: '300px'}}> + + + { + getReplicationData('replication_slots', setReplicationSlots); + }}/>} + title={gettext('Replication Slots')} style={{minHeight: '300px', marginTop: '4px'}}> + + + + ); +} + +Replication.propTypes = { + treeNodeInfo: PropTypes.object.isRequired, + pageVisible: PropTypes.bool, +}; diff --git a/web/pgadmin/dashboard/static/js/Replication/replication_slots.ui.js b/web/pgadmin/dashboard/static/js/Replication/replication_slots.ui.js new file mode 100644 index 000000000..0f5a2a043 --- /dev/null +++ b/web/pgadmin/dashboard/static/js/Replication/replication_slots.ui.js @@ -0,0 +1,52 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2024, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import gettext from 'sources/gettext'; +import BaseUISchema from 'sources/SchemaView/base_schema.ui'; + +export default class ReplicationSlotsSchema extends BaseUISchema { + constructor(initValues) { + super({ + ...initValues, + }); + } + + get baseFields() { + return [ + { + id: 'slot_name', label: gettext('Slot Name'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'slot_type', label: gettext('Slot Type'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'active', label: gettext('Active'), type: 'switch', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'active_pid', label: gettext('Active PID'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'restart_lsn', label: gettext('Restart LSN'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'confirmed_flush_lsn', label: gettext('Confirmed Flush LSN'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'wal_status', label: gettext('WAL Status'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + ]; + } +} diff --git a/web/pgadmin/dashboard/static/js/Replication/replication_stats.ui.js b/web/pgadmin/dashboard/static/js/Replication/replication_stats.ui.js new file mode 100644 index 000000000..ca32d8ec5 --- /dev/null +++ b/web/pgadmin/dashboard/static/js/Replication/replication_stats.ui.js @@ -0,0 +1,80 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2024, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import gettext from 'sources/gettext'; +import BaseUISchema from 'sources/SchemaView/base_schema.ui'; + +export default class ReplicationStatsSchema extends BaseUISchema { + constructor(initValues) { + super({ + ...initValues, + }); + } + + get baseFields() { + return [ + { + id: 'pid', label: gettext('PID'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'usename', label: gettext('Usename'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'application_name', label: gettext('App Name'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'client_addr', label: gettext('Client Addr'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'client_port', label: gettext('Client Port'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'state', label: gettext('State'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'sent_lsn', label: gettext('Sent LSN'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'write_lsn', label: gettext('Write LSN'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'flush_lsn', label: gettext('Flush LSN'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'replay_lsn', label: gettext('Replay LSN'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'write_lag', label: gettext('Write Lag'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'flush_lag', label: gettext('Flush Lag'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'replay_lag', label: gettext('Replay Lag'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + { + id: 'reply_time', label: gettext('Reply Time'), type: 'text', mode:['properties'], readonly: true, + group: gettext('Details') + }, + ]; + } +} diff --git a/web/pgadmin/dashboard/static/js/SystemStats/CPU.jsx b/web/pgadmin/dashboard/static/js/SystemStats/CPU.jsx index f71bdff0c..40fc761a8 100644 --- a/web/pgadmin/dashboard/static/js/SystemStats/CPU.jsx +++ b/web/pgadmin/dashboard/static/js/SystemStats/CPU.jsx @@ -13,7 +13,7 @@ import gettext from 'sources/gettext'; import PropTypes from 'prop-types'; import { makeStyles } from '@material-ui/core/styles'; import {getGCD, getEpoch} from 'sources/utils'; -import ChartContainer from '../ChartContainer'; +import ChartContainer from '../components/ChartContainer'; import { Box, Grid } from '@material-ui/core'; import { DATA_POINT_SIZE } from 'sources/chartjs'; import StreamingChart from '../../../../static/js/components/PgChart/StreamingChart'; diff --git a/web/pgadmin/dashboard/static/js/SystemStats/Memory.jsx b/web/pgadmin/dashboard/static/js/SystemStats/Memory.jsx index 9091826c8..fe3a4d954 100644 --- a/web/pgadmin/dashboard/static/js/SystemStats/Memory.jsx +++ b/web/pgadmin/dashboard/static/js/SystemStats/Memory.jsx @@ -12,7 +12,7 @@ import gettext from 'sources/gettext'; import PropTypes from 'prop-types'; import { makeStyles } from '@material-ui/core/styles'; import {getGCD, getEpoch} from 'sources/utils'; -import ChartContainer from '../ChartContainer'; +import ChartContainer from '../components/ChartContainer'; import { Box, Grid } from '@material-ui/core'; import { DATA_POINT_SIZE } from 'sources/chartjs'; import StreamingChart from '../../../../static/js/components/PgChart/StreamingChart'; diff --git a/web/pgadmin/dashboard/static/js/SystemStats/Storage.jsx b/web/pgadmin/dashboard/static/js/SystemStats/Storage.jsx index fe57a8ce8..fa0d0759e 100644 --- a/web/pgadmin/dashboard/static/js/SystemStats/Storage.jsx +++ b/web/pgadmin/dashboard/static/js/SystemStats/Storage.jsx @@ -12,7 +12,7 @@ import PropTypes from 'prop-types'; import { makeStyles } from '@material-ui/core/styles'; import url_for from 'sources/url_for'; import {getGCD, getEpoch} from 'sources/utils'; -import ChartContainer from '../ChartContainer'; +import ChartContainer from '../components/ChartContainer'; import { Grid } from '@material-ui/core'; import { DATA_POINT_SIZE } from 'sources/chartjs'; import StreamingChart from '../../../../static/js/components/PgChart/StreamingChart'; diff --git a/web/pgadmin/dashboard/static/js/SystemStats/Summary.jsx b/web/pgadmin/dashboard/static/js/SystemStats/Summary.jsx index 1edfffba1..874cd8d03 100644 --- a/web/pgadmin/dashboard/static/js/SystemStats/Summary.jsx +++ b/web/pgadmin/dashboard/static/js/SystemStats/Summary.jsx @@ -13,7 +13,7 @@ import { makeStyles } from '@material-ui/core/styles'; import url_for from 'sources/url_for'; import getApiInstance from 'sources/api_instance'; import {getGCD, getEpoch} from 'sources/utils'; -import ChartContainer from '../ChartContainer'; +import ChartContainer from '../components/ChartContainer'; import { Grid } from '@material-ui/core'; import { DATA_POINT_SIZE } from 'sources/chartjs'; import StreamingChart from '../../../../static/js/components/PgChart/StreamingChart'; diff --git a/web/pgadmin/dashboard/static/js/ChartContainer.jsx b/web/pgadmin/dashboard/static/js/components/ChartContainer.jsx similarity index 96% rename from web/pgadmin/dashboard/static/js/ChartContainer.jsx rename to web/pgadmin/dashboard/static/js/components/ChartContainer.jsx index c090d71a8..587d545c1 100644 --- a/web/pgadmin/dashboard/static/js/ChartContainer.jsx +++ b/web/pgadmin/dashboard/static/js/components/ChartContainer.jsx @@ -10,7 +10,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Box, Card, CardContent, CardHeader, makeStyles } from '@material-ui/core'; -import EmptyPanelMessage from '../../../static/js/components/EmptyPanelMessage'; +import EmptyPanelMessage from '../../../../static/js/components/EmptyPanelMessage'; const useStyles = makeStyles((theme) => ({ diff --git a/web/pgadmin/dashboard/static/js/components/RefreshButtons.jsx b/web/pgadmin/dashboard/static/js/components/RefreshButtons.jsx new file mode 100644 index 000000000..4350d814b --- /dev/null +++ b/web/pgadmin/dashboard/static/js/components/RefreshButtons.jsx @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2024, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import React from 'react'; +import gettext from 'sources/gettext'; +import CachedOutlinedIcon from '@material-ui/icons/CachedOutlined'; +import { PgIconButton } from '../../../../static/js/components/Buttons'; +import { makeStyles } from '@material-ui/core'; +import PropTypes from 'prop-types'; + +const useStyles = makeStyles((theme) => ({ + refreshButton: { + marginLeft: 'auto', + height: '1.9rem', + width: '2.2rem', + ...theme.mixins.panelBorder, + }, +})); + + +export default function RefreshButton({onClick}) { + const classes = useStyles(); + + return( + } + onClick={onClick} + color="default" + aria-label="Refresh" + title={gettext('Refresh')} + > + ); +} + +RefreshButton.propTypes = { + onClick: PropTypes.func +}; diff --git a/web/pgadmin/dashboard/static/js/components/SectionContainer.jsx b/web/pgadmin/dashboard/static/js/components/SectionContainer.jsx new file mode 100644 index 000000000..5adf17851 --- /dev/null +++ b/web/pgadmin/dashboard/static/js/components/SectionContainer.jsx @@ -0,0 +1,60 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2024, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// +import React from 'react'; +import PropTypes from 'prop-types'; +import { Box, makeStyles } from '@material-ui/core'; + + +const useStyles = makeStyles((theme) => ({ + root: { + ...theme.mixins.panelBorder.all, + display: 'flex', + flexDirection: 'column', + overflow: 'hidden !important', + height: '100%', + width: '100%', + minHeight: '400px', + }, + cardHeader: { + backgroundColor: theme.otherVars.tableBg, + borderBottom: '1px solid', + borderBottomColor: theme.otherVars.borderColor, + display: 'flex', + alignItems: 'center', + }, + cardTitle: { + padding: '0.25rem 0.5rem', + fontWeight: 'bold', + } +})); + +export default function SectionContainer({title, titleExtras, children, style}) { + const classes = useStyles(); + + return ( + + +

{title}
+
+ {titleExtras} +
+ + + {children} + + + ); +} + +SectionContainer.propTypes = { + title: PropTypes.string.isRequired, + titleExtras: PropTypes.node, + children: PropTypes.node.isRequired, + style: PropTypes.object, +}; diff --git a/web/pgadmin/dashboard/templates/dashboard/sql/default/replication_slots.sql b/web/pgadmin/dashboard/templates/dashboard/sql/default/replication_slots.sql new file mode 100644 index 000000000..f156a6a4c --- /dev/null +++ b/web/pgadmin/dashboard/templates/dashboard/sql/default/replication_slots.sql @@ -0,0 +1 @@ +select * from pg_replication_slots diff --git a/web/pgadmin/dashboard/templates/dashboard/sql/default/replication_stats.sql b/web/pgadmin/dashboard/templates/dashboard/sql/default/replication_stats.sql new file mode 100644 index 000000000..e7e58e98f --- /dev/null +++ b/web/pgadmin/dashboard/templates/dashboard/sql/default/replication_stats.sql @@ -0,0 +1 @@ +select * from pg_stat_replication diff --git a/web/pgadmin/dashboard/tests/test_replication.py b/web/pgadmin/dashboard/tests/test_replication.py new file mode 100644 index 000000000..3ab065f11 --- /dev/null +++ b/web/pgadmin/dashboard/tests/test_replication.py @@ -0,0 +1,50 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2024, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +from pgadmin.utils.route import BaseTestGenerator +from pgadmin.utils import server_utils +from regression import parent_node_dict +import json + + +class DashboardReplicationTestCase(BaseTestGenerator): + """ + This class validates the version in range functionality + by defining different version scenarios; where dict of + parameters describes the scenario appended by test name. + """ + + scenarios = [( + 'TestCase for replication slots', dict( + endpoint='/dashboard/replication_slots', + data=[], + )), ( + 'TestCase for replication stats', dict( + endpoint='/dashboard/replication_stats', + data=[], + )), + ] + + def setUp(self): + pass + + def runTest(self): + self.server_id = parent_node_dict["server"][-1]["server_id"] + server_response = server_utils.connect_server(self, self.server_id) + if server_response["info"] == "Server connected.": + + url = self.endpoint + '/{0}'.format(self.server_id) + response = self.tester.get(url) + self.assertEqual(response.status_code, 200) + else: + raise Exception("Error while connecting server to add the" + " database.") + + def tearDown(self): + pass diff --git a/web/pgadmin/misc/properties/CollectionNodeProperties.jsx b/web/pgadmin/misc/properties/CollectionNodeProperties.jsx index f8645735f..71636732b 100644 --- a/web/pgadmin/misc/properties/CollectionNodeProperties.jsx +++ b/web/pgadmin/misc/properties/CollectionNodeProperties.jsx @@ -9,7 +9,7 @@ import React from 'react'; import getApiInstance from 'sources/api_instance'; import { makeStyles } from '@material-ui/core/styles'; -import { Box, Switch } from '@material-ui/core'; +import { Box } from '@material-ui/core'; import { generateCollectionURL } from '../../browser/static/js/node_ajax'; import gettext from 'sources/gettext'; import PgTable from 'sources/components/PgTable'; @@ -23,6 +23,7 @@ import EmptyPanelMessage from '../../static/js/components/EmptyPanelMessage'; import Loader from 'sources/components/Loader'; import { evalFunc } from '../../static/js/utils'; import { usePgAdmin } from '../../static/js/BrowserComponent'; +import { getSwitchCell } from '../../static/js/components/PgTable'; const useStyles = makeStyles((theme) => ({ emptyPanel: { @@ -64,12 +65,6 @@ const useStyles = makeStyles((theme) => ({ overflow: 'hidden !important', overflowX: 'auto !important' }, - readOnlySwitch: { - opacity: 0.75, - '& .MuiSwitch-track': { - opacity: theme.palette.action.disabledOpacity, - } - } })); export default function CollectionNodeProperties({ @@ -215,14 +210,6 @@ export default function CollectionNodeProperties({ schemaRef.current?.fields.forEach((field) => { if (node.columns.indexOf(field.id) > -1) { if (field.label.indexOf('?') > -1) { - const Cell = ({value})=>{ - return ; - }; - Cell.displayName = 'StatusCell'; - Cell.propTypes = { - value: PropTypes.any, - }; - column = { Header: field.label, accessor: field.id, @@ -230,7 +217,7 @@ export default function CollectionNodeProperties({ resizable: true, disableGlobalFilter: false, minWidth: 0, - Cell: Cell + Cell: getSwitchCell() }; } else { column = { diff --git a/web/pgadmin/static/js/components/PgTable.jsx b/web/pgadmin/static/js/components/PgTable.jsx index 81bc19ed6..42b144145 100644 --- a/web/pgadmin/static/js/components/PgTable.jsx +++ b/web/pgadmin/static/js/components/PgTable.jsx @@ -22,7 +22,7 @@ import { makeStyles } from '@material-ui/core/styles'; import clsx from 'clsx'; import PropTypes from 'prop-types'; import AutoSizer from 'react-virtualized-auto-sizer'; -import { Checkbox, Box } from '@material-ui/core'; +import { Checkbox, Box, Switch } from '@material-ui/core'; import { InputText } from './FormComponents'; import _ from 'lodash'; import gettext from 'sources/gettext'; @@ -30,6 +30,8 @@ import SchemaView from '../SchemaView'; import EmptyPanelMessage from './EmptyPanelMessage'; import KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp'; import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown'; +import ChevronRightIcon from '@material-ui/icons/ChevronRight'; +import { PgIconButton } from './Buttons'; /* eslint-disable react/display-name */ const useStyles = makeStyles((theme) => ({ @@ -123,6 +125,9 @@ const useStyles = makeStyles((theme) => ({ textAlign: 'center', minWidth: 20 }, + tableHeader: { + backgroundColor: theme.otherVars.tableBg, + }, tableCellHeader: { fontWeight: theme.typography.fontWeightBold, padding: theme.spacing(1, 0.5), @@ -182,6 +187,15 @@ const useStyles = makeStyles((theme) => ({ padding: theme.spacing(0.5, 0), textAlign: 'center', }, + btnExpanded: { + backgroundColor: theme.palette.grey[400] + }, + readOnlySwitch: { + opacity: 0.75, + '& .MuiSwitch-track': { + opacity: theme.palette.action.disabledOpacity, + } + } })); const IndeterminateCheckbox = React.forwardRef( @@ -280,9 +294,9 @@ function RenderRow({ index, style, schema, row, prepareRow, setRowHeight, Expand {!_.isUndefined(row) && row.isExpanded && ( {schema && Promise.resolve({})} + getInitData={()=>Promise.resolve(row.original)} viewHelperProps={{ mode: 'properties' }} - schema={schema[row.id]} + schema={schema[row.id]??schema} showFooter={false} onDataChange={()=>{setExpandComplete(true);}} />} @@ -307,7 +321,7 @@ export default function PgTable({ columns, data, isSelectRow, caveTable=true, sc // Use the state and functions returned from useTable to build your UI const classes = useStyles(); const [searchVal, setSearchVal] = React.useState(''); - const tableRef = React.useRef(); + const windowTableRef = React.useRef(); const rowHeights = React.useRef({}); // Reset Search value on tab changes. @@ -316,7 +330,7 @@ export default function PgTable({ columns, data, isSelectRow, caveTable=true, sc setSearchVal(prevState => (prevState)); setGlobalFilter(searchVal || undefined); rowHeights.current = {}; - tableRef.current?.resetAfterIndex(0); + windowTableRef.current?.resetAfterIndex(0); }, [data]); function getRowHeight(index) { @@ -324,13 +338,13 @@ export default function PgTable({ columns, data, isSelectRow, caveTable=true, sc } const setRowHeight = (index, size) => { - if(tableRef.current) { + if(windowTableRef.current) { if(size == ROW_HEIGHT) { delete rowHeights.current[index]; } else { rowHeights.current[index] = size; } - tableRef.current.resetAfterIndex(index); + windowTableRef.current.resetAfterIndex(index); } }; @@ -422,9 +436,10 @@ export default function PgTable({ columns, data, isSelectRow, caveTable=true, sc ), sortable: false, + disableResizing: true, width: 35, maxWidth: 35, - minWidth: 0 + minWidth: 35 }, ...CLOUMNS, ]; @@ -522,7 +537,7 @@ export default function PgTable({ columns, data, isSelectRow, caveTable=true, sc > {({ height }) => ( { + const classes = useStyles(); + const onClickFinal = (e)=>{ + e.preventDefault(); + row.toggleRowExpanded(!row.isExpanded); + onClick?.(row, e); + }; + return ( + + ) : ( + + ) + } + noBorder + {...props} + onClick={onClickFinal} + aria-label={props.title} + /> + ); + }; + + Cell.displayName = 'ExpandCell'; + Cell.propTypes = { + title: PropTypes.string, + row: PropTypes.any, + }; + + return Cell; +} + +export function getSwitchCell() { + const Cell = ({value})=>{ + const classes = useStyles(); + return ; + }; + + Cell.displayName = 'SwitchCell'; + Cell.propTypes = { + value: PropTypes.any, + }; + + return Cell; +} \ No newline at end of file diff --git a/web/pgadmin/static/js/utils.js b/web/pgadmin/static/js/utils.js index a56eae8f4..160803121 100644 --- a/web/pgadmin/static/js/utils.js +++ b/web/pgadmin/static/js/utils.js @@ -633,3 +633,14 @@ export function requestAnimationAndFocus(ele) { cancelAnimationFrame(animateId); }); } + + +export function scrollbarWidth() { + // thanks too https://davidwalsh.name/detect-scrollbar-width + const scrollDiv = document.createElement('div'); + scrollDiv.setAttribute('style', 'width: 100px; height: 100px; overflow: scroll; position:absolute; top:-9999px;'); + document.body.appendChild(scrollDiv); + const scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + return scrollbarWidth; +} \ No newline at end of file diff --git a/web/webpack.config.js b/web/webpack.config.js index 265732808..08df04708 100644 --- a/web/webpack.config.js +++ b/web/webpack.config.js @@ -503,6 +503,7 @@ module.exports = [{ 'pure|pgadmin.node.aggregate', 'pure|pgadmin.node.operator', 'pure|pgadmin.node.dbms_job_scheduler', + 'pure|pgadmin.node.replica_node' ], }, }, diff --git a/web/webpack.shim.js b/web/webpack.shim.js index b3035f4ef..a4f7e2e4c 100644 --- a/web/webpack.shim.js +++ b/web/webpack.shim.js @@ -121,6 +121,7 @@ let webpackShimConfig = { 'pgadmin.node.primary_key': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key'), 'pgadmin.node.procedure': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure'), 'pgadmin.node.resource_group': path.join(__dirname, './pgadmin/browser/server_groups/servers/resource_groups/static/js/resource_group'), + 'pgadmin.node.replica_node': path.join(__dirname, './pgadmin/browser/server_groups/servers/replica_nodes/static/js/replica_node'), 'pgadmin.node.role': path.join(__dirname, './pgadmin/browser/server_groups/servers/roles/static/js/role'), 'pgadmin.node.rule': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/tables/rules/static/js/rule'), 'pgadmin.node.schema': path.join(__dirname, './pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema'),