From b21673b32106027ca3d76d78ad21a70491369e75 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 21 Jun 2018 14:36:18 +0300 Subject: [PATCH] Update zabbix_screen.py limit screen columns (#41487) * Update zabbix_screen.py limit screen columns Add option graphs_in_row that allows to limit the count of columns on zabbix screen. When graphs_in_row columns is filled, begins to draw next row. If there is many hosts with many graphs each, draws all graphs for one host in an column each below each other * fix remove whitespaces before and after brackets Fixing ansible-test sanity --test pep8 errors moved * fix documentation parsing error Fixing error: missing documentation (or could not parse documentation): expected string or buffer --- .../monitoring/zabbix/zabbix_screen.py | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/lib/ansible/modules/monitoring/zabbix/zabbix_screen.py b/lib/ansible/modules/monitoring/zabbix/zabbix_screen.py index cf2a892f3d..3e8238b844 100644 --- a/lib/ansible/modules/monitoring/zabbix/zabbix_screen.py +++ b/lib/ansible/modules/monitoring/zabbix/zabbix_screen.py @@ -34,6 +34,7 @@ options: - If the screen(s) already been added, the screen(s) name won't be updated. - When creating or updating screen(s), C(screen_name), C(host_group) are required. - When deleting screen(s), the C(screen_name) is required. + - Option C(graphs_in_row) will limit columns of screen and make multiple rows (default 3) - > The available states are: C(present) (default) and C(absent). If the screen(s) already exists, and the state is not C(absent), the screen(s) will just be updated as needed. @@ -48,7 +49,7 @@ notes: EXAMPLES = ''' # Create/update a screen. -- name: Create a new screen or update an existing screen's items +- name: Create a new screen or update an existing screen's items 5 in a row local_action: module: zabbix_screen server_url: http://monitor.example.com @@ -63,6 +64,7 @@ EXAMPLES = ''' - Example graph2 graph_width: 200 graph_height: 100 + graphs_in_row: 5 # Create/update multi-screen - name: Create two of new screens or update the existing screens' items @@ -248,20 +250,24 @@ class Screen(object): pass # get screen's hsize and vsize - def get_hsize_vsize(self, hosts, v_size): + def get_hsize_vsize(self, hosts, v_size, graphs_in_row): h_size = len(hosts) + # when there is only one host, put all graphs in a row if h_size == 1: - if v_size == 1: - h_size = 1 - elif v_size in range(2, 9): - h_size = 2 + if v_size <= graphs_in_row: + h_size = v_size else: - h_size = 3 + h_size = graphs_in_row v_size = (v_size - 1) // h_size + 1 + # when len(hosts) is more then graphs_in_row + elif len(hosts) > graphs_in_row: + h_size = graphs_in_row + v_size = (len(hosts) // graphs_in_row + 1) * v_size + return h_size, v_size # create screen_items - def create_screen_items(self, screen_id, hosts, graph_name_list, width, height, h_size): + def create_screen_items(self, screen_id, hosts, graph_name_list, width, height, h_size, graphs_in_row): if len(hosts) < 4: if width is None or width < 0: width = 500 @@ -289,7 +295,8 @@ class Screen(object): if graph_id is not None: self._zapi.screenitem.create({'screenid': screen_id, 'resourcetype': 0, 'resourceid': graph_id, 'width': width, 'height': height, - 'x': i, 'y': j, 'colspan': 1, 'rowspan': 1, + 'x': i % graphs_in_row, 'y': len(graph_id_list) * (i // graphs_in_row) + j, + 'colspan': 1, 'rowspan': 1, 'elements': 0, 'valign': 0, 'halign': 0, 'style': 0, 'dynamic': 0, 'sort_triggers': 0}) except Already_Exists: @@ -356,6 +363,9 @@ def main(): else: host_group = zabbix_screen['host_group'] graph_names = zabbix_screen['graph_names'] + graphs_in_row = 3 + if 'graphs_in_row' in zabbix_screen: + graphs_in_row = zabbix_screen['graphs_in_row'] graph_width = None if 'graph_width' in zabbix_screen: graph_width = zabbix_screen['graph_width'] @@ -369,12 +379,12 @@ def main(): resource_id_list = [] graph_ids, v_size = screen.get_graph_ids(hosts, graph_names) - h_size, v_size = screen.get_hsize_vsize(hosts, v_size) + h_size, v_size = screen.get_hsize_vsize(hosts, v_size, graphs_in_row) if not screen_id: # create screen screen_id = screen.create_screen(screen_name, h_size, v_size) - screen.create_screen_items(screen_id, hosts, graph_names, graph_width, graph_height, h_size) + screen.create_screen_items(screen_id, hosts, graph_names, graph_width, graph_height, h_size, graphs_in_row) created_screens.append(screen_name) else: screen_item_list = screen.get_screen_items(screen_id) @@ -390,7 +400,7 @@ def main(): deleted = screen.delete_screen_items(screen_id, screen_item_id_list) if deleted: screen.update_screen(screen_id, screen_name, h_size, v_size) - screen.create_screen_items(screen_id, hosts, graph_names, graph_width, graph_height, h_size) + screen.create_screen_items(screen_id, hosts, graph_names, graph_width, graph_height, h_size, graphs_in_row) changed_screens.append(screen_name) if created_screens and changed_screens: