From 57af39c3368f36bdd4b4f8d582be0be5036064e0 Mon Sep 17 00:00:00 2001 From: skabbina Date: Sun, 26 May 2024 11:07:32 +0530 Subject: [PATCH] Initial commit --- .gitignore | 9 + LICENSE | 201 ++++++ config.yaml | 62 ++ dbscripts/dbcreate.sh | 89 +++ docker-compose.yaml | 189 ++++++ docker/Dockerfile.database | 6 + docker/Dockerfile.processor | 27 + docker/Dockerfile.scheduler | 27 + docker/Dockerfile.ssh_collector | 29 + docker/Dockerfile.superset | 12 + docs/CODE_OF_CONDUCT.md | 79 +++ docs/CONTRIBUTING.md | 45 ++ docs/SECURITY.md | 39 ++ docs/arch.png | Bin 0 -> 362454 bytes docs/dashboard.png | Bin 0 -> 182296 bytes docs/device-configuration.md | 77 +++ docs/service-configuration.md | 21 + normalisers/__init__.py | 15 + normalisers/asr1k_cli_normaliser.py | 158 +++++ normalisers/cat9300_cli_normaliser.py | 172 +++++ normalisers/iosxe_cli_normaliser.py | 313 +++++++++ normalisers/model.py | 259 +++++++ normalisers/normaliser.py | 47 ++ normalisers/normaliser_factory.py | 44 ++ .../asr1k_show_environment.fsm | 9 + .../catalyst9k_show_env_all.fsm | 9 + .../iosxe_show_interfaces.fsm | 67 ++ .../iosxe_show_inventory.fsm | 20 + .../textfsm_templates/iosxe_show_mem.fsm | 8 + .../iosxe_show_processes_cpu.fsm | 5 + .../iosxe_show_snmp_mib_ifmib_ifindex.fsm | 6 + processor/energymap_proxy.py | 65 ++ processor/poweff_helper.py | 312 +++++++++ processor/processor.py | 133 ++++ processor/requirements.txt | 4 + scheduler/configurator.py | 168 +++++ scheduler/requirements.txt | 6 + scheduler/scheduler.py | 98 +++ scheduler/schema.json | 153 +++++ ssh_collector/requirements.txt | 4 + ssh_collector/ssh_collector.py | 100 +++ ssh_collector/ssh_connection.py | 165 +++++ start-susi.sh | 21 + stop-susi.sh | 19 + .../charts/CO2eq_EMISSIONS_1.yaml | 39 ++ .../charts/CO2eq_EMISSIONS_23.yaml | 39 ++ .../charts/CO2eq_EMISSIONS_30.yaml | 44 ++ .../charts/CO2eq_EMISSIONS_32.yaml | 39 ++ .../charts/CO2eq_EMISSIONS_34.yaml | 44 ++ .../charts/CO2eq_EMISSIONS_5.yaml | 43 ++ .../default_dashboards/charts/DEVICES_16.yaml | 54 ++ .../charts/DEVICE_FAMILIES_11.yaml | 53 ++ .../charts/Device_Families_28.yaml | 55 ++ .../default_dashboards/charts/Devices_15.yaml | 54 ++ .../charts/ENERGY_CONSUMPTION_21.yaml | 39 ++ .../charts/ENERGY_CONSUMPTION_25.yaml | 44 ++ .../charts/ENERGY_CONSUMPTION_27.yaml | 45 ++ .../charts/ENERGY_CONSUMPTION_33.yaml | 44 ++ .../charts/ENERGY_CONSUMPTION_4.yaml | 39 ++ .../charts/ENERGY_CONSUMPTION_6.yaml | 39 ++ ...GY_CONSUMPTION_AND_CO2eq_EMISSIONS_20.yaml | 104 +++ ...GY_CONSUMPTION_AND_CO2eq_EMISSIONS_37.yaml | 93 +++ .../ENERGY_CONSUMPTION_BY_DAY_OF_WEEK_2.yaml | 68 ++ .../ENERGY_CONSUMPTION_BY_DAY_OF_WEEK_24.yaml | 68 ++ ...NERGY_CONSUMPTION_BY_DEVICE_FAMILY_10.yaml | 90 +++ .../ENERGY_CONSUMPTION_BY_HOUR_OF_DAY_14.yaml | 67 ++ .../ENERGY_CONSUMPTION_BY_HOUR_OF_DAY_35.yaml | 67 ++ ...ERGY_CONSUMPTION_DURING_WORK_HOURS_17.yaml | 72 ++ ...NERGY_CONSUMPTION_DURING_WORK_HOURS_8.yaml | 54 ++ ...NERGY_CONSUMPTION_DURING_WORK_HOURS_9.yaml | 56 ++ ...GY_CONSUMPTION_and_CO2eq_EMISSIONS_22.yaml | 112 +++ ...rgy_Consumption_By_day_of_the_week_31.yaml | 81 +++ .../Energy_Consumption_By_hour_of_day_36.yaml | 80 +++ ...nergy_consumption_by_device_family_19.yaml | 95 +++ .../default_dashboards/charts/Sites_29.yaml | 56 ++ .../charts/TRAFFIC_EFFICIENCY_12.yaml | 44 ++ .../charts/TRAFFIC_EFFICIENCY_13.yaml | 39 ++ .../charts/TRAFFIC_EFFICIENCY_18.yaml | 44 ++ .../charts/TRAFFIC_EFFICIENCY_26.yaml | 39 ++ .../charts/TRAFFIC_EFFICIENCY_3.yaml | 39 ++ .../charts/TRAFFIC_EFFICIENCY_7.yaml | 44 ++ .../dashboards/1._Organization_3.yaml | 640 ++++++++++++++++++ .../dashboards/2._Sites_1.yaml | 538 +++++++++++++++ .../dashboards/3._Devices_2.yaml | 502 ++++++++++++++ .../default_dashboards/databases/susi.yaml | 13 + .../datasets/susi/powermetrics.yaml | 221 ++++++ .../susi/vw_site_week_timebucket.yaml | 173 +++++ .../default_dashboards/metadata.yaml | 3 + superset/superset-init.sh | 49 ++ superset/superset_config.py | 30 + utils/README.md | 0 utils/applog.py | 56 ++ utils/dbcon.py | 346 ++++++++++ utils/messaging.py | 75 ++ utils/secrets.py | 55 ++ 95 files changed, 8119 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 config.yaml create mode 100755 dbscripts/dbcreate.sh create mode 100644 docker-compose.yaml create mode 100644 docker/Dockerfile.database create mode 100644 docker/Dockerfile.processor create mode 100644 docker/Dockerfile.scheduler create mode 100644 docker/Dockerfile.ssh_collector create mode 100644 docker/Dockerfile.superset create mode 100644 docs/CODE_OF_CONDUCT.md create mode 100644 docs/CONTRIBUTING.md create mode 100644 docs/SECURITY.md create mode 100644 docs/arch.png create mode 100644 docs/dashboard.png create mode 100644 docs/device-configuration.md create mode 100644 docs/service-configuration.md create mode 100644 normalisers/__init__.py create mode 100644 normalisers/asr1k_cli_normaliser.py create mode 100644 normalisers/cat9300_cli_normaliser.py create mode 100644 normalisers/iosxe_cli_normaliser.py create mode 100644 normalisers/model.py create mode 100644 normalisers/normaliser.py create mode 100644 normalisers/normaliser_factory.py create mode 100644 normalisers/textfsm_templates/asr1k_show_environment.fsm create mode 100644 normalisers/textfsm_templates/catalyst9k_show_env_all.fsm create mode 100644 normalisers/textfsm_templates/iosxe_show_interfaces.fsm create mode 100644 normalisers/textfsm_templates/iosxe_show_inventory.fsm create mode 100644 normalisers/textfsm_templates/iosxe_show_mem.fsm create mode 100644 normalisers/textfsm_templates/iosxe_show_processes_cpu.fsm create mode 100644 normalisers/textfsm_templates/iosxe_show_snmp_mib_ifmib_ifindex.fsm create mode 100644 processor/energymap_proxy.py create mode 100644 processor/poweff_helper.py create mode 100644 processor/processor.py create mode 100644 processor/requirements.txt create mode 100644 scheduler/configurator.py create mode 100644 scheduler/requirements.txt create mode 100644 scheduler/scheduler.py create mode 100644 scheduler/schema.json create mode 100644 ssh_collector/requirements.txt create mode 100644 ssh_collector/ssh_collector.py create mode 100644 ssh_collector/ssh_connection.py create mode 100755 start-susi.sh create mode 100755 stop-susi.sh create mode 100644 superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_1.yaml create mode 100644 superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_23.yaml create mode 100644 superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_30.yaml create mode 100644 superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_32.yaml create mode 100644 superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_34.yaml create mode 100644 superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_5.yaml create mode 100644 superset/dashboards/default_dashboards/charts/DEVICES_16.yaml create mode 100644 superset/dashboards/default_dashboards/charts/DEVICE_FAMILIES_11.yaml create mode 100644 superset/dashboards/default_dashboards/charts/Device_Families_28.yaml create mode 100644 superset/dashboards/default_dashboards/charts/Devices_15.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_21.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_25.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_27.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_33.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_4.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_6.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_AND_CO2eq_EMISSIONS_20.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_AND_CO2eq_EMISSIONS_37.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DAY_OF_WEEK_2.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DAY_OF_WEEK_24.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DEVICE_FAMILY_10.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_HOUR_OF_DAY_14.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_HOUR_OF_DAY_35.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_17.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_8.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_9.yaml create mode 100644 superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_and_CO2eq_EMISSIONS_22.yaml create mode 100644 superset/dashboards/default_dashboards/charts/Energy_Consumption_By_day_of_the_week_31.yaml create mode 100644 superset/dashboards/default_dashboards/charts/Energy_Consumption_By_hour_of_day_36.yaml create mode 100644 superset/dashboards/default_dashboards/charts/Energy_consumption_by_device_family_19.yaml create mode 100644 superset/dashboards/default_dashboards/charts/Sites_29.yaml create mode 100644 superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_12.yaml create mode 100644 superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_13.yaml create mode 100644 superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_18.yaml create mode 100644 superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_26.yaml create mode 100644 superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_3.yaml create mode 100644 superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_7.yaml create mode 100644 superset/dashboards/default_dashboards/dashboards/1._Organization_3.yaml create mode 100644 superset/dashboards/default_dashboards/dashboards/2._Sites_1.yaml create mode 100644 superset/dashboards/default_dashboards/dashboards/3._Devices_2.yaml create mode 100644 superset/dashboards/default_dashboards/databases/susi.yaml create mode 100644 superset/dashboards/default_dashboards/datasets/susi/powermetrics.yaml create mode 100644 superset/dashboards/default_dashboards/datasets/susi/vw_site_week_timebucket.yaml create mode 100644 superset/dashboards/default_dashboards/metadata.yaml create mode 100755 superset/superset-init.sh create mode 100644 superset/superset_config.py create mode 100644 utils/README.md create mode 100644 utils/applog.py create mode 100644 utils/dbcon.py create mode 100644 utils/messaging.py create mode 100644 utils/secrets.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c7c58e4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +venv +dist +.idea +.vscode +.python-version +.DS_Store +**/__pycache__/** +.log +tests/cases diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..989d054 --- /dev/null +++ b/config.yaml @@ -0,0 +1,62 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +#---------------------------------------------------------------------------------------- +# Device inventory and collection configuration file +# for Cisco Sustainability Insights +#---------------------------------------------------------------------------------------- +loglevel: + console: INFO +sites: + branch: + Latitude: '14.59' + Longitude: '120.98' + Timezone: Asia/Manila + avg_co2_intensity: 570 + campus: + Latitude: '37.375' + Longitude: '-6.037' + Timezone: Europe/Madrid + avg_co2_intensity: 60 +devices: + ASR1k-A: + site: branch + family: ASR1k + os_type: iosxe + os_version: Unknown + connection: ssh + address: 10.10.0.1 + port: 22 + username: admin + password: password-encrypted-on-first-run + timeout: 30 + collection: + enabled: true + interval: 10 + C9300-B: + site: campus + family: Cat9300 + os_type: iosxe + os_version: Unknown + connection: ssh + address: 10.20.0.1 + port: 22 + username: admin + password: another-password-encrypted-on-first-run + timeout: 30 + collection: + enabled: true + interval: 10 diff --git a/dbscripts/dbcreate.sh b/dbscripts/dbcreate.sh new file mode 100755 index 0000000..bb5b8e5 --- /dev/null +++ b/dbscripts/dbcreate.sh @@ -0,0 +1,89 @@ +#!/bin/sh +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + + +### +# DB Initialization script for SUSI Tooling +# Requires +# + +quit() { + code=$1 + shift + echo $* + exit $code +} + +[ -n "${DBUSER}" ] || quit 1 "DBUSER env not set" +[ -n "${DBPASS}" ] || quit 1 "DBPASS env not set" +[ -n "${DBNAME}" ] || quit 1 "DBNAME env not set" +[ -n "${SCHEMA}" ] || quit 1 "SCHEMA env not set" + +psql -U postgres \ +-c "CREATE DATABASE ${DBNAME};" \ +-c "CREATE USER ${DBUSER} WITH PASSWORD '${DBPASS}'; \ + GRANT ALL PRIVILEGES ON DATABASE ${DBNAME} TO ${DBUSER}; \ +" + +PGPASSWORD=${DBPASS} psql -U ${DBUSER} -d ${DBNAME} -c "\ +CREATE SCHEMA ${SCHEMA}; \ +CREATE TABLE ${SCHEMA}.assets ( \ +hostname TEXT NOT NULL, \ +serial TEXT NOT NULL, \ +pid TEXT NOT NULL \ +); \ +CREATE TABLE ${SCHEMA}.powermetrics ( \ +timestamp TIMESTAMPTZ NOT NULL, \ +site TEXT NOT NULL, \ +hostname TEXT NOT NULL, \ +family TEXT NOT NULL, \ +power_in INTEGER, \ +power_out INTEGER, \ +power_efficiency INTEGER, \ +power_available INTEGER, \ +power_utilization INTEGER, \ +traffic_in INTEGER, \ +traffic_out INTEGER, \ +traffic_efficiency INTEGER, \ +temperature INTEGER, \ +cpu_usage INTEGER, \ +memory_usage INTEGER, \ +co2_intensity INTEGER \ +); \ +CREATE TABLE ${SCHEMA}.psumetrics ( \ +timestamp TIMESTAMPTZ NOT NULL, \ +hostname TEXT NOT NULL, \ +psuname TEXT, \ +power_in INTEGER, \ +power_out INTEGER, \ +power_efficiency INTEGER \ +); \ +CREATE TABLE ${SCHEMA}.ifmetrics ( \ +timestamp TIMESTAMPTZ NOT NULL, \ +hostname TEXT NOT NULL, \ +ifname TEXT NOT NULL, \ +bandwidth INTEGER, \ +data_in INTEGER, \ +data_out INTEGER, \ +utilization INTEGER, \ +power INTEGER \ +); \ +create view ${SCHEMA}.vw_site_week_timebucket as SELECT time_bucket_gapfill('1 hour', timestamp) as bucket,site, family, hostname, locf(avg(power_in)) as power_in, locf(avg(power_efficiency)) as power_efficiency, locf(avg(power_utilization)) as power_utilization, locf(avg(traffic_efficiency)) as traffic_efficiency, max(temperature) as temperature, max(cpu_usage) as cpu, max(memory_usage) as memory, locf(avg(co2_intensity)) as co2_intensity FROM ${SCHEMA}.powermetrics WHERE timestamp < NOW() AND timestamp > NOW() - INTERVAL '30 days' GROUP BY bucket, site, family, hostname ORDER BY hostname, bucket ASC; \ +SELECT create_hypertable('${SCHEMA}.powermetrics', 'timestamp'); \ +SELECT create_hypertable('${SCHEMA}.psumetrics', 'timestamp'); \ +SELECT create_hypertable('${SCHEMA}.ifmetrics', 'timestamp'); \ +" \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..c04f54f --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,189 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +--- +### +# Docker compose for SUSi Collector Tooling +# +services: + zookeeper: + image: confluentinc/cp-zookeeper:7.3.0 + hostname: zookeeper + container_name: zookeeper + ports: + - "2181:2181" + environment: + ZOOKEEPER_CLIENT_PORT: 2181 + KAFKA_OPTS: "-Dzookeeper.4lw.commands.whitelist=*" + healthcheck: + test: echo ruok | nc -w1 localhost 2181 + interval: 60s + timeout: 10s + retries: 3 + start_period: 10s + start_interval: 5s + restart: unless-stopped + + broker: + image: confluentinc/cp-kafka:7.3.0 + hostname: broker + container_name: broker + depends_on: + zookeeper: + condition: service_healthy + ports: + - "29092:29092" + environment: + KAFKA_BROKER_ID: 1 + KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092,PLAINTEXT_HOST://host.docker.internal:29092 + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + restart: unless-stopped + + broker-init: + image: confluentinc/cp-kafka:7.3.0 + hostname: broker-init + container_name: broker-init + depends_on: + zookeeper: + condition: service_healthy + command: + - /bin/bash + - -c + - | + kafka-topics --bootstrap-server broker:9092 --if-not-exists --create --topic ssh_schedules --partitions 2 && \ + kafka-topics --bootstrap-server broker:9092 --if-not-exists --create --topic collections --partitions 2 + exit 0 + restart: on-failure:3 + + database: + build: + context: . + dockerfile: ./docker/Dockerfile.database + args: + - --no-cache + hostname: database + container_name: database + depends_on: + zookeeper: + condition: service_healthy + ports: + - "${DBPORT}:${DBPORT}" + environment: + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + DBUSER: ${DBUSER} + DBPASS: ${DBPASS} + DBNAME: ${DBNAME} + SCHEMA: metrics + healthcheck: + test: pg_isready -U${DBUSER} -d${DBNAME} + interval: 60s + timeout: 10s + retries: 3 + start_period: 10s + start_interval: 5s + restart: unless-stopped + + collector: + build: + context: . + dockerfile: ./docker/Dockerfile.ssh_collector + args: + - --no-cache + hostname: collector + container_name: collector + depends_on: + zookeeper: + condition: service_healthy + broker-init: + condition: service_completed_successfully + database: + condition: service_healthy + command: bash -c "sleep 10 && python ssh_collector.py" + environment: + BOOTSTRAP_SERVERS: broker:9092 + SCHEDULES_TOPIC: ssh_schedules + COLLECTIONS_TOPIC: collections + restart: unless-stopped + + processor: + build: + context: . + dockerfile: ./docker/Dockerfile.processor + args: + - --no-cache + hostname: processor + container_name: processor + depends_on: + zookeeper: + condition: service_healthy + broker-init: + condition: service_completed_successfully + database: + condition: service_healthy + command: bash -c "sleep 10 && python processor.py" + environment: + BOOTSTRAP_SERVERS: broker:9092 + COLLECTIONS_TOPIC: collections + DBHOST: database + DBUSER: ${DBUSER} + DBPASS: ${DBPASS} + DBPORT: ${DBPORT} + DBNAME: ${DBNAME} + ENERGYMAP_KEY: ADDME + restart: unless-stopped + + superset: + build: + context: ./superset + dockerfile: ../docker/Dockerfile.superset + args: + - --no-cache + container_name: superset + environment: + - ADMIN_USERNAME=${SUPERSET_ADMIN_USERNAME} + - ADMIN_EMAIL=${SUPERSET_ADMIN_EMAIL} + - ADMIN_PASSWORD=${SUPERSET_ADMIN_PASSWORD} + - SUPERSET_SECRET_KEY=${SUPERSET_SECRET_KEY} + - DBUSER=${DBUSER} + - DBPASS=${DBPASS} + - DBNAME=${DBNAME} + - DBPORT=${DBPORT} + ports: + - '8088:8088' + depends_on: + database: + condition: service_healthy + scheduler: + build: + context: . + dockerfile: ./docker/Dockerfile.scheduler + args: + - --no-cache + hostname: scheduler + container_name: scheduler + depends_on: + - collector + command: bash -c "sleep 10 && python scheduler.py" + environment: + BOOTSTRAP_SERVERS: broker:9092 + REPORTS_TOPIC: reports + restart: unless-stopped + volumes: + - type: bind + target: /susit/scheduler/config.yaml + source: ./config.yaml diff --git a/docker/Dockerfile.database b/docker/Dockerfile.database new file mode 100644 index 0000000..4536970 --- /dev/null +++ b/docker/Dockerfile.database @@ -0,0 +1,6 @@ +### +# Dockerfile for SUSi Collector Tooling +# + +FROM timescale/timescaledb:latest-pg15 +ADD dbscripts/dbcreate.sh /docker-entrypoint-initdb.d/ diff --git a/docker/Dockerfile.processor b/docker/Dockerfile.processor new file mode 100644 index 0000000..62b44b5 --- /dev/null +++ b/docker/Dockerfile.processor @@ -0,0 +1,27 @@ +### +# Dockerfile for SUSi Collector Tooling +# + +FROM python:3.11-slim + +# Upgrade packages and install dependencies +RUN apt update -y \ + && apt upgrade -y \ + && apt install -y ssh \ + && pip install --upgrade pip + +# Create non-root user with /susit as home directory +RUN adduser --quiet --system --group --shell /usr/bin/bash --home /susit susit +USER susit +WORKDIR /susit/processor + +# Copy requirements.txt separately to leverage docker layer caching and avoid rerunning pip every time +COPY --chown=susit ./processor/requirements.txt /susit/processor/requirements.txt +RUN pip install --no-warn-script-location -r requirements.txt + +# Copy sources and libraries +COPY --chown=susit ./processor /susit/processor +COPY --chown=susit ../utils /susit/processor/utils + +# Run as non-root user +CMD [ "python", "processor.py" ] \ No newline at end of file diff --git a/docker/Dockerfile.scheduler b/docker/Dockerfile.scheduler new file mode 100644 index 0000000..00ed88f --- /dev/null +++ b/docker/Dockerfile.scheduler @@ -0,0 +1,27 @@ +### +# Dockerfile for SUSi Collector Tooling +# + +FROM python:3.11-slim + +# Upgrade packages and install dependencies +RUN apt update -y \ + && apt upgrade -y \ + && apt install -y ssh \ + && pip install --upgrade pip + +# Create non-root user with /susit as home directory +RUN adduser --quiet --system --group --shell /usr/bin/bash --home /susit susit +USER susit +WORKDIR /susit/scheduler + +# Copy requirements.txt separately to leverage docker layer caching and avoid rerunning pip every time +COPY --chown=susit ./scheduler/requirements.txt /susit/scheduler//requirements.txt +RUN pip install --no-warn-script-location -r requirements.txt + +# Copy sources and libraries +COPY --chown=susit ./scheduler /susit/scheduler +COPY --chown=susit ../utils /susit/scheduler/utils + +# Run as non-root user +CMD [ "python", "scheduler.py" ] diff --git a/docker/Dockerfile.ssh_collector b/docker/Dockerfile.ssh_collector new file mode 100644 index 0000000..b9384b2 --- /dev/null +++ b/docker/Dockerfile.ssh_collector @@ -0,0 +1,29 @@ +### +# Dockerfile for SUSi Collector Tooling +# + +FROM python:3.11-slim + +# Upgrade packages and install dependencies +RUN apt update -y \ + && apt upgrade -y \ + && apt install -y ssh \ + && pip install --upgrade pip + +RUN apt-get install gcc python3-dev -y +# Create non-root user with /susit as home directory +RUN adduser --quiet --system --group --shell /usr/bin/bash --home /susit susit +USER susit +WORKDIR /susit/ssh_collector + +# Copy requirements.txt separately to leverage docker layer caching and avoid rerunning pip every time +COPY --chown=susit ./ssh_collector/requirements.txt /susit/ssh_collector/requirements.txt +RUN pip install --no-warn-script-location -r requirements.txt + +# Copy sources and libraries +COPY --chown=susit ./ssh_collector /susit/ssh_collector +COPY --chown=susit ./normalisers /susit/ssh_collector/normalisers +COPY --chown=susit ./utils /susit/ssh_collector/utils + +# Run as non-root user +CMD [ "python", "ssh_collector.py" ] diff --git a/docker/Dockerfile.superset b/docker/Dockerfile.superset new file mode 100644 index 0000000..23a32e7 --- /dev/null +++ b/docker/Dockerfile.superset @@ -0,0 +1,12 @@ +FROM apache/superset:latest + +USER root +RUN pip install mysqlclient +RUN apt update -y && apt install zip -y && apt install yq -y + +USER superset +COPY superset-init.sh /superset-init.sh +COPY superset_config.py /app/ +COPY --chown=superset dashboards/default_dashboards /tmp/default_dashboards +ENV SUPERSET_CONFIG_PATH /app/superset_config.py +ENTRYPOINT [ "/superset-init.sh" ] diff --git a/docs/CODE_OF_CONDUCT.md b/docs/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..8af3c79 --- /dev/null +++ b/docs/CODE_OF_CONDUCT.md @@ -0,0 +1,79 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at [oss-conduct@cisco.com][conduct-email]. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +[conduct-email]: mailto:oss-conduct@cisco.com + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 0000000..d81ff86 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,45 @@ +# How to Contribute + +Thanks for your interest in contributing to `Sustainability Insights`! Here are a few general guidelines on contributing and +reporting bugs that we ask you to review. Following these guidelines helps to communicate that you respect the time of +the contributors managing and developing this open source project. In return, they should reciprocate that respect in +addressing your issue, assessing changes, and helping you finalize your pull requests. In that spirit of mutual respect, +we endeavor to review incoming issues and pull requests within 10 days, and will close any lingering issues or pull +requests after 60 days of inactivity. + +Please note that all of your interactions in the project are subject to our [Code of Conduct](/CODE_OF_CONDUCT.md). This +includes creation of issues or pull requests, commenting on issues or pull requests, and extends to all interactions in +any real-time space e.g., Slack, Discord, etc. + +## Reporting Issues + +Before reporting a new issue, please ensure that the issue was not already reported or fixed by searching through our +[issues list](https://github.com/org_name/repo_name/issues). + +When creating a new issue, please be sure to include a **title and clear description**, as much relevant information as +possible, and, if possible, a test case. + +**If you discover a security bug, please do not report it through GitHub. Instead, please see security procedures in +[SECURITY.md](/SECURITY.md).** + +## Sending Pull Requests + +Before sending a new pull request, take a look at existing pull requests and issues to see if the proposed change or fix +has been discussed in the past, or if the change was already implemented but not yet released. + +We expect new pull requests to include tests for any affected behavior, and, as we follow semantic versioning, we may +reserve breaking changes until the next major version release. + +## Other Ways to Contribute + +We welcome anyone that wants to contribute to `Sustainability Insights` to triage and reply to open issues to help troubleshoot +and fix existing bugs. Here is what you can do: + +- Help ensure that existing issues follows the recommendations from the _[Reporting Issues](#reporting-issues)_ section, + providing feedback to the issue's author on what might be missing. +- Review existing pull requests, and testing patches against real existing applications that use `Sustainability Insights`. +- Write a test, or add a missing test case to an existing test. + +Thanks again for your interest on contributing to `Sustainability Insights`! + +:heart: diff --git a/docs/SECURITY.md b/docs/SECURITY.md new file mode 100644 index 0000000..2c31179 --- /dev/null +++ b/docs/SECURITY.md @@ -0,0 +1,39 @@ +# Security Policies and Procedures + +This document outlines security procedures and general policies for the +`Sustainability Insights` project. + +- [Reporting a Bug](#reporting-a-bug) +- [Disclosure Policy](#disclosure-policy) +- [Comments on this Policy](#comments-on-this-policy) + +## Reporting a Bug + +The `Sustainability Insights` team and community take all security bugs in +`Sustainability Insights` seriously. Thank you for improving the security of +`Sustainability Insights`. We appreciate your efforts and responsible disclosure and +will make every effort to acknowledge your contributions. + +Report security bugs by emailing `oss-security@cisco.com`. + +The lead maintainer will acknowledge your email within 48 hours, and will send a +more detailed response within 48 hours indicating the next steps in handling +your report. After the initial reply to your report, the security team will +endeavor to keep you informed of the progress towards a fix and full +announcement, and may ask for additional information or guidance. + +## Disclosure Policy + +When the security team receives a security bug report, they will assign it to a +primary handler. This person will coordinate the fix and release process, +involving the following steps: + +- Confirm the problem and determine the affected versions. +- Audit code to find any potential similar problems. +- Prepare fixes for all releases still under maintenance. These fixes will be + released as quickly as possible. + +## Comments on this Policy + +If you have suggestions on how this process could be improved please submit a +pull request. diff --git a/docs/arch.png b/docs/arch.png new file mode 100644 index 0000000000000000000000000000000000000000..d42c58d6ed05663b3076254d1efd9a92c6313ae0 GIT binary patch literal 362454 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
(MM*o*!f)GUJJ$TRGEY{2NV;4g(i+}B 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 k;ztk1q!cCLcUGC<=FH-g zvIM|jWUsRQ?<%Y&5|J0!WlYGH+w1FyfI1LVqMq9gTvXHkU@XS~aFIuT4k_%acIz(r zbTK9{cN(&BM%+=s0`6YCA8KA_4^>bL1LA{+!V85Y#;^3F$!NyO^hDgV{#WcOPiN(- z8C~55@{>|mH@@vU<_|bH2Sb=-G&_-&y@cMNsNt@)u zE+zdc^@yi9xy=ae`vaY=k^X`ZDhYd&6-p|0lmr|=Tj+{J-L;^h~-ahU{JZGM^A zJ)Rj?dOAiU+?Eh9ixcl=L-ZeCHeoN+Y zM3uTu>AHTwCxNrl@AYwp$>*7$68vADUo;zpxk|GRUiMY|{!Cd_*4HL7O;od7u^kI# zGzkm?U}Wt9m0$qcjt2?ir<;Z#pQ)igZxKRvX{TLxQLMS<5mpOgcCWm~irqXMWTfvI zVAY%(VYbeCE34pIszXiH3~ig+>1GYfQI#ytX5sTx7PA418g)<5sMcPIuk*wm<9B`&C*|ggwfOIZ?0w2swecYezTA z*kO|DL1yNfz{dc_)Vil{45j*yZ7l9R+g|wR7zY_ zl=(6p(2KW>+`9{*j8hC&IT@~Qj`CH~xfh}h~0d_8If$UYgMQAI&m5GwSmtpnBla+=j4 zLWYgb6hN-`r1$a^$ZgX!P@`(no*B3MrAK~_aJo2HBm?qv+7T_X%d@jkiHEC@$O@P# z9dpQ<9fR`6P+;1I<_+P=foApf_BTosfgYoV5kabv5flr*E8X%7C;!&0!#9*z{1Y0wQobtM1La6o=B1EBD&H_v~T${fNEK}+RMA#lPBhIl5xa@iM?HuqlZ__ z|CmVR`NQS&EE}v>Btzb=(&}Ux2x|0t4nisucKmt)QYrTN{thM2;xNmv%k7jG37A*d zDTn5bL}m);A))T#?$eqlNuMATGlC{G2M0S zJbTQp*qGZem4jEvO#b(opnXdrdA!DoWI@yAVdVjt#oT^4;ruSw{R<0Q2{Tf6(TVVR z-p!QXF_C|%qeow@HGL(=gOdF|c7Oa59UPA#!MI#rWOiSW>k*ZEwD~s)*0kp7Ap9Y5 z;%>yQX1>g_oAt$C@e#xPUf6rz+n)pXg zfXr8?mvjm5GK3M8){Cp+l3&1na<~KvG-?`IU=8~Yfq5%vN&6bg<)&ext0tK;sZG2_ z_~whB%t4s8R;ynZ8e7K`T{F&0{H^YszN0^9FBvt0m&`PE+P-@>N=qc!9@l{@2#3q^}MG9XfF_G01^|fhK+M zw)NT2T6GklE=DRxtH7njjchzg5ou)kD(5#W=eFLrxw zMx-7QYCy1%S&fbH12BN-Jy9ZiBbOO-s@cOK@|_|Wyk7quFRJZTc70j`G53v$<04snb#ENpCS6(m&Rts%5`fnGo>ABh$@#AR43o5iO{ zZg_u%_lQ7>#qTh!^6?$ovfx8_8km+Ma-*+Wms-5IUePOxZ~6@c-q0V0xg=tCcFJ#l zn3tT;i2)}B8Nbtuehr#qs#W2gO3P^xb+vcg_Im$Lb8n{Iyny`}-*_(=0Y3vM8_stp zwz;^ix_p@DYa|Gs|I*=PIn~r?idxo)S!2k!3C9S!^HB?S?y*rOLa<}4&WH={&=&fY zd_yr{58=|R46*Y&u*g-ux(FA_8lZL$rFvw%YZ$YXU^zsC*m$3El4e|{<>|G`YUi@# z!cOl0YhG;WBoD3dC%$ZCAvQSg9!}aV(Hx6emys6@3#~Mz2p@vV^0AqXV**=jp1mji zB@IG@0vyF@Bw~BgG!uQ1h4|YaUe?EnMr zjBt|8*Gll=;J4n?XWgRXcCmJEellhL+tBBks|kl`J?RhYM78G#gc;bu8I><2w`uBD ze$P70$nO(Zn_^hViF~^K8iW-+fUwl~?=Gi78a9a;@L54E1z!l!RDxDY@gzB|X1hI8 z70=vao!+`VAbQz>Y2=O`ABSK&Q<(C8^%Hv%3rN{E+_-vk61=++4vQ)@p6POL* zV&%>|F&h*^AU0>8x)~i{JJ*MH6wH@y9H`x-zK=xcAW$U}StUcAJ-^eOH*Y^h8w$hC6fH zPcmQKUDuiYnw@{T_M5ATRF${gsLxO?v!DUN50uO%r!xyDUVN&#<9bENd=rS z!PvPv+yz7loui}b3PX`+J5v}MmaSYH5xDt-u*v7S z6c(u=7L~ZMlc7`k)olUjuArvO*H8pTuzlS~in_07tZr;zZYr1|3lWw_`W)IRL0r^P zk}*|bnULeV>9N`RtLcZc!x2(o!>C)=LMR-*gmY1)pFu;Cqe38{50ZE7ea!cdI^n+ zdr^w6i;7Z&{dQT#@Mt&?LH@-lV5q5M~`VRIDMta73O7efMr-=VX+SmAhjn6*|q&Zajl1q_~ zIqs4N4R>nUTNL&8R_T{n_+X3FtCR(Ue9d;TKFgia35g~ByycLZ29-$T1=Q>3Ku5?X z#p&jcbQ2Rd#hh{S(|mVvOgzxlJXjE?r(GY{{iZ(H6;SN(9`HLAd=cQ3p_7{R3F+Uy z%YYdEivoNUu`R|;@|5)p#qH+$lQ4i)qo4k$B-Nd0&ezpm?km9C`H?pm4qo=G2t_AG zayRimRn6wol*0W^%dJG12TSB9%_11rbF?%4AFVp1xtyKF{!G(3$%VNa*3n0p%sizw z$XCD5!Zuv({U}uP_TF^ldQk7XFhagefkH^e=E^p_lhCiE)&k>m&9~25UG{YZPeuvT zxP2=v?~zAt*8|AiB=z<)r$Y0^?k$DB;QfBCD_YTZ(IMbJ-*rwPaZrG1|7ECeR9{qjvjWr%HL>Oouw`%UN)$1 zY+)OPJ901aioDkH2en%5yMD~S4Bnvrgk%2Qr}r*an6Xh?Xkgj1uM2WOgf%g-G-5B| zs#070?%~}F!=?F&s~6X&Mf(+0R(yH@?A4R=X*(U4Ox$4#*=VcSxfRyqK+g%N;R$v- z!ub$*@j8i-leV6qmzM+?#dQvfS57%oue3ma9Flp`qo!?)q#)YsoouPIZ4n4mWBy%5 z0cMs#3=7I3f1?Fl3m9I7KEz~x&6vm4LO0H)2o;S2?;uz>fn32F|65N+wcs_XrZNdm zPBmOEDLic8gG0h?2G`Wo#0{SmI=5r7RbyBni#7v-k^9AEoZtd8Z2IC$+ zAz@#+HCP{`rI(_Aj@Z{)5Jp{DQa3eU#}f5!OW-=JNT$_B_#`BQnO3>5WE^^GMwUDV&2Mk47~%Q@tJiq%zb7%pGpPrsqH;_Pzd;Y&{c}Uv z$OuocS5algf$_;BCS(LWGQ&#qvxbz=>HOz251@`d~8@u6xaX5s8seaIlxWMR-ZD zB;~n9R8{7)77v+@*XS1eVm~3}oOs?oCIgx1lG}VkG>VbJEdAfBY)K>?)WLN3_|t$F zeV=uiIE1#Ld5-7V!owo;`?*2mTjcTKTH6%1BV9nJu_2mdJ3?dE5m@R$YqpOx$U_Bi zsSDq<8*uR?PZ*$Ng2(X$XDn<3IV?jT{w@<8jR~yWo!qvxoK^P!$OTCJp^spy|GOTQ zt)q>jvY{j9D+by2$hA;LaaZ@{i*J8vlFRk-Kv>n0{%<#M0QqAd*;LHRBN{jL`$6oT&8MDAL_ zYC_N4u$5i0q$w|r9o>0i<(8ppqV~EcL7A61-2iT1RYdg?_3gV7c3*q*u1%~7k>Wf3 zxu4L*^P44S|M#VJen2|=8X)|8hd0+l3h#czNTj(Jgv6Rjo65pPt#6EM!a0w`#%CJM zul7^Cb6NSC|4*k{ zp1%YyUbp|SimpZ6U2T?!JTn}wteX#5sjsod9W~huT@6=#i7;f1-Dg=4pVh=bDhgZ3 zn57^A@+d18na3PHl16re-2IPkoc`_C30Ye9xRaH7FD*_>Wr6lp%j9>yDYdoh(@ET22<{%oN%psrwc~v-wDS|QL(rjprCz(xWBK&*Ay$+Ws zG6Ybj{L0UIUw)@b@0)Z2$-zKi3qr+?qG<4MZ zorOTD0u43{e*)R>-lh{D;6XxWa1`X9WSq9(BH}WRPx~|XwSvA<9l?-}4x+LyGyQoS zYtpa1Nc`B>6lh(FZp_O(H$>;zr-<#}gYo1PUlIq-JmI(W^+G3S_Ctrj&)Ff~RA(M_ z#WjA7LeGAK#Zha&suhGppXWa$Q}gSfm*XToZ5TTe&UoYo0>ida%5EKJF|WQ|SyGpeMjX@azmKvKn?43X0~r z69{;T-sAbd?5dU#j;fpNcaxeZX6TR{=;BQ)QE1m#&Lswa#W>kwBrn<5yf6H|oBQ^y zBT`-eIsP~xNB+-R=AZ5)96$clRDQ(TO=e!-N6dXxXywXj|DR%TZ&KMSgi=`03)>AV z+}uu)i^ZQh^1f)Xge@25sU>5t2YGUx7QXYL|2wbMK;W4M9LLIvstq%gQ&<`Jjw=VT z>-fwNKK-eeZ?&62Vnil5#&$bFSJMwA_|Be~LBRStm^+L4e|SF;Od0@rM~iBS%TXNP zQt-Q`by?0RZqN+<0fE0S^$>_0|OFI|~ z=;Rah+Kkn}40GAh;~L(#Q)_i$5^^Vi(+mY)aRqIBce#&pHUk0?Bh>zU4Z34J*L}19 zf}up@YAUfXC8Jb#mMOtT|BNI$${7*?#YbJ)S_2Hq?q8qAJ9td|9p>s;D!jHwDB@e- zdgFz`4)Q&4-H-vy%Y3u0VEkkJJv!%`fxJ;hU+uYGPbQT#IN&u945o)}V611h(BwAO z5g3>z?l0^(Qxk+1lNS-euWKPQlNYZHy#L?@3N1vy&9mIU0R1=^H(<-py#=tmlwM=l zw>b_tUJI@>jt^!VFf_Qi~@o1GD6t&Fahy{j$Dz$ zjMj#In%oANa z3=T?Bx2N6R>tgj7>5p;+5`MuZ??=&Rb%zL1;uh4TU;a(N=CGG(DSl4B*y=A~kXVd_ zr*MD-HrE)yVeUO}i0cH|;#RAYLBU|B_N7)Xir&$DjV-f>(Z%STAcYhpW#zu*!!#xcm4(yI8-D8Q#?k=vxCGM&;7{`buBid6b85m>XSOVpjGcyN*`3)OfnKR! z7NvLn`u4CRJq-t)k(r~__Y#}av~@5vCb8BfKR+L4S`U2nvc|9=S&}q`QXx;!ycO{@ z(dm?9?}4FJ;+96u5Tt8L_XgnvglQ&X&1TGX`n;1MAyZ0brs2UOvR)W6;v<4U=)V}& z+iEJ#5#hh#kD)I)^fqcL=6eE80zPUfVCQcQX1Hp>f01G0>gjVp8{Oo~vh7dCGf8{a z(Y`37j^jkCpQ>Zj>>Nk$^u6~wuf=soIyfyIBz+#umsUOTcnv6p%!Yiq8kfidXsz1{ z-G@r6y@7aV=B}$dCNyN<)F^)$Dh$N{Su<&kliN(|cCw(|NfZ8I89H|$jYxGvWKXEIT9rxkHnsCT*X`(IyEp}?|90`NT~ zt3b(56D-6TmUAZs{_AxA`>#Q@&{md40U6f{B}#Tr@ZB7{i9Zn$&6mt!@jCiprX~*4 z#3S*oPvFg40}$d3L|upfOqYH;@6w^b&;J>C!?A(e6LI;9_;ce=rKCTuA&HiYt+%p? zYHDaLZ|z<$^|mL{EQ1uLv9KmZZp~nD6xpcbf1uwen9w6AD&_gk-*5wt_w;)zi2xXj zhFiWbnk{F+ZH3P-HiqD4uFQ&p#+f65bu+4~-((={V9A?=wwDF8sgj~WfMHUn5Qa|J zIjY{wqDb)xlpAm^sbuzpS$FyvK2_lDMP=km?vW2^gfD9WGrupI zSO$o1KJb2i;Z(#sZow>191{`WuHfP6$v?+PssP}8L1AG87pe}jf={1lz`p3^eoIr6 ztr*v3VL9#)Afv(fFK;R;IEX1Zb@TWM*}ldwXclK3vOC=5Y#&NE32utc*H4wWgR)?N z1Fs8DaQpKqWXju*ivgSB&R(V}YqrnOr;iEy5UC|Di*U(qajn;p%d`c>s!f$nuUOsY z?)O0=glevip-FHve&f4pp;8L|#}N{QluVqUrs`#bujliR;d(LUWzUaam~|h%Wgn|D zROQxbE%vmcas_yEHSJoU{&D~=CQeRhaJdcER|+0#ZBQRKYvsCH6igB2rFH-51^#bi z0QCWk^&x|a7UuI$$+;DiLMY@xhfv%Wn*&(lh7!?$2oHxtmbwStWcaTdgFGqCwcwc{%qaeNko2n@4i}WX~HJF#kOs6 z?Twiu;SW$v$^Si}L_j_8ZAUB7WSETnP-kkW=J+)`Mx(hb2Dekla2TetvL~w#-A7nV z$h;1JxtAJM))!VSAXTaJGQzO2X-6TXzrQ&;<`wn6&>HOb zdL~qBxBN&A(TfDr+4pJ1lf9#t0h`mJ#amf5ks%ze1aa@zz~?t34*$0?Z9gtmUIFQh zajeeCro6Oh!T0T){AD)%x4P6;&rf~(eCGcY)2&Uepog} z;|X33H@pzpJjX&2y$g0*9O!qmBcD4iwHp2z1%&H7P{?ZlUt}<%!C;k`+>@&T$%;Y zmK-CZq7u`9r+q5D6Gr65l~^wMfFs5wYfKO-iS!DJa}U5x3MYv*Vdsn_m8Rf6PV z6usr2yig#eQuAv^haHc#k;-mMomIoVifwCG^MRip1yKo9`^y{3Ql&V;Qr@YP^r#JK z{Du6ln)-|ph911~WB4g#R{i<@pT4%ekv-*8Jvh>hWm{q@V*i66%)=0bq0EH>Q_(Y9~wZ|jK7sCz{04U7yJ?WFgAJYl5XQn;%C_My8;5# z%Vb7`N}|tGkj8vKO$&#MN~m`<(B%%dw|=i~f;Ubg zWmN|j_-Nh+;wE!^(sMHk|J|pozOVh_sk>X@6HMq*ufd^gM;lL$mN!rgY%6Q>U&zZ# zgWRCbY1&4mr{1jDojf94yxdi(nkd`7$80J{#=&|z|Zg6GmtWhH}<#Qkpy zJ5AFYm4UlDR56KB3M8&FU;&OK7O=kV79~(pOQR0r;>4y9MuHK1NT1tx0@{)pP%PxB zw$kgC>%>b029)ZQC8GJ52@?PVY$y;|WR9!^esqjX_`Vu}S+K3*#yur%S|5qPxQ0tX z!J$?j^NBl+1ws6M9}WA@tJKEBWu{h1+4%-$Gg|9n7H8EZ+)c3C;Q3O_rg|;gd4amJ z5hqx<5zxcJVB8!)HKt8VMf$r8j`CZ~sW7x5W2$m6(=u1zSv0R4nO5(*{ztKpw)MRXiD|K z4F<~bgUEV2E#81yaLjN=&vse)DwJ`a9ZW6;%fn^LZR~=_9ayjhAXFepAPg|n0F=n zgbHd6p3(8D(iFUwDyLhgph%1{RZMhWTlS<)H+vm}lTU3o(_cM~wk7@W4m2k{{C&_I ziA@KIol__gHrg9&yaJGnVqu5#!yyHn$l>K;H~q?UP*!)rH` zH>)~!0FiKfck#7KDEF=G*rOxH93R9gJ~2UNkY#l3VS(BkZAk5(mcoOqJ(B(yraMPt zhn&(Z^&l$vZEN!QDiH&zAliggkDT{}t)PB+3?nRXW94qd~pPZp^>unh`zu4nCP_?l?xn>kCgl zy6+a?T#{E#&(m*_zNkdQcS_P?(F-E5O^>uGSF%0bk{OVIkGeq54_C2c?0Kg^h;?jV zN4y;obDxrc+OphlMeGQErI#%lPl$MwewSgT5I0Ar6}UP4J92d^0Dl=~DyBJXiXGR@ z%hXQcYQ2GYIWx-&(+zRrHz5In`vOPa5(KZ>< zkZ(z#7gp)vusGVzw`yU64yfwW)16EnyPYMH@~x-#27S3?*&T3^bS6AZMj-R9Ch9pf z@F<7GJnOhjCS~^Z`$EELurJSki0bn1=OJ-W$H%rAxGwZ4&?lCTmrmRP$EKpT`XKJ9 z$KR|vY?ESt#Hk;+7$CoLL4Xy-hDEy&3vCkWgM7m#MaAmAWgkqH$7eDezy=f9PEf(T zp;&q)SnYbDwWud;;*v@;hq7k{tGm0q=lPR(=+nHuD*6{&t}+>_qViwp->$73EQqFl zLA3u^w10F%tdLs%?vVY*uLskMRX}y6Aj)I!pfOq?t&nQgYdO222K-#hw(F1!dLrAn znh_#SR}WUZK{fw9Hdtd2qUluvh34>)s8uKs;~Ti|D8Z7Cv^D0|fdRp1!8*#jF81~~ zJygaIX!7Z-cDdXwf9~u9g>czNFZ}RQr{fz5Xb7ZbWfdEvjg|B94CvffpBpO0nN8Tf zh?UJSinE(!6}isU&Z|Aj445~IXZo6HEof#)Kd>l(l4D-ud`@j!HGhSZAWI;phyW1w}lBWa|)?ZBvH7Acbm+y*inEG5%CBuUA zI@G)^D-CGHkerG>7JwW5D5@k!Pi$F@SozcoACUT*btO_?T(#Rf*DYI}nJ$BC4UL5c z7F5ENG3_^H+5OQ+SkXPZ>%LUH&6;O#F23kSE$q&h?iWjZl46gCGW~!%)E785Z7NqP zx=h<~^8VGedfwURpDIG$LG{DRphC4o=cHqzmZMHCkkA=Mz^ZJ0&Nz-#x~v|*_u(?u z&RtnMOUY~w)Q@#!f~y^ij-Gygortp^u%5G4`Qvlr4W#$S7QM?Rm~)O-rNW?OQTvPw}$qw)#YyE{dQa5w8_gd@t^Ekn~;P zG_{vgJA?NfZ9EqrX<4+$z0s?@qN1IqC^jP_e4fL$)bF2;QNAJEvqzxL@1&P9oo4Mp zadx36mOIa+a`Q%6y^4ADzU63H6t-T*QvAIVGAt#Mtfs>hyjK?uL{My*>txh@XYvaN z2k*;zxY!vGR!u#JAg!zv&$_M@^EztqkaOSp5FXdcT>kp4qGam|Q5Zj4cbZ>o;%$@_ zz9OXc59jQ6Y_|(aP56yy&mh6Ui+2s5h~QekkLpIWyvb{Iq^zyQazfr^!V4cmMQ}47 z0rhssFmJ@ljGo^GiGv;r!v~DO5zbmEYQK&6{h!1uD1k#Rl{x#Q5?B00Bv1F$ zx_Sw^dE6+Pd?Ab#AUb_&PPaE&>giJ*a$@{}s-scgUJyk+?jcMN_aL!0Vky?w)j4{Z zeDF%M_0CrU>8JhiqvDQv>sbj2-P{u?Gb|BoUmq!b)hg^2-g{1*kgjx|$v!{iQb*rYUgLT@G!~VuPJMRd z(_K9FHD8FQS8U9?O|F*_d8^Yn?IVKRrLt#lJ~EzGonIk9>}cMcPM+U7^`~b}Wi-1k zWZW^D|8Q&9#AmX=mw`x*;V!4kSo!TFJG;qtx}Vv-$lxp4qZ)LgOINhWiLLPrp~r-H z`RMGoui9KV;N9yFx0DEv(K8@2%eR|5Fh=`CsX;ir~90n{UJ2h_|zH5UHyXT+QNM#&qU$#hJY8r2*KRPvB-DY*x4ETE|V?~$5cLCFHWS9E-S*e zwy-ZuO14SLxO*X(>r`N6((eQT8&Ch#7qLJ=n zPsy&liw8hXCzSQbFtN%d!4`rn;m2MlX%~ z!N^G48J8TN=IK8w%<6rfO_S=({pT{|LQfxf-n9DUTr7hTdJv-DM*FZ}O!}sO+sUM3 zOooNn&0`qhW6s7jZw_axNDXB6D9VU`IIFzqTJGQR^!8;!{c8+sC;jx8DmZ87F0Q#P zA7T*rJiHRE=0Bbq&}tqltgI>Ge>B2TO<2S-!A8yaZ0oUK6-Lh>GKj}$d>^oHh;BMB zJJ)HHe=79Lxm{^f{o#=62Oz3)91dAU%BHX+*@KAzVd+6=RC>yl3Qnk-y1@NAL1-wW4pcp zIr}@-tsGBeOI}UHc7h~E2(3BS%g25sXXT}cpEDN)cex<@o+<2ktBA;tuHG8nkdR&1 zoYTRAK1nKW-Sv%VyswiZqGu1m(5GP6C!wtNyYTRXJZldaSwFr%8Y4x1^Zip7g469m zLM97MkXBa#`8B=o?pR6cLDcM^mzJYcrS7Lh&Fod>mn@TGr_0=~tL3kZot!2VwpnFz z4UX)VaDLp;$iVgP4W)wOrMr5|6+_3_y(d-9WbJRn{fLQ)bYr|2(>i{6=Qr8uczxj) zrRu>!cq`)QAa`Z>0z7kQ0OW4c&{f6$=z(`3xqLvI1A<+nK4M#dFoJb@?NoWU2jaHxtla zla=imD-iS^U^)u@Rb$PPtUS5&@=W`gKsO-qk_+9#&2NxvN#T6;>gOW|;)nu*^681F-M=*oB5CRlAQd>=~OXc4X0%OK}MWa-Hk?R|Gv zat2?=o^C-Z$R}qeEd==Nz(%!_4Wj2m$$WP8TUh4 zzIw7ei9$RVOIUb^9w~3Ow^&pS8heoJ<Bc?vEUKrr<-o36n&P0bF_BB)R^Q>esLz>w+XQ}ZMnBE zAhXAip@XP2o(w~U>)%h81g1$gG5)qnSMn!cO*$FTM$~RnOJUx<%?U>h%Xn_?=&+hS z5KI>J!hIND?CUX=1db;;7In@qhx;;8{m#su0#O!2SW^~QO>4B2u(D$%5Nok0aR=f4 zf{JhX0!|Qjj7rwNhmkypDdJH;;`)#{c&6xTJqBM889LHrsU4+VH)E@{m&z0~GTHMJ{`ge4E)b zQb`8$M?58TzTn@we9sUR4{POf{UroiGjg-5{%c|Cz!DqRQllNtnt4!Zz z8O2?{yn1vAnrk;h$3U=W77@K`j4nAICvn@B<&j^US) zH`kkAfx&(sGr3FMEoR@0$<8CpXLjs9JUB7Im3nn)_B?2r*xhEU$3p})yWW^m$*A@B z_cMZ#CnjK|;oHIlZJa~`qpV+A4H)4&&ZwQnKm{!MfL;`Q)ulB1MJ2JBkf-~G!_4_d z0@zm5E-N!8{Xyet)}QY@RP<_*F3ZD5Y~jt!<=~&OP8`wiYspUr3!5Y^SI!5^LWKwIs3i%hdE>sgeE3q{F`+Kf{_?7sH=8IX9C|+U4{fN zT%(Spr`Pek&nj`m@MT#YHSfq^vyW$c9-mJaa5C=wiybwub#ceyBo9-J`-r{iW-3%C|9$(0M?5JW@mVZJ51A2UWPNyp6 z%&ezLtXZYc-CD!R*~inV7$`9M{KnBds}m zS6hoH!FzWo?sQNuQDWA#kaF9__shkJ1#b?3*jUCuBBC-| zRw0pE5**z|U#I)x67`BiC%_+tbj-`T@R|nA6IXEk@zE9mcc~`Gc$5M&%?@t|-o)uz zPJ*$c8X zlXUeoyokAj=93rhxPeoOb%OD9T=FxY#QN7!llWG>YHk||%^Ro=n5#~S<s2+lPrl+UnU#c4h#>)^CakR2Bg(`#ETViULWD))S zKsG2lNTJ_zs|8V!uPAYjQK|-ek2&qHd@x4TyZ3n%&!Od=iGFeozD*x=ORj{9-QLOG z+J|?Ed+*`Nnrgx!`$(?%q>DQsuGeJmXIuxXz0W6)dy5ezl~I)7N1n?)#gA{d2}eU8DT{!No%=DOq`k*LNp-aQ|TR zo1}oOdXmZYR-cb`B^L zqsj5$oBO^ilMDUzY;8k9s)a9vD`wABMn}JTyi$(DG&@)5id$Y8oHkB%_&;RMygrtp0W;_CGN(<#E#ehc)r&_{o;`PXpZR6y2`>8jAE)nz zCoDXot@Z%ttiQi@ss>IJ&$+#jVu#axliF_d&3#-lo)jIv69Nu+QO9*s-RL4k{?UjR(;%L+*rb=hv<-e@SID?jIaX&J9Uhyvuc@g`mtY z9QcBfB%e8oYIfJIT@?`Gz9)~Gj&3)2f1_G6!Titim;8!lZLhHY6%} z58@FefE&8=+F}hSL2Xr48AOXF*$+4R#CX9%@f|!?zZy+P<1n-NQ8T|ZzCNUKL2_Q~ z#9bqiCjKA3$}v{;TvvRZe9K3?p1FF#Who^WcP|7pQn!#^rI^uXGPsUnO52aG=`Cm@ zNz9(3Ofp@3OIX-$%J1;LoC|d<7L!B8?3CoZw+JeW0$g!l*j>2&MJ^RzuY^6KK5kj& zSLbFZKlWfz!mYV@Xu+It z5XSAo=bBxIKbB`k4JopTzb)2x6Mk-$q#Kz(6&FKy=;_@OXF|aV5iBGTP9T=3yysEo z5!Ry){j4Iwp9;_ITEo7*uoUj>@1IF==SQH-YiwuC-q);Q!*?JY1VzAUS|5?+e-z5i z_{Sj0lAPqw;jC_nR_Ky^iyaw+CHZD$@xG|$GI$~zL}N{20qI{}c~X*+i6*td)BV+i z2h{XgUhrxNIhxFM=324y&2*geD2I-WELWFVrp3QOZ9eZq9L>ITdM%r^0K$bX8ytAd zIXn4L3}hYeC&rddP#K42|1oFAIHkLy0?(j6ygV)K$@AVO)$25*5S@a@u~30@Pvy`| zA%w|rIM-r(BZ1ZgwQ-v+sgCruDp?GsX%XwxOklhqb@lTCv;FeSGv7RJyJD69SH#bGQ1m+ z-w_X|#qM`HVNI3$D3wQXoq{vHPOf$CxTO9)<`$+YBgeMsi=^XmZO?k~k^I<~Tnq{a zxFpWCYuA!2p|Z+u8h$+RDY6Wv%4*8&QH>K$(v>z_hP=P5^RFoHehMqt;Szinf<%&) zZmW(cnwxW68EwUnm+;_*AB2%Hw`J4DI@;UcfC>kM7u0pkpga+y8Q(+o&!sP+j)M{S zFvG^dzz8Tx`qhba|9# zL@I6q>)25yrt58FRI*9?S+Pa-qaxSoGrz1K>=Ql3;D@$j4P}xc80jpCH~mU@deReV zQZcK12P|CItIh@ybc0>5-sPIYY@@*oE(O|{e3!9Xrq&8ce&-q=g(j~EO^M%1etn1I zlw|$VtvJ*6I0d++bDfY4Eh1v&h>ol({#Q03CiOP3%b`~xOU94`4r)^JvV931Msa=et?0g@D z0`JJDa_E=ddu(jhu0$Wn;d}=E^U)5Dok(;%6V5Tjqd0A)j^p!X`UWKTmJK}^=z|K8 zHdntfH0P=um%lBz=W?+4W@cY>peNnb$!DQTM=zZvFM_%^#5b{_KFl7ZtQB;N(9k>S za9{?C_ZUKT8p~H{7w%~7j#P( zPu3LNBb0W7FAwNA&ko`P?bweHlEKdb*f=;RzOAoeO__;9qtzV{C-*gZT#fwXXXwa& zw$M>Uo1UBp3RZ;-uD=XpC4^ET>e_B@1ZxXjmqXc9DyGJvL`IJ7eGdOP&rhLbkl0&Z zSBLNF=C+jFFR_Q@dG=u9;ISK3J>^m3w7I}!&@E($c$};ft~(-cV=f#Ro2w`vdn9LS zYA$PKTBO`GN_k(RO8BT`Ovs>vlMmhdoM{DN+euNc5@lyqJoYbv4d-6yYcL-?MvY`e ztNLb0N?hu`MgUDdNLzeluS=af0may|>;|wLA!ky_G%e+}@8HLGw@!iOq_)Yw{&P5= z+l=f>-DDB59ICk+Pj9O*3*PU<1tzFjt7yUWJAwehecb5-VHr2;Ho}dmof1Cl=~;ly zz+*#a+DXllk~wwULisAV6Mgo#K`jQj?htT%kRuGK<+aK0{()@Yzv0EfBIV`7k;yrM zO^#-iTE3zVA*9qFibW2`ijWI(?IZFPYVfizq^h_T^wbb+xV)hEjl6k+)tYXwi-5`o z_X~&eX3QvBgH(NaXd&73#>L@Rw?ptlg~h}O^-m<-g3f+r5c=SKOk5-1#t5mhl3%~<(OC{<3*J{KAM40CbM$2tS8RSX(*QIv@uuL^_H>?cads9) z$d3A1DFGHa*|gn(3SC`Yl@P*qz+u#D&qq)Xd?B~5qCS!nYf4R}4}>aSvqn0{i&Y*g z`8)Pgb&rx|6(eIB_hLG@C1w|s}OD0TYxJo*LX8V?j%2U*WcuL?bS z%wUJ3_v}4yhe)-(N*5JNa=b2G~FSLc~#t)Uo z3OuK-w&IXK{#3a*C1I%0yImQ)jO0s?>z8i^DD0+=Ht)%JsD2a@*@9o8 zz9O9Zm=qHd_5watpQP}ptbzHi5$OxC8hj`&fVVVdB3_}Z`lTv5%c19BlIZ&0y6AFM z`B+h7AZ)2;ZXwmvexgPfJEQxQ`O5t^53l7$5ktbd86*N|#N+ZlU8#c`sMfR*y{0c~ zzt?9y_ayS`45WG!Gmti$1Pz8w(y=X;F{147I827aHwLiY`M8B{CZnf7C5+Kfj_XdnD2Z)$Cu-`nhIOV*yoEthdHARFJzJMU@ z8nKI=&y-pEfI`?ni`g=@>}ly+Ofowro?E=#)m`Go`R=4;GLjz#aR(qQ<5pEwWnJno z_GMy=K8Hjvbc8cAM!o1?aTJn@A1 z_!z`Qw9fWbd^fG&;aej_9*yLX=AFZ=rdE-Wp9-CoI5Vth;f>dz{`uXzu;?Btc%2-EIQ5`y&1hL=~z~?*8C<@ki21- zZSXVM9fm9wCQ=Qk@#*}@p{>@duKwQ04~ubu}`6vgNK*rH@YaL^u0XiaJrW_9|Z z7gfaENso^%HfM#VL=HYXDq$%0?4rg_2va*eSQiur@~%3y57GJJV#N9Asxdqq!m#Y0 z_ipxh5*Z~0;}5-d0~6)7!M#?_e_O8y+-m|N8|KirA1>Qva2SD*X0Zo}HfJ0T)^OYx zW3Rq2pVSR8XNLPxAd+2al-ndiTkeG4&cGmn@PssVp$SvLm$l>9&^@2zf!mArKqh+a&yYNE|ImwsbpuNO+*K;*_tAIq` z7tqo01el?BRO16HOH56eApuWe6RF}Tc7>5tDw`yrlEJ5izzVa}LB0mA;xjAq2 zGg9#wnEG}qemnnAA$-?E)w=}HKea`>fn`|Tl>-89k;*e)rww@CXi;|oK7{0|uXoiO}?e5&JV6UcZTk8x4iE7D8 z)d9o0FXf1ieWUhU-+xk8rS$KJg38=UaXZsqnLZ(aDVB{gK0RKp&jMw=1ILk0UYf*9Wo#{GA z)Qfh;k2;z>1w^K!)vMi=T$zLiecS$93e91SWIVEGFJlDKZ3w)%LT^~gE6S$1Ww%3J z!3RcAlbzT49WR?BvlCtZ$TeV5NME8XsBxhU(I&mULXo zRBnXTz<7M^{XH4NcDB5r{)2WXg4?}4LPu(@>G_wxeS6C6`JkWI2*2?|lwJG@A6Ke7 zsfDIdP@;r|3Gy}Bt8jN`2T&7vbN1xH+Kxu8ls|8HMHzv_t?x*^?o=-`hgwiI_e!ii% zuy0wI6zn9pGmV9#tGf_`&5_3>l;|fP{$!x0EeEXf5Nzd55Juyybf+&0hb#8q}9i5^0 z*5?!=O^hNIUZ|MCyo0$bzYW2sh#-{@2qBO~SgX8wB+lx!h-zHLb_&zeu^ z+sSAXa2n@WKT?UM1efwo2uQM-AJsw%++*Y7K4nH~&#FRYSj^3vgkP7JuZteI4%B1E z{$(!+-NV|yyo=l+-*qXcq>VIk5z5{JPi3n=efySXVC#H!#8r6J3v#z&T9Re;oIfHF zNXK2ic!EKp403||Kt!8fp0{#_+Ox^ZcSxs8s%7Rm&T3>E%h)(Mb(lAWl0io~4Cr<{ zTsj0+#>Qa!mJPqjh9$)6IUi07mP%U9^>FO*YQj6;2RDQGo zl!lqUd<1O2fqQ1_Vug6dcnF^8TvN~S^p7(OjWfHGdyaWjf`k!OfUn7Qj!uwk2}gJF z4vNE|!WXfgJp5RjH2m#-A=%gbG#A@mb_G3iT}M(!`S(e^yIM<+sUN!M$w*XAF_W3^ z$#lrW$!0OLe|8-&K#Wm*=0FObIEi{9>bf@iWJP%HXVs$-d1%x#mD#3!4Hp$-?!=l# zi5=}(S=wzs+-={qba(1bL$k=@`eba#-rC~Po(im$DUz62p*Ws`#ZUFsBdbEk2`!{Qugv+KqrIrT1;D17Y}G4tst9VS$`2R$|W&$F*5OxF<=u@-%c z@Zh1Y6`?vyS#otIGAT1t!eZ#^$~X=8*Z!68jyB!*S6r;V_H~Gp2YU>gN%G%(bwgjN zBKz`+rXRj`$(QU?6^>oj!baT#Y70JdJVi&&+SF+!JzD&nOsID;+amw#H#ZjY6@!oV z9rTsAC1!%BJ;WD34!*M*US(|%9r`jI`Lu_=`^txL)0OGSukrc4a;LpB-4Tiw#TxV1a!vvo^>p5RdH_nbuT)?@& zuzGzuolt_R`&#>wQFn!0*xuvwUq)@#WlHNMjPC{Bh%Y^D-eoz*%iGK#*mK3j+4>XN z(yY_!+B(a7dAsReMdf3*-NUL3%AR)9)30SZh$IHR`%1Zm#p1q{@USXqX=k3H6T=@V7Q2U7R7!mdj3YvXha-4~~`S5%Fjsyy;ux>-;u zHFw*qYjULF8c}3OlWo|12bG6W)_7y3P)NagqYyoPe{}p>$OZAB?7 zo2ATeq2u2wu1es06pVFG&z9SEo7WF!*(h)y*7-m$xKDZ7Zhcryt$xqB)ZxXdX?I=r z%~Ll&i+NW1Hrk%!+qJ68qt!wCD1;7aG7;ME;Q4HtwwVY;P-eK0kY8CZP5EXR;)rWv1lRvG~MWFA=LXH+-@q%aq@PV6S>O%3@Mj zCn)%V$Q@yo>rs|fPgGFYY3$RNaVMzOS9^L0&V8Gt==;F1ZY(Vs_K9^Gj(*4Smbe#YucyD84ly;yhI2e&Ya#ka%i%Y&)!m)pMw1}r1jUHE8!d-@}fhYc^L;fZ&^dN#Csd%$ z(nl^Q@2}J)RoI8Tqg>q8$VZ>MAzR&mND#AOW0Gx+t{Olj>j0MhURsUppdUB+AMo7x z2|5ou<|#$6`R4DjX;jeH!)0l0*I3bs2H5>~>Gkw(o}1o3goD_bzODN`uNZggxzP`NlM#9@}E9188Jo_xa z^zJnCk*Hg!VcH0!gmgf($RrYS+;YR)qGW1Ul8Lf=+i zNzpy!e}&u+_tl^f@2*Tyi7M)vg4K}^AwF+a#V=&|263FLTdcCLb=I{iSgi3&y!Zoi z5M+_W@RzPcWQk~zz=vpm>;{ntJPm;@;BNDfc9=J{e!?n#6U2$ZI8Zi(B;fAh4E!DaaaqSlRu-uVl z`u=|3tq%cN*3;Rp)dNQLg9=8kUJLC(7{EKXnuWg58w-TE;vSi;_#d@qvgF0X_xaV%IZ9uIpRCT6dmni2dVa+Hii}QI2ZQ5>CtMBh zEMl9p-{$op9L>P4tmM9y(8Gxdy~`ve*BWsvJ0u(|^Vf&ODj2@C?2B@gh+^n@6z|S9 z{>)A9ox|`%#U=VK-(ts)2kDMjl@broPmzXWT<6D~e96wOweSw-6;`?t@iZ)ol!Q1= zy*rRl^~rl>B0g?$WG*B5Z8Na(dw2sRtVe)88O zDMpxL$F74_a=Evoj}0W2V;`J38S-lX(Rh{qlb=ge5(EW`7E+|zR*Q$}ipjIU@QKPJ@VM_t~2;Yf3TzS<%w!<{ul} z+Nme{DmDx6!H{&_%~`S6Swn}UpFVlQZGbFXD={_oV8ZT$Y>|E;{0W@*wV{+0PKyD5 z*aO(QvBl-fJgMRJTU2xFL6JFh==llzy$`ar2{A5|yi=jC-v|tczP2Ty*h1ewA28W? z$}~zw=eO2^7pTQ(fNd~t+Q&~79+Ip737f5;=jD5Ms-S2I&ol#w#Kgp&GX?o>l_xtD zk?#g5`64X`k;$8pok$Mjb zatt{-%QuJ%IdTjbYl38jV<)mz_d+T8qHAGiL0{_AYLv*9pT<3$g zX8GeGu>^;OH}w~)4eLPYO3eX`!bv6^7$x)!M)!p|%k5Vb0?PKrSKcUYEai7FbHu_1 zbKayy!}xcId51&&jfk;-e`OPmHiRRLExx?r5pF@;E!+;2L8|G<++18(@PU>x_db2! z@Hl>Jg$%PrsYz#7*HhfXO#dV`J228fN+pfFVPc1aKxKq7DdC<7op zqd7s1O!3ka-7Ycw*0nbIv(&B>?>{cFxibi41IbIrQ~C~I!NiRBQD?rzsm;-cKP1}s ziRxczi7n8QBbP*RH*XYPpbWxA&1awzTj-E!<~@q<{E~u7-oB&D(ygYpaH3`^+E@v| zZ|v|+?T?+QyCaK1^cP`s4D9w3Dd;TRXXdvi*o5;h7{HNPmOQJS>G%_#O$1e9%GG26 z_Akz!2+Nmvjc|}ECeqW^7Fl2Uk@ytfLFs?4;wMRmtELSk?))b$ zk%Ns zajY#Zatl?<^ia!L{BfE3KqS|Rwev5DSuD5OM~g(`=t zeaE2`iSst%4uVno1z%H65n)2^~@e2JW-GvFh}6Od$*vjJjKLC2qJlNgy2u`nW_PZ7iyqG zC!j+l5MK?2G~cZi{rQ0Ygw3Y)^ak%Zrqs-eQp9zxFg%KMltz2`s~2SQkq{HY#bBYgf7UC z{daR(4(sddTLc{3Fk9^-lRtVwFd`-GLz0uD<3mfyiVRI<0up(U>F=_8KPKk5Uk2U7 zD(xB0TdTHVYY;}P*ynthe>9nL9hrpp5>~>efrs{t7!sh}vZ3z~>@FacpZlf)Ow#hD zgU=7BsoSH#LzwX*8fQa@%jN97_Q~Tf5_ywRSSYsh z4Z#LJ)w8PmOKVw_D2a-S*0;&blcwllk@Y!zz82Xcz$6MxrW+53QfeMmGs-;x6od75mlh(>r&vO2e;OG3eD2+oyS=)bje9 zsKxJDmb`1^KKB+GG~K$>ftDkxXWY%XUYfFRoHFl~H}cs{OZ;^*Y@IKR`Kp%Pnv^x) z&jfMsUO{P_nVB&=o=ZTkpL!xG`|c$=ZeeUk7?p7j75Vka%VXDf;78~H2Kt}Sk^?aA zhRgr5*$@xm!W&>R)Wm#^Jy(>fcTA17@&2P1-+ji#@WVUwhK&b;9v*@9y^IG; z9S`#N+nQgNplXiJH>^42gVi7RJJA*dGmE(F_EX>YhH%_|{FNE6e&9Gf>Uq0U;ssJwwjggh1s2Pe)`E3~%p5I#7&3l+Jnq5!X5_n!W)8^Pw$f^f{H z_GhJK5UK@W{%4-w}QU#zNZFum^x33Su>QHHS+T;$NIOVCvB<+c#~HvcLk=2PJx5) zClK8-+5A4)#`e+Y0sN_fPqnvz5znkXA$I;aJKcs6A+ZW!mY zT(`*2#)AN2jl1BZmwftOx*8FTgdB&@=!JRUd10Yx69CLjj+#n2ZvDP>2i2IjP@3S%iCCad3#taIz>p3R1FC`@?`g z$4cXY-7lLkq5y{@PQeL?IJBv31MSV368RD9L(R#bHiZFVKc{-dYjRZ}Gul4uB}Oho z%0u*OoLYFwA@>^SGomcq8jT0c`?>jXAfSi0)j~TFK}~OfRTq99s8tqMsZ$;CCp+K7 z71-ZZV3mh1Kau%y_jX{6P!`*$}syS%p5;{T;^4fHt39;gLW_8II?${%!YmaxSd`s0Yc-v z&_fqQWa&fMHXcyPIb^@LvMpoF-1KuPTQEt9gEd7yZ71DY69>Yu=*~AS#{yIe*LP(i z=MSVBqzDM&%QTPUJE;XE{f*syif9P0F)wWI+D{g(^Cy;!o(9ZV3w|6A*OswSq#>H` zK8Kfx?>*^lB#@sgt3tf1S1jyk#c7EIpG#4wjN$SfhD}B zr@ggFZ)g-5C+JCrU&m6pxVX^N%bFq7X$&qDJE(J7YD>q6$$9vN9?pUeat}m5#7P}u z^WL0%yLCYyQdD>tZyIvvHoi|JN6kn-b$*_~uT*4yTzup3)x}UIFPQs}FMc@1>#qPj zb#w{?wYZ6=3atKIia8yeL(tK77e!CB2|={Id4p|-)!$))u?F=sY+{ClesckRaEVFy zD&&n@Y%UYgv!N4fkPB=fF%05%rMZG~K|w)9oQS=KRYRP}QHL`)f8xcc9OK00li9U! zL}nl6z2JxtwTpTnIbot!>)aih=KO@ zcFkIj4Ry1P!Y`qN?}S1&Ym|QvF5fMM)wqxz5+HJfFU~%Jem(1zd&LfWoXsgG*c@{c z$e!p*pmpZaN$n?5*ffZ&wv(vj$-mGQQ&l*ohCTieu<_$sf#^D`pa8JYFsdSaUu(y= zg*y#+RnlyHMxb(n$_9oE@%GAXsCWu99FqfobO9hYh7?xAfpzcD*67KODIDnKez|}+LR#98f_~Rk* zAtF|!_K_amL<(DMNGPR*E~9P2^xtJYj?^+EUwZA9Wz8)^TTBVPT0z0WjR%Gs)R6?1z2Ma(DDH6~H!tOq*L-z4G9xB2?XmqhZ%Dfp< zw;lwJ#C1gO{zg4^U~5NzJfN3A06kcmO}Paa#lysEhoFd(BVsR-Z~juYjv+5JBgC+k>vgjL3L{c5$pKqP~9}oWbHUy%--u5vo&Z$3$1z)FL%1<_bs9wa5_6XCAn{>Um`}LV$eP~{lm#%;p|5?CZw_HgZT^O z{&7O!>S2-2JXBh z{NtSzIn2VsLT~@73*8wvCNv^e&GEUb>ViRun>Y3UlNnB9oH6ctdU`KE*(HHiUuux) z*2V(}N{;vfb^Ss>L|e7bo?RegoX!9$(T)G_E8ZmMe>p8cQkt`gP)wvsPWgiICVL9h zN;D#i-hCcJ%NacjrvEhm3$QVk8wTysx$9d9T}_+Y+9-ya5*V~I z4fKbL+lqBbrbW(hGPA1wy58@*1KTLHEdZ};d7VzsYI}zh3Y!4Gs;TyW1%@vG2F1&1 zvOk92Ej?s$DjvZt);uOC14D6^EQmYWk&L zmPAIa=(oSgESESX5AdjMKh}iAX~xFq1$;gBT1DVC-aL=Z2QbY0s2Y;`GOve<@P7_3 z?jzY!(YIbj7vp`UPcx9!koe10L*fpkc_8kfmYetL?BHPHYr(Dt6(+JhoRQ?Aez{?t zo!gQ&jE|b32950BXwG(|7C;gm?ddf_HfMju0-HO(_j;E3n|rS3ap`Q(esvDpNejrD z6Qj}g*(kVOe*)lNKS7(|@e5^&RTn|`5kAq!f6+;JjW7yiPfp`F#Ph-FY}se^fnxAq9eJD z&BiSM*O^SfM{r3s`19D9Qu~JQbL*&oK42sf3f__(^7EtZr~D@k+QZV^(h~M1ue4O+ z%<~Ny+#3gM2a>Me?Ih?_#HOL775R&GRuj=|19+{rG}}$={0YSEKY34OZfU7_osODX z{`*G2h#Q@S*iFHb7xcm6yI8@2K?CWH7O>Jrh%LV5DV(jHU}g#UZ$Ed*{qLCZ_$Ov) zS5P9pfHWqXw<8t7zi6(9*7|WgvwyPx{;MS{eu5F++aXymy>t>-%hXz>y%I+92D2v zcVnRhct8x)pL1*8fL97VR*zWjQEes&n%Y1L{v3ES=-BcysBT*j{og!*?U6KkcV!j? zyq3s z_Lv#TU^S-3)Y#wsDw}7u%{c$~3NuQ`FCf5r;>+S9``Ayj`tNU{55Tz*e0~S+oqyfJ zKc~a&A~m|qDu6{f?sLK_%5qrx#5tV6#J_zO*Ej0B8LjV9lQWfPQ5=Ox$)kKhU5VjpE|sQn<{@tH6=5{W8!b zaJd3@y#F^3%ufh!q8CsdSrYS022KGlfPNhrT?RkWpKAwMIAg`(YQID3f7Z6JEp?Dc zOMiDmL&hIG@Heo1#{&Y;Q#Isk#kW7|ze9#U6m36OaH?Ttd6_0Y9tQgD*MX_WgT?PN`2FWoFm?!D?A3Dk&*0sK6B82?mI6o}=75-< zw_8{uBAR$#8Q+o)wtHzCFr#!yt9NS=|ep18vY_xyjq&qMtf$HwVskwlPB-JU* z<2h_l#M1L&ub4Fhn~JW`=ToWF&$gL-o6EL&wHOI@mmWv}TNc^&%L>&_6uEff6ByZw z%b*uQ<#imw%C~9~cRi}+^Ivb{yZM)?Ao>e(eH5MoX{sxr_zOQ(mj}u(DY`(yaUXqo z>Xgy?s<#oOm@9DF9=~*R1fqFcg8#-Bs6&28A_J)vKLTVo z(Q9*o&7O#2(wjJD2Z4@*uc6_Jl$zR9G;IjJTKf}y+Poh3LS9!%^9Bl$&0qX&lfR!k zngr7~oUUl7f&J<)3YI)}Ot=8Bst6fIHU{YJ)t4W3dp8a_SwfYlvHmYg|NjQmpO9F{ zvpJ)is`YQ|4-&$FsrC${J84lm58W}VSY0BlJld2IZ^M!uY&Pa{p~4~cziqC}2QK^j z(145EuT5PUu8Ohb0vYuqG=#nBWEq~+fs$InR@7H@GC14!jphBezJDIc9{}daMV~r# zO5;;m89L|EpTTqA*G`UrAT-zwyXGKNz)6Fv5{6urMjBa(!!Tv=#ckqjem}C`*Abzy zr3gOA(EUrAjCw6<%w7MMv>sy^2qG;OXiQ~FCWPx>B{+!n~X#&DJf}aiCh}G zt@*cIjsimI&&!(OX`VEMKVI9qoawIvYMO@wKD}ZfgpMotU6%?~z^Ij`Q%JK7e^I}P zxj`iEERFa4qhpufMZv!=(S(fJUDfiKMEn1EV`csiXWt!9b^rcfN@S!WDzkxPHjM0Y zBM}nWBO}U6_B@>mWtN>?8I^JD?HpMr$q1PtdmJ2lo#Xhv-nzTfr{nYa-M@c&c%068 zzhCnj&+BUauN{f&mia+cdt^!p_)4rOqYZ+F_EnJb6uCSdrtIu*x>z~+A(@qaAQk4Y7?{wQ{V zy5WQSA!opmdloGwTE(APY^Jx-W1Ks2d-(%DIYMmIY~ZUe%0>>}i`TZGZJe6Xk)nkiBH&EZ}L!kMpHJlI=e=L;sv0dbruWbeyaVktCNvFh}fmZSCOaUH9_SAmbwgb z|H#qGGVl6*w8IWQmNv05VWo?o7%OdUR&N$9#+ZA{7?#0uJYRDY4se_uciFx#yZ{GD zuF2PAAOUSn9UB-=DK}9d_<5ubzxQJr%JijO=QVQPC)xdoZEJ*~h5dukUgMBDl@pzdQ&4;t#(E3VEp!6M5F zt|W$$Y|c%zRvMH}hpDeM_#>!joOl%sG)-#yFAKKiZ-cI+>7G|q;~q*=z(G%OA8$$q zZ_b1%g&U%}vc{j!Eq9XrJB|f#hZ`C&%I6}1QV#Qk?1bkU@arjsKK00rIsubZ>(GNz z>or(kQvcG>j$7nm*Ag8kSGB`!C#knT~y$jh3uN{!2w4uoX6&I{r@(Xct`PaOXY$>tvx(vCKL;@#PNhp#nIh zk$Qpye8Ull&zx6W*I%w9B~KBgDqbfSLlp%$tb}w(mrRSBSW2JhJNNNTOoG}4*V@yH z)jpvfuf{_a1ENqCUEi-q;NExfT5p4mpM&V%v7qY~d*Aal_u$mE%3KuQ`cBP38gyZd zp9*MEPYdff9YhAI>R~RT~3P6R_qxd;IK3_lB-6@Qjo4nE)#5B*egUO zwZH5+I#fmS7$g~?z9OLh7R8b4`L=J7fE@-!Th-A4sj6JmwXH~#vYCIO3w_-l%;0T3Y>JHE7<{a&aDr5?eU zF209xrKj|ic$v{%$q*ciP89rUJoW7|7}=c8`~GjUW3zAS5tQK0?DuDNy_n8YCd9=z zx5?n#hvc0qsdpNfl`){}TN-^+Rm*rCujgZaYT0m`@VciBEMXlMiR?&??{nw`@?h~C zt6B7`^*Sb2n7CG+g9QR`ptPi3R&(+fKr2bSWT`& zwtXfCDt3cd$xQK>4<&z@0Qe%y2_)ICyn=0}JYe~O7=@c?u#?B}Ajpb@>oBZ#y7wRD zD|J%_mb}0*g3*;ALj!xorwSr|yuleBCq3|rQXg5xbhhMq{;3sS9kX>XbwyBFzyNuK8AAJ};jl~TMhgN~QLwHk(O#HYXrV><` z()H@;E5(MLh1WqB46b5$(95}AAM;gk(RgG?0xIf}0INRD1L{F%0 zYqK?Z50vM^prLng?DG2TatG?HQgmC+2NSDpoXf;>P)x}tfH27pS0@RUC^*TZ5Bi(4 z^BF)^`ML)Og*B`2)aL{qt#~Fp|9WY_VX@!)TLcJq4H&$r)VQckOCw!R> zJM}ttWPOoi9AVTiu+m;#MN6?5tdw+ki_H|7v`M#TdM+Q3dqaP8C`heCxNPmgF)G_C zQTUg=EHIDW-WfS=lYescei=x+Noq)aI0c?DqyiQa7>zV9Ne-$wb!0P1zMe|f>^pdec>%c;5(x|;?{eq< zOJyVZzP`>0i<7hOBbkp1y%Z9>wEP}pQ;)+Bs5o=>$mw$Vj#yZ0xVtMZl+-V_FE43` z#V&QT*7tvC+DA($Tk|y3;diZLx!^?3iCj+}`0N~aP||CiaRElw)bHHuj(stMuJo1M z?7d%`ip)1C-Jb3W;*O!m5%q3LMh@_(Zzf$iGgm`l@#t(BrS4#Q!UVZtF z9Aa6U@DuQU!gAq2Xae4Je0sXUw%fViv#PXjDf52kZC~#|;XaqQT7+WT*}sx82$ZCr z!x!0sc=wt8pw8yNaHz@w=*Lx4UAZ0Hx{CZqx6@aDKPhjZyzG)d3Fr>0#*p}y53k*B zoNnUiflOmcr;{^MYkS6?2wKLMfB6e^reZ*84w3(2vfQuw>pf++ooIb=VIlY7lS6CQCWtN=da%wSp^x_#0 z3N?~B+n3v@VngU@X<q;}J%Ytg93K-SZkd(DX5KJ!c;ZA6mT zwCUDR5fg?15w-vTe^dU76imEWR(9T=@@?01BV0^@_$quJr?r}-MprzpJ=)fc>lO;JH-{DKm z&i{-IHBrNlG2f4Jexp-Vj2su>0= zBXkzSy3s$|{pLU~DEOr{UNJU(%xmp&Q|5{RJ{YTih@P*`EV*ZJ+kyj*5^#u*>e+YE zJ$-4%z@rtVXY{<`Og*he*(s|joT}6J`MlS^F#!MG;U%uD2P2>E*B&#cA|MMm`ak40 zNs7g~O}<+@&3@MnUn`6}=dqld(7-S~F|j{2!OKleGkPdj)#oz3+-0h5D(lyQITI(X zR4tJQF4XCPEzCi*;)`i`wn&wC5uJ2ZqjN)6Xq_Efd& z+C-GGU_J@&!<86+4PC3^P>H9@EM1J9^^-AF&x@|w7y7{i%gw6vX=C97=>WfTe`Fbp z4p-rbs+hJba(%t0vV5gUrScNtqfE$BdV12DSkVfBRH2A7Vb(9JKB(t30us{>gYK_Q zw7TkH66Se>1>4L7)iKCjUE75*u!Doexg!8aKbrk~A4$XG+%kUc%kQ-qmekpSa<18Dd(jx$`JPZ!$)=DYsgZO8dv?&@r*%#^exFl zjrecQq2!QkDO;aq;6&u+gp6Vn-Pb;y{+3bDc~P6c;PB?=+%Rp>RX@iAilZS`dE4+P zX&G`5!!JHjk`@X|);x8-s1LxMNmh?`sS>0?4Qu&p*^Ak~PTsHkpsEMK668{Abt?0u zLv*6s8L+968Ip^MRYYS)Rxpr?6URr+yd&F$vrGbkA4&b#X2QG_+jl8g1@&e#Cv@Ks2U#}7A1vm z+Qh4zMPG5u&@UC*@(GZ*8A`y9^7c#VX6P5&1VteiXi$NvCvX0lahrH~FBCzIukEM) zVH75^?DgR^0cQ8JL;58%G|o>z;j-o0q8M9IUdXtY592Br2>X!4iJSiVg1^AX&Utk$ z>&Yn@G!lrZD~k2Gk@huzv3B%(j5TLIYC@IU*=Vh;=61MS6|Zp&Xz+_=8LeFrL&Pma zHsjh#7{4Po!-go2ux9f&2E!I5Y(Jt84t18B_%3}?|MZ|-E^TqpHjc)-1G#YFgfPz> z+P&Y+D(d39U?>X6hK)q78j#W@>v0^hCj zn0f4>cpwSy4|p^9^w^>#66nl8z^U#w8LP*Ak)^hqRUn-(#2Pdfqlwgepy2h*_;C2E zdC(q*2Al<$2qrzZa;6j;AI6GQYbfwVAA&Ius#ponv1ong-Xq5IVXw^QhwE;G*BwAJ z*(-^Rgx!=|VwzN(!r=N=koW-UdaV9V+i_cYO&DAoZuggYuqW$@iBHzGdPaS@5RXh@LB4}YE zHGu`>v-!1e6}k8iyaVobNPW+nBI_fV zQML|l@u?cfy_}z<2I51Br9Ht^{!=(`Oq8y%2;vg6I&8$)5v`fkro406uaeaw81I#; z^{{waX{-*eNl`OwOmz#04}fWwo%Hz5jL1+wYGRWL4xg8M6Zyd8r8PI$T90nketFj8 zK@x-P@4BBYe8|5aFY~_fM-Jf+ZBXS)$0%g@Wn`AgoT8K54EB9mBps>_LH%M>VI>`man-D?jOj%Z>*9` z&Eh)zVz!3g>l~i2f--Cp_|cBsX}}QcRx(XE>7idR$}g zUyI=1L#nED*?I@npP%$odwejYckw#5u3$4hauX@WrJHN*Bsu0f`tkzSz0tL4tqglG z?&Sv3eJWd?zU4)waEj7Pwa(KBsriqm=EmOy*G3{2lhds!E)`GZ)JIEM#wQfseV1eu zleZ~>bydNS!3gHd-*ONm#Ztk&=Y0W?R!z#F_nb5<&q}e0i~J6#5uOcVg)V>$cmeG` zQ_PuJJR0rNU}k<3T(ZVhsR9DTBjg+rR|8O-XW>YwI*F5 zvnE~ZrAg*$AV26R>3N&8=2bN>fp|BJql0BpFL^ zjbbGFDX&kV>)Y-%|G^cQ+xh;4bz3FZMcbya-e3{a{<6NC;mEwHcb7I7*0}7ZuRG^m z((_zc2^73AR;zf^ytcmej;tsrCL*+d&Zmg*-hba>|A51yq|2szADv;@K!Fz0Sfii} zwmF_}H(F=w7wj=R-06jX>lisD_!B>d9L{#ygGM}sIJbd?NzIh6^tmi|nGYp} zD*Mre*sTuu7S=~Uy1|EB9pou9#bgu)1$$1J*v)<*lc$h+3Ao%zvq3R7C0vt}lY{g1 z{K0cWXn6`TZBX=^e%Wp!Ir7eQt9T1u4QK0#(d{x%Pr!W}8_cRYP+!~Ke0m+z$yL4H zzq!%B&>TCwHb4UtX<6Wiu?o4KpOV6{P&O1KHVD#N>H^d%(DVS8f0bN4SmS>ofsW#W z>Br{~yJM)+Bsj3wxnCmp>TU^0h9-TFp}Pj$50BF`;4V^o?UMl6$S(c3zQ|*#kIQEq z5&k!oFR{n;N1Zdtu@BEgVKPhk7%@_WAt~d<@h^W6Fv7nM<~(N|%Q^HVY<31bDgL3d}o&;hT88N1^E9dYty*X9Pi*6uRIo7|G&=uLC2J&~BB_+SG3s3In*0+apqM(o;HLc(G_FiF=B(B z)Afb0a2cJ>?}2S@EZmXtJrF2!;L>TzeQRy0lHuOZk`9K7VaqP`0cAfrt#j6pFdw-v z8v>BxOPOW!pLpn!&0rL=3c+;GLmsKJc&!dZ=wl>Ov1Dpl*Uy&Dlvv`2Ii;QrRCOR9 z_m0NcvZTg2>6DG|+CHQ49G95`DJ0bm!u?FPFkDaWP`dD2Y9gN6zHI4%Kx_+Z<_{ut zVkc>edef)MqdM)`J<2`#>bYY_xHaY7^1_5sSlaBmtXI7JrHgv~_+E9zcQ1WwtJeNwXl7R&qG795VUYbZ^)zYE`MEnDV<>K&r?oo28V$3GOofA`$y;G$UHExt{{HRDJ~ zl-&9|5AAzc5k2}>_e86?sT3XSu2!!1TuBv?cU$inmrfU06HFe?c<$0vrxeoO1|9#j zjp7b!fsRsrXGw2`8BZuaMg!m&9G8NCHD;`fyqC^}bx|D1ixMd7wDUD#ZA2T~~BW4_MHURG9C54N#%iiOiD8_Ys-k_&j{MNx*J4K9U1Mx4kDp zD9O?Ybe-u!(naLhfI+6dI3+I^4Wr;w7y%&KGe!RLysT%U+jY&4HGyB|XR9!6PB5kf z_^fo@esMzEut$T2uJs|^;BV()acBJ_%hvVP25P@HzRarbKUh=xxm9_AuY8rjMx!>Ir-{XHpPUxmn(3le#-E_sz=X0ri__>P=83 zCuYhwzZ79OChA5lU0wT#c(d+s1flNeM?muak%REt~H0%Zo$|M1iM!DXPTO z9$w*!Kwd1GNQpT=n3I!JG+Rk2R^!=tX{;KuWTM2JZJ?sLcAvOXt5aeMHr7VprN$oz zPKIZx3B$gqB-LPm3uN~$L#_tB(RusPw1gX}&7suc1Q92SNl^F_*lZ@Dp!RNaUVC>$ zdpwEK`?NHZrOB_>%a`V=X@@{mLO%^#!Y|bCvA{z$DvVmY4x|b#k9y!oL+8}<4&&Xh zYwgWdo9!#UX3k9Q(+lezGt9Oy6I{Q2W>0FTf%BrIma{~RhRxyBvW4-f7bJ=-8$Ani zz9{h{!5h=wF7p!%CTo5gu91L z9=pJSh*V4Fr;Z0Pq=4lNTTjcR`_CG~fOW8Ch`dkB^aE|a(8G11CLk(dn~OOl&-7&! z8NtkT=1sCgGGO+43i*C{BVXuXh$-eaNe1i)t4E_?Uw3$^(287w~kqTGR|&2E5bVzS*H2*F6$IU}_F>h(Y#m*Lfv^ zxYJZ;Cs1}Kzz5cTdz~Uz;l$bL@Z2Vw&6#`COZh|+2&J@wH+q?E%Dpzsiu?Yu(o#&k zfPI`Vn!aHC@wuPKe6we+e0O+e17`w36aPIG6`atALu+L}aBLrXXKomjE43V6w1U%= z9|+`VKi0UNWCOI{8k<2(a(Gb%;Hwyqe%7v3bek2uDs@sNrS29n3+)pL=&bfRGNJO^ zwd}?44wGB;RrY!2YrUF?(P%iY|zhBt49b_lEA-9O&hjEu0Z@-6IhwXS@!pEst* zgO94t0?U`Y;W{P6xw+|_gu#ITpg#&f!p|(&u#5#he%!r|2OFm&D-X^CiwCs9l@*dR zuToVTGA$np!u0bZ%+AZRdOF;?euBe1)=mzBmn@kJljDeD?TGn4N7|c)&gJA%G zZbhLR;sX4R9Q12heabu*!Fxk9jiAnVo`>I1Z9d`Z#r{rZGu(7x(Nb{3E( zrRUYAH$+Y>dpOx%TF*b{7SkT1F)S9%T{PmkxZ9 zz3%hNTocguOSaU<_@xWQQw1ptR$-ed9R*y?dDz0XSnW^5F6$i0DY<~ByoKM+NAPGL zPCjnbqPY(=~o!RNr0o|2Puo}$W>qQ}Zgf;6-+EO5U77uDCh#}Ff~AZ<4g;W5IUz0&87&M53V z4l2548+~}RI&BM!kx(n8qp}D7C>p}YfaPSNsM$nBVuNjY{raR~?yk_-D_c&OpX&FP zG@Br8dj``BDg&&V`pa1BOyfvqU6el_BV}Nft1mBh3-QiBJnfcwL%~slW8RyYHgB;L zSV=w_fnp3&3N4r*$_d)p9tY6EQ+F(k2OHA8q~3Mcx1Djn_}U_>L~trMG_^LvnZSoB zZJH6QB~$iPlvIXkkJ74YD<*P7lFn(MX0|~n@MfQ@1B=o8XUdzU&ALD9Z$j#JU#Rq& zkxoE9=qyFi`u5#RzOp15{>Px9srhJ~0WmRlkA(O3eu*PSAtXYOTQPNmM~WOv`It_+ zMNKVAPO~2LW6tHPkKo1J>$u!c0KP>Kuu0E(;fGkq2H1h!s~c-qdu(omA9e|Hlvi>6 zoAKT;dLDB%o`W}zzE*RY5woAAQ){_#2{)BH^vajT5At%LM1PU*5BEf4)rBu&gkS{x zDtN*%^Ek&_%fO?Sldt+w{^<8@F;b-n3lAT`oTXxG6#k*2;U^Ckjn*bqGow7tBusdl z#~m%jmgy7RdO!8_yI6SHcR*I8m&3{iMrfi9lPifI=^SWYF$-3KO_VY(yY^)JR)0Jc zV?IsKqjMaE8w%Clm>Cra)ky0wUGiLsI*91996NxXw0dk}h=TPkHU&$ClD!>f6uVJ8 z!nsn@AcfahUcI$oe|v(zzVgyr)Y<0nl@FRoNBJqwsjjY}%6bI${6K+8VI!`MPb;iL zC z(uyu>cm6pHYPs8TDAvC58IX2Tej{W9p0`ysG{SS81XW*yP7y6@3TF7# zxiyiqhYI`LEIl?bhQX#`kEGP36)2j4AMCybw?KXYcn)H;w3HfiGc(%+J&KM26_pII zO3As?t*nMqrC4NFH1N+0RsozA?Ohb>wLX!(Hi{sKEY6`>oBI6IZe>hLu#P>IS$?KsD1HuB{^}Fx&~p#~Yk_N- zDqaIHE`M|!S=c#4uu=s|VDe(u-LKd#AspRJ;4igW|y637)ke*E|#2tG8FAOWr) z?C0kkWVeG` zMEP2P=T7g^%2!q{t3rK@KK9Qhy3sFs@{S(u8KE z;Ds==%ly34+kNAo=--(m@XB4Gi);Bm!ft-D-yw}HpMd{TG|+B1e6tURjT>5yk)(~W zX|cP%IT9HgU#NJ3Inra)2al`us1Q0!NzWUYD>*;nf%R&*eGtv+s7fd)|1^QMp+2+L z@K~j~KOPuoBXwgrd@?@j)$S@HDdjW0-OeNOO`mbs<0Lte%W(-Kh@P}0EOirMJm2wo z7vg6vfEVpCpGK>=hc>XTt#113^$*IQg?;y#LDB?C;2%zTaO7w-2wx(sZ#v9GU!5M~ z*E`(5I@9|uI$VaPGdFp1Tgfl@VStjV8FPAM@jA~9vfsFQ;ne!1Z|ma*1ZPKR<7H8X ziCChWc=>xZtx5p!#m?zY0z%g@D1uj7KE;{faXy02bBW9Vf+tHQlntGyC?7*WkYPJF zqAa9C?4~P-8qMD!QF`F#GXBbUUV2i+Yd#c$P21zF+e+^B*9tJ(@KFg&Tr;}9e#$S> z(5tv=PV8P52tL$6WTmUGINkx7yE*>We}l;B+7~B%`=P?ko2`ku38WBvwc`8XC^ZRg zoAnR;Lr-Y*4%tc!-JEO7&FDYI3>&^Yx1cM@3VH-;r_xJ!eQviSyyP6VhOMAEhZ?Xr zQ}GMM8(6LccRL+?Pts<<;x{!(*MYmdUk@bEd~@#Tv@B%KadLEAvisz!IpW!e_jzm* z^Zw8pCjLDWKDu{^8C}lDI^!?=jh;c6tbj+qeL2wDyx}D)tHlBSwT%Qq#7gOGy0dk2 zA&O_=S-4g*XCGM%72|PMk&%YtZ;?n>cRl+dmH7^9jTAw$@3D4u3?{WxuG*o%XuMeuBl-MKC4!%p z2*4>gNqwk}9cD1}u+wv!Nbb@vlw2uplBGD$g}?1=?xT}`PXj^}o1zaei(U+pBCIw# zFdnpCuQY<}6Md&HcFNQuV3Q2Vu&%2nJqHdPuqp*DBfQwcYgG-7K*dRvq1!gHw0xG4 zwz;*h2s6_IxPr#jPY*TR?(!dk5EUA)*~hL?A4{w$4L2t>QGUSAue|QM5sAW^K>-gZ zVA4Wy#f52W4ajki61aV(Y<18dijfpVcM)^HnWBHBwo!h4;N-HzNRP-;Ni{I3A#E*X9%&`gH z*jN*p?`3_KtL%D{$#L8(dn~gD4IG8wOAGW+zycr_OX$@)37R|o#|oLoPzZ5;WtUcr zu7T6!+M+WngQmxtyLJzF={A)u9hLB#}P?ZbMIydZmP>30*)UWOFXta#HDrT`hqWw z2|6e!)2mbXs6_f!E6Cp@z0oX1*~YYOFa)$}H-7-U0ET}2sPGVI4KUgA2(?tzdD$%+1E#!TdyMv-?I;S3k-esp!X;fB}6ix)?IuVP$*D>;U6FFEhz zpn+c}GkhA_w4sL|D(32%Z8dN3S246#^!2^gXt)M~%>@|#dM8c|Q!(7Sr+~xw^VNQg z_?L`1ZY8zCY2Qvq@ER7!n?ky!@hKE9TUze=spo)WOa1bC*Vm$%+-`;dlI28MtP9U^VL)3h`d-}J;g?~8voWuhGu>GS#R$2wsjJ9Rx z0E8EN_0>V3`_ML zk2HMXR#>H|6BKua$p(+`A99u=s4+P;8$hTAOZzv%o>U}zd>J;Tmx5nmPw+9p^L-9& zmK~zC?){ERNyQGy0Zd=qsscVKyQBeN0dt29fT?*kP zm-0gDmf(?_MfGG-s~@z=-5g^*m%Fr8KLaQsswYKOP*AW2iewdm2&;Whn{C_M8xqJ- zW0w1f@?}2|sWpAY3dtAag$ChZh~^;|U{Ow~pM$Sc@j46z!68Sz%Q5!R?e*7Gtdin@ z9aB~`8f|&fv(ckPfz#~7Sz1nIJLV9kaj=# z)^JFgsFJWsjwM|UhO4Q8IO(~U035{61j7OW<^<^}<1Zm*0QSf*PMt>AKAEnq9U#N@ z;@yVjRB%DIo_F4$SNmXw^b=pgLkQET*>u_={7S;XVEj_C%POL&I(<~IqtTE_mkJRO z=X{hw3@gHCklWD+Nqk4M@iJ>e-BB`|)RvA8UGw0ME~jap40)$y>A0aF5rKHGfpExn zN>Q@(Qg3R^+=N03%!Q1t9vi{WI%W!W11!CMtCPY8WTYK4op;51jkK65#XEn=$jIFI z+;Li$6jX1^yDQjmf}^Jvy#4(Ljvlz4{zjhVZ}v?*0VW{w3`GP@m+wl}IkhAyXs^n;W#my% zF$(cy0@(5@oNZ}oX%6V4GhTq{X?B7&JUl!b6lRPPcYQ#=_`;3Z9q{`lw?1aL!kkdQy!#d+XzNPw!2s1LhB^ZMwHhP8{? zkA4P3^`0T1@cd+GBrbw5N)HbmyS@~NwOT=%knw_dNfKMAHK2h-YTnzPdG}N2?omlB zD-%x$`v;=Arey?RW|4(qVH!91B5HS#xI_Qc7hQkeBlUgr7>r%3VD@HTscA4$vS4Ui zj+bgIhzt5Hl!dpYNAl|S;U5obcg0;$yf^UJBAd%41;lu2gIPN~IGcht$xROO_Nx6H zz~6cS7+P)$-@(1T%pdq|<2H@xc;f0>6O2U)KR`3YfLfKM-}ORHarYr0sr7BYL)jrv zC1!Q2qWrdyN(Y1vuX(MvCe%WKzM@S6E;lO#$|`DklLdL< zc1vG1 zOh)}hvEOy^i+qPp%hN-r20gLvhI;oukak74=HJxREW8y{$q=WnIN55f-3jYmhb$B* ztn4u#nh*eLuUF@o)ei!^OfL=al$hxg029>&q%8YGq?;}zwf@i>`QRWx5)me>z&3>` zITTLF&`9BDbxe{OCdA`Fkkbwdb#-Q&boAKn0n7Ct3kX*`cr^iD5C)1*MZ6~pU_;s| zQ(Ak$_miZCP2|T$0v(jC1Db#pN~M19l;9D#^LZR-$U_q1?+55 zRC#KNTlGkNBt*W8$`ICn!xd%*A<`^hxts%-F6E@j+}o=4{rjRAsqRlVC>K2dU^1)g zT#GAEJWw5z3yS=>seBI-n;E}93nV~(l~7GfVq3c|&sdE(5W1@ABsF;KwR277S_p=P zpA2Ctb@+)rj>e-J-6UL^=6z*r01T~c@j3b=O$B~&0{tCSdUbT__;R`EFGV5|%;)>3 z0MX_JOR^qVoZj6IfUecVl5F*j*0SFuSmLC_z6Zx7+#HyI-6L_nW}wQ~e1MZ{mn;z& zNZQB~PN$=0V89X>82F-6iSCbc@Z)4OAA`>~UTpD^Hl#@67X#QoZ&?!m7u>2AR}@Fw zkVEE96+yO{cE7kIa5%f_ty>W)Z(qGSfk^w!xZU=pg1vjA^4Lw>QRGSdA|O%ukYXes zCUQv3qJMvqeQaYsfBt&ow--bX)(#KcO%iwL48QHh%VNfMM>!=%;xo0_Fnvi1_o4^J z$aSTdTeN@!J301J#KRE0G_KKAbcKiw`sd~O`AJ2^!823>cDW^RJLS(rSZ-jtd-SCr z)=5jru%AbTb8E^$$Q9`0_tB3xSC%bq!C|IVFmcBT{eC=uIMR!#AF#vCO_h&S#8=0t z0>lQ7&8Aw+s@w;ZKnQ68&==XJamM|}Bop6KE!p%b|J5|5H!0}$MO_qH547Ekr zcXKeRTzeb!dfQ_Cx(3_d;HSG4{s8m-JN)tIySopau{BT7-|MEAh(t=hPfMlbpRnut zAZ$cYq|kA#B7Afdz3)JL5ZM`@}JLuK2g;n$@tQloNtph zeF_e`FoNAag;5hxqNr5p2-}vV@z1b#{G-{O#Ctc#gq*`p7k~V!(N%fsDb8kQcvxP1 zB?pKWcE`=EAGEk>M8K2Y(9~oAFw8Rm2@3W6-92xIY5nIAnk4|f(`(;Kq+~w$YBCR7 zMN(Lk7k@@M&=z+ZV*$LMK9zjxXh9pPnt(E3UIeg8@tr+;_F7!k`k#Bg^B5$~f(OfA zqW-g83b+gKkb`IVpK0irChP~&Sk`gLVSwF}!=Qxh+U`peI*J{!|88yVA&y&P%T=PA zc;*O%Z#_uC8O4EcjUU8#11Sui_b>Xg9qh`F$Sii4<|6t-q8AA)nZzkDGjpauqGN=s z9R?`-HSsHg_%URMT%PoRYnX)_mlIZm_8ru7* zUKe&}W}h#k`8#2vL%SwxboCuio2a`1o3~tBdn4`fFAI5cQz;eSiu0l4`bN&0*1K-A zmq}T8CrR*!@CN{u0)@J|`Y^`E%IY&_r~0&sykJYM>pJ@~rPogaZqlV}u+&aHT?&Z^ zQhGkUHYQ^=)}h+KXO)Ya$avrFZVyp8ynT9p8i})V4<=H4cfO~IWpDN^(`sn~4RGS# zy*uRm+6=Xr-KU;Ea%>Td&eZr<3!P|5;w}6_QCL!a`<8DTrL;Ua+oFeaV7zca%XTR6 zmJV?GjA?^|M=eMuj$iM%S8``3dA{v2zk~w3krJ{cE*8Dg8ym?Z!dQSnLJA;zd+qy2 z!Vy~8=TokyJp-L}_*TBcrD5brmV)}Z6W!Yph zR)F|a6RrJgHT>E+7a@BTSj=(QBzE|2w&$5$4$~=?TEq-&B4_BwWXH7<1uCkszGBNQ z#4W?UCw-*ZnqO3as(o(?oDAd}rZ@$RNY&;yK~B>fNV~t6JJ9JG4aF38*qmRh`uBH? z*nkmsjNJSK6VYF&>OoF7#$##1>gIS=?4^7NV~~`{e0*q}7fx3VOk#cDd7cHlI5&(y z?XQX>+t%riSN@nkUB2`HmIqi({%*V+L|iNATb_{IvW@khIWyt!^YVgu&HMnfw#P9TJi6p-M*ZxXe3LQDDon=Oc%@22yCk|)8cFMeNvB-jeDoIbd zt5^907p%iGNG76HI=tLyh(&XEm?ap)Az+>W6?1imZ%F$>a_IDNJT(Y7vgVpMG2f&ZCuMI$@+2 zFL-D?2efsjgeV@6{Rh;d{tSW$wzA`mH4=dCCzbh^<3y*~TnHw)-tJz(lmQt-pQ8Z% zKa)wo{`?`5J(t-?*MY5qF6asJ2h;_)0K5JFmV3Y6vIxo>hDwe&2@n+~R21;}%h?qE z;~~F19;Tij2VYyKO*;7dOuQ>xKRsNHc z6JMH}Rp}N46-YLCpZ9T3NQCx@?R1O(96fL!)b|1bIiLLh;>t)C?FIG#o&8w*flOI# zYPjUVtA-^FQRlejf?1B7lDGLvChtH_bVrCy6llgx3Lp*oI9nTNaVvTvATgkZR{&&5 z4H`V`+LmwY6oLTXv*AtqX{7mbPF1qwS^iAxNhVhIV{uYmFoY(VrkdigRvj1EC(#6VD$# zRC`)iWM}ebwvi-m{QbYF$De4im%?^A!shK;;>)xP9<=w9*gYed9R*+{$X{;&=6#Lp z`e(OYlu6QwP$=u%zd2w6M@cDc7b9%m|CiV8jdD1x{sh;Nu1)*(t6=uMuahTZ%eiQe zu98fYhxeIGl&9=4RHCwCUktddADrYeh*f0SO;XM;khDTGK<>!}B59w1wSDKRC|1!C zeO4A;QnDT;l(Cf{VO5}Q#&uZh!hgOYQJxe4v&Miq%_ukuSZ$)cFu;&F=P=%^T-fn^ z2Xzn@0!E}J+S5+F97z13gGMbEg7z4Pfuz)05X67|?%iGK&*;<96&Mix$;p3qRoWVB z*lTEH;+S@&htis)a)HN>0P3m!bc)2*yvHM?*PZ2m8Eyj2q@T#v_ckExNkD0_r`ox9 zfKSa7d26qm5*z8hmP^Zdrzf2^zV8}JhnqR}7LWsL?Zy|Yd0TA)ZbiV1a; zCi)5|*eO4|Nl&4%S2DhG1Cc78PTx;TsJhXllu`#U6>Gf6tjPPrE8gH2up6u{f>Ito zJnEzL&v^gd&w**j6K|o*w!x8;OfGQu#VqJ649_P8(usK@xDJfFE8p4WM_U;;Ew&B! zP(tsGUlXTt0Fr#q29=|+7vSYv9k_n9>sdr}9(mGi2-nS&g0jW3-Ect25>k8mjEKjX zh}e6Uo7)6L!|bN>JC?gow60Ew>?nwv3n00Jy!lW;`4xB=d}(hBYgq7c!L#=)EpypI z)it+%&I`n0p?Ba8)@dAll!%@2w+HpS5N%m`Wx}fJ z{rmSC%^r%FG3ouky7-Y8yn|JV*t{DJ5US|j@o)R010BEbA91A4?NSx2UsC-=I*OmVd z@8yRt2-fd^`hvD|L>(`{$pPWnb9Y;kSYGNK=L}3GHlD4Q#sS7-%O%bXq9c}0)BqDo z^WJI|`{yI5*x=7-Ips7ozRES6SyCDL<4FA!>(XPSkUdfh+|~b$&k#Q_iH4+qUqwbi z-!`ehH-8T2?@!_w0J-ZUBc(tc*A9q5A~O&Q)89LPNR2;czQGO2rnm3kPqv>{L$w+1 zxJ@M-ss?@Q7wmU)=;yW)ArpdgmVCB(z3#y~3N7LQ5jmCC&s$YE8o8cK*jcy;!U3>Z zCIc#L8))t{B5ME$-&L%2`Xy1epN^vkNdTK80Ei5}2KIcFjU5f66DKIeJm z=si#@G$Q`GGy8r{Eixs#JJoCFsX4-dw@?OV_WwUMfuB=TZs5#UoZb=cNp#L|c`?wLsbQ0V4>PTtx z<%jF;5XYeluc&@T`v&Y;@1@j@cX33N)DHl_!4TZkmFY#|Xw^Fit@?VwwwLIX&Yb_b zQ>D4exSL`-3tJ?xV`h3Lww0s(B}?IIM*yt*-n_4b=nYnV@^g!*8^x_va64`h09N-# zS;Z#w5g)58xVy+dst&7>n##Rc-BKp&Zw{zfZL;=k0uVg|^bGSQE3e&;7Uf zuTNfn74ho?C}JLK^H*uSK|GoXhM${@!+LOn5MLOpQ(8uWU!Esu-nS-ngv66wz-@6H zDH=9JRAMEnK!*ey%2ko1@{#$;ujSl6DUe8=G_LZBl*kjtb>Vbc^MFHG3(CggmMenf z5~aU`yxze6jTz^)h{bg%o4_#b;J79H#v3`=k^{aptbHB6PU1u_?PAfE>y+|e!+REi zwKl0Q^oeed#i3PDy@;(WiL}ZdwV&z1#}lrqe^CTnMI0g7;8NAqWt>0-6Bh*g9!qO$ zYa;`G*(yX{@ZWA`Iwz>HAB^@p!rk6uvj>i(hiud>D#qV8owhF=K{`=FFviv zx?MH6hjmpN0`sH~&Gy&9A8>qrOypd_0}la^>F&LI-BGU=|1tG{gA?F~fzPCNlC%3f z(JKv{P9GXp$)k~G*NF@ZS}>rsLHzJIBO}g{?*I{IIwZSlPJq)b(ir-$;?P?UR{?@z zaewY(BG&?>w5kGScuYOD)p%>?h%CUi8}{4qv+TB_NxS}swIYy|!Mwf7-!B_3QHmE~9S~0){xAC|+8kKW(}v)!CxCa!5~py0JuQ>-g-NxAcVOJsnq zEy?>6#AV7y(!Ehs^R!m3#CQ1j4cY#kaX&E8OpCjU#HXbo{qPxv_5>NqYK|(-Er9oOcRFLj&5DOKgQ$V^?x<{lHq&p-eHqxDE zJ?PAUBlAD=o=?XQ{uDNwXW#egb**dd{>A_P?vS#xBZ0NO*#BY3;2xnZ{@dHw|FlUY z9`9Jm#Q(#XKvb&4_{>y12dc-q}_~|e+&Dh_{)P<`cDTix=uATa?=IQtW zM9BxP1fu=!Akbfm!Z~||UTglnAOG#o?6^f9BghQK#Z(^tR*Th*;k$TmM_UvBs}KD` zyQ4R14A zu{N!p(Vc(l@0WQHLEFBT7rzzI{m=aLRYhb17^3q?mFI51l@@27eh9h7IrId6t5pA@ zk7dqCzZ3i;;mkZU@9%YE%n3AL)9K`=-`j$J`8bE5yH?}OhD-k2&%kB z|F!>eB4ZYajBi}{#k}%h$0sGdf`dB#u-cPU@`AI#F3;=Ige1uYqkXmi)!wFu?FhZt z&+76)w9PAkV?sczj{@FsL1*Lw!-G3Z9p=qqg*|FVU?DdRvh(T&fV3Zs)cPs7!WbDV z7fc=)&cgw-`r$e>UY|9#~0TEIGtzT8``gAHTPk7h(`0I-Y)C?jt2=oAG;^+ z`)l_zWiZTzDDH<{iaU171w5-e*CeEbgTTMzMqrpnims z%TI9^&BW}cF(X4@e^10qVty~|`-`)>ip$(wTX@j&M`HIhj*|AB&+@Jm17Qi?8R|qf zOhg->eR=?ZM!@XjR6{VG)qIx$n(4pL-_Qd6O@Ptje?N??5|WZ$rTTvZ#NgNSdl2F+ z_d7W~Zx-Bk{2a=`nz&7Dw|wxTY{s(525}R~70&|^PtF}DxezVrL-Nx35*n5i?fDop zz5z6>mn2uQnhGOjczI5r!Dys@7jN!KRea>uF*0=QTN5E{%f0u-J7idDyzNJA>I<*K z2+yb0w?(Xh`i=yIG+GT|%pT!RTMD;s-xh06Rd~KrXLJw1JMeotSX&3x>~ z%1Zp>Q&UreU%z^F3*~L!ahaJh?ksgG&B4UNYOBgU2 z0J~oH_YeI3U)l#LC@56K1qHwS`3p31okK!GhJmYDtoy25>f88oskP;4`d8=a{h3eqt`#`GW=34yj zr#yhBNb)9ClJ~$t^wT{5`LF6lG@H2|hmib5;`nd27Y^*a#YJrwXpRa8(5Yzj7FbB7 zsd6?K!+@BK<#eCHMBR7yz`($syJef*r#p&l-cMOrTKcnFOpLMM?sd7eZQ3ZYM`PR>QX|Yiq$%W-BvaZ)sPlVAD(~N)%G76RAtV_`Kxy z_MN?FKm+d~f5n>bKcC6YBb){z_LS4a#Azs*AIDlvi3VG-SZ;~FefxHSmIzw9j$5l* zz4cHO7ByX$D=S_m#>T#+RsXh;;_>6h=Al@7q~jer=C!Y=|LswDc#eIns2H~myIC}% z{7_=&Q&vl&S)khdb)`v0%`@?oX>EN`ZNe!Q{*C^LM#(&@uQ^ zz`;GwwOjuG^&8ITj4dtCi5RLANG31TVF!vQqfgty|C1 z8pfXLs@VCBjcMD7`3>Hj=*RE8ui5FV*d4arSK~2o-j2)a)vFXa)Pb|7PMu0n%uYyJ z=z(w9EreP0J4lpr4gGv5#A{*a*%d}cDH#&^h+9vi1-&lK!Mv>q09j)|-Ms15xSE6U zbmFH!!>rb;jBgdM&X2&*RitWb0T&mSRIDhT1CxG-M50WB_aLKg33P-5E9H*_#@n$Q z4>*q(>E`9<3q8fcof;QU9Re-RblkM<%rl9a>@Ac_RV}6hx_=xwIXOy&%xGUa6-6{O zv}lL*C8<&gS35YWz!&Hoo)8p5d=jYGDBEs>; zsOK%ID&4jP8mOu_#H?YPfEF8pku}rJH4Dk*_^GP)_IB$fK(hL3h1u{Y%B9h@ZI=jJ zHsRduSkI43Z{duS`SQxbStyj}t_70DgkYysS`rd%Vn z1o@1}&w3v|e26ya&S7atxQojkc~WTvICZgcA9+bhokO>Nd$jMY1nny0jqQ+6QjrOio1DG)&e}a9B=C z^v0S_^{`1k$087-EgK$djA8`l3=OfC&9~f6eK+9VDS#;PI+`Ys&r+ShXS$XW;?Mtx zb2%&7057VfueIGT1|0)KA+hMv9-;sLV%&L1BuT`>3XPa4%AU|4MXa;STdINK;VV=h zKT2U^W8Z;E&U@!*S0s z!3i#?@*%JkFO9mn{5ga* zWQpI|&CT`jZj-c8>U<3QFK4~`J9{Mc_ur5|7SBDFgR>~`5$A`OGEL-ZDuY-d4aZ3K zsWXjI&L^hI-d+`aX5A}5jPO<_UV^u%xR{KINydYa?ExVHt09vr?fFnnyL)}sLnneb z?Q&q>ZA0byE?=ZQCEe_|eO7O@U_`@%}u+HVMmNi~9 zC#fpVx#;VARr13PtHF;)*(@gmC;Lm)Xh<(-WMnXERG-eb{2uH}uhz#TV2eLtyV#Sw z{B?4Y287Jh+4+Fm%a@Gxp*L-$dU|@iLv4HVOc<@El$&jsRX?A-aN(+Kq71_~X%|Yw zXiRBA#lLck_B@cTi<{1W6AJ=XhnIQ@vq76Zw06RENnjruBl+CdMe8hH@AkGXJy0PK znzHTdq5b{&{~uT6ndrPoOj%V?5yKvK@W&nBe1S&QF}SvfvPDt#lvh;=&pQUPSpU8`_5C-_{a~G>{e4W{SM2a@dvzp zYr$1&V$oA7=cU8!xo8*wlQK>cNt?;H$$lj{bojU@z_NpHv4Y@Vp>mECcyrNKh`Hb8 z&=GSbSs1h@Z)|MjSA#9q!%=Uz7(>NVBDOZK84vJCYrj}qt^jjFwYj$Fv#~lK5}SU~ zbQPdK$E9)6qH3YZ8Uw-}J3Fp}1W-$pol*2QYvXb5tA4i?>*hx4#5^Vn7&U9FVKHO0 zRE%(}j!fVu#LzE*cNZfU3)ZmjmB00MYhzyAX1aJ;1He78C~p?V^?V8y`uwF(4y)nm z((Sf5*MCMF>a?C!1-wN6Q&b3H1B5^B>Z=cxdU^ly^~RGO49%f9^r}5AIfj!Ruvzd8 zu~9D>I1I+eLf+2;0uPh1v@Ex(7TeZW5xb1knrhNx9vRQ4F?o4; z)mb{t(K^ks%TEI2E9F&-i;9MU-HPD@BaOp^EJi|4fkjkF*^-jgp43$pJ|yf;)XvX+$j;uaG>;0?w}K3KB$ATCP{TW!$E+UthmaW_B-B)ZEQt3{})`WBXfkP7<351c!x#X~&AumDf z&>lHT$IO$bD!Swuf-a+*l$&d1STJJVpTrpXe`xt0$M!?ZhwmOlEqi0DdvlZ?&eH?a zOcHm@9_WQKO@{a#La2(8VDzrQKxGw-r$$2iffyf+IJS8X) zqt~9AY1qpSB>qmXlVk*IAVcGO`t=H}$3hPTa>==J5w|dA7Z+O%_GXvP*&s%3_$_Ac z&TIE?XFS-bGEKD^=(+lz%_UC(q!L2s&%5pj>BVa<0|V--V6Mdq9f7?mMkYZjmP=#^ zm>b^9xXa;gNM>nEN~_u8Q+eLTkb@8lFMx>6^dqKVf@<*^XS21nb>N!J7$3iIjIf`^ z%)lSmXU^PL-U2dsO^skCm4`(2k#u9NNdfU+0$%$<-DgL!m2&iJsz=s>;ggG~tG_dh z%Vu=ivTyzZk(>}fYsDON3=l1c2*`Z^QpF2HjJVMcsmne}hOIB6+D8Wda9un18-wL3 z10|#AOIf>>@Bekk>7q;r4v20WZD0w0-i46Lc(k4fOuC0XY=nuN@Q?g(X>IAdo=&hT zl#a!|;!WJPkbP0HiG%Chn5`!l#PIN0*f*$RoL4$X4r7=&xb_iC5w#FOlR;MCeOP(S zO)9k|ZV7HAD?wZE)z$G4S^Ee3uKsPVBp#B;`*PVL_kk z7>hc#N9%SOrGGyclJmz-t9!p9=F0Ve#AlcXsd^|BTBc-aH{Jq^`Us1@CWJK&SX0jf zk^7sDqWNOG<=Pab+=YDbID!dMG3Fdme(=Izy53x)@B{;$p9u_&7@O79+jyQ+D2byE zO$Vu{W9vU}tEi+DHmS(nzgSBe#i!B@SOIf2$Ca7;l4>0OQZQR3sYbu7gm&oA zBF+Tc#hca=xwNsg^w_cYHf~rN2o3DZh~r2it)i45 zMJCM=9!Ol3NSQY;OX43WHL@(Yqbwbw-kz!wONvBV+1I-S@%_yP$_^%|m2Po1vwbk@ z&(iVflY?2Qit_T?xe0r1s1ODyJJl_M|49(4N6^}wFp18e52$0#bJ&S{1yU7#EKZ1}$#6aQLR@71^Rjt%evF+kPa@`N>C$2FVP`SH< z&NNp;AQjw&XMleAa4?-1T_9OuxE&+_Po6v(D?W^YG0wiXfK=uW7Bfd??DoG4`##?_ z&2WDI{(Z?h#0M&IKUAyCm1Y3KZsg_=Qw3am&F0kp&S&ZdvQ)M3!khGh7&XnE-SDj- z@C`XgKG6f4)aa>X^dTljw6x&0>C&WvLZ*hBNxX-%^MM4V+*Ffzp0mWn;oB!ZMQ+=D z?_zEiUYe6SNRCHKChS}NCFcJ9`>`lkUUV6_8B-GIFP}h-#-+;r!Cd1vX+H&Kl))eg zWGI&9#E+chM`q0PXT&jzu zcTFH?4gKdSXY#%SE;1d(Y`}c;3kreOe>9CZK4oMy&7@+4XAV^Zkyh($Ig;nWq8Ndb zaPbY{Ql3wtj%mL!Th)~DP+%1n4GK3}OnEg&EOd>C22 zLDQQ(B_H6T37mQQuZq7{b#~hZb?j;%iZ_N;RaK}zr7TmL=jr_oDDx;3JdJjtz&lZ% zo;`l+DOOOybWi?6-EQ6Z(?@adnt~PUges>={ApjPXDOABe2KWtKU0GQ_K+krf%7mi zsVU;7tOJXxLoAo7%-Vrkj-Yp_7;@@YLyOev}H`JOY_{{#MVE(0^5`C|m<&yUWmYr6h82@QW9 z85v)liRx;>*||B!Ma?Xe#R=Kw7(+wDSWD9rU@{Yw^D{xBv2pD)t)^8wi|uk@&p_1; zD4&Q1BsqwO-Bf5xRiTDOXQ!cV*KA|QjD>SmJ$M3^M_3-chPVcuzGQ7Al*;;4=5pwI z1#Lo*j${)5J+9?LM@|Y_Tj!~AUcD;V{)>sLISS6|?eWds_w~!i+5f*hbhzm!uL%hX zR>xrVu>9~5mxRj6Wa3?m(M0RRxs5K-LCTj9+V-rlun@3}RX19gC+u>u7!?Z46E-&H z8?cFpQsSikz=0~emp!Cr1r1?-Fqa%0%V9C$3uV18EdgGYkc(V5?Q~G_S?Gj0Cu!Z5 zcoQ|VuKB@F_ERCOMl1%|zft2df1Zm@<>J_D>rBS_f z>$@}igGX?TP0Bbk$o811zn_mp08_d6BHbUP0q%AtW)@y$&o{rDs<9gJ)eY_aL<3&WefD`^o=S|aWqeAGrHc&Y zGt~FwPi`~N5BZR(+KhGJ;W0b7ZDcuyKufIiEj2kg3&XWL7|)d%>eE&Y3SS52@leTK zy-cL0ebuOB3wENh(Oj9hn?<9P&HIQ>nRc6y&A?18@%r3S=tnzDmXj!6vX|$)OH`CZ zMwc4!NGaMz2@@Q@^^hfWXTF)Oq^c|7FYcD@vmN3SX{Jk~TKP7sC*S=tXmTQcx zSItH>m)4K&P-RV;)0Tlw7gSr*1VkiKcnTZpp6v6{4xo9^t8WTaLJ8TU^uFbb9ZljP zKPr=^+RHRwAIc&2{WZ%;!W&3(yEYe%8arzlKm0jF4yhA~1v53iCt{l`UA{hcl0&xE zpOzXb`0Xy2!GQY#SDFaabr_32KnX^)G^t_c&UjHe%+keD0~fP~E{E;qsD@1_vamQ9 zv?a+kG#dGB?(S7MyJ8NTcsiu-b>X}8qw46#iq4aGLeuW5SjBWI{TJ!qlzx$OT$%o+ zQ7$4CEQj&@cz8O`M2@vc+m>c&8Su8L()xu>&={Qv4SQfMBy3mcd7)*tZ;WlOx>-eI zQcHx4X5*f4`TOt6ol+Ii?WKx=ZQIuv2)~Whn8lW?8!T+9Kcg&)zSsKF?JJ#_!CkwN zt`i}f=6j3EyARp86s^9#-WCf@lnG-eG;mSA`VNf^3zsT-+8))GV*2$1MsK~gCJ1$` zh{4l4@aF~A=XApM)ZR^!w9Xfk@!4o4Rli^uI)q?|uj zdg=i~sNn4($on!u5tv?QZF@p&{VFXjEeu+DQN&|x3kt#M>wgM864ZkH;z4EswiQzZ{?#3WU2wQa5DW~kMn zw|_9Kt&%=p($TKf!f9p!TyB8GR;ktjMgORA3@&7or##@VdBlh+?5%a?j_ zL=mX2^s*~tTfQo}St_6!#BAuCm)GOqlgA~rf6V71ic{?~I;EuvH59imqV9-d%KRa{H{k%)z9<+?eI>?XnYN#_mHl{h+F(n9!XmVCq_qg{7O^>`vJb* z=WD%Ak8rX_VM&)Vl;z#Wp~9^RdnOt0e|Ta}8@CkDr`MFtgMTbCn z+HOG{kcSBGM%%nP>+Y}aa{bQd9Jd@;?x>1upIe7fgw zZM7A78T8c+`EUtul3J;S3kKHm%G(_tpJ>pP8yIK9X zR1{ySWqk0D@pdRSxqiz(ZA}>Z9>-ceB=u6f?+r`}sHt`jLN(uDz_D_LZL!dA}9$zabwvwK0A6jVOh*cD%D!!?_J@{MiT1By2O? zgm{~(xlB(3;$I!J9SKOKXZ7Ls7x#^DP-FgVH8X~%)4F&_l9a;Zo-UUnZ{JjBeO8J% z_d5R)5xdTWi1=-XOxa~Ca=|+qz9o}SwNOHFISpf$y11}I?}H2}`O-}(tZE?x?zaMe z+xor#vQEdCyRy~ODb>=DLHR?Zhab5>v0o6_7?^n>7DsgC(&ft*YKqiIBifJpGx3GF zHYKCZB4r0|Sk{oi71y@D)NN$J!RZGPD8W|>f4z$i3z8zO-;$m`e?C=eznYmEm)(?a zrey;h-=gJlcSEVDP7kll78092z@OPZfs5UgC`-Kx04n#3Bk#g^EpfQHxou$4l&FY! z;5FXIuC7q6(^1Yd=7mi`kMO&omnW^n42hUgXJ$oKI8=>;x_⪇QjCU-YRh8MYY7 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

PR4l6#Nk9{stCC) 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�lQ4ZuaLpre@RleneN%{_CU6 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 K*|ZCK5B?u2X=)?@ literal 0 HcmV?d00001 diff --git a/docs/dashboard.png b/docs/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0543a6a9237dc651decc7baa84e152dfb3879a GIT binary patch literal 182296 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 literal 0 HcmV?d00001 diff --git a/docs/device-configuration.md b/docs/device-configuration.md new file mode 100644 index 0000000..562fb7e --- /dev/null +++ b/docs/device-configuration.md @@ -0,0 +1,77 @@ +# Configuring Device Inventory and Collection + +Devices and collections are configured with a YAML file. This is mounted on Scheduler MS container. + +## Configuration File Parameters + +- loglevel: + - console: Console log level, one of 'OFF', 'ERROR', 'INFO', 'DEBUG' +- sites: + - site name: Unique site name + - Latitude: Site latitude to fetch CO2 Intensity. Enter within quotes for YAML to interpret as string. + - Longitude: Site longitude to fetch CO2 Intensity. Enter within quotes for YAML to interpret as string. + - Timezone: Site timezone. Use the tz database naming convention + - avg_co2_intensity: Site's CO2 Intensity override, where Electricity Map API is not available +- devices: + - device name: Unique device name, must match the name configured on device + - site: Site name (from above) that the device belongs to + - family: Device family either ASR1k or Cat9300 + - os_type: Device OS, only 'iosxe' supported in this version + - os_version: Device OS version string '17.12.1' + - connection: Connection type only 'ssh' supported in this version + - address: Device IP address or hostname + - port: Device SSH port to connect + - username: Device username + - password: Device password in plain text, will be encyrpted on first run + - timeout: Connection timeout in seconds + - collection: + - enabled: Flag to enable/disable collection, restart to take effect + - interval: Collection interval in minutes + +## Configuration Example +Below is an example configuration with two devices in two sites +``` +loglevel: + console: INFO +sites: + branch: + Latitude: '14.59' + Longitude: '120.98' + Timezone: Asia/Manila + avg_co2_intensity: 570 + campus: + Latitude: '37.375' + Longitude: '-6.037' + Timezone: Europe/Madrid + avg_co2_intensity: 60 +devices: + ASR1k-A: + site: branch + family: ASR1k + os_type: iosxe + os_version: Unknown + connection: ssh + address: 10.10.0.1 + port: 22 + username: admin + password: password-encrypted-on-first-run + timeout: 30 + collection: + enabled: true + interval: 10 + C9300-B: + site: campus + family: Cat9300 + os_type: iosxe + os_version: Unknown + connection: ssh + address: 10.20.0.1 + port: 22 + username: admin + password: another-password-encrypted-on-first-run + timeout: 30 + collection: + enabled: true + interval: 10 +``` + diff --git a/docs/service-configuration.md b/docs/service-configuration.md new file mode 100644 index 0000000..84337e2 --- /dev/null +++ b/docs/service-configuration.md @@ -0,0 +1,21 @@ +# Configuring Microservices + +Sustainability Insights microservices are preconfigured to with required values. Some settings can be chanhged through [docker-compose file](../docker-compose.yaml). This file describes only the important parameters. Also note that, all these changes require restart to take effect. + +## Configuration Parameters + +- Scheduler MS: + In case a custom device inventory and collection configuration file is used, mounted is as below. Change **only the source key** to point to the correct location. + ``` + volumes: + - type: bind + target: /susit/scheduler/config.yaml + source: ./config.yaml + ``` +- Processor MS: + This solution can fetch latest CO2 Emission Intensity at a given location from [ElectricityMap API](https://static.electricitymaps.com/api/docs/index.html). Update `ENERGYMAP_KEY` environment variable with a valid key. + + If valid API key is not available, configure a default CO2 Emission Intensity value for the site in the inventory configuration file. + +- Database: + Solution uses a Postgres/Timescale database to store collected and calculated metrics. Set `DBUSER` and `DBPASS` environment variables to use any custom values. Do remember to apply exact same values for `processor` and `superset` services. diff --git a/normalisers/__init__.py b/normalisers/__init__.py new file mode 100644 index 0000000..0f1d61d --- /dev/null +++ b/normalisers/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 diff --git a/normalisers/asr1k_cli_normaliser.py b/normalisers/asr1k_cli_normaliser.py new file mode 100644 index 0000000..37698d6 --- /dev/null +++ b/normalisers/asr1k_cli_normaliser.py @@ -0,0 +1,158 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import logging +from .iosxe_cli_normaliser import Iosxe_Cli_Normaliser + +class Asr1k_Cli_Normaliser(Iosxe_Cli_Normaliser): + + def __init__(self, customer): + super().__init__(customer) + + def get_commands(self): + return super().get_commands() + + def normalise(self, sites, device_config, command_data): + return super().normalise(sites, device_config, command_data) + + def _parse_assets(self, command_data): + return super()._parse_assets(command_data) + + def _parse_interfaces(self, command_data): + return super()._parse_interfaces(command_data) + + def _parse_sensors(self, command_data): + sensor_data = [] + sensor_data.extend(self._parse_power_textfsm(command_data)) + sensor_data.extend(self._parse_cpu_textfsm(command_data)) + sensor_data.extend(self._parse_memory_textfsm(command_data)) + return sensor_data + + def _parse_power_textfsm(self, command_data): + tokenized = self._tokenize_fsm(command_data['show-environment'], 'asr1k_show_environment.fsm') + sensor_data = [] + vout_dict = {} + vin_dict = {} + iout_dict = {} + iin_dict = {} + for sensor in tokenized: + try: + sensor_reading = float(sensor['READING']) + except: + logging.debug(f"Error extracted sensor reading {sensor['READING']} is not a number") + continue + + sensor_location = sensor['SLOT'] + + if 'vout' in sensor['SENSOR'].lower(): + sensor_name = 'Vout' + sensor_units = 'V' + vout_dict[sensor_location] = sensor_reading + elif 'vin' in sensor['SENSOR'].lower(): + sensor_name = 'Vin' + sensor_units = 'V' + vin_dict[sensor_location] = sensor_reading + elif 'iout' in sensor['SENSOR'].lower(): + sensor_name = 'Iout' + sensor_units = 'A' + iout_dict[sensor_location] = sensor_reading + elif 'iin' in sensor['SENSOR'].lower(): + sensor_name = 'Iin' + sensor_units = 'A' + iin_dict[sensor_location] = sensor_reading + else: + sensor_name = sensor['SENSOR'] + sensor_units = sensor['UNITS'] + # Only add non-power sensors as there will already be the chassis level power + sensor_i = { + 'name': sensor_name, + 'state': sensor['STATE'], + 'reading': sensor_reading, + 'units': sensor_units, + 'location': sensor_location + } + sensor_data.append(sensor_i) + + logging.debug(sensor_data) + power_sensors = self._generate_chassis_power_from_vi(vout_dict, vin_dict, iout_dict, iin_dict) + sensor_data.extend(power_sensors) + logging.debug(sensor_data) + + return sensor_data + + def _parse_cpu_textfsm(self, command_data): + return super()._parse_cpu_textfsm(command_data) + + def _parse_memory_textfsm(self, command_data): + return super()._parse_memory_textfsm(command_data) + + def _generate_chassis_power_from_vi(self, vout_dict, vin_dict, iout_dict, iin_dict): + chassis_total_power_out = 0 + chassis_total_power_in = 0 + power_sensors = [] + while len(iout_dict) != 0: + sensor_location = list(iout_dict.keys())[0] + vout_reading = vout_dict.pop(sensor_location, 0) + iout_reading = iout_dict.pop(sensor_location, 0) + if vout_reading == 0: + logging.warning(f"Vout at power slot {sensor_location} is 0.") + if iout_reading == 0: + logging.warning(f"Iout at power slot {sensor_location} is 0.") + chassis_total_power_out += vout_reading * iout_reading + + while len(iin_dict) != 0: + sensor_location = list(iin_dict.keys())[0] + vin_reading = vin_dict.pop(sensor_location, 0) + iin_reading = iin_dict.pop(sensor_location, 0) + if vin_reading == 0: + logging.warning(f"Vin at power slot {sensor_location} is 0.") + if iin_reading == 0: + logging.warning(f"Iin at power slot {sensor_location} is 0.") + chassis_total_power_in += vin_reading * iin_reading + + if vout_dict: + logging.warning(f"Vout locations {list(vout_dict.keys())} have no corresponding Iout") + if vin_dict: + logging.warning(f"Vin locations {list(vin_dict.keys())} have no corresponding Iin") + + if int(chassis_total_power_out) != 0: + sensor_chassis_pout = { + 'location': 'Chassis', + 'reading': chassis_total_power_out, + 'units': 'W', + 'state': 'NA', + 'name': 'Pout' + } + power_sensors.append(sensor_chassis_pout) + else: + logging.debug("Chassis Pout is 0. Skipping sensor data.") + + if int(chassis_total_power_in) != 0: + sensor_chassis_pin = { + 'location': 'Chassis', + 'reading': chassis_total_power_in, + 'units': 'W', + 'state': 'NA', + 'name': 'Pin' + } + power_sensors.append(sensor_chassis_pin) + else: + logging.debug("Chassis Pin is 0. Skipping sensor data.") + + logging.debug(power_sensors) + + return power_sensors + \ No newline at end of file diff --git a/normalisers/cat9300_cli_normaliser.py b/normalisers/cat9300_cli_normaliser.py new file mode 100644 index 0000000..ed619fd --- /dev/null +++ b/normalisers/cat9300_cli_normaliser.py @@ -0,0 +1,172 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import logging +from .iosxe_cli_normaliser import Iosxe_Cli_Normaliser + +class Cat9300_Cli_Normaliser(Iosxe_Cli_Normaliser): + + def __init__(self, customer): + super().__init__(customer) + + def get_commands(self): + return { + "show-inventory": "show inventory", + "show-interfaces": "show interfaces", + "show-ifindex": "show snmp mib ifmib ifindex", + "show-environment": "show environment all", + "show-processes-cpu": "show processes cpu", + "show-memory": "show platform software status control-processor brief" + } + + def normalise(self, sites, device_config, command_data): + return super().normalise(sites, device_config, command_data) + + def _parse_assets(self, command_data): + return super()._parse_assets(command_data) + + def _parse_interfaces(self, command_data): + return super()._parse_interfaces(command_data) + + def _parse_sensors(self, command_data): + sensor_data = [] + sensor_data.extend(self._parse_power_cat9k(command_data)) + sensor_data.extend(self._parse_cpu_textfsm(command_data)) + sensor_data.extend(self._parse_memory_textfsm(command_data)) + sensor_data.extend(self._parse_temperature_textfsm(command_data)) + return sensor_data + + def _parse_power_cat9k(self, command_data): + sensor_data = [] + + show_environment = self._tokenize_fsm(command_data.get('show-environment', ''), + 'catalyst9k_show_env_all.fsm') + logging.debug(show_environment) + + chassis_total_power_out = 0 + chassis_total_power_in = 0 + + for sensor in show_environment: + try: + sensor_reading = float(sensor['READING']) + except: + logging.error(f"Sensor reading {sensor['READING']} is not numerical") + + sensor_location = sensor['NAME'] + + if 'mw' in sensor['UNITS'].lower(): + sensor_reading /= 1000 + sensor_units = 'W' + elif sensor['UNITS'].lower() in ('w', 'watt', 'watts'): + sensor_units = 'W' + else: + logging.debug(f"Skipping sensor {sensor}. Units not in Watts or mW") + continue + + if 'powin' in sensor['SENSOR'].lower(): + sensor_name = 'Pin' + chassis_total_power_in += sensor_reading + elif 'powout' in sensor['SENSOR'].lower(): + sensor_name = 'Pout' + chassis_total_power_out += sensor_reading + else: + logging.debug(f"Skipping sensor {sensor}. Is not POWin or POWout or Power") + continue + + sensor = { + 'location': sensor_location, + 'name': sensor_name, + 'state': sensor['STATE'], + 'reading': sensor_reading, + 'units': sensor_units + } + + if int(chassis_total_power_out) != 0: + sensor_chassis_pout = { + 'location': 'Chassis', + 'reading': chassis_total_power_out, + 'units': 'W', + 'state': 'NA', + 'name': 'Pout' + } + sensor_data.append(sensor_chassis_pout) + else: + logging.debug("Chassis Pout is 0. Skipping sensor data.") + + if int(chassis_total_power_in) != 0: + sensor_chassis_pin = { + 'location': 'Chassis', + 'reading': chassis_total_power_in, + 'units': 'W', + 'state': 'NA', + 'name': 'Pin' + } + sensor_data.append(sensor_chassis_pin) + else: + logging.debug("Chassis Pin is 0. Skipping sensor data.") + + return sensor_data + + def _parse_temperature_textfsm(self, command_data): + logging.info("Parsring Temperature") + + sensor_data = [] + + show_environment = self._tokenize_fsm(command_data.get('show-environment', ''), + 'catalyst9k_show_env_all.fsm') + logging.debug(show_environment) + + + for sensor in show_environment: + try: + sensor_reading = float(sensor['READING']) + except: + logging.error(f"Sensor reading {sensor['READING']} is not numerical") + continue + + sensor_location = sensor['SENSOR'] + if 'inlet' not in sensor_location.lower(): + logging.debug(f"Skipping sensor {sensor}. Is not inlet") + continue + sensor_state = sensor['STATE'] + if sensor_state.lower().strip() in ("normal", "good", "green"): + sensor_state = "Normal" + elif sensor_state.lower().strip() in ("yellow"): + sensor_state = "Warning" + elif sensor_state.lower().strip() in ("red"): + sensor_state = "Critical" + else: + logging.warning(f"Unable to identify Inlet temperature sensor state is '{sensor_state}'") + sensor_state = sensor['STATE'] + + + if 'celsius' in sensor['UNITS'].lower(): + sensor_units = 'Celsius' + else: + logging.warning(f"Unable to identify temperature unit '{sensor['UNITS']}") + sensor_units = sensor['UNITS'] + + sensor_temperature = { + 'location': sensor['SENSOR'], + 'reading': sensor_reading, + 'units': sensor_units, + 'state': sensor_state, + 'name': 'Temp' + } + + sensor_data.append(sensor_temperature) + + return sensor_data \ No newline at end of file diff --git a/normalisers/iosxe_cli_normaliser.py b/normalisers/iosxe_cli_normaliser.py new file mode 100644 index 0000000..5a647ec --- /dev/null +++ b/normalisers/iosxe_cli_normaliser.py @@ -0,0 +1,313 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import logging +import re +from .model import PoweffModel, Asset, Interface, Sensor +from .normaliser import Normaliser + +class Iosxe_Cli_Normaliser(Normaliser): + + def __init__(self, customer): + super().__init__(customer) + + def get_commands(self): + return { + "show-inventory": "show inventory", + "show-interfaces": "show interfaces", + "show-ifindex": "show snmp mib ifmib ifindex", + "show-environment": "show environment", + "show-processes-cpu": "show processes cpu", + "show-memory": "show platform software status control-processor brief" + } + + def normalise(self, sites, device_config, command_data): + + current_device = PoweffModel() + device = device_config['name'] + current_device.set_family(device_config['family']) + + hostname = device + + sitename = device_config['site'] + + try: + logging.info(f"{device} Extracting location data from site {sitename}") + location = sites[sitename] + logging.debug(location) + except: + logging.error(f"{device} Failed to extract location data") + return None + + try: + logging.info(f"{device} Extracting assets") + asset_data = self._parse_assets(command_data) + if len(asset_data) == 0: + raise Exception("Parsing assets returned empty list") + logging.debug(asset_data) + except Exception as e: + logging.error(f"{device} Failed to extract assets. Error Message {e}") + return None + + try: + logging.info(f"{device} Extracting interfaces") + interface_data = self._parse_interfaces(command_data) + if len(interface_data) == 0: + raise Exception("Parsing interfaces returned empty list") + logging.debug(interface_data) + except: + logging.error(f"{device} Failed to extract interfaces") + return None + + try: + logging.info(f"{device} Extracting sensors") + sensor_data = self._parse_sensors(command_data) + if len(sensor_data) == 0: + # do not raise exception because main chassis assets and interfaces might be used later on + logging.warning("Sensor data returned empty list. POWEFF data will still be processed.") + logging.debug(sensor_data) + except Exception as e: + logging.error(f"{device} Failed to extract sensors. Error Message {e}") + return None + + logging.info(f"{device} Building POWEFF Model") + for i in asset_data: + asset = Asset( + pid = i['pid'], + hostname = hostname, + entity = i['entity'], + description = i['description'], + serial = i['serial'], + vid = i['vid'], + slot = i['slot'], + lat = location['Latitude'], + long = location['Longitude'], + site = sitename, + customer = self._customer + ) + current_device.add_asset(asset) + + for i in interface_data: + interface = Interface( + ifname = i['name'], + index = i.get('if-index', ''), + bandwidth = i['bandwidth'], + type=i['interface-type'], + speed = i['speed'], + data_rate_frequency = i['data_rate_frequency'], + input_packet_rate = i['input_packet_rate'], + input_data_rate = i['input_data_rate'], + output_packet_rate = i['output_packet_rate'], + output_data_rate = i['output_data_rate'] + ) + current_device.add_interface(interface) + + for i in sensor_data: + sensor = Sensor( + location = i['location'], + name = i['name'], + state = i['state'], + reading = i['reading'], + units = i['units'] + ) + current_device.add_sensor(sensor) + + try: + poweff_current = current_device.serialise() + except Exception as e: + logging.error(f"{device} Failed to serialize. Error Message {e}") + return None + + self._models.append(poweff_current) + + return self._models + + def _parse_assets(self, command_data): + try: + asset_data = self._parse_inventory_textfsm(command_data) + except: + asset_data = [] + + return asset_data + + def _parse_inventory_textfsm(self, command_data): + show_inventory = self._tokenize_fsm(command_data['show-inventory'], 'iosxe_show_inventory.fsm') + logging.debug(show_inventory) + + asset_data = [] + + for inv in show_inventory: + + params = {'entity': inv['NAME'].strip(), + 'description': inv['DESCR'].strip(), + 'pid': inv['PID'].strip(), + 'serial': inv['SN'].strip(), + 'vid': inv['VID'].strip(), + 'slot': 'None'} + + if params['serial'].lower() in ("N/A", ""): + params['serial'] = "NA" + if params['vid'].lower() in ("N/A", ""): + params['vid'] = "NA" + + asset_data.append(params) + + asset_data[0]['slot'] = 'Chassis' + + return asset_data + + def _parse_interfaces(self, command_data): + tokenized_snmp_interface = self._tokenize_fsm(command_data.get('show-ifindex', ""), 'iosxe_show_snmp_mib_ifmib_ifindex.fsm') + logging.debug(tokenized_snmp_interface) + + interface_data = [] + tokenized = self._tokenize_fsm(command_data.get('show-interfaces', ''), 'iosxe_show_interfaces.fsm') + logging.debug(tokenized) + + for interface_token in tokenized: + interface = {} + name = interface_token["INTERFACE"] + if not self._is_physical_interface(name): + logging.debug(f"Interface {name} is a virtual. Skipping.") + continue + if "up" not in interface_token["LINK_STATUS"]: + logging.debug(f"Interface {name} is down. Skipping") + continue + interface["name"] = name + interface["if-index"] = self._match_ifindex(name, tokenized_snmp_interface) + interface["interface-type"] = interface_token["HARDWARE_TYPE"] + + # units already in Kbit, eg "10000000 Kbit" + bandwidth_match = re.search(r"\d+", interface_token["BANDWIDTH"]) + if bandwidth_match: + interface["bandwidth"] = int(bandwidth_match[0]) + else: + interface["bandwidth"] = 0 + # sample "10 Gb/s", "auto-speed", + duplex_speed_raw = interface_token["SPEED"] + duplex_speed = duplex_speed_raw + if re.search(r"\d+\s?\Sb", duplex_speed_raw): + duplex_speed = int(re.search(r"\d+", duplex_speed_raw)[0]) + if "kb" in duplex_speed_raw.lower(): + pass + elif "mb" in duplex_speed_raw.lower(): + duplex_speed *= 1000 + elif "gb" in duplex_speed_raw.lower(): + duplex_speed *= 1000000 + else: + logging.warn(f"Could not identify Duplex speed units in '{duplex_speed_raw}'. Placing raw extract instead") + duplex_speed = duplex_speed_raw + interface["speed"] = duplex_speed + + try: + bps_to_kbps = 0.001 + interface["input_packet_rate"] = int(interface_token["INPUT_RATE_PPS"]) # Units in packets/s + interface["input_data_rate"] = int(int(interface_token["INPUT_RATE_BPS"]) * bps_to_kbps) # Units in kpbs + interface["output_packet_rate"] = int(interface_token["OUTPUT_RATE_PPS"]) # Units in packets/s + interface["output_data_rate"] = int(int(interface_token["OUTPUT_RATE_BPS"]) * bps_to_kbps) # Units in kpbs + + # sample "30 seconds", "1 minute" + load_interval_raw = interface_token["LOAD_INTERVAL_INPUT"] + load_interval_val = int(re.search(r"\d+", load_interval_raw)[0]) + if "minute" in load_interval_raw: + load_interval_val *= 60 + interface["data_rate_frequency"] = load_interval_val + except: #some interfaces such as loopbacks will not have have these data rates + interface["data_rate_frequency"] = 0 + interface["input_packet_rate"] = 0 + interface["input_data_rate"] = 0 + interface["output_packet_rate"] = 0 + interface["output_data_rate"] = 0 + + interface_data.append(interface) + + return interface_data + + def _parse_sensors(self, command_data): + pass + + + def _parse_cpu_textfsm(self, command_data): + tokenized = self._tokenize_fsm(command_data['show-processes-cpu'], 'iosxe_show_processes_cpu.fsm') + logging.debug(tokenized) + + if len(tokenized) == 0: + logging.warning("CPU textfsm returned empty list. Skipping.") + return [] + elif len(tokenized) > 1: + logging.error("Unexpected behavior: CPU textfsm returned more than one value. Skipping.") + return [] + + try: + cpu_1min = float(tokenized[0]['CPU_1min']) + cpu_5min = float(tokenized[0]['CPU_5min']) + except: + logging.error("Extracted CPU usages not numerical") + return [] + + sensor_cpu_five_min = { + 'location': 'Chassis', + 'reading': cpu_5min, + 'units': 'Percentage', + 'state': 'NA', + 'name': 'CPU-5Min' + } + return [sensor_cpu_five_min] + + def _parse_memory_textfsm(self, command_data): + tokenized = self._tokenize_fsm(command_data['show-memory'], 'iosxe_show_mem.fsm') + logging.debug(tokenized) + + if len(tokenized) == 0: + logging.warning("Memory textfsm returned empty list. Skipping.") + return [] + elif len(tokenized) > 1: + logging.warning("Unexpected behavior: Memory textfsm returned more than one value. Taking only the first value.") + try: + mem_total = int(tokenized[0]['mem_total']) + mem_used = int(tokenized[0]['mem_used']) + mem_free = int(tokenized[0]['mem_free']) + except: + logging.error("Extracted Memory usages not an integer") + return [] + + if abs(mem_free + mem_used - mem_total) > 10: + logging.error("Extracted Memory usages do not add up correctly") + return [] + + sensor_memory = { + 'location': 'Chassis', + 'reading': round(100*(mem_used/mem_total), 2), + 'units': 'Percentage', + 'state': 'NA', + 'name': 'Memory' + } + return [sensor_memory] + + def _parse_temperature_textfsm(self, command_data): + pass + + def _match_ifindex(self, ifname, tokenized): + for i in tokenized: + if ifname == i['IFNAME']: + return i['IFINDEX'] + return "" + + def _is_physical_interface(self, name): + # TODO other cases, if any + if re.search(r'ethernet\s?[\d\/]+|gige\s?[\d\/]+|mgmteth', name.lower()): + return True + return False \ No newline at end of file diff --git a/normalisers/model.py b/normalisers/model.py new file mode 100644 index 0000000..f28a001 --- /dev/null +++ b/normalisers/model.py @@ -0,0 +1,259 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import datetime +import json +import calendar + +class PoweffModel: + """ + Represents POWEFF Specification LMO Type + """ + + def __init__(self): + self._family = '' + self._assets = [] + date = datetime.datetime.utcnow() + self._timestamp = str(calendar.timegm(date.utctimetuple())) + + def __str__(self): + return(json.dumps(self.serialise())) + + def set_family(self, family): + """ + Sets device family + Parameters: + family: device family i.e. ASR1k, ASR9k etc + """ + self._family = family + + def add_asset(self, asset): + """ + Adds assets to the toplevel LMO object + Parameters: + asset: POWEFF Asset object to be be added + """ + self._assets.append(asset) + + def add_interface(self, interface): + """ + Utility method, adds interface to the first asset in the list + Parameters: + interface: POWEFF Interface object to be added + """ + self._assets[0].add_interface(interface) + + def add_sensor(self, sensor): + """ + Utility method, adds sensor to the first asset in the list + Parameters: + sensor: POWEFF Sensor object to be added + """ + self._assets[0].add_sensor(sensor) + + def serialise(self): + """ + Produces JSON representation of the POWEFF model + recursively calling serialise on the constituent assets + Returns: + poweff model in json format + """ + assets = [] + for asset in self._assets: + assets.append(asset.serialise()) + + poweff = { + 'data': { + 'ietf-lmo:lmos': { + 'lmo': { + 'lmo-class': 'ietf-lmo-asset:asset', + 'timestamp': self._timestamp, + 'ietf-susi-asset-ext:device_family': self._family, + 'inst': assets + } + } + } + } + try: + _ = poweff['data']['ietf-lmo:lmos']['lmo']['inst'][0]['ietf-susi-power-traffic:interfaces'] + except: + raise Exception("No Interfaces Found") + try: + _ = poweff['data']['ietf-lmo:lmos']['lmo']['inst'][0]['ietf-susi-power-environment:sensors'] + except: + raise Exception("No Sensors Found") + return poweff + +class Asset: + """ + Represents POWEFF Specification Asset Type + """ + + def __init__(self, **kwargs): + + # set defaults to avoid serialisation errors + self._interfaces = [] + self._sensors = [] + self._pid = kwargs.get('pid', '') + self._vid = kwargs.get('vid', '') + self._hostname = kwargs.get('hostname', '') + self._entity = kwargs.get('entity', '') + self._description = kwargs.get('description', '') + self._serial = kwargs.get('serial', '') + self._status = kwargs.get('status', 'True') + self._slot = kwargs.get('slot', '') + self._lat = kwargs.get('lat', '0.0') + self._long = kwargs.get('long', '0.0') + self._site = kwargs.get('site', '') + self._customer = kwargs.get('customer', '') + + def __str__(self): + return(json.dumps(self.serialise())) + + def add_interface(self, interface): + """ + Adds an interface to this asset + """ + self._interfaces.append(interface) + + def add_sensor(self, sensor): + """ + Adds a sensor to this asset + """ + self._sensors.append(sensor) + + def serialise(self): + """ + Produces JSON representation of the POWEFF asset + recursively calling serialise on the constituent interfaces and sensors + Returns: + poweff model of this asset in json format + """ + poweff = { + 'id': self._pid, + 'parent': { + 'lmo-class': 'ietf-lmo-assets-inventory:asset', + 'id': self._hostname + }, + 'ietf-lmo-assets-inventory:name': self._hostname, + 'ietf-lmo-assets-inventory:pid': self._pid, + 'ietf-lmo-assets-inventory:description': self._description, + 'ietf-lmo-assets-inventory:serial-number': self._serial, + 'ietf-lmo-assets-inventory:entity-name': self._entity, + 'ietf-lmo-assets-inventory:vid': self._vid, + 'ietf-susi-asset-ext:status': self._status, + 'ietf-susi-asset-ext:slot': self._slot, + 'ietf-susi-asset-ext:site': self._site, + 'ietf-lmo-assets-inventory:uid': self._customer + self._pid + self._serial, + 'ietf-lmo-assets-inventory:install-location': { + 'geolocation': { + 'latitude': self._lat, + 'longitude': self._long + } + } + } + + interfaces = [] + for interface in self._interfaces: + interfaces.append(interface.serialise()) + if len(interfaces) > 0: + poweff.setdefault('ietf-susi-power-traffic:interfaces',{}) + poweff['ietf-susi-power-traffic:interfaces']['interface'] = interfaces + sensors = [] + for sensor in self._sensors: + sensors.append(sensor.serialise()) + if len(sensors) > 0: + poweff.setdefault('ietf-susi-power-environment:sensors',{}) + poweff['ietf-susi-power-environment:sensors']['sensors'] = sensors + + return poweff + +class Interface: + """ + Represents POWEFF Specification Interface Type + """ + + def __init__(self, **kwargs): + + # set defaults to avoid serialisation errors + self._name = kwargs.get('ifname') + self._index = kwargs.get('index', '') + self._id = kwargs.get('id', '') + self._type = kwargs.get('type', '') + self._bandwidth = kwargs.get('bandwidth', 0) + self._speed = kwargs.get('speed', 0) + self._input_packet_rate = kwargs.get('input_packet_rate', 0) + self._input_data_rate = kwargs.get('input_data_rate', 0) + self._output_packet_rate = kwargs.get('output_packet_rate', 0) + self._output_data_rate = kwargs.get('output_data_rate', 0) + self._data_rate_frequency = kwargs.get('data_rate_frequency', 0) + + def __str__(self): + return(json.dumps(self.serialise())) + + def serialise(self): + """ + Produces JSON representation of the POWEFF interface + Returns: + poweff model of this interface in json format + """ + poweff = { + 'name': self._name, + 'if-index': self._index, + 'interface-type': self._type, + 'bandwidth': self._bandwidth, + 'speed': self._speed, + 'data-rate-frequency': self._data_rate_frequency, + 'statistics': { + 'input-data-rate': self._input_data_rate, + 'input-packet-rate': self._input_packet_rate, + 'output-data-rate': self._output_data_rate, + 'output-packet-rate': self._output_packet_rate + } + } + return poweff + +class Sensor: + """ + Represents POWEFF Specification Sensor Type + """ + + def __init__(self, **kwargs): + + # update from args, else set defaults + self._location = kwargs.get('location', '') + self._name = kwargs.get('name', '') + self._state = kwargs.get('state', '') + self._reading = float(kwargs.get('reading', '0.0')) + self._units = kwargs.get('units', '') + + def __str__(self): + return(json.dumps(self.serialise())) + + def serialise(self): + """ + Produces JSON representation of the POWEFF sensor + Returns: + poweff model of this sensor in json format + """ + poweff = { + 'sensor-location': self._location, + 'sensor-current-reading': self._reading, + 'sensor-units': self._units, + 'sensor-state': self._state, + 'sensor-name': self._name + } + return poweff diff --git a/normalisers/normaliser.py b/normalisers/normaliser.py new file mode 100644 index 0000000..bb8572b --- /dev/null +++ b/normalisers/normaliser.py @@ -0,0 +1,47 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import logging + +class Normaliser: + ''' + Abstract base class for device type and access protocol specific Normalisers + Subclasses must implement normalise() method + ''' + + def __init__(self, customer): + self._models = [] + self._customer = customer + + def normalise(self, sites, device_config, command_data): + pass + + def _tokenize_fsm(self, data, filename): + import os + import textfsm + + fsm_file = os.path.join(os.path.dirname(__file__), 'textfsm_templates', filename) + logging.debug(f"Textfsm file in {fsm_file}") + with open(fsm_file) as template: + fsm = textfsm.TextFSM(template) + try: + result = fsm.ParseText(data) + logging.debug(result) + parsed = [dict(zip(fsm.header,i)) for i in result] + except Exception as inst: + logging.error(inst) + parsed = [] + return parsed diff --git a/normalisers/normaliser_factory.py b/normalisers/normaliser_factory.py new file mode 100644 index 0000000..132d3a0 --- /dev/null +++ b/normalisers/normaliser_factory.py @@ -0,0 +1,44 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +from .asr1k_cli_normaliser import Asr1k_Cli_Normaliser +from .cat9300_cli_normaliser import Cat9300_Cli_Normaliser + +def get_normaliser(task_config): + + """ + Given device os and connection protocol, returns instance of suitable Normaliser + Parameters: + task_config: collection task config dict including os_type and connection + Returns: + Instance of suitable Normaliser class + """ + + conn_type = task_config['device'].get('connection') + family = task_config['device'].get('family') + customer = task_config['customer']['name'] + + if (conn_type in ('ssh', 'cspc', 'radkit')): + if family == 'ASR1k' : + return Asr1k_Cli_Normaliser(customer) + elif family == 'Cat9300': + return Cat9300_Cli_Normaliser(customer) + else: + None + else: + # Should never reach this line + # Supported combinations must be validated in Inventory Yaml + None diff --git a/normalisers/textfsm_templates/asr1k_show_environment.fsm b/normalisers/textfsm_templates/asr1k_show_environment.fsm new file mode 100644 index 0000000..4894e7e --- /dev/null +++ b/normalisers/textfsm_templates/asr1k_show_environment.fsm @@ -0,0 +1,9 @@ +Value SLOT (\S+) +Value SENSOR (\S+|\S+\s\S+|\S+\s\S+\s\S+|\S+\s\S+\s\S+\s\S+) +Value STATE (\S+|\S+\s\S+|\S+\s\S+\s\S+|\S+\s\S+\s\S+\s\S+) +Value READING ([-+]?\d*\.\d+|\d+) +Value UNITS (\S+|\S+\s\S+|\S+\s\S+\s\S+) + +Start + ^\s*${SLOT}\s{2,}${SENSOR}\s{2,}${STATE}\s{2,}${READING}\s*${UNITS} -> Record + diff --git a/normalisers/textfsm_templates/catalyst9k_show_env_all.fsm b/normalisers/textfsm_templates/catalyst9k_show_env_all.fsm new file mode 100644 index 0000000..1e5d812 --- /dev/null +++ b/normalisers/textfsm_templates/catalyst9k_show_env_all.fsm @@ -0,0 +1,9 @@ +Value NAME (\S+) +Value SENSOR (\S+) +Value LOCATION (\S+) +Value STATE (\S+) +Value READING (\d*\.\d+|\d+) +Value UNITS (\S+) + +Start + ^\s*${NAME}\s+${SENSOR}\s+${LOCATION}\s+${STATE}\s+${READING}\s*${UNITS} -> Record diff --git a/normalisers/textfsm_templates/iosxe_show_interfaces.fsm b/normalisers/textfsm_templates/iosxe_show_interfaces.fsm new file mode 100644 index 0000000..2edf4be --- /dev/null +++ b/normalisers/textfsm_templates/iosxe_show_interfaces.fsm @@ -0,0 +1,67 @@ +Value Required INTERFACE (\S+) +Value LINK_STATUS (.+?) +Value PROTOCOL_STATUS (.+?) +Value HARDWARE_TYPE ([\w\-\s]+) +Value MAC_ADDRESS ([a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}) +Value BIA ([a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}) +Value DESCRIPTION (.+?) +Value IP_ADDRESS (\d+\.\d+\.\d+\.\d+) +Value PREFIX_LENGTH (\d+) +Value MTU (\d+) +Value DUPLEX (([Ff]ull|[Aa]uto|[Hh]alf|[Aa]-).*?) +Value SPEED (.*?) +Value MEDIA_TYPE (\S+.*) +Value BANDWIDTH (\d+\s+\w+) +Value DELAY (\d+\s+\S+) +Value ENCAPSULATION (.+?) +Value LAST_INPUT (.+?) +Value LAST_OUTPUT (.+?) +Value LAST_OUTPUT_HANG (.+?) +Value QUEUE_STRATEGY (.+) +Value LOAD_INTERVAL_INPUT (\d+\sminutes?|\d+\sseconds?) +Value INPUT_RATE_BPS (\d+) +Value INPUT_RATE_PPS (\d+) +Value LOAD_INTERVAL_OUTPUT (\d+\sminutes?|\d+\sseconds?) +Value OUTPUT_RATE_BPS (\d+) +Value OUTPUT_RATE_PPS (\d+) +Value INPUT_PACKETS (\d+) +Value OUTPUT_PACKETS (\d+) +Value RUNTS (\d+) +Value GIANTS (\d+) +Value INPUT_ERRORS (\d+) +Value CRC (\d+) +Value FRAME (\d+) +Value OVERRUN (\d+) +Value ABORT (\d+) +Value OUTPUT_ERRORS (\d+) +Value VLAN_ID (\d+) +Value VLAN_ID_INNER (\d+) +Value VLAN_ID_OUTER (\d+) + +Start + ^\S+\s+is\s+.+?,\s+line\s+protocol.*$$ -> Continue.Record + ^${INTERFACE}\s+is\s+${LINK_STATUS},\s+line\s+protocol\s+is\s+${PROTOCOL_STATUS}\s*$$ + ^\s+Hardware\s+is\s+${HARDWARE_TYPE} -> Continue + ^.+address\s+is\s+${MAC_ADDRESS}\s+\(bia\s+${BIA}\)\s*$$ + ^\s+Description:\s+${DESCRIPTION}\s*$$ + ^\s+Internet\s+address\s+is\s+${IP_ADDRESS}\/${PREFIX_LENGTH}\s*$$ + ^\s+MTU\s+${MTU}.*BW\s+${BANDWIDTH}.*DLY\s+${DELAY},\s*$$ + ^\s+Encapsulation\s+${ENCAPSULATION}, Vlan ID\s+${VLAN_ID}.+$$ + ^\s+Encapsulation\s+${ENCAPSULATION}, outer ID\s+${VLAN_ID_OUTER}, inner ID\s+${VLAN_ID_INNER}.+$$ + ^\s+Encapsulation\s+${ENCAPSULATION},.+$$ + ^\s+Last\s+input\s+${LAST_INPUT},\s+output\s+${LAST_OUTPUT},\s+output\s+hang\s+${LAST_OUTPUT_HANG}\s*$$ + ^\s+Queueing\s+strategy:\s+${QUEUE_STRATEGY}\s*$$ + ^\s+${DUPLEX},\s+${SPEED},.+media\stype\sis\s${MEDIA_TYPE}$$ + ^\s+${DUPLEX},\s+${SPEED},.+TX/FX$$ + ^\s+${DUPLEX},\s+${SPEED}$$ + ^\s+${LOAD_INTERVAL_INPUT}\sinput\s+rate\s+${INPUT_RATE_BPS}\s+\w+/sec,\s+${INPUT_RATE_PPS}\s+packets.+$$ + ^\s+${LOAD_INTERVAL_OUTPUT}\soutput\s+rate\s+${OUTPUT_RATE_BPS}\s+\w+/sec,\s+${OUTPUT_RATE_PPS}\s+packets.+$$ + ^\s+${INPUT_PACKETS}\s+packets\s+input,\s+\d+\s+bytes,\s+\d+\s+no\s+buffer\s*$$ + ^\s+${RUNTS}\s+runts,\s+${GIANTS}\s+giants,\s+\d+\s+throttles\s*$$ + ^\s+${INPUT_ERRORS}\s+input\s+errors,\s+${CRC}\s+CRC,\s+${FRAME}\s+frame,\s+${OVERRUN}\s+overrun,\s+\d+\s+ignored\s*$$ + ^\s+${INPUT_ERRORS}\s+input\s+errors,\s+${CRC}\s+CRC,\s+${FRAME}\s+frame,\s+${OVERRUN}\s+overrun,\s+\d+\s+ignored,\s+${ABORT}\s+abort\s*$$ + ^\s+${OUTPUT_PACKETS}\s+packets\s+output,\s+\d+\s+bytes,\s+\d+\s+underruns\s*$$ + ^\s+${OUTPUT_ERRORS}\s+output\s+errors,\s+\d+\s+collisions,\s+\d+\s+interface\s+resets\s*$$ + # Capture time-stamp if vty line has command time-stamping turned on + ^Load\s+for\s+ + ^Time\s+source\s+is diff --git a/normalisers/textfsm_templates/iosxe_show_inventory.fsm b/normalisers/textfsm_templates/iosxe_show_inventory.fsm new file mode 100644 index 0000000..640574d --- /dev/null +++ b/normalisers/textfsm_templates/iosxe_show_inventory.fsm @@ -0,0 +1,20 @@ +Value NAME (.*) +Value DESCR (.*) +Value PID (([\S+]+|.*)) +Value VID (.*) +Value SN ([\w+\d+\/]+) + +Start + ^NAME:\s+"${NAME}",\s+DESCR:\s+"${DESCR}" + ^PID:\s+${PID}.*,.*VID:\s+${VID},.*SN:\s+${SN} -> Record + ^PID:\s+,.*VID:\s+${VID},.*SN: -> Record + ^PID:\s+${PID}.*,.*VID:\s+${VID},.*SN: -> Record + ^PID:\s+,.*VID:\s+${VID},.*SN:\s+${SN} -> Record + ^PID:\s+${PID}.*,.*VID:\s+${VID}.* + ^PID:\s+,.*VID:\s+${VID}.* + ^.*SN:\s+${SN} -> Record + ^.*SN: -> Record + # Capture time-stamp if vty line has command time-stamping turned on + ^Load\s+for\s+ + ^Time\s+source\s+is + diff --git a/normalisers/textfsm_templates/iosxe_show_mem.fsm b/normalisers/textfsm_templates/iosxe_show_mem.fsm new file mode 100644 index 0000000..b64b61b --- /dev/null +++ b/normalisers/textfsm_templates/iosxe_show_mem.fsm @@ -0,0 +1,8 @@ +Value slot (\S+) +Value status (\S+) +Value mem_total (\d+.?\d*) +Value mem_used (\d+.?\d*) +Value mem_free (\d+.?\d*) + +Start + ^\s*${slot}\s*${status}\s*${mem_total}\s*${mem_used}\s*\(\d+\%\)\s*${mem_free}\s*\(\d+\%\)\s* -> Next.Record diff --git a/normalisers/textfsm_templates/iosxe_show_processes_cpu.fsm b/normalisers/textfsm_templates/iosxe_show_processes_cpu.fsm new file mode 100644 index 0000000..7185b70 --- /dev/null +++ b/normalisers/textfsm_templates/iosxe_show_processes_cpu.fsm @@ -0,0 +1,5 @@ +Value CPU_1min (\d+.?\d*) +Value CPU_5min (\d+.?\d*) + +Start + ^\s*CPU\sutilization\sfor\sfive\sseconds:\s?\S+\s?one\sminute:\s?${CPU_1min}\%;\sfive\sminutes:\s?${CPU_5min}\% -> Next.Record diff --git a/normalisers/textfsm_templates/iosxe_show_snmp_mib_ifmib_ifindex.fsm b/normalisers/textfsm_templates/iosxe_show_snmp_mib_ifmib_ifindex.fsm new file mode 100644 index 0000000..390cf9e --- /dev/null +++ b/normalisers/textfsm_templates/iosxe_show_snmp_mib_ifmib_ifindex.fsm @@ -0,0 +1,6 @@ +Value IFNAME (\S+) +Value IFINDEX (\d+) + +Start + ^\s*${IFNAME}:\s*Ifindex\s*=\s*${IFINDEX} -> Record + diff --git a/processor/energymap_proxy.py b/processor/energymap_proxy.py new file mode 100644 index 0000000..c7af7e1 --- /dev/null +++ b/processor/energymap_proxy.py @@ -0,0 +1,65 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import json +import os +import requests +import time +from utils.applog import logger + +# Caches CO2 data for a location +# dict of (lat, long) and (timestamp, co2intensity) +co2_intensity_cache = {} + +def get_co2_intensity(device, lat,long): + + # EnergyMap URL and API keys + energymap = os.environ.get('ENERGYMAP_API', 'https://api.electricitymap.org/') + api_key = os.environ.get('ENERGYMAP_KEY', '') + + if not api_key: + logger.info("Energymap API key not given. Skipping") + return None + + # fetch co2intensity for the given (lat, long), if already exists + # if the cached value is less than 1hr old, reuse + record = co2_intensity_cache.get((lat, long)) + if record and time.time() - record[0] < 360: + logger.debug(f"{device} returning from cache") + return record[1] + + # Else, fetch the co2intensity again + try: + response = requests.get( + url = f'{energymap}/v3/carbon-intensity/latest?lat={lat}&lon={long}&emissionFactorType=direct', + headers = { "auth-token": api_key }, + verify = True, + timeout = 15) + if response.status_code != 200: + logger.error(f"{device} Failed to fetch co2 emission data {response.text}") + return None + else: + payload = json.loads(response.text) + logger.debug(f"{device} payload") + co2_intensity = payload['carbonIntensity'] + # update cache + co2_intensity_cache[(lat, long)] = (time.time(), co2_intensity) + return co2_intensity + + except Exception as e: + logger.error(f"{device} Failed to fetch report data {e}") + return None + diff --git a/processor/poweff_helper.py b/processor/poweff_helper.py new file mode 100644 index 0000000..09d3e7c --- /dev/null +++ b/processor/poweff_helper.py @@ -0,0 +1,312 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import re +from datetime import datetime +from utils import dbcon +from utils.applog import logger + +def process_assets(customer, device, poweff): + """ + Process assets from Poweff and insert into database + Parameters: + customer: customer name + device: device hostname + poweff: Referene to "lmo" object in POWEFF payload + Returns: + on success: array of assets in the form + [ + { + 'hostname': device name + 'serial': serial key, may include empty '' + 'pid': string, product ID + } + ] + on error: empty [] + """ + assets = [] + for i in poweff['inst']: + serial = i["ietf-lmo-assets-inventory:serial-number"].strip() + pid = i["ietf-lmo-assets-inventory:pid"].strip() + + if pid: + assets.append(dict([ + ('hostname', device), + ('serial', serial), + ('pid', pid) + ])) + + if assets: + dbcon.insert_assets(customer, device, assets) + + return assets + + +def process_interfaces(customer, device, poweff): + """ + Process interfaces from Poweff and insert into database + Parameters: + customer: customer name + device: device hostname + poweff: Referene to "lmo" object in POWEFF payload + Returns: + on success: array of assets in the form + [ + { + 'timestamp': timestamp with timezone + 'hostname': device name + 'ifname': integer, power input in watts + 'bandwidth': integer, interface bandwidth in Kbps + 'traffic_in': integer, total incoming traffic in Kbps + 'traffic_out': integer, total outgoinf traffic in Kbps + 'utilization': integer, psu efficiency in percentage + } + ] + on error: empty [] + """ + # As per POWEFF spec, interfaces are only in first asset + metrics = [] + for i in poweff['inst'][0]['ietf-susi-power-traffic:interfaces']['interface']: + # TODO: Below two filters probably moved to Tooling + # Skip loopback, virtual interfaces etc + if re.search(r'\.\d+$|^Loopback|^Port-channel|^Vlan|^mgmt|^Po|^Tunnel|^Bundle', i['name'], re.IGNORECASE): + continue + # Some old interfaces are reported with 0 bandwith + if i['bandwidth'] == 0: + continue + + metrics.append(dict([ + ('timestamp', datetime.fromtimestamp(int(poweff['timestamp']))), + ('hostname', device), + ('ifname', i['name']), + ('bandwidth', i['bandwidth']), + ('traffic_in', i['statistics']['input-data-rate']), + ('traffic_out', i['statistics']['output-data-rate']), + ('utilization', (i['statistics']['input-data-rate'] + + i['statistics']['output-data-rate']) * 100 / i['bandwidth']) + ])) + + logger.debug(metrics) + if metrics: + dbcon.insert_ifmetrics(customer, device, metrics) + + return metrics + + +def process_sensors(customer, device, poweff): + """ + Process sensors from Poweff and insert into database + Parameters: + customer: customer name + device: device hostname + poweff: Referene to "lmo" object in POWEFF payload + Returns: + on success: array of psu and system vital metrics + PSU metrics as, + [ + { + 'timestamp': timestamp with timezone + 'hostname': device name + 'power_in': integer, input power in watts + 'power_out': integer, output power in watts + 'power_efficiency': integer, psu efficiency in percentage + } + ] + system vitals as, + { + 'temperature': temperature status -1 unknown, 0 normal, 1 warning, 2 critical + 'cpu_usage': -1 unknown, 0 - 100% otherwise + 'memory_usage': -1 unknown, 0 - 100% otherwise + } + """ + + # Define temperature levels + temperatures = {"Unknown": -1, "Normal": 0, "Warning": 1, "Critical": 2} + # Initialise sensors to defaults + vitals = {'cpu_usage': -1, 'memory_usage': -1, 'temperature': -1} + psus = {} + + # Capture values of CPU, Memory and Power sensors + vitals['temperature'] = -1 + for i in poweff['inst'][0]['ietf-susi-power-environment:sensors']['sensors']: + if i['sensor-name'] in ['Pin', 'Pout', 'Vin', 'Vout', 'Iin', 'Iout']: + psus[i['sensor-location']] = psus.get(i['sensor-location'], {}) + psus[i['sensor-location']][i['sensor-name'] + ] = i['sensor-current-reading'] + elif i['sensor-name'] == 'CPU-5Min': + vitals['cpu_usage'] = i['sensor-current-reading'] + elif i['sensor-name'] == 'Memory': + vitals['memory_usage'] = i['sensor-current-reading'] + # Among the many temperature sensors, capture the highest one + elif i['sensor-units'] == 'Celsius': + level = temperatures.get(i['sensor-state'], -1) + if vitals['temperature'] < level: + vitals['temperature'] = level + else: + # Ignore all other sensors for now + pass + + # initialise psu metrics + metrics = [] + for k, v in psus.items(): + d = dict([ + ('timestamp', datetime.fromtimestamp( + int(poweff['timestamp']))), + ('hostname', device), + ('psuname', k) + ]) + + # Devices like ASR1k report only Voltage and Current + # Calculate Power as, + # P = Vrms * Irms (for AC) or V * I (for DC) + # This device specific behaviour to be moved to Collector? + if 'Vin' in v and 'Iin' in v: + v['Pin'] = v['Vin'] * v['Iin'] + if 'Vout' in v and 'Iout' in v: + v['Pout'] = v['Vout'] * v['Iout'] + logger.debug(v) + + # If both Pin and Pout are available, then all good + # Else assume 88% efficiency and then calculate the other + # TODO: read efficiency from PSU specs + if 'Pin' in v and 'Pout' in v: + d['power_in'] = v['Pin'] + d['power_out'] = v['Pout'] + d['power_efficiency'] = 0 if ( + v['Pin'] == 0) else int(v['Pout'] * 100/v['Pin']) + elif 'Pin' in v: + d['power_in'] = v['Pin'] + d['power_out'] = 0.88 * v['Pin'] + d['power_efficiency'] = 88 + elif 'Pout' in v: + d['power_out'] = v['Pout'] + d['power_in'] = v['Pout'] / 0.88 + d['power_efficiency'] = 88 + else: + logger.warning('No power measurements found') + continue + metrics.append(d) + + logger.debug(metrics) + logger.debug(vitals) + if metrics: + dbcon.insert_psumetrics(customer, device, metrics) + + return metrics, vitals + + +def process_psus(device, assets): + """ + Process reported assets on the device to find PSUs + Parameters: + hostname: device hostname + assets: Assets reported on the device, a list in the format + [ + { + 'hostname': device name + 'serial': serial key, may include empty '' + 'pid': string, product ID + } + ] + Returns: + on success: power available as sum nominal output power from all PSUs + on failure: 0 + """ + + ''' + Use below sample assets data to trace the code + [ {'hostname': '192.37.62.134', 'serial': 'SSI15010A28', 'pid': 'N2K-C2248TP-1GE'}, + {'hostname': '192.37.62.134', 'serial': 'SSI142501FV', 'pid': 'N2K-C2248TP-1GE'}, + {'hostname': '192.37.62.134', 'serial': 'FDO23491DSD', 'pid': 'N9K-C93180YC-EX'}, + {'hostname': '192.37.62.134', 'serial': 'FDO23491DSD', 'pid': 'N9K-C93180YC-EX'}, + {'hostname': '192.37.62.134', 'serial': 'DCC234040BE', 'pid': 'NXA-PAC-650W-PE'}, + {'hostname': '192.37.62.134', 'serial': 'DCC234040B0', 'pid': 'NXA-PAC-650W-PE'}, + {'hostname': '192.37.62.134', 'serial': 'N/A','pid': 'NXA-FAN-30CFM-F'}, + {'hostname': '192.37.62.134', 'serial': 'N/A', 'pid': 'NXA-FAN-30CFM-F'}, + {'hostname': '192.37.62.134', 'serial': 'N/A', 'pid': 'NXA-FAN-30CFM-F'}, + {'hostname': '192.37.62.134', 'serial': 'N/A', 'pid': 'NXA-FAN-30CFM-F'}, + {'hostname': '192.37.62.134', 'serial': 'JAF1430AKLK', 'pid': 'N2K-C2248TP-1GE'}, + {'hostname': '192.37.62.134', 'serial': 'N/A', 'pid': 'N2K-C2248-FAN'}, + {'hostname': '192.37.62.134', 'serial': 'LIT143607RK', 'pid': 'N2200-PAC-400W'}, + {'hostname': '192.37.62.134', 'serial': 'LIT143607XP', 'pid': 'N2200-PAC-400W'}, + {'hostname': '192.37.62.134', 'serial': 'JAF1505CFHK', 'pid': 'N2K-C2248TP-1GE'}, + {'hostname': '192.37.62.134', 'serial': 'N/A', 'pid': 'N2K-C2248-FAN'}, + {'hostname': '192.37.62.134', 'serial': 'DTN1832PBFM', 'pid': 'N2200-PAC-400W'}, + {'hostname': '192.37.62.134', 'serial': 'LIT142829HC', 'pid': 'N2200-PAC-400W'} + ] + ''' + # Exract all PIDs from the assets + pids = [i['pid'] for i in assets] + ''' + pids = ['N2K-C2248TP-1GE', 'N2K-C2248TP-1GE', 'N9K-C93180YC-EX', 'N9K-C93180YC-EX', + 'NXA-PAC-650W-PE', 'NXA-PAC-650W-PE', 'NXA-FAN-30CFM-F', 'NXA-FAN-30CFM-F', + 'NXA-FAN-30CFM-F', 'NXA-FAN-30CFM-F', 'N2K-C2248TP-1GE', 'N2K-C2248-FAN', + 'N2200-PAC-400W', 'N2200-PAC-400W', 'N2K-C2248TP-1GE', 'N2K-C2248-FAN', + 'N2200-PAC-400W', 'N2200-PAC-400W'] + ''' + + # Lookup power specification for these PIDs in the DB + psu_specs = dbcon.fetch_psu_specs(device, pids) + ''' + Of the given PIDs, say only one is in the DB + [{'pid': 'NXA-PAC-650W-PE', 'nominal_power': 650, 'available_power': 598, 'efficiency': 92}] + ''' + # Extract available_power from the DB result + psu_avl = {i['pid']: i['available_power'] for i in psu_specs} + ''' + psu_avl = {'NXA-PAC-650W-PE': 598} + ''' + + # DB results need further processing, for two cases: + # 1. While device may have two or more PSUs of the type i.e.PID, + # DB result would only contain one. In the example, device has two "NXA-PAC-650W-PE" + # 2. Some PSUs may not have been added to the DB at all + # device has four N2200-PAC-400W which is not in the DB yet + power_total = 0 + # loop over device PIDs + for pid in pids: + # match with DB result + power_avl = psu_avl.get(pid, 0) + + # if not found i.e. 2nd case above, use regex to try extracting power rating from the PID itself + ''' + consider NXA-PAC-650W-PE, N2200-PAC-400W, N77-AC-3KW and N7K-AC-7.5KW-INT + ''' + if power_avl == 0: + match = re.search(r"(\d+\.*\d*)KW", pid) + if match: + # Units in KW e.g. N77-AC-3KW and N7K-AC-7.5KW-INT + power_avl = int(float(match.group(1)) * 1000) + else: + match = re.search(r"(\d+)W", pid) + if match: + # Units in W e.g. NXA-PAC-650W-PE, N2200-PAC-400W + power_avl = int(match.group(1)) + else: + # No match, may not be PSU PID + power_avl = 0 + + if power_avl != 0: + logger.warn(f"{device} PSU specs not found for {pid}, assumed Pout {power_avl}W") + + # add to available power + ''' + In this example, 650 + 650 + 400 + 400 + 400 + 400 = 2900 + ''' + power_total += power_avl + + logger.debug (power_total) + return power_total diff --git a/processor/processor.py b/processor/processor.py new file mode 100644 index 0000000..d0d2ac6 --- /dev/null +++ b/processor/processor.py @@ -0,0 +1,133 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import json +import os +import sys +from datetime import datetime +import energymap_proxy +import poweff_helper as helper +from utils import messaging, dbcon +from utils.applog import logconfig, logger + +def main(): + + # Start with a baseline logger level + logconfig(level='INFO') + collections_topic = os.environ.get('COLLECTIONS_TOPIC', 'collections') + + # Connect to DB + try: + dbcon.connect() + except Exception as e: + logger.critical(f"Failed connecting to database {e}") + sys.exit(1) + + logger.info(f"Waiting for POWEFF metric payloads") + + # Run event loop forever, waking up to receive POWEFF tasks through messaging + try: + while True: + payload = messaging.consume(collections_topic, 'processor') + task_config = json.loads(payload) + customer = task_config['customer']['name'] + device = task_config['device']['name'] + loglevel = task_config['loglevel']['console'] + + # Reconfigure logformat to include customer name and desired loglevel + logconfig(customer, loglevel) + + # Locate root level in each POWEFF entry and start processing + # Collector *always* pushes valid payload as per POWEFF schema + # So this json key traversal is safe enough + # But values are filled at runtime and need to validated + for poweff in task_config['poweff']: + + root = poweff["data"]["ietf-lmo:lmos"]["lmo"] + site = root['inst'][0]["ietf-susi-asset-ext:site"] + device = root['inst'][0]['ietf-lmo-assets-inventory:name'] + family = root['ietf-susi-asset-ext:device_family'] + + # Process assets, interfaces and sensors from POWEFF + logger.info(f"{device} processing energy metrics") + assets = helper.process_assets(customer, device, root) + ifaces = helper.process_interfaces(customer, device, root) + powers, vitals = helper.process_sensors(customer, device, root) + + # Initialise all metrics with default values + metrics = { + 'timestamp': datetime.fromtimestamp(int(root['timestamp'])), + 'site': site, + 'hostname': device, + 'family': family, + 'power_in': 0, + 'power_out': 0, + 'power_efficiency': 0, + 'power_available': 0, + 'power_utilization': 0, + 'traffic_in': 0, + 'traffic_out': 0, + 'traffic_efficiency': 0, + 'temperature': vitals.get('temperature', -1), + 'cpu_usage': vitals.get('cpu_usage', -1), + 'memory_usage': vitals.get('memory_usage', -1), + 'co2_intensity': 0 + } + + # Fill in power metrics + for i in powers: + metrics['power_in'] += i['power_in'] + metrics['power_out'] += i['power_out'] + metrics['power_efficiency'] = 0 if (metrics['power_in'] == 0) else int( + metrics['power_out'] * 100/metrics['power_in']) + metrics['power_available'] = helper.process_psus(device, assets) + + metrics['power_utilization'] = 0 if (metrics['power_available'] == 0) else int( + metrics['power_in'] * 100/metrics['power_available']) + + # Fill in traffic data + for i in ifaces: + metrics['traffic_in'] += i['traffic_in'] + metrics['traffic_out'] += i['traffic_out'] + # Traffic in and out are in Kbps, Total traffic in Gbps + total_traffic = ( + metrics['traffic_in'] + metrics['traffic_out'])/1000000 + metrics['traffic_efficiency'] = 0 if ( + total_traffic == 0) else int(metrics['power_in']/total_traffic) + lat = root['inst'][0]['ietf-lmo-assets-inventory:install-location']['geolocation']['latitude'] + long = root['inst'][0]['ietf-lmo-assets-inventory:install-location']['geolocation']['longitude'] + co2_intensity = energymap_proxy.get_co2_intensity(device, lat, long) + if co2_intensity: + metrics['co2_intensity'] = co2_intensity + elif 'avg_co2_intensity' in task_config['sites'][site]: + metrics['co2_intensity'] = int(task_config['sites'][site]['avg_co2_intensity']) + logger.info(f'{device} Using default CO2 intensity from config file instead') + else: + logger.warning(f'{device} No default CO2 intensity on site {site} of config file. CO2 intensity will be set to 0.') + + # Write record to DB + logger.debug(metrics) + dbcon.insert_powermetrics(customer, device, metrics) + + logger.info(f"{device} completed energy and sustainability calculations") + + except KeyboardInterrupt as e: + logger.info(f"Interrupt received, shutting down...") + messaging.shutdown() + sys.exit(0) + +if __name__ == '__main__': + main() diff --git a/processor/requirements.txt b/processor/requirements.txt new file mode 100644 index 0000000..4fbdaad --- /dev/null +++ b/processor/requirements.txt @@ -0,0 +1,4 @@ +confluent_kafka==2.2.0 +cryptography==41.0.1 +psycopg2-binary==2.9.9 +Requests==2.31.0 diff --git a/scheduler/configurator.py b/scheduler/configurator.py new file mode 100644 index 0000000..050f45f --- /dev/null +++ b/scheduler/configurator.py @@ -0,0 +1,168 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import json +import jsonschema +import ruamel.yaml +from utils import secrets +from utils.applog import logconfig, logger +from dateutil import tz + +# Application configuration dict loaded from './config.yaml' +_config = {} + +def initialise(): + """ + Loads and validates configuration and validates agaisnt schema + Encrypts secrets like device password on first load + Schema file location is fixed to ./schema.json + Config file location is fixed to ./config.yaml + Parameters: + None + Returns: + None, use get_config to fetch configuration properties + """ + global _config + + # Start with a baseline logger level + logconfig() + + # Load schema, config from files, and validate + # These can throw exceptions that are propapated up + schema = _load_schema('schema.json') + _config = _load_config('config.yaml') + _validate_config(schema, _config) + + # Now reconfigure logger to user desired level for rest of the application logger + logconfig(customer = 'metrics', level = _config['loglevel'].get('console')) + + # Flag to indicate, whether config file needs to be updated + changed = False + + # Encrypt device credentials, if not done already + # If password does not exist (as in cspc/mimir/radkit connection) skip + # If password exists, but key does not exist, then encrypt + for d in _config['devices'].keys(): + device_config = _config['devices'][d] + password = device_config.get('password') + key = device_config.get('key') + if password is None: + continue + elif key is None: + device_config['password'], device_config['key'] = secrets.encrypt( + password) + changed = True + + # Update config file, if passwords got updated + if changed: + logger.info(f"Updating application configuration") + _update_config('config.yaml', _config) + else: + logger.info(f"Loaded application configurations") + +def _load_schema(schema_json): + """ + Loads json schema describing the application configuration + Subsequent code can assume successful validation + Parameters: + schema_json (string): schema file path, normally ./schema.json + Returns: + schema (dict): loaded json schema dict + Raises an exception on failure + """ + try: + with open(schema_json, 'r') as f: + schema = json.loads(f.read()) + except Exception as e: + logger.critical(f"Failed to load configuration schema {e}") + raise e + return schema + +def _load_config(config_yaml): + """ + Loads application configuration file in YAML format + Parameters: + config_yaml (string): config file path, normally ./config.yaml + Returns: + config (dict): app configuration, yet to be validated + Raises an exception on failure + """ + try: + with open(config_yaml, 'r') as f: + yaml = ruamel.yaml.YAML() + config = yaml.load(f) + except Exception as e: + logger.critical(f"Failed to load configuration file {e}") + raise e + return config + +def _validate_config(schema, config): + """ + Validates configuration against schema to ensure mandatory properties are present and in correct format + Parameters: + schema (dict): json schema + config (dict): app configuration to be validated + Returns: + True on success + Raises an exception on failure + """ + validator = jsonschema.Draft7Validator(schema, format_checker = jsonschema.FormatChecker()) + try: + validator.validate(config, schema) + except Exception as e: + logger.error(f"Validation failed for configuration file: {e}") + raise e + for sitename, value in config['sites'].items(): + if not tz.gettz(value['Timezone']): + raise Exception(f"Invalid Timezone '{value['Timezone']}' for site '{sitename}'") + + return True + +def _update_config(config_yaml, config): + """ + Updates application configuration with latest contents of config dict + This is called to write updated password + Parameters: + config_yaml (string): Config file path, normally ./config.yaml + config (dict): Application configuration to write + Returns: + True on success + Raises an exception on failure + """ + try: + with open(config_yaml, 'w') as f: + yaml = ruamel.yaml.YAML() + yaml.dump(config, f) + except Exception as e: + logger.error(f"Failed to update configuration file {e}") + raise e + return True + + +def get_config(section): + """ + Returns a named section in the configuration + Parameters: + section (string): Top level config section name 'customer', 'report', 'devices' etc + Returns: + Returns copy of named section configuration + None if invalid section name + """ + section_config = _config.get(section) + if section_config: + return section_config.copy() + else: + return None diff --git a/scheduler/requirements.txt b/scheduler/requirements.txt new file mode 100644 index 0000000..bae47de --- /dev/null +++ b/scheduler/requirements.txt @@ -0,0 +1,6 @@ +confluent_kafka==2.2.0 +cryptography==41.0.1 +jsonschema==4.18.4 +ruamel.yaml==0.17.32 +schedule==1.2.0 +python-dateutil==2.8.2 \ No newline at end of file diff --git a/scheduler/scheduler.py b/scheduler/scheduler.py new file mode 100644 index 0000000..6300420 --- /dev/null +++ b/scheduler/scheduler.py @@ -0,0 +1,98 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + + +import os +import schedule +import sys +import time +import configurator +from utils import messaging +from utils.applog import logger + +def main(): + """ + Entrypoint for scheduler app + Loads configurations from the file + Schedules collections and runs event loop + At scheduled event, pushes collection task configuration on messaging bus + """ + try: + configurator.initialise() + except Exception as e: + logger.critical(f"Failed to initialise application {e}") + sys.exit(1) + + _schedule_collection() + + # Run event loop forever, waking up to run scheduled collections + try: + while True: + schedule.run_pending() + time.sleep(1) + except KeyboardInterrupt as e: + logger.info(f"Interrupt received, shutting down...") + messaging.shutdown() + sys.exit(0) + +def _schedule_collection(): + """ + Schedules device collections + Parameters: + None + Returns: + None + """ + devices = configurator.get_config('devices') + for device_name, device_config in devices.items(): + if device_config['collection']['enabled']: + schedule.every(device_config['collection']['interval']).minutes.do(_process_task, device_name) + logger.info(f"{device_name} Collection scheduled at every {device_config['collection']['interval']} minutes") + else: + logger.info(f"{device_name} Collection not enabled, skipping") + continue + return + +def _process_task(task_data): + """ + Callback function for scheduled jobs + Parameters: + None + Returns: + None + """ + task_config = {} + task_config['customer'] = { 'name': 'metrics'} + task_config['loglevel'] = configurator.get_config('loglevel') + + # add device name, configuration and connection details + task_config['device'] = configurator.get_config('devices')[task_data] + task_config['device']['name'] = task_data + task_config['connections'] = configurator.get_config('connections') + task_config['sites'] = configurator.get_config('sites') + connection_type = task_config['device']['connection'] + topic = f"{connection_type}_schedules" + # use device hostname as topic key + key = task_data + print (task_config) + logger.info(f"{task_config['device']['name']} Triggering collection") + + # publish payload on either schedules topic or reports topic + messaging.produce(topic = topic, key = key, message = task_config) + return + +if __name__ == '__main__': + main() diff --git a/scheduler/schema.json b/scheduler/schema.json new file mode 100644 index 0000000..d3b4546 --- /dev/null +++ b/scheduler/schema.json @@ -0,0 +1,153 @@ +{ + "type": "object", + "properties": { + "loglevel": { + "type": "object", + "properties": { + "console": { + "type": "string", + "enum": [ + "OFF", + "ERROR", + "INFO", + "DEBUG" + ] + } + }, + "required": [ + "console" + ], + "additionalProperties": false + }, + "sites": { + "type": "object", + "patternProperties": { + "[A-Za-z0-9_-]+" :{ + "type": "object", + "properties" : { + "Latitude" : { + "type": "string", + "pattern": "[-]?[0-9]+.[0-9]+" + }, + "Longitude" : { + "type": "string", + "pattern": "[-]?[0-9]+.[0-9]+" + }, + "Timezone" : { + "type": "string" + }, + "avg_co2_intensity": { + "type": "integer", + "minimum": 1, + "maximum": 800 + } + }, + "required": [ + "Latitude", + "Longitude", + "Timezone" + ], + "additionalProperties": false + } + } + }, + "devices": { + "type": "object", + "patternProperties": { + "^[a-zA-Z0-9_\\-\\./]*$": { + "type": "object", + "properties": { + "site": { + "type": "string", + "pattern": "[A-Za-z0-9_-]+" + }, + "family": { + "type": "string", + "enum": [ + "ASR1k", + "Cat9300" + ] + }, + "os_type": { + "type": "string", + "enum": [ + "iosxe" + ] + }, + "os_version": { + "type": "string" + }, + "connection": { + "type": "string", + "enum": [ + "ssh" + ] + }, + "address": { + "type": "string", + "format": "ipv4" + }, + "port": { + "type": "integer", + "minimum": 1 + }, + "ssh_options": { + "type": "string" + }, + "timeout": { + "type": "integer", + "minimum": 1 + }, + "username": { + "type": "string", + "minLength": 1 + }, + "password": { + "minLength": 1 + }, + "key": { + "type": "string", + "minLength": 32 + }, + "collection": { + "properties": { + "enabled": { + "type": "boolean" + }, + "interval": { + "type": "integer", + "minimum": 1 + } + }, + "required": [ + "enabled", + "interval" + ], + "additionalProperties": false + } + }, + "required": [ + "site", + "connection", + "timeout", + "collection", + "family", + "os_type", + "address", + "port", + "username", + "password" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "required": [ + "loglevel", + "sites", + "devices" + ], + "additionalProperties": false +} diff --git a/ssh_collector/requirements.txt b/ssh_collector/requirements.txt new file mode 100644 index 0000000..9377c00 --- /dev/null +++ b/ssh_collector/requirements.txt @@ -0,0 +1,4 @@ +confluent_kafka==2.2.0 +cryptography==41.0.1 +pyats +textfsm==1.1.3 diff --git a/ssh_collector/ssh_collector.py b/ssh_collector/ssh_collector.py new file mode 100644 index 0000000..6b32e34 --- /dev/null +++ b/ssh_collector/ssh_collector.py @@ -0,0 +1,100 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import json +import os +import sys +from ssh_connection import SSH_Connection +from normalisers import normaliser_factory +from utils import messaging +from utils.applog import logconfig, logger + +def main(): + + # Messaging topics to consume and publish + schedules_topic = os.environ.get('SCHEDULES_TOPIC', 'ssh_schedules') + collections_topic = os.environ.get('COLLECTIONS_TOPIC', 'collections') + batch_size = int(os.environ.get('BATCH_SIZE', 10)) + + # Start with a baseline logger level + logconfig(level = 'INFO') + logger.info(f"Waiting for collection requests") + + # Run event loop forever, waking up to receive collection tasks through messaging + try: + while True: + payload = messaging.consume(schedules_topic, 'collector') + task_config = json.loads(payload) + customer = task_config['customer']['name'] + sites = task_config['sites'] + device = task_config['device']['name'] + conn_type = task_config['device']['connection'] + loglevel = task_config['loglevel']['console'] + + # Reconfigure logformat to include customer name and desired loglevel + logconfig(customer, loglevel) + + normaliser = normaliser_factory.get_normaliser(task_config) + commands = normaliser.get_commands() + logger.debug(commands) + + connection = SSH_Connection(task_config) + if not connection: + logger.error(f"{device} Invalid connection configuration, skipping collection") + continue + + logger.info(f"{device} Trying to connect through {conn_type}") + if not connection.connect(): + logger.error(f"{device} Failed connecting to device, skipping collection") + continue + else: + logger.info(f"{device} Successfully connected") + + logger.info(f"{device} Executing commands") + command_data = connection.execute(commands) + connection.disconnect() + logger.debug(command_data) + + if not command_data: + logger.error(f"{device} Error executing commands") + continue + else: + logger.info(f"{device} Normalising data into POWEFF model") + + poweff_data = normaliser.normalise(sites, task_config['device'], command_data) + if not poweff_data: + logger.error(f"{device} Failed to build POWEFF model, skipping device") + continue + else: + logger.info(f"{device} Successfully built POWEFF model") + logger.debug(poweff_data) + + for poweff_index in range(0, len(poweff_data), batch_size): + batch_task = task_config.copy() + batch_poweff = poweff_data[poweff_index:poweff_index + batch_size] + batch_task['poweff'] = list(filter(None, batch_poweff)) + logger.info(f"{device} sending batch index {poweff_index} of POWEFF data to message queue") + logger.debug(batch_task) + messaging.produce(topic = collections_topic, key = device, message = batch_task) + + except KeyboardInterrupt as e: + logger.info(f"Interrupt received, shutting down...") + messaging.shutdown() + sys.exit(0) + +if __name__ == '__main__': + main() + diff --git a/ssh_collector/ssh_connection.py b/ssh_collector/ssh_connection.py new file mode 100644 index 0000000..a70e5ad --- /dev/null +++ b/ssh_collector/ssh_connection.py @@ -0,0 +1,165 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +from pyats import topology +import logging +from utils.secrets import decrypt + +class SSH_Connection: + + def __init__(self, task_config): + """ + SSH CLI connection provider + uses PyATS + """ + self._connection = None + self._task_config = task_config + self._name = task_config['device']['name'] + self._type = task_config['device']['connection'] + self._device_config = self._task_config['device'] + + def connect(self): + """ + Overrides baseclass connect() method + opens SSH connection to device specified using PyATS + Parameters: + None, uses connection details from task_config + Results: + True: if connection attempt is successful + False otherwise + """ + testbed_config = { + "devices": { + self._name: { + "credentials": { + "default": { + "username": self._device_config['username'], + "password": self._device_config['password'] + } + }, + "connections": { + "cli": { + "ip": self._device_config['address'], + "port": self._device_config['port'], + "protocol": self._device_config['connection'], + # Set default ssh options value as some devices will not work without specifying one + "ssh_options": "-o KexAlgorithms=+diffie-hellman-group14-sha1 -o HostKeyAlgorithms=+ssh-rsa" + } + }, + "os": self._device_config['os_type'] + } + } + } + # Insert optional ssh_options + if 'ssh_options' in self._device_config: + testbed_config['devices'][self._name]['connections']['cli']['ssh_options'] = self._device_config['ssh_options'] + logging.debug(testbed_config) + + # Insert decrypted password + testbed_config['devices'][self._name]['credentials']['default']['password'] = decrypt( + self._device_config['password'], self._device_config['key']) + # DO NOT log decrypted password! + + testbed = topology.loader.load(testbed_config) + self._connection = testbed.devices[self._name] + + try: + self._connection.connect(log_stdout = False, + init_exec_commands=['terminal length 0'], + init_config_commands=[], + connection_timeout=self._device_config['timeout']) + except: + self._connection = None + return False + + logging.debug(self._connection) + return True + + def execute(self, commands): + """ + Executes given CLI commands on the connected device + Parameters: + commands: Device specific CLI commands to run + Returns: + Dictionary of command run results + On failure to run any command, only that specific command result is set to empty + But if any exception is encountered at any time, None is returned + """ + if self._connection is None: + return None + + try: + timeout = self._device_config['timeout'] + result = {} + for cmd in commands.keys(): + + # first, try running the given command + logging.info(f"{self._name} Running command {commands[cmd]}") + try: + result[cmd] = self._connection.execute(command=commands[cmd], timeout = timeout) + logging.debug(result[cmd]) + except: + logging.error( + f"{self._name} Failed to run command {commands[cmd]}") + result[cmd] = "" + + # if that failed, and is an admin command, try alternate form without admin + if (commands[cmd][0:6] == "admin ") and self._is_empty_show_result(result[cmd]): + new_cmd = commands[cmd][6:] + logging.info( + f"{self._name} Running alternate command {new_cmd}") + try: + result[cmd] = self._connection.execute(command = new_cmd, timeout = timeout) + logging.debug(result[cmd]) + except: + logging.error(f"Failed to run command {new_cmd}") + logging.debug(result) + return result + except: + logging.error( + f"{self._name} Failed to run commands") + return None + + def disconnect(self): + """ + Overrides baseclass disconnect() method + Disconnects from the device and cleans up + called by connector component + Parameters: + None + Returns: + None + """ + if self._connection is not None: + logging.info(f"{self._name} Disconnecting from device") + self._connection.disconnect() + self._connection = None + + def _is_empty_show_result(self, show_result): + """ + Checks if the show command result is empty, typically for "admin show ..." form + Parameters: + show_result (string): show command result + Returns: + True: if result contains warnings and no meaningful data + + """ + show_result = show_result.lower() + if len(show_result) < 150: + return True + if ("warning" in show_result and "deprecated" in show_result): + return True + return False diff --git a/start-susi.sh b/start-susi.sh new file mode 100755 index 0000000..eda6c41 --- /dev/null +++ b/start-susi.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + + +# Start Docker containers defined in the docker-compose.yml file in detached mode. +docker compose up -d +# The '-d' flag runs the containers in detached mode, meaning they run in the background. \ No newline at end of file diff --git a/stop-susi.sh b/stop-susi.sh new file mode 100755 index 0000000..9b8c7d7 --- /dev/null +++ b/stop-susi.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +# The following command shuts down any running Docker containers defined in the docker-compose.yml file. +docker compose down \ No newline at end of file diff --git a/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_1.yaml b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_1.yaml new file mode 100644 index 0000000..3ebfdaf --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_1.yaml @@ -0,0 +1,39 @@ +slice_name: CO2eq EMISSIONS +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 1 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: CO2eq EMISSION + optionName: metric_j9pitiiu9u_dm13h1bdf9i + sqlExpression: sum(co2_intensity * power_in)/3000000 + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + subheader: Kg CO2eq + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 1 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: ccfd63ca-7b2a-4923-904a-4e93ab14db4c +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_23.yaml b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_23.yaml new file mode 100644 index 0000000..2619d29 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_23.yaml @@ -0,0 +1,39 @@ +slice_name: CO2eq EMISSIONS +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 25 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: CO2eq Emission + optionName: metric_ubic0h2iuq_9qtamx343r + sqlExpression: sum(co2_intensity * power_in)/3000000 + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + subheader: Kg CO2eq + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 3 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 7abf1603-34e9-472f-a15f-4f86dd6a829d +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_30.yaml b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_30.yaml new file mode 100644 index 0000000..1e4f722 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_30.yaml @@ -0,0 +1,44 @@ +slice_name: CO2eq EMISSIONS +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 8 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: CO2eq EMISSION + optionName: metric_rnt9w6c9oif_rr8rudemny + sqlExpression: sum(co2_intensity * power_in)/10000000 + adhoc_filters: + - clause: WHERE + comparator: null + datasourceWarning: false + expressionType: SQL + filterOptionName: filter_enm2kdwvj7_edql6lzutu7 + isExtra: false + isNew: false + operator: TEMPORAL_RANGE + sqlExpression: bucket >= CURRENT_TIMESTAMP - INTERVAL '24 HOUR' + subject: bucket + subheader: Kg CO2eq + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 1 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: f32ee84f-9d25-4316-85a2-7cde42728a0b +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_32.yaml b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_32.yaml new file mode 100644 index 0000000..37e0e7c --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_32.yaml @@ -0,0 +1,39 @@ +slice_name: CO2eq EMISSIONS +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 22 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: CO2eq Emission + optionName: metric_8cabzwwbmgn_3qc63hglfki + sqlExpression: sum(co2_intensity * power_in)/3000000 + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + subheader: Kg CO2eq + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 2 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 2e0ccfca-b4c9-4ec3-9e00-66041ea43adb +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_34.yaml b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_34.yaml new file mode 100644 index 0000000..5826b92 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_34.yaml @@ -0,0 +1,44 @@ +slice_name: CO2eq EMISSIONS +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 34 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: CO2eq Emission + optionName: metric_96igotbhe4_5e9aqc2529a + sqlExpression: sum(co2_intensity * power_in)/10000000 + adhoc_filters: + - clause: WHERE + comparator: null + datasourceWarning: false + expressionType: SQL + filterOptionName: filter_4f7penc7f0e_c6h7jqgoddv + isExtra: false + isNew: false + operator: TEMPORAL_RANGE + sqlExpression: bucket >= CURRENT_TIMESTAMP - INTERVAL '24 HOUR' + subject: bucket + subheader: Kg CO2eq + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 3 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 35134fa2-6b47-41da-a3c7-6e7b275b2bb2 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_5.yaml b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_5.yaml new file mode 100644 index 0000000..c8d6fba --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/CO2eq_EMISSIONS_5.yaml @@ -0,0 +1,43 @@ +slice_name: CO2eq EMISSIONS +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 38 + metric: + expressionType: SQL + sqlExpression: sum(co2_intensity * power_in)/10000000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: 24HR:CO2eq EMISSIONS + optionName: metric_3s08pwcx14a_us4aolmk70f + adhoc_filters: + - clause: WHERE + comparator: null + datasourceWarning: false + expressionType: SQL + filterOptionName: filter_fihlu47ob1k_tfcxwgu39eg + isExtra: false + isNew: false + operator: TEMPORAL_RANGE + sqlExpression: bucket >= CURRENT_TIMESTAMP - INTERVAL '24 HOUR' + subject: bucket + subheader: Kg CO2eq + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: SMART_NUMBER + time_format: smart_date + extra_form_data: {} + dashboards: + - 2 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 7f073bc3-deef-472b-8382-f3a90a550681 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/DEVICES_16.yaml b/superset/dashboards/default_dashboards/charts/DEVICES_16.yaml new file mode 100644 index 0000000..6851124 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/DEVICES_16.yaml @@ -0,0 +1,54 @@ +slice_name: DEVICES +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 1__table + viz_type: big_number_total + slice_id: 35 + metric: + aggregate: COUNT_DISTINCT + column: + advanced_data_type: null + certification_details: null + certified_by: null + column_name: hostname + description: null + expression: null + filterable: true + groupby: true + id: 122 + is_certified: false + is_dttm: false + python_date_format: null + type: TEXT + type_generic: 1 + verbose_name: null + warning_markdown: null + datasourceWarning: false + expressionType: SIMPLE + hasCustomLabel: true + label: devices + optionName: metric_x5ore1ir37_au2k6sdhrxw + sqlExpression: null + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: timestamp + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 6 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 476563e1-d443-4aae-a39d-21107eff1808 +version: 1.0.0 +dataset_uuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 diff --git a/superset/dashboards/default_dashboards/charts/DEVICE_FAMILIES_11.yaml b/superset/dashboards/default_dashboards/charts/DEVICE_FAMILIES_11.yaml new file mode 100644 index 0000000..7d7131b --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/DEVICE_FAMILIES_11.yaml @@ -0,0 +1,53 @@ +slice_name: DEVICE FAMILIES +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 1__table + viz_type: big_number_total + metric: + expressionType: SIMPLE + column: + advanced_data_type: null + certification_details: null + certified_by: null + column_name: family + description: null + expression: null + filterable: true + groupby: true + id: 123 + is_certified: false + is_dttm: false + python_date_format: null + type: TEXT + type_generic: 1 + verbose_name: null + warning_markdown: null + aggregate: COUNT_DISTINCT + sqlExpression: null + datasourceWarning: false + hasCustomLabel: true + label: Device Family + optionName: metric_fb33rgk8gr9_xoiupvea83l + adhoc_filters: + - clause: WHERE + subject: timestamp + operator: TEMPORAL_RANGE + comparator: No filter + expressionType: SIMPLE + subheader: '' + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: SMART_NUMBER + time_format: smart_date + extra_form_data: {} + dashboards: + - 6 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 803794d4-8acb-441b-97c8-1e58f3edf9fd +version: 1.0.0 +dataset_uuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 diff --git a/superset/dashboards/default_dashboards/charts/Device_Families_28.yaml b/superset/dashboards/default_dashboards/charts/Device_Families_28.yaml new file mode 100644 index 0000000..bd0f1b4 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/Device_Families_28.yaml @@ -0,0 +1,55 @@ +slice_name: Device Families +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 1__table + viz_type: big_number_total + slice_id: 488 + metric: + aggregate: COUNT_DISTINCT + column: + advanced_data_type: null + certification_details: null + certified_by: null + column_name: family + description: null + expression: null + filterable: true + groupby: true + id: 888 + is_certified: false + is_dttm: false + python_date_format: null + type: TEXT + type_generic: 1 + verbose_name: null + warning_markdown: null + datasourceWarning: false + expressionType: SIMPLE + hasCustomLabel: false + label: COUNT_DISTINCT(family) + optionName: metric_z48m15ia7y_9x9qe2dcbu + sqlExpression: null + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: timestamp + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: SMART_NUMBER + time_format: smart_date + granularity_sqla: timestamp + extra_form_data: {} + dashboards: + - 17 + - 18 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 306d1c89-1f06-4971-92b4-7bb4da7ea622 +version: 1.0.0 +dataset_uuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 diff --git a/superset/dashboards/default_dashboards/charts/Devices_15.yaml b/superset/dashboards/default_dashboards/charts/Devices_15.yaml new file mode 100644 index 0000000..94e2f6a --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/Devices_15.yaml @@ -0,0 +1,54 @@ +slice_name: Devices +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 1__table + viz_type: big_number_total + slice_id: 23 + metric: + aggregate: COUNT_DISTINCT + column: + advanced_data_type: null + certification_details: null + certified_by: null + column_name: hostname + description: null + expression: null + filterable: true + groupby: true + id: 887 + is_certified: false + is_dttm: false + python_date_format: null + type: TEXT + type_generic: 1 + verbose_name: null + warning_markdown: null + datasourceWarning: false + expressionType: SIMPLE + hasCustomLabel: false + label: COUNT_DISTINCT(hostname) + optionName: metric_z3b0zmquw6_9wfsyri153 + sqlExpression: null + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: timestamp + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 5 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 12abe591-8074-4db8-ba9a-76e4d8a7b1a1 +version: 1.0.0 +dataset_uuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_21.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_21.yaml new file mode 100644 index 0000000..a2ad263 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_21.yaml @@ -0,0 +1,39 @@ +slice_name: ENERGY CONSUMPTION +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 10 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Daily Average + optionName: metric_cl0zxsoi7gn_ei5whsdsbd + sqlExpression: (SUM(power_in))/1000 + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + subheader: kWh + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 1 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: c49fe1db-df06-4e98-ba5a-e63c74a0d21c +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_25.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_25.yaml new file mode 100644 index 0000000..2bb6850 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_25.yaml @@ -0,0 +1,44 @@ +slice_name: ENERGY CONSUMPTION +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 3 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Daily Average + optionName: metric_4rolv281la_0gzjxsqgs1s6 + sqlExpression: (sum(power_in))/1000 + adhoc_filters: + - clause: WHERE + comparator: null + datasourceWarning: false + expressionType: SQL + filterOptionName: filter_4ynkdtig3qi_e1xdr3hm60g + isExtra: false + isNew: false + operator: TEMPORAL_RANGE + sqlExpression: bucket >= CURRENT_TIMESTAMP - INTERVAL '24 HOUR' + subject: bucket + subheader: kWh + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 1 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 0253592c-5d6e-458d-a858-ef453ccbcaac +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_27.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_27.yaml new file mode 100644 index 0000000..641ade9 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_27.yaml @@ -0,0 +1,45 @@ +slice_name: ENERGY CONSUMPTION +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 13 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Daily Average + optionName: metric_49wzxk7l18s_yi8wer6kdyo + sqlExpression: (SUM(power_in))/1000 + adhoc_filters: + - clause: WHERE + comparator: null + datasourceWarning: false + expressionType: SQL + filterOptionName: filter_ufmzpqmrzbi_1y09jwr5svi + isExtra: false + isNew: false + operator: TEMPORAL_RANGE + sqlExpression: bucket >= CURRENT_TIMESTAMP - INTERVAL '24 HOUR' + subject: bucket + subheader: kWh + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + currency_format: {} + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 1 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 032421e3-83c2-4393-8f90-a9d83cd6dd1b +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_33.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_33.yaml new file mode 100644 index 0000000..c186c3c --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_33.yaml @@ -0,0 +1,44 @@ +slice_name: ENERGY CONSUMPTION +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 35 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Daily Average + optionName: metric_vdmqx2r24oo_amoibgzbi2 + sqlExpression: (sum(power_in))/1000 + adhoc_filters: + - clause: WHERE + comparator: null + datasourceWarning: false + expressionType: SQL + filterOptionName: filter_mxg8fmsvxer_b1p3mi4c7ln + isExtra: false + isNew: false + operator: TEMPORAL_RANGE + sqlExpression: bucket >= CURRENT_TIMESTAMP - INTERVAL '24 HOUR' + subject: bucket + subheader: kWh + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 3 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: bdc5ff85-8bc7-4e37-9914-38eeb02ef21c +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_4.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_4.yaml new file mode 100644 index 0000000..606f93d --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_4.yaml @@ -0,0 +1,39 @@ +slice_name: ENERGY CONSUMPTION +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 14 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: daily totals + optionName: metric_2aa75spckmd_x9deagmii2f + sqlExpression: (SUM(power_in::DECIMAL))/1000 + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + subheader: kWh + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 2 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 10628c54-cbc5-4a9c-8e41-21040a911148 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_6.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_6.yaml new file mode 100644 index 0000000..f5ffb04 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_6.yaml @@ -0,0 +1,39 @@ +slice_name: ENERGY CONSUMPTION +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 37 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Energy Comsuption + optionName: metric_2soj4653tku_1nzmzy7wbir + sqlExpression: (SUM(power_in::decimal))/1000 + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + subheader: kWh + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 3 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 20c61aeb-2019-4112-b8a0-2fa108f2dbaa +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_AND_CO2eq_EMISSIONS_20.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_AND_CO2eq_EMISSIONS_20.yaml new file mode 100644 index 0000000..04441d2 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_AND_CO2eq_EMISSIONS_20.yaml @@ -0,0 +1,104 @@ +slice_name: ENERGY CONSUMPTION AND CO2eq EMISSIONS +description: null +certified_by: null +certification_details: null +viz_type: mixed_timeseries +params: + datasource: 1__table + viz_type: mixed_timeseries + slice_id: 17 + x_axis: timestamp + time_grain_sqla: PT1M + metrics: + - aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Daily Energy Consumption (kWh) + optionName: metric_bjxqvqa4q3w_sxwps9idcd + sqlExpression: sum(power_in::decimal)/1000 + groupby: [] + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: timestamp + limit: 10 + order_desc: true + row_limit: 10000 + truncate_metric: false + comparison_type: values + metrics_b: + - aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Daily CO2eq Emissions (kg CO2eq) + optionName: metric_7bjr7tqu4ko_tcr1j37ilvj + sqlExpression: sum(co2_intensity::decimal * power_in::decimal)/10000000 + groupby_b: [] + adhoc_filters_b: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: timestamp + limit_b: 5 + order_desc_b: true + row_limit_b: 10000 + truncate_metric_b: true + time_compare_b: [] + comparison_type_b: values + annotation_layers: [] + x_axis_title: '' + x_axis_title_margin: 50 + y_axis_title: ' ENERGY CONSUMPTION' + y_axis_title_margin: 15 + y_axis_title_position: Top + color_scheme: standard_color_scheme + seriesType: line + stack: null + show_value: false + opacity: 0.2 + markerSize: 6 + yAxisIndex: 0 + seriesTypeB: line + stackB: false + areaB: false + show_valueB: false + opacityB: 0.2 + markerEnabledB: false + markerSizeB: 5 + yAxisIndexB: 1 + show_legend: true + legendType: scroll + legendOrientation: bottom + x_axis_time_format: smart_date + rich_tooltip: true + tooltipSortByMetric: true + tooltipTimeFormat: smart_date + minorSplitLine: true + truncateXAxis: false + truncateYAxis: false + y_axis_bounds: + - null + - null + y_axis_format: ~g + logAxis: false + y_axis_bounds_secondary: + - null + - null + y_axis_format_secondary: ~g + yAxisTitleSecondary: 'CO2eq EMISSIONS ' + logAxisSecondary: false + extra_form_data: {} + dashboards: + - 2 +query_context: null +cache_timeout: null +uuid: 0617e91f-6715-4b75-80fb-cfe17f6bba6f +version: 1.0.0 +dataset_uuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_AND_CO2eq_EMISSIONS_37.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_AND_CO2eq_EMISSIONS_37.yaml new file mode 100644 index 0000000..2feebba --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_AND_CO2eq_EMISSIONS_37.yaml @@ -0,0 +1,93 @@ +slice_name: ENERGY CONSUMPTION AND CO2eq EMISSIONS +description: null +certified_by: null +certification_details: null +viz_type: mixed_timeseries +params: + datasource: 1__table + viz_type: mixed_timeseries + slice_id: 18 + x_axis: timestamp + time_grain_sqla: PT1M + metrics: + - aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Daily Energy Consumption (kWh) + optionName: metric_jtih5tjw89q_kezq1ublmul + sqlExpression: sum(power_in::decimal)/1000 + groupby: [] + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: timestamp + limit: 10 + order_desc: true + row_limit: 10000 + truncate_metric: false + comparison_type: values + metrics_b: + - aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Daily CO2eq Emissions (kg CO2eq) + optionName: metric_fo1zleiwi6_wuzwr4zl6tj + sqlExpression: sum(co2_intensity::decimal * power_in::decimal)/10000000 + groupby_b: [] + adhoc_filters_b: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: timestamp + limit_b: 5 + order_desc_b: true + row_limit_b: 10000 + truncate_metric_b: true + comparison_type_b: values + annotation_layers: [] + x_axis_title_margin: 15 + y_axis_title: ' ENERGY CONSUMPTION' + y_axis_title_margin: '10' + y_axis_title_position: Top + color_scheme: standard_color_scheme + seriesType: line + opacity: 0.2 + markerSize: 6 + seriesTypeB: line + opacityB: 0.2 + markerSizeB: 6 + yAxisIndexB: 1 + show_legend: true + legendType: scroll + legendOrientation: bottom + legendMargin: null + x_axis_time_format: smart_date + rich_tooltip: true + tooltipSortByMetric: true + tooltipTimeFormat: smart_date + minorSplitLine: false + truncateXAxis: false + y_axis_bounds: + - null + - null + y_axis_format: ~g + y_axis_bounds_secondary: + - null + - null + y_axis_format_secondary: ~g + yAxisTitleSecondary: 'CO2eq EMISSIONS ' + extra_form_data: {} + dashboards: + - 3 +query_context: null +cache_timeout: null +uuid: 3a319c66-d42e-4a52-ad44-2d2c668b907c +version: 1.0.0 +dataset_uuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DAY_OF_WEEK_2.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DAY_OF_WEEK_2.yaml new file mode 100644 index 0000000..dbedaf7 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DAY_OF_WEEK_2.yaml @@ -0,0 +1,68 @@ +slice_name: ENERGY CONSUMPTION BY DAY OF WEEK +description: null +certified_by: null +certification_details: null +viz_type: echarts_timeseries_bar +params: + datasource: 2__table + viz_type: echarts_timeseries_bar + slice_id: 20 + x_axis: + expressionType: SQL + label: dow + sqlExpression: to_char(bucket, 'Day') + time_grain_sqla: P1D + x_axis_sort_asc: true + x_axis_sort_series: name + x_axis_sort_series_ascending: true + metrics: + - expressionType: SQL + sqlExpression: SUM(power_in)/1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: Energy Consumption (kWh) + optionName: metric_h0nvf3h30h9_5y4kaefkcun + groupby: [] + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + order_desc: true + row_limit: 10000 + truncate_metric: true + show_empty_columns: true + comparison_type: values + annotation_layers: [] + forecastPeriods: 10 + forecastInterval: 0.8 + orientation: vertical + x_axis_title_margin: 15 + y_axis_title_margin: 15 + y_axis_title_position: Left + sort_series_type: sum + color_scheme: standard_color_scheme + only_total: true + show_legend: true + legendType: scroll + legendOrientation: bottom + x_axis_time_format: smart_date + y_axis_format: SMART_NUMBER + truncateXAxis: true + y_axis_bounds: + - null + - null + rich_tooltip: true + tooltipSortByMetric: true + tooltipTimeFormat: smart_date + extra_form_data: {} + dashboards: + - 3 +query_context: null +cache_timeout: null +uuid: d61b0672-97ac-49a8-96c2-622d7cd14132 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DAY_OF_WEEK_24.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DAY_OF_WEEK_24.yaml new file mode 100644 index 0000000..ba66644 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DAY_OF_WEEK_24.yaml @@ -0,0 +1,68 @@ +slice_name: ENERGY CONSUMPTION BY DAY OF WEEK +description: null +certified_by: null +certification_details: null +viz_type: echarts_timeseries_bar +params: + datasource: 2__table + viz_type: echarts_timeseries_bar + slice_id: 19 + x_axis: + datasourceWarning: false + expressionType: SQL + label: dow + sqlExpression: to_char(bucket, 'Day') + time_grain_sqla: P1D + x_axis_sort_asc: true + x_axis_sort_series: name + x_axis_sort_series_ascending: true + metrics: + - expressionType: SQL + sqlExpression: SUM(power_in)/1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: Energy Consumption (kWh) + optionName: metric_mp3zuglz1r8_57ogaonfp1t + groupby: [] + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + order_desc: true + row_limit: 10000 + truncate_metric: true + show_empty_columns: true + comparison_type: values + annotation_layers: [] + forecastPeriods: 10 + forecastInterval: 0.8 + orientation: vertical + x_axis_title_margin: 15 + y_axis_title_margin: 15 + y_axis_title_position: Left + sort_series_type: sum + color_scheme: standard_color_scheme + only_total: true + show_legend: true + legendType: scroll + legendOrientation: bottom + x_axis_time_format: smart_date + y_axis_format: SMART_NUMBER + truncateXAxis: true + y_axis_bounds: + - null + - null + rich_tooltip: true + tooltipTimeFormat: smart_date + extra_form_data: {} + dashboards: + - 2 +query_context: null +cache_timeout: null +uuid: 1531bcbd-ece1-4309-bad0-5166e5f22e9a +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DEVICE_FAMILY_10.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DEVICE_FAMILY_10.yaml new file mode 100644 index 0000000..f0850b1 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_DEVICE_FAMILY_10.yaml @@ -0,0 +1,90 @@ +slice_name: ENERGY CONSUMPTION BY DEVICE FAMILY +description: null +certified_by: null +certification_details: null +viz_type: bubble_v2 +params: + datasource: 2__table + viz_type: bubble_v2 + slice_id: 21 + entity: family + x: + aggregate: COUNT_DISTINCT + column: + advanced_data_type: null + certification_details: null + certified_by: null + column_name: hostname + description: null + expression: null + filterable: true + groupby: true + id: 106 + is_certified: false + is_dttm: false + python_date_format: null + type: TEXT + type_generic: 1 + verbose_name: null + warning_markdown: null + datasourceWarning: false + expressionType: SIMPLE + hasCustomLabel: true + label: Device Count + optionName: metric_769srwhbjwy_6gf04u55f5d + sqlExpression: null + y: + expressionType: SQL + sqlExpression: AVG(traffic_efficiency)/1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: Traffic Efficiency (kW/Gbps) + optionName: metric_v5gbwplc9u_zzgcf13zlw + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + size: + expressionType: SQL + sqlExpression: SUM(power_in)/1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: Energy Consumption (kWh) + optionName: metric_8m2d0e1tezo_85xx5kvlvom + order_desc: true + row_limit: 50000 + color_scheme: standard_color_scheme + show_legend: true + legendType: scroll + legendOrientation: bottom + max_bubble_size: '25' + tooltipSizeFormat: ~g + opacity: 1 + x_axis_label: Device Count + x_axis_title_margin: 30 + xAxisFormat: SMART_NUMBER + logXAxis: true + y_axis_label: Traffic Efficiency (kW/Gbps) + y_axis_title_margin: '35' + y_axis_format: SMART_NUMBER + logYAxis: false + truncateXAxis: true + truncateYAxis: false + y_axis_bounds: + - null + - null + extra_form_data: {} + dashboards: + - 2 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: d23b66b3-01d4-404c-b241-faddbca89ab4 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_HOUR_OF_DAY_14.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_HOUR_OF_DAY_14.yaml new file mode 100644 index 0000000..0f6a818 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_HOUR_OF_DAY_14.yaml @@ -0,0 +1,67 @@ +slice_name: ENERGY CONSUMPTION BY HOUR OF DAY +description: null +certified_by: null +certification_details: null +viz_type: echarts_timeseries_bar +params: + datasource: 2__table + viz_type: echarts_timeseries_bar + slice_id: 22 + x_axis: + expressionType: SQL + label: hod + sqlExpression: to_char(bucket, 'HH24') + time_grain_sqla: P1D + x_axis_sort_asc: true + x_axis_sort_series: name + x_axis_sort_series_ascending: true + metrics: + - expressionType: SQL + sqlExpression: SUM(power_in)/1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: Energy Consumption (kWh) + optionName: metric_rz3nl88qb87_ercivw0qrnt + groupby: [] + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + order_desc: true + row_limit: 10000 + truncate_metric: true + show_empty_columns: false + comparison_type: values + annotation_layers: [] + forecastPeriods: 10 + forecastInterval: 0.8 + orientation: vertical + x_axis_title_margin: 15 + y_axis_title_margin: 15 + y_axis_title_position: Left + sort_series_type: sum + color_scheme: standard_color_scheme + only_total: true + show_legend: true + legendType: scroll + legendOrientation: bottom + x_axis_time_format: smart_date + y_axis_format: SMART_NUMBER + truncateXAxis: true + y_axis_bounds: + - null + - null + rich_tooltip: true + tooltipTimeFormat: smart_date + extra_form_data: {} + dashboards: + - 2 +query_context: null +cache_timeout: null +uuid: 40cf6e61-7276-463d-8ad5-d9f4a41118c7 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_HOUR_OF_DAY_35.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_HOUR_OF_DAY_35.yaml new file mode 100644 index 0000000..3d49fce --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_BY_HOUR_OF_DAY_35.yaml @@ -0,0 +1,67 @@ +slice_name: ENERGY CONSUMPTION BY HOUR OF DAY +description: null +certified_by: null +certification_details: null +viz_type: echarts_timeseries_bar +params: + datasource: 2__table + viz_type: echarts_timeseries_bar + slice_id: 23 + x_axis: + expressionType: SQL + label: hod + sqlExpression: to_char(bucket, 'HH24') + time_grain_sqla: P1D + x_axis_sort_asc: true + x_axis_sort_series: name + x_axis_sort_series_ascending: true + metrics: + - expressionType: SQL + sqlExpression: SUM(power_in)/1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: Energy Consumption (kWh) + optionName: metric_rdgutkwxno8_2js97b65p0b + groupby: [] + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + order_desc: true + row_limit: 10000 + truncate_metric: true + show_empty_columns: true + comparison_type: values + annotation_layers: [] + forecastPeriods: 10 + forecastInterval: 0.8 + orientation: vertical + x_axis_title_margin: 15 + y_axis_title_margin: 15 + y_axis_title_position: Left + sort_series_type: sum + color_scheme: standard_color_scheme + only_total: true + show_legend: true + legendType: scroll + legendOrientation: bottom + x_axis_time_format: smart_date + y_axis_format: SMART_NUMBER + truncateXAxis: true + y_axis_bounds: + - null + - null + rich_tooltip: true + tooltipTimeFormat: smart_date + extra_form_data: {} + dashboards: + - 3 +query_context: null +cache_timeout: null +uuid: 683dd5b5-3c82-463d-9d74-4275a979b204 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_17.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_17.yaml new file mode 100644 index 0000000..e5afce2 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_17.yaml @@ -0,0 +1,72 @@ +slice_name: Energy Consumption during work hours +description: null +certified_by: null +certification_details: null +viz_type: pie +params: + datasource: 2__table + viz_type: pie + slice_id: 25 + groupby: + - label: hours + sqlExpression: CASE WHEN bucket::time between '9:00:00' and '18:00:00' THEN 'Business + Hours' ELSE 'Off Business Hours' END + expressionType: SQL + metric: + aggregate: SUM + column: + advanced_data_type: null + certification_details: null + certified_by: null + column_name: power_in + description: null + expression: null + filterable: true + groupby: true + id: 905 + is_certified: false + is_dttm: false + python_date_format: null + type: NUMERIC + type_generic: 0 + verbose_name: null + warning_markdown: null + datasourceWarning: false + expressionType: SIMPLE + hasCustomLabel: false + label: SUM(power_in) + optionName: metric_258tf13f49s_7hk2xa61xif + sqlExpression: null + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + row_limit: 10000 + sort_by_metric: true + color_scheme: standard_color_scheme + show_labels_threshold: 5 + show_legend: true + legendType: plain + legendOrientation: bottom + legendMargin: 0 + label_type: key + number_format: SMART_NUMBER + date_format: smart_date + show_labels: false + labels_outside: true + label_line: false + show_total: false + outerRadius: 70 + donut: true + innerRadius: 30 + extra_form_data: {} + dashboards: + - 5 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 95f30ff2-6c25-446f-9c1c-820a552128d2 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_8.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_8.yaml new file mode 100644 index 0000000..8bd0a57 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_8.yaml @@ -0,0 +1,54 @@ +slice_name: ENERGY CONSUMPTION DURING WORK HOURS +description: null +certified_by: null +certification_details: null +viz_type: pie +params: + datasource: 2__table + viz_type: pie + slice_id: 52 + groupby: + - expressionType: SQL + label: Hours + sqlExpression: CASE WHEN bucket::time between '09:00:00' and '18:00:00' THEN 'Business + Hours' ELSE 'Off Business Hours' END + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: false + label: SUM(power_in) + optionName: metric_h3rqlie60tc_xsld43o622j + sqlExpression: SUM(power_in) + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + row_limit: 10000 + sort_by_metric: true + color_scheme: standard_color_scheme + show_labels_threshold: 5 + show_legend: true + legendType: scroll + legendOrientation: bottom + label_type: key + number_format: SMART_NUMBER + date_format: smart_date + show_labels: false + labels_outside: true + label_line: false + outerRadius: 58 + donut: true + innerRadius: 30 + extra_form_data: {} + dashboards: + - 7 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 8fe454a6-332b-495e-b3f6-8a1f48a7d65e +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_9.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_9.yaml new file mode 100644 index 0000000..4bfe33b --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_DURING_WORK_HOURS_9.yaml @@ -0,0 +1,56 @@ +slice_name: ENERGY CONSUMPTION DURING WORK HOURS +description: null +certified_by: null +certification_details: null +viz_type: pie +params: + datasource: 2__table + viz_type: pie + slice_id: 45 + groupby: + - expressionType: SQL + label: Hours + sqlExpression: CASE WHEN bucket::time between '09:00:00' and '18:00:00' THEN 'Business + Hours' ELSE 'Off Business Hours' END + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: false + label: SUM(power_in) + optionName: metric_ahjpd3g67li_7tjekyawsvt + sqlExpression: SUM(power_in) + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + row_limit: 10000 + sort_by_metric: true + color_scheme: standard_color_scheme + show_labels_threshold: 5 + show_legend: true + legendType: scroll + legendOrientation: bottom + legendMargin: 0 + label_type: key + number_format: SMART_NUMBER + date_format: smart_date + show_labels: false + labels_outside: true + label_line: false + show_total: false + outerRadius: 58 + donut: true + innerRadius: 30 + extra_form_data: {} + dashboards: + - 6 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 35a5b771-3c68-4412-bb1d-3def9c49739e +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_and_CO2eq_EMISSIONS_22.yaml b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_and_CO2eq_EMISSIONS_22.yaml new file mode 100644 index 0000000..eed434d --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/ENERGY_CONSUMPTION_and_CO2eq_EMISSIONS_22.yaml @@ -0,0 +1,112 @@ +slice_name: ENERGY CONSUMPTION and CO2eq EMISSIONS +description: null +certified_by: null +certification_details: null +viz_type: mixed_timeseries +params: + datasource: 1__table + viz_type: mixed_timeseries + slice_id: 26 + x_axis: timestamp + time_grain_sqla: PT1M + metrics: + - aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Energy Consumption (kWh) + optionName: metric_ri32tjuci3_v4x9xghf4lo + sqlExpression: SUM(power_in::DECIMAL)/1000 + groupby: [] + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: timestamp + limit: 5 + order_desc: true + row_limit: 10000 + truncate_metric: true + comparison_type: values + metrics_b: + - aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: CO2eq Emissions (kg CO2eq) + optionName: metric_9x2ucj7702g_amdailxio9q + sqlExpression: sum(co2_intensity::DECIMAL * power_in::DECIMAL)/10000000 + groupby_b: [] + adhoc_filters_b: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: timestamp + limit_b: 5 + order_desc_b: true + row_limit_b: 10000 + truncate_metric_b: true + comparison_type_b: values + annotation_layers: [] + x_axis_title_margin: 30 + y_axis_title: ' ENERGY CONSUMPTION' + y_axis_title_margin: 15 + y_axis_title_position: Top + color_scheme: d3Category10 + seriesType: line + stack: false + area: false + show_value: false + opacity: 0.2 + markerEnabled: false + markerSize: 6 + yAxisIndex: 0 + seriesTypeB: line + stackB: false + areaB: false + show_valueB: false + opacityB: 0.2 + markerEnabledB: false + markerSizeB: 6 + yAxisIndexB: 1 + zoomable: false + minorTicks: false + show_legend: true + legendType: scroll + legendOrientation: bottom + legendMargin: '' + x_axis_time_format: smart_date + xAxisLabelRotation: 0 + rich_tooltip: true + tooltipSortByMetric: false + tooltipTimeFormat: smart_date + minorSplitLine: false + truncateXAxis: false + xAxisBounds: + - null + - null + truncateYAxis: false + y_axis_bounds: + - null + - null + y_axis_format: ~g + logAxis: false + y_axis_bounds_secondary: + - 0 + - null + y_axis_format_secondary: ~g + currency_format_secondary: {} + yAxisTitleSecondary: 'CO2eq EMISSIONS ' + logAxisSecondary: false + extra_form_data: {} + dashboards: + - 1 +query_context: null +cache_timeout: null +uuid: 6a4b4456-4554-4f20-8f09-696cd92132aa +version: 1.0.0 +dataset_uuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 diff --git a/superset/dashboards/default_dashboards/charts/Energy_Consumption_By_day_of_the_week_31.yaml b/superset/dashboards/default_dashboards/charts/Energy_Consumption_By_day_of_the_week_31.yaml new file mode 100644 index 0000000..050e445 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/Energy_Consumption_By_day_of_the_week_31.yaml @@ -0,0 +1,81 @@ +slice_name: Energy Consumption By day of the week +description: null +certified_by: null +certification_details: null +viz_type: echarts_timeseries_bar +params: + datasource: 2__table + viz_type: echarts_timeseries_bar + slice_id: 27 + x_axis: + expressionType: SQL + label: dow + sqlExpression: to_char(bucket, 'Day') + time_grain_sqla: P1D + x_axis_sort_asc: true + x_axis_sort_series: name + x_axis_sort_series_ascending: true + metrics: + - aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Energy Consumption (kWh) + optionName: metric_6iwy2kai7wi_mohg7dnfxjf + sqlExpression: SUM(power_in)/1000 + groupby: [] + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + order_desc: true + row_limit: 10000 + truncate_metric: true + show_empty_columns: false + rolling_type: sum + rolling_periods: '' + time_compare: [] + comparison_type: ratio + annotation_layers: [] + forecastPeriods: 10 + forecastInterval: 0.8 + orientation: vertical + x_axis_title: '' + x_axis_title_margin: 15 + y_axis_title_margin: 15 + y_axis_title_position: Left + sort_series_type: name + sort_series_ascending: false + color_scheme: standard_color_scheme + show_value: false + stack: null + only_total: true + zoomable: false + show_legend: true + legendType: scroll + legendOrientation: bottom + legendMargin: null + x_axis_time_format: smart_date + xAxisLabelRotation: 45 + y_axis_format: SMART_NUMBER + logAxis: false + minorSplitLine: false + truncateXAxis: true + truncateYAxis: false + y_axis_bounds: + - null + - null + rich_tooltip: true + tooltipSortByMetric: false + tooltipTimeFormat: smart_date + extra_form_data: {} + dashboards: + - 1 +query_context: null +cache_timeout: null +uuid: c6b2f4b2-6354-4337-a04e-5bc6f4c39bfd +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/Energy_Consumption_By_hour_of_day_36.yaml b/superset/dashboards/default_dashboards/charts/Energy_Consumption_By_hour_of_day_36.yaml new file mode 100644 index 0000000..0f7751b --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/Energy_Consumption_By_hour_of_day_36.yaml @@ -0,0 +1,80 @@ +slice_name: Energy Consumption By hour of day +description: null +certified_by: null +certification_details: null +viz_type: echarts_timeseries_bar +params: + datasource: 2__table + viz_type: echarts_timeseries_bar + slice_id: 28 + x_axis: + expressionType: SQL + label: hod + sqlExpression: to_char(bucket, 'HH24') + time_grain_sqla: P1D + x_axis_sort_asc: true + x_axis_sort_series: name + x_axis_sort_series_ascending: true + metrics: + - expressionType: SQL + sqlExpression: SUM(power_in)/1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: Energy Consumption (kWh) + optionName: metric_6iwy2kai7wi_mohg7dnfxjf + groupby: [] + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + order_desc: true + row_limit: 10000 + truncate_metric: true + show_empty_columns: false + rolling_type: sum + rolling_periods: '' + time_compare: [] + comparison_type: ratio + annotation_layers: [] + forecastPeriods: 10 + forecastInterval: 0.8 + orientation: vertical + x_axis_title_margin: 15 + y_axis_title_margin: 15 + y_axis_title_position: Left + sort_series_type: name + sort_series_ascending: false + color_scheme: standard_color_scheme + show_value: false + stack: null + only_total: true + zoomable: false + show_legend: true + legendType: scroll + legendOrientation: bottom + legendMargin: null + x_axis_time_format: smart_date + xAxisLabelRotation: 45 + y_axis_format: SMART_NUMBER + logAxis: false + minorSplitLine: false + truncateXAxis: true + truncateYAxis: false + y_axis_bounds: + - null + - null + rich_tooltip: true + tooltipSortByMetric: false + tooltipTimeFormat: smart_date + extra_form_data: {} + dashboards: + - 1 +query_context: null +cache_timeout: null +uuid: 5a74062e-0386-465f-80b0-aeb79b15a5e9 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/Energy_consumption_by_device_family_19.yaml b/superset/dashboards/default_dashboards/charts/Energy_consumption_by_device_family_19.yaml new file mode 100644 index 0000000..040b7e6 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/Energy_consumption_by_device_family_19.yaml @@ -0,0 +1,95 @@ +slice_name: Energy consumption by device family +description: null +certified_by: null +certification_details: null +viz_type: bubble_v2 +params: + datasource: 2__table + viz_type: bubble_v2 + slice_id: 30 + entity: family + x: + aggregate: COUNT_DISTINCT + column: + advanced_data_type: null + certification_details: null + certified_by: null + column_name: hostname + description: null + expression: null + filterable: true + groupby: true + id: 106 + is_certified: false + is_dttm: false + python_date_format: null + type: TEXT + type_generic: 1 + verbose_name: null + warning_markdown: null + datasourceWarning: false + expressionType: SIMPLE + hasCustomLabel: true + label: Device Count + optionName: metric_500g31r1ckq_bu1o2zq3b1p + sqlExpression: null + y: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Traffic efficiency (kW/Gbps) + optionName: metric_suwar93bs0k_x9z820u54j + sqlExpression: AVG(traffic_efficiency)/1000 + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + size: + expressionType: SQL + sqlExpression: SUM(power_in)/1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: Energy Consumption (kWh) + optionName: metric_vves29g8xw_c7bcnopk4du + order_desc: true + row_limit: 50000 + color_scheme: standard_color_scheme + show_legend: true + legendType: scroll + legendOrientation: bottom + legendMargin: null + max_bubble_size: '25' + tooltipSizeFormat: ~g + opacity: 1 + x_axis_label: Device Count + xAxisLabelRotation: 0 + x_axis_title_margin: 30 + xAxisFormat: SMART_NUMBER + logXAxis: true + y_axis_label: Traffic Efficiency (kW/Gbps) + y_axis_title_margin: '40' + y_axis_format: SMART_NUMBER + logYAxis: false + truncateXAxis: false + xAxisBounds: + - null + - null + truncateYAxis: false + y_axis_bounds: + - null + - null + extra_form_data: {} + dashboards: + - 1 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: c276c227-a7f8-4de6-a8ce-92d9590f9a73 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/Sites_29.yaml b/superset/dashboards/default_dashboards/charts/Sites_29.yaml new file mode 100644 index 0000000..4c2ca31 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/Sites_29.yaml @@ -0,0 +1,56 @@ +slice_name: Sites +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 1__table + viz_type: big_number_total + slice_id: 487 + metric: + aggregate: COUNT_DISTINCT + column: + advanced_data_type: null + certification_details: null + certified_by: null + column_name: site + description: null + expression: null + filterable: true + groupby: true + id: 886 + is_certified: false + is_dttm: false + python_date_format: null + type: TEXT + type_generic: 1 + verbose_name: null + warning_markdown: null + datasourceWarning: false + expressionType: SIMPLE + hasCustomLabel: false + label: COUNT_DISTINCT(site) + optionName: metric_eqmyqjfoej7_e8v0ck7g6i + sqlExpression: null + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: timestamp + header_font_size: 0.4 + subheader_font_size: 0.2 + y_axis_format: SMART_NUMBER + time_format: smart_date + conditional_formatting: [] + granularity_sqla: timestamp + extra_form_data: {} + dashboards: + - 17 + - 18 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: ae32980b-902c-4e51-92fb-5819159712d0 +version: 1.0.0 +dataset_uuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 diff --git a/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_12.yaml b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_12.yaml new file mode 100644 index 0000000..ee05685 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_12.yaml @@ -0,0 +1,44 @@ +slice_name: TRAFFIC EFFICIENCY +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 39 + metric: + expressionType: SQL + sqlExpression: AVG(traffic_efficiency) / 1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: TRAFFIC EFFICIENCY + optionName: metric_8t1ucnmigvp_d5io8cx8qbn + adhoc_filters: + - expressionType: SQL + sqlExpression: bucket >= CURRENT_TIMESTAMP - INTERVAL '24 HOUR' + clause: WHERE + subject: bucket + operator: TEMPORAL_RANGE + comparator: null + isExtra: false + isNew: false + datasourceWarning: false + filterOptionName: filter_y598p2ruh0a_opdvxthrap + subheader: kW/Gbps + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 6 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 78cb894c-4438-48ab-8638-b513ff33f6a3 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_13.yaml b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_13.yaml new file mode 100644 index 0000000..bafbc9b --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_13.yaml @@ -0,0 +1,39 @@ +slice_name: TRAFFIC EFFICIENCY +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 65 + metric: + expressionType: SQL + sqlExpression: AVG(traffic_efficiency)/1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: traffic_efficiency + optionName: metric_cz5n2rcn7ys_62yu3y9pose + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + subheader: kW/Gbps + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 5 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 39dd3497-aa0e-4f3e-814c-0f942be00273 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_18.yaml b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_18.yaml new file mode 100644 index 0000000..90353fb --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_18.yaml @@ -0,0 +1,44 @@ +slice_name: TRAFFIC EFFICIENCY +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 55 + metric: + expressionType: SQL + sqlExpression: AVG(traffic_efficiency) / 1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: true + label: TRAFFIC EFFICIENCY + optionName: metric_91p8o5dcnnu_q1zokyknx0j + adhoc_filters: + - expressionType: SQL + sqlExpression: bucket >= CURRENT_TIMESTAMP - INTERVAL '24 HOUR' + clause: WHERE + subject: bucket + operator: TEMPORAL_RANGE + comparator: null + isExtra: false + isNew: false + datasourceWarning: false + filterOptionName: filter_66smzhrpgjl_xqha3umzybb + subheader: kW/Gbps + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 7 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 399f5dbd-8d1c-40e1-9a5d-d9cee606940c +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_26.yaml b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_26.yaml new file mode 100644 index 0000000..c123918 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_26.yaml @@ -0,0 +1,39 @@ +slice_name: TRAFFIC EFFICIENCY +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 58 + metric: + expressionType: SQL + sqlExpression: AVG(traffic_efficiency)/1000 + column: null + aggregate: null + datasourceWarning: false + hasCustomLabel: false + label: AVG(traffic_efficiency)/1000 + optionName: metric_4l631m7wk3o_tca3vau72mn + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + subheader: kW/Gbps + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 7 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 93dbab25-6e4e-4b4c-acc3-854d31ea03f5 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_3.yaml b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_3.yaml new file mode 100644 index 0000000..dd9b5f2 --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_3.yaml @@ -0,0 +1,39 @@ +slice_name: TRAFFIC EFFICIENCY +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 17 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Traffic Efficiency + optionName: metric_tkda9rfj1pc_2g2n98qnbhi + sqlExpression: AVG(traffic_efficiency)/1000 + adhoc_filters: + - clause: WHERE + comparator: No filter + expressionType: SIMPLE + operator: TEMPORAL_RANGE + subject: bucket + subheader: kW/Gbps + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 3 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: 2939146b-ee97-4541-a606-33114b40164d +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_7.yaml b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_7.yaml new file mode 100644 index 0000000..9ace4ac --- /dev/null +++ b/superset/dashboards/default_dashboards/charts/TRAFFIC_EFFICIENCY_7.yaml @@ -0,0 +1,44 @@ +slice_name: TRAFFIC EFFICIENCY +description: null +certified_by: null +certification_details: null +viz_type: big_number_total +params: + datasource: 2__table + viz_type: big_number_total + slice_id: 62 + metric: + aggregate: null + column: null + datasourceWarning: false + expressionType: SQL + hasCustomLabel: true + label: Traffic Efficiency + optionName: metric_a512j8ydxbw_qljm2kzeoxe + sqlExpression: AVG(traffic_efficiency) / 1000 + adhoc_filters: + - clause: WHERE + comparator: null + datasourceWarning: false + expressionType: SQL + filterOptionName: filter_7h8uuozwnri_dgrfjlgoc4j + isExtra: false + isNew: false + operator: TEMPORAL_RANGE + sqlExpression: bucket >= CURRENT_TIMESTAMP - INTERVAL '24 HOUR' + subject: bucket + subheader: kW/Gbps + header_font_size: 0.4 + subheader_font_size: 0.15 + y_axis_format: ',d' + time_format: smart_date + conditional_formatting: [] + extra_form_data: {} + dashboards: + - 5 + annotation_layers: [] +query_context: null +cache_timeout: null +uuid: d51c17f0-03b9-486b-81db-10a30176ab05 +version: 1.0.0 +dataset_uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd diff --git a/superset/dashboards/default_dashboards/dashboards/1._Organization_3.yaml b/superset/dashboards/default_dashboards/dashboards/1._Organization_3.yaml new file mode 100644 index 0000000..d84e052 --- /dev/null +++ b/superset/dashboards/default_dashboards/dashboards/1._Organization_3.yaml @@ -0,0 +1,640 @@ +dashboard_title: 1. Organization +description: null +css: ".subheader-line {\n position: absolute;\n right: 0;\n bottom: 1rem;\n\ + }\n\ndiv[data-test-viz-type=big_number_total] .header-line\n{\n color:#00bceb\ + \ !important;\n font-size: 1.5rem !important;\n line-height: inherit;\n \ + \ height: inherit !important;\n font-weight: 600;\n}\ndiv[data-test-viz-type=big_number_total]\ + \ .subheader-line {\n line-height: 1rem;\n font-size: .75rem !important;\n\ + }\n.dashboard-grid a.css-1r97axf{\n font-weight: 400;\n font-size: .875rem;\n\ + }\n.dashboard-grid a.css-1r97axf:hover{\n font-size: .875rem !important;\n} \n\ + .css-1f41l3g.dashboard-markdown .dashboard-component-chart-holder {\n font-size:1.25rem;\n\ + \ font-weight: 600;\n}" +slug: null +certified_by: '' +certification_details: '' +published: true +uuid: 3a4a2c2e-199e-4c22-901d-cb67c72ea7b5 +position: + CHART-A3AiLWs6VS: + children: [] + id: CHART-A3AiLWs6VS + meta: + chartId: 36 + height: 44 + sliceName: Energy Consumption By hour of day + sliceNameOverride: ENERGY CONSUMPTION BY HOUR OF THE DAY + uuid: 5a74062e-0386-465f-80b0-aeb79b15a5e9 + width: 3 + parents: + - ROOT_ID + - GRID_ID + - ROW-DXKGGzZniD + type: CHART + CHART-TryaeC4elN: + children: [] + id: CHART-TryaeC4elN + meta: + chartId: 19 + height: 44 + sliceName: Energy consumption by device family + sliceNameOverride: ENERGY CONSUMPTION BY DEVICE FAMILY + uuid: c276c227-a7f8-4de6-a8ce-92d9590f9a73 + width: 4 + parents: + - ROOT_ID + - GRID_ID + - ROW-DXKGGzZniD + type: CHART + CHART-_0n55o2xXY: + children: [] + id: CHART-_0n55o2xXY + meta: + chartId: 17 + height: 44 + sliceName: Energy Consumption during work hours + sliceNameOverride: ENERGY CONSUMPTION DURING BUSINESS HOURS + uuid: 95f30ff2-6c25-446f-9c1c-820a552128d2 + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-DXKGGzZniD + type: CHART + CHART-explore-32-1: + children: [] + id: CHART-explore-32-1 + meta: + chartId: 22 + height: 61 + sliceName: ENERGY CONSUMPTION and CO2eq EMISSIONS + uuid: 6a4b4456-4554-4f20-8f09-696cd92132aa + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-Yt0GlwD3vL + type: CHART + CHART-explore-38-1: + children: [] + id: CHART-explore-38-1 + meta: + chartId: 5 + height: 14 + sliceName: CO2eq EMISSIONS + uuid: 7f073bc3-deef-472b-8382-f3a90a550681 + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + - ROW-gaBJMrcJY- + type: CHART + CHART-explore-483-1: + children: [] + id: CHART-explore-483-1 + meta: + chartId: 31 + height: 44 + sliceName: Energy Consumption By day of the week + sliceNameOverride: ENERGY CONSUMPTION BY DAY OF THE WEEK + uuid: c6b2f4b2-6354-4337-a04e-5bc6f4c39bfd + width: 3 + parents: + - ROOT_ID + - GRID_ID + - ROW-DXKGGzZniD + type: CHART + CHART-explore-487-1: + children: [] + id: CHART-explore-487-1 + meta: + chartId: 29 + height: 11 + sliceName: Sites + sliceNameOverride: SITES + uuid: ae32980b-902c-4e51-92fb-5819159712d0 + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + - ROW-qgb2rx6t6n + type: CHART + CHART-explore-488-1: + children: [] + id: CHART-explore-488-1 + meta: + chartId: 28 + height: 11 + sliceName: Device Families + sliceNameOverride: DEVICE FAMILIES + uuid: 306d1c89-1f06-4971-92b4-7bb4da7ea622 + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + - ROW-qgb2rx6t6n + type: CHART + CHART-explore-489-1: + children: [] + id: CHART-explore-489-1 + meta: + chartId: 15 + height: 11 + sliceName: Devices + sliceNameOverride: DEVICES + uuid: 12abe591-8074-4db8-ba9a-76e4d8a7b1a1 + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + - ROW-qgb2rx6t6n + type: CHART + CHART-explore-490-1: + children: [] + id: CHART-explore-490-1 + meta: + chartId: 27 + height: 14 + sliceName: ENERGY CONSUMPTION + sliceNameOverride: ENERGY CONSUMPTION + uuid: 032421e3-83c2-4393-8f90-a9d83cd6dd1b + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + - ROW-gaBJMrcJY- + type: CHART + CHART-explore-62-1: + children: [] + id: CHART-explore-62-1 + meta: + chartId: 7 + height: 14 + sliceName: TRAFFIC EFFICIENCY + uuid: d51c17f0-03b9-486b-81db-10a30176ab05 + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + - ROW-gaBJMrcJY- + type: CHART + CHART-explore-63-1: + children: [] + id: CHART-explore-63-1 + meta: + chartId: 4 + height: 14 + sliceName: ENERGY CONSUMPTION + uuid: 10628c54-cbc5-4a9c-8e41-21040a911148 + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + - ROW-OGbOJxFg9M + type: CHART + CHART-explore-64-1: + children: [] + id: CHART-explore-64-1 + meta: + chartId: 32 + height: 14 + sliceName: CO2eq EMISSIONS + uuid: 2e0ccfca-b4c9-4ec3-9e00-66041ea43adb + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + - ROW-OGbOJxFg9M + type: CHART + CHART-explore-65-1: + children: [] + id: CHART-explore-65-1 + meta: + chartId: 13 + height: 14 + sliceName: TRAFFIC EFFICIENCY + uuid: 39dd3497-aa0e-4f3e-814c-0f942be00273 + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + - ROW-OGbOJxFg9M + type: CHART + COLUMN-Yt0GlwD3vL: + children: + - CHART-explore-32-1 + id: COLUMN-Yt0GlwD3vL + meta: + background: BACKGROUND_TRANSPARENT + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + type: COLUMN + COLUMN-qPggoEfN84: + children: + - ROW-qgb2rx6t6n + - ROW-ztsyiO326w + - ROW-gaBJMrcJY- + - MARKDOWN-otAwieV01p + - ROW-OGbOJxFg9M + id: COLUMN-qPggoEfN84 + meta: + background: BACKGROUND_TRANSPARENT + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + type: COLUMN + DASHBOARD_VERSION_KEY: v2 + GRID_ID: + children: + - ROW-nKcXk3waf + - ROW-DXKGGzZniD + id: GRID_ID + parents: + - ROOT_ID + type: GRID + HEADER_ID: + id: HEADER_ID + meta: + text: 1. Organization + type: HEADER + MARKDOWN-otAwieV01p: + children: [] + id: MARKDOWN-otAwieV01p + meta: + code: Last 30 Days - Totals + height: 7 + width: 4 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + type: MARKDOWN + MARKDOWN-y4MfTy3VGR: + children: [] + id: MARKDOWN-y4MfTy3VGR + meta: + code: Last 24 Hours + height: 7 + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + - ROW-ztsyiO326w + type: MARKDOWN + ROOT_ID: + children: + - GRID_ID + id: ROOT_ID + type: ROOT + ROW-DXKGGzZniD: + children: + - CHART-explore-483-1 + - CHART-A3AiLWs6VS + - CHART-_0n55o2xXY + - CHART-TryaeC4elN + id: ROW-DXKGGzZniD + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + type: ROW + ROW-OGbOJxFg9M: + children: + - CHART-explore-63-1 + - CHART-explore-64-1 + - CHART-explore-65-1 + id: ROW-OGbOJxFg9M + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + type: ROW + ROW-gaBJMrcJY-: + children: + - CHART-explore-490-1 + - CHART-explore-38-1 + - CHART-explore-62-1 + id: ROW-gaBJMrcJY- + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + type: ROW + ROW-nKcXk3waf: + children: + - COLUMN-qPggoEfN84 + - COLUMN-Yt0GlwD3vL + id: ROW-nKcXk3waf + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + type: ROW + ROW-qgb2rx6t6n: + children: + - CHART-explore-487-1 + - CHART-explore-488-1 + - CHART-explore-489-1 + id: ROW-qgb2rx6t6n + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + type: ROW + ROW-ztsyiO326w: + children: + - MARKDOWN-y4MfTy3VGR + id: ROW-ztsyiO326w + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-nKcXk3waf + - COLUMN-qPggoEfN84 + type: ROW +metadata: + chart_configuration: + '17': + id: 17 + crossFilters: + scope: global + chartsInScope: + - 4 + - 5 + - 7 + - 13 + - 15 + - 19 + - 22 + - 27 + - 28 + - 29 + - 31 + - 32 + - 36 + '19': + id: 19 + crossFilters: + scope: global + chartsInScope: + - 4 + - 5 + - 7 + - 13 + - 15 + - 17 + - 22 + - 27 + - 28 + - 29 + - 31 + - 32 + - 36 + '22': + id: 22 + crossFilters: + scope: global + chartsInScope: + - 4 + - 5 + - 7 + - 13 + - 15 + - 17 + - 19 + - 27 + - 28 + - 29 + - 31 + - 32 + - 36 + '31': + id: 31 + crossFilters: + scope: global + chartsInScope: + - 4 + - 5 + - 7 + - 13 + - 15 + - 17 + - 19 + - 22 + - 27 + - 28 + - 29 + - 32 + - 36 + '36': + id: 36 + crossFilters: + scope: global + chartsInScope: + - 4 + - 5 + - 7 + - 13 + - 15 + - 17 + - 19 + - 22 + - 27 + - 28 + - 29 + - 31 + - 32 + global_chart_configuration: + scope: + rootPath: + - ROOT_ID + excluded: [] + chartsInScope: + - 4 + - 5 + - 7 + - 13 + - 15 + - 17 + - 19 + - 22 + - 27 + - 28 + - 29 + - 31 + - 32 + - 36 + color_scheme: standard_color_scheme + refresh_frequency: 0 + expanded_slices: {} + label_colors: {} + timed_refresh_immune_slices: [] + cross_filters_enabled: false + default_filters: '{}' + native_filter_configuration: + - id: NATIVE_FILTER-ehsMYDbs4 + controlValues: + enableEmptyFilter: false + defaultToFirstItem: false + multiSelect: true + searchAllOptions: false + inverseSelection: false + name: Select Site + filterType: filter_select + targets: + - column: + name: site + datasetUuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 + defaultDataMask: + extraFormData: {} + filterState: {} + ownState: {} + cascadeParentIds: [] + scope: + rootPath: + - ROOT_ID + excluded: [] + type: NATIVE_FILTER + description: '' + chartsInScope: + - 22 + - 23 + - 24 + - 25 + - 26 + - 27 + - 28 + - 29 + - 30 + - 31 + - 32 + tabsInScope: [] + - id: NATIVE_FILTER-BhzNgm2eY + controlValues: + enableEmptyFilter: false + defaultToFirstItem: false + multiSelect: true + searchAllOptions: false + inverseSelection: false + name: Select Family + filterType: filter_select + targets: + - column: + name: family + datasetUuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd + defaultDataMask: + extraFormData: {} + filterState: {} + ownState: {} + cascadeParentIds: + - NATIVE_FILTER-ehsMYDbs4 + scope: + rootPath: + - ROOT_ID + excluded: + - 29 + - 28 + - 15 + type: NATIVE_FILTER + description: '' + chartsInScope: + - 482 + - 483 + - 484 + - 485 + - 486 + - 490 + - 491 + - 492 + tabsInScope: [] + - id: NATIVE_FILTER-EIVmmRaC- + controlValues: + enableEmptyFilter: false + defaultToFirstItem: false + multiSelect: true + searchAllOptions: false + inverseSelection: false + name: Select Device + filterType: filter_select + targets: + - column: + name: hostname + datasetUuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd + defaultDataMask: + extraFormData: {} + filterState: {} + ownState: {} + cascadeParentIds: + - NATIVE_FILTER-BhzNgm2eY + scope: + rootPath: + - ROOT_ID + excluded: + - 29 + - 28 + - 15 + type: NATIVE_FILTER + description: '' + chartsInScope: + - 22 + - 24 + - 25 + - 26 + - 27 + - 30 + - 31 + tabsInScope: [] + shared_label_colors: + Off Business Hours: '#fbab18' + Business Hours: '#0d274d' + Energy Consumption (kWh): '#fbab18' + CO2eq Emissions (kg CO2eq): '#0d274d' + color_scheme_domain: + - '#fbab18' + - '#0d274d' + - '#00bceb' + - '#6abf4b' + - '#e2231a' + - '#eed202' + - '#00bceb' + - '#495057' + - '#ced4da' +version: 1.0.0 diff --git a/superset/dashboards/default_dashboards/dashboards/2._Sites_1.yaml b/superset/dashboards/default_dashboards/dashboards/2._Sites_1.yaml new file mode 100644 index 0000000..d8244cd --- /dev/null +++ b/superset/dashboards/default_dashboards/dashboards/2._Sites_1.yaml @@ -0,0 +1,538 @@ +dashboard_title: 2. Sites +description: null +css: ".subheader-line {\n position: absolute;\n right: 0;\n bottom: 1rem;\n\ + }\n\ndiv[data-test-viz-type=big_number_total] .header-line\n{\n color:#00bceb\ + \ !important;\n font-size: 1.5rem !important;\n line-height: inherit;\n \ + \ height: inherit !important;\n font-weight: 600;\n}\ndiv[data-test-viz-type=big_number_total]\ + \ .subheader-line {\n line-height: 1rem;\n font-size: .75rem !important;\n\ + }\n.dashboard-grid a.css-1r97axf{\n font-weight: 400;\n font-size: .875rem;\n\ + }\n.dashboard-grid a.css-1r97axf:hover{\n font-size: .875rem !important;\n} \n\ + .css-1f41l3g.dashboard-markdown .dashboard-component-chart-holder {\n font-size:1.25rem;\n\ + \ font-weight: 600;\n}" +slug: null +certified_by: '' +certification_details: '' +published: true +uuid: 75145c7e-2b82-48b2-87d0-b905d917cec0 +position: + CHART-explore-34-1: + children: [] + id: CHART-explore-34-1 + meta: + chartId: 11 + height: 11 + sliceName: DEVICE FAMILIES + uuid: 803794d4-8acb-441b-97c8-1e58f3edf9fd + width: 3 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + - ROW-zZIL83L1NG + type: CHART + CHART-explore-35-1: + children: [] + id: CHART-explore-35-1 + meta: + chartId: 16 + height: 11 + sliceName: DEVICES + uuid: 476563e1-d443-4aae-a39d-21107eff1808 + width: 3 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + - ROW-zZIL83L1NG + type: CHART + CHART-explore-36-1: + children: [] + id: CHART-explore-36-1 + meta: + chartId: 20 + height: 61 + sliceName: ENERGY CONSUMPTION AND CO2eq EMISSIONS + uuid: 0617e91f-6715-4b75-80fb-cfe17f6bba6f + width: 3 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-_bpKfeMZ6D + type: CHART + CHART-explore-37-1: + children: [] + id: CHART-explore-37-1 + meta: + chartId: 33 + height: 14 + sliceName: ENERGY CONSUMPTION + uuid: bdc5ff85-8bc7-4e37-9914-38eeb02ef21c + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + - ROW-_p5Uctmbyq + type: CHART + CHART-explore-38-1: + children: [] + id: CHART-explore-38-1 + meta: + chartId: 34 + height: 14 + sliceName: CO2eq EMISSIONS + uuid: 35134fa2-6b47-41da-a3c7-6e7b275b2bb2 + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + - ROW-_p5Uctmbyq + type: CHART + CHART-explore-39-1: + children: [] + id: CHART-explore-39-1 + meta: + chartId: 12 + height: 14 + sliceName: TRAFFIC EFFICIENCY + uuid: 78cb894c-4438-48ab-8638-b513ff33f6a3 + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + - ROW-_p5Uctmbyq + type: CHART + CHART-explore-40-1: + children: [] + id: CHART-explore-40-1 + meta: + chartId: 6 + height: 14 + sliceName: ENERGY CONSUMPTION + uuid: 20c61aeb-2019-4112-b8a0-2fa108f2dbaa + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + - ROW-fLkyvPMbJq + type: CHART + CHART-explore-41-1: + children: [] + id: CHART-explore-41-1 + meta: + chartId: 23 + height: 14 + sliceName: CO2eq EMISSIONS + uuid: 7abf1603-34e9-472f-a15f-4f86dd6a829d + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + - ROW-fLkyvPMbJq + type: CHART + CHART-explore-42-1: + children: [] + id: CHART-explore-42-1 + meta: + chartId: 3 + height: 14 + sliceName: TRAFFIC EFFICIENCY + uuid: 2939146b-ee97-4541-a606-33114b40164d + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + - ROW-fLkyvPMbJq + type: CHART + CHART-explore-43-1: + children: [] + id: CHART-explore-43-1 + meta: + chartId: 24 + height: 50 + sliceName: ENERGY CONSUMPTION BY DAY OF WEEK + uuid: 1531bcbd-ece1-4309-bad0-5166e5f22e9a + width: 3 + parents: + - ROOT_ID + - GRID_ID + - ROW-EDqiRSHH8z + type: CHART + CHART-explore-44-1: + children: [] + id: CHART-explore-44-1 + meta: + chartId: 14 + height: 50 + sliceName: ENERGY CONSUMPTION BY HOUR OF DAY + uuid: 40cf6e61-7276-463d-8ad5-d9f4a41118c7 + width: 3 + parents: + - ROOT_ID + - GRID_ID + - ROW-EDqiRSHH8z + type: CHART + CHART-explore-45-1: + children: [] + id: CHART-explore-45-1 + meta: + chartId: 9 + height: 50 + sliceName: ENERGY CONSUMPTION DURING WORK HOURS + uuid: 35a5b771-3c68-4412-bb1d-3def9c49739e + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-EDqiRSHH8z + type: CHART + CHART-explore-66-1: + children: [] + id: CHART-explore-66-1 + meta: + chartId: 10 + height: 50 + sliceName: ENERGY CONSUMPTION BY DEVICE FAMILY + uuid: d23b66b3-01d4-404c-b241-faddbca89ab4 + width: 4 + parents: + - ROOT_ID + - GRID_ID + - ROW-EDqiRSHH8z + type: CHART + COLUMN-EhZMaT9jau: + children: + - ROW-zZIL83L1NG + - ROW-WwoBTfDIKP + - ROW-_p5Uctmbyq + - ROW-EySqmWdu6t + - ROW-fLkyvPMbJq + id: COLUMN-EhZMaT9jau + meta: + background: BACKGROUND_TRANSPARENT + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + type: COLUMN + COLUMN-_bpKfeMZ6D: + children: + - CHART-explore-36-1 + id: COLUMN-_bpKfeMZ6D + meta: + background: BACKGROUND_TRANSPARENT + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + type: COLUMN + DASHBOARD_VERSION_KEY: v2 + GRID_ID: + children: + - ROW-BQMGBgxNL + - ROW-EDqiRSHH8z + id: GRID_ID + parents: + - ROOT_ID + type: GRID + HEADER_ID: + id: HEADER_ID + meta: + text: 2. Sites + type: HEADER + MARKDOWN-cuktWghycq: + children: [] + id: MARKDOWN-cuktWghycq + meta: + code: Last 24 Hours + height: 7 + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + - ROW-WwoBTfDIKP + type: MARKDOWN + MARKDOWN-r39tolbEhB: + children: [] + id: MARKDOWN-r39tolbEhB + meta: + code: Last 30 Days - Totals + height: 7 + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + - ROW-EySqmWdu6t + type: MARKDOWN + ROOT_ID: + children: + - GRID_ID + id: ROOT_ID + type: ROOT + ROW-BQMGBgxNL: + children: + - COLUMN-EhZMaT9jau + - COLUMN-_bpKfeMZ6D + id: ROW-BQMGBgxNL + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + type: ROW + ROW-EDqiRSHH8z: + children: + - CHART-explore-43-1 + - CHART-explore-44-1 + - CHART-explore-45-1 + - CHART-explore-66-1 + id: ROW-EDqiRSHH8z + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + type: ROW + ROW-EySqmWdu6t: + children: + - MARKDOWN-r39tolbEhB + id: ROW-EySqmWdu6t + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + type: ROW + ROW-WwoBTfDIKP: + children: + - MARKDOWN-cuktWghycq + id: ROW-WwoBTfDIKP + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + type: ROW + ROW-_p5Uctmbyq: + children: + - CHART-explore-37-1 + - CHART-explore-38-1 + - CHART-explore-39-1 + id: ROW-_p5Uctmbyq + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + type: ROW + ROW-fLkyvPMbJq: + children: + - CHART-explore-40-1 + - CHART-explore-41-1 + - CHART-explore-42-1 + id: ROW-fLkyvPMbJq + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + type: ROW + ROW-zZIL83L1NG: + children: + - CHART-explore-34-1 + - CHART-explore-35-1 + id: ROW-zZIL83L1NG + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-BQMGBgxNL + - COLUMN-EhZMaT9jau + type: ROW +metadata: + chart_configuration: + '9': + id: 9 + crossFilters: + scope: global + chartsInScope: + - 3 + - 6 + - 10 + - 11 + - 12 + - 14 + - 16 + - 20 + - 23 + - 24 + - 33 + - 34 + '10': + id: 10 + crossFilters: + scope: global + chartsInScope: + - 3 + - 6 + - 9 + - 11 + - 12 + - 14 + - 16 + - 20 + - 23 + - 24 + - 33 + - 34 + '14': + id: 14 + crossFilters: + scope: global + chartsInScope: + - 3 + - 6 + - 9 + - 10 + - 11 + - 12 + - 16 + - 20 + - 23 + - 24 + - 33 + - 34 + '20': + id: 20 + crossFilters: + scope: global + chartsInScope: + - 3 + - 6 + - 9 + - 10 + - 11 + - 12 + - 14 + - 16 + - 23 + - 24 + - 33 + - 34 + '24': + id: 24 + crossFilters: + scope: global + chartsInScope: + - 3 + - 6 + - 9 + - 10 + - 11 + - 12 + - 14 + - 16 + - 20 + - 23 + - 33 + - 34 + global_chart_configuration: + scope: + rootPath: + - ROOT_ID + excluded: [] + chartsInScope: + - 3 + - 6 + - 9 + - 10 + - 11 + - 12 + - 14 + - 16 + - 20 + - 23 + - 24 + - 33 + - 34 + color_scheme: standard_color_scheme + refresh_frequency: 0 + expanded_slices: {} + label_colors: {} + timed_refresh_immune_slices: [] + cross_filters_enabled: true + default_filters: '{}' + native_filter_configuration: + - id: NATIVE_FILTER-xj6aKx5XN + controlValues: + enableEmptyFilter: false + defaultToFirstItem: false + multiSelect: true + searchAllOptions: false + inverseSelection: false + name: Select Site + filterType: filter_select + targets: + - column: + name: site + datasetUuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 + defaultDataMask: + extraFormData: {} + filterState: {} + ownState: {} + cascadeParentIds: [] + scope: + rootPath: + - ROOT_ID + excluded: [] + type: NATIVE_FILTER + description: '' + chartsInScope: + - 34 + tabsInScope: [] + shared_label_colors: + Off Business Hours: '#fbab18' + Business Hours: '#0d274d' + Daily Energy Consumption (kWh): '#fbab18' + Daily CO2eq Emissions (kg CO2eq): '#0d274d' + Energy Consumption (kWh): '#fbab18' + color_scheme_domain: + - '#fbab18' + - '#0d274d' + - '#00bceb' + - '#6abf4b' + - '#e2231a' + - '#eed202' + - '#00bceb' + - '#495057' + - '#ced4da' +version: 1.0.0 diff --git a/superset/dashboards/default_dashboards/dashboards/3._Devices_2.yaml b/superset/dashboards/default_dashboards/dashboards/3._Devices_2.yaml new file mode 100644 index 0000000..4487d15 --- /dev/null +++ b/superset/dashboards/default_dashboards/dashboards/3._Devices_2.yaml @@ -0,0 +1,502 @@ +dashboard_title: 3. Devices +description: null +css: ".subheader-line {\n position: absolute;\n right: 0;\n bottom: 1rem;\n\ + }\n\ndiv[data-test-viz-type=big_number_total] .header-line\n{\n color:#00bceb\ + \ !important;\n font-size: 1.5rem !important;\n line-height: inherit;\n \ + \ height: inherit !important;\n font-weight: 600;\n}\ndiv[data-test-viz-type=big_number_total]\ + \ .subheader-line {\n line-height: 1rem;\n font-size: .75rem !important;\n\ + }\n.dashboard-grid a.css-1r97axf{\n font-weight: 400;\n font-size: .875rem;\n\ + }\n.dashboard-grid a.css-1r97axf:hover{\n font-size: .875rem !important;\n} \n\ + .css-1f41l3g.dashboard-markdown .dashboard-component-chart-holder {\n font-size:1.25rem;\n\ + \ font-weight: 600;\n}" +slug: null +certified_by: '' +certification_details: '' +published: true +uuid: 0c077aae-7790-46c1-9c32-079ad18b232f +position: + CHART-explore-49-1: + children: [] + id: CHART-explore-49-1 + meta: + chartId: 37 + height: 50 + sliceName: ENERGY CONSUMPTION AND CO2eq EMISSIONS + uuid: 3a319c66-d42e-4a52-ad44-2d2c668b907c + width: 3 + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-Um337zPUHP + type: CHART + CHART-explore-50-1: + children: [] + id: CHART-explore-50-1 + meta: + chartId: 2 + height: 51 + sliceName: ENERGY CONSUMPTION BY DAY OF WEEK + uuid: d61b0672-97ac-49a8-96c2-622d7cd14132 + width: 4 + parents: + - ROOT_ID + - GRID_ID + - ROW-U7ibvewh3h + type: CHART + CHART-explore-51-1: + children: [] + id: CHART-explore-51-1 + meta: + chartId: 35 + height: 51 + sliceName: ENERGY CONSUMPTION BY HOUR OF DAY + uuid: 683dd5b5-3c82-463d-9d74-4275a979b204 + width: 4 + parents: + - ROOT_ID + - GRID_ID + - ROW-U7ibvewh3h + type: CHART + CHART-explore-52-1: + children: [] + id: CHART-explore-52-1 + meta: + chartId: 8 + height: 51 + sliceName: ENERGY CONSUMPTION DURING WORK HOURS + uuid: 8fe454a6-332b-495e-b3f6-8a1f48a7d65e + width: 4 + parents: + - ROOT_ID + - GRID_ID + - ROW-U7ibvewh3h + type: CHART + CHART-explore-53-1: + children: [] + id: CHART-explore-53-1 + meta: + chartId: 25 + height: 15 + sliceName: ENERGY CONSUMPTION + uuid: 0253592c-5d6e-458d-a858-ef453ccbcaac + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + - ROW-Oh-VYOfSzQ + type: CHART + CHART-explore-54-1: + children: [] + id: CHART-explore-54-1 + meta: + chartId: 30 + height: 15 + sliceName: CO2eq EMISSIONS + uuid: f32ee84f-9d25-4316-85a2-7cde42728a0b + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + - ROW-Oh-VYOfSzQ + type: CHART + CHART-explore-55-1: + children: [] + id: CHART-explore-55-1 + meta: + chartId: 18 + height: 15 + sliceName: TRAFFIC EFFICIENCY + uuid: 399f5dbd-8d1c-40e1-9a5d-d9cee606940c + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + - ROW-Oh-VYOfSzQ + type: CHART + CHART-explore-56-1: + children: [] + id: CHART-explore-56-1 + meta: + chartId: 21 + height: 15 + sliceName: ENERGY CONSUMPTION + uuid: c49fe1db-df06-4e98-ba5a-e63c74a0d21c + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + - ROW-4ZkHj_qzBl + type: CHART + CHART-explore-57-1: + children: [] + id: CHART-explore-57-1 + meta: + chartId: 1 + height: 15 + sliceName: CO2eq EMISSIONS + uuid: ccfd63ca-7b2a-4923-904a-4e93ab14db4c + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + - ROW-4ZkHj_qzBl + type: CHART + CHART-explore-58-1: + children: [] + id: CHART-explore-58-1 + meta: + chartId: 26 + height: 15 + sliceName: TRAFFIC EFFICIENCY + uuid: 93dbab25-6e4e-4b4c-acc3-854d31ea03f5 + width: 2 + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + - ROW-4ZkHj_qzBl + type: CHART + COLUMN-Um337zPUHP: + children: + - CHART-explore-49-1 + id: COLUMN-Um337zPUHP + meta: + background: BACKGROUND_TRANSPARENT + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + type: COLUMN + COLUMN-wbZuZ6roKB: + children: + - ROW-vbMEI6Uc4c + - ROW-Oh-VYOfSzQ + - ROW-XjBpJcHyHU + - ROW-4ZkHj_qzBl + id: COLUMN-wbZuZ6roKB + meta: + background: BACKGROUND_TRANSPARENT + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + type: COLUMN + DASHBOARD_VERSION_KEY: v2 + GRID_ID: + children: + - ROW-3WCcuvF6CI + - ROW-U7ibvewh3h + id: GRID_ID + parents: + - ROOT_ID + type: GRID + HEADER_ID: + id: HEADER_ID + meta: + text: 3. Devices + type: HEADER + MARKDOWN-EaKftvVRVN: + children: [] + id: MARKDOWN-EaKftvVRVN + meta: + code: Last 30 Days - Totals + height: 7 + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + - ROW-XjBpJcHyHU + type: MARKDOWN + MARKDOWN-_F79YDhNgs: + children: [] + id: MARKDOWN-_F79YDhNgs + meta: + code: Last 24 Hours + height: 7 + width: 6 + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + - ROW-vbMEI6Uc4c + type: MARKDOWN + ROOT_ID: + children: + - GRID_ID + id: ROOT_ID + type: ROOT + ROW-3WCcuvF6CI: + children: + - COLUMN-wbZuZ6roKB + - COLUMN-Um337zPUHP + id: ROW-3WCcuvF6CI + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + type: ROW + ROW-4ZkHj_qzBl: + children: + - CHART-explore-56-1 + - CHART-explore-57-1 + - CHART-explore-58-1 + id: ROW-4ZkHj_qzBl + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + type: ROW + ROW-Oh-VYOfSzQ: + children: + - CHART-explore-53-1 + - CHART-explore-54-1 + - CHART-explore-55-1 + id: ROW-Oh-VYOfSzQ + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + type: ROW + ROW-U7ibvewh3h: + children: + - CHART-explore-50-1 + - CHART-explore-51-1 + - CHART-explore-52-1 + id: ROW-U7ibvewh3h + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + type: ROW + ROW-XjBpJcHyHU: + children: + - MARKDOWN-EaKftvVRVN + id: ROW-XjBpJcHyHU + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + type: ROW + ROW-vbMEI6Uc4c: + children: + - MARKDOWN-_F79YDhNgs + id: ROW-vbMEI6Uc4c + meta: + background: BACKGROUND_TRANSPARENT + parents: + - ROOT_ID + - GRID_ID + - ROW-3WCcuvF6CI + - COLUMN-wbZuZ6roKB + type: ROW +metadata: + chart_configuration: + '2': + id: 2 + crossFilters: + scope: global + chartsInScope: + - 1 + - 8 + - 18 + - 21 + - 25 + - 26 + - 30 + - 35 + - 37 + '8': + id: 8 + crossFilters: + scope: global + chartsInScope: + - 1 + - 2 + - 18 + - 21 + - 25 + - 26 + - 30 + - 35 + - 37 + '35': + id: 35 + crossFilters: + scope: global + chartsInScope: + - 1 + - 2 + - 8 + - 18 + - 21 + - 25 + - 26 + - 30 + - 37 + '37': + id: 37 + crossFilters: + scope: global + chartsInScope: + - 1 + - 2 + - 8 + - 18 + - 21 + - 25 + - 26 + - 30 + - 35 + global_chart_configuration: + scope: + rootPath: + - ROOT_ID + excluded: [] + chartsInScope: + - 1 + - 2 + - 8 + - 18 + - 21 + - 25 + - 26 + - 30 + - 35 + - 37 + color_scheme: standard_color_scheme + refresh_frequency: 0 + expanded_slices: {} + label_colors: {} + timed_refresh_immune_slices: [] + cross_filters_enabled: true + default_filters: '{}' + native_filter_configuration: + - id: NATIVE_FILTER-OFSHv_o7V + controlValues: + enableEmptyFilter: false + defaultToFirstItem: false + multiSelect: true + searchAllOptions: false + inverseSelection: false + name: Select Site + filterType: filter_select + targets: + - column: + name: site + datasetUuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 + defaultDataMask: + extraFormData: {} + filterState: {} + ownState: {} + cascadeParentIds: [] + scope: + rootPath: + - ROOT_ID + excluded: [] + type: NATIVE_FILTER + description: '' + chartsInScope: [] + tabsInScope: [] + - id: NATIVE_FILTER-oLCXTkP3N + controlValues: + enableEmptyFilter: false + defaultToFirstItem: false + multiSelect: true + searchAllOptions: false + inverseSelection: false + name: Select Family + filterType: filter_select + targets: + - column: + name: family + datasetUuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 + defaultDataMask: + extraFormData: {} + filterState: {} + ownState: {} + cascadeParentIds: + - NATIVE_FILTER-OFSHv_o7V + scope: + rootPath: + - ROOT_ID + excluded: [] + type: NATIVE_FILTER + description: '' + chartsInScope: [] + tabsInScope: [] + - id: NATIVE_FILTER-sPYSIoJVG + controlValues: + enableEmptyFilter: false + defaultToFirstItem: false + multiSelect: true + searchAllOptions: false + inverseSelection: false + name: Select Device + filterType: filter_select + targets: + - column: + name: hostname + datasetUuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 + defaultDataMask: + extraFormData: {} + filterState: {} + ownState: {} + cascadeParentIds: + - NATIVE_FILTER-oLCXTkP3N + scope: + rootPath: + - ROOT_ID + excluded: [] + type: NATIVE_FILTER + description: '' + chartsInScope: + - 49 + - 50 + - 51 + - 52 + tabsInScope: [] + shared_label_colors: + Off Business Hours: '#fbab18' + Business Hours: '#0d274d' + Energy Consumption (kWh): '#fbab18' + Daily Energy Consumption (kWh): '#fbab18' + Daily CO2eq Emissions (kg CO2eq): '#0d274d' + color_scheme_domain: + - '#fbab18' + - '#0d274d' + - '#00bceb' + - '#6abf4b' + - '#e2231a' + - '#eed202' + - '#00bceb' + - '#495057' + - '#ced4da' +version: 1.0.0 diff --git a/superset/dashboards/default_dashboards/databases/susi.yaml b/superset/dashboards/default_dashboards/databases/susi.yaml new file mode 100644 index 0000000..5164087 --- /dev/null +++ b/superset/dashboards/default_dashboards/databases/susi.yaml @@ -0,0 +1,13 @@ +database_name: susi +sqlalchemy_uri: postgresql+psycopg2://REPLACE_USER_NAME:REPLACE_USER_PWD@database:REPLACE_DB_PORT/REPLACE_DB_NAME +cache_timeout: null +expose_in_sqllab: true +allow_run_async: false +allow_ctas: false +allow_cvas: false +allow_dml: false +allow_file_upload: false +extra: + allows_virtual_table_explore: true +uuid: bd98a864-83a0-4ef5-afdd-c30e022c6fa3 +version: 1.0.0 diff --git a/superset/dashboards/default_dashboards/datasets/susi/powermetrics.yaml b/superset/dashboards/default_dashboards/datasets/susi/powermetrics.yaml new file mode 100644 index 0000000..e17031e --- /dev/null +++ b/superset/dashboards/default_dashboards/datasets/susi/powermetrics.yaml @@ -0,0 +1,221 @@ +table_name: powermetrics +main_dttm_col: timestamp +description: null +default_endpoint: null +offset: 0 +cache_timeout: null +schema: metrics +sql: null +params: null +template_params: null +filter_select_enabled: true +fetch_values_predicate: null +extra: null +normalize_columns: false +always_filter_main_dttm: false +uuid: 14f50bc2-4581-4303-ac1d-23c0dc325435 +metrics: +- metric_name: count + verbose_name: COUNT(*) + metric_type: count + expression: COUNT(*) + description: null + d3format: null + currency: null + extra: null + warning_text: null +columns: +- column_name: timestamp + verbose_name: null + is_dttm: true + is_active: true + type: TIMESTAMP WITH TIME ZONE + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: co2_intensity + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: power_available + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: traffic_efficiency + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: cpu_usage + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: traffic_in + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: traffic_out + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: memory_usage + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: power_utilization + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: power_efficiency + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: power_in + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: power_out + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: temperature + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: hostname + verbose_name: null + is_dttm: false + is_active: true + type: TEXT + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: family + verbose_name: null + is_dttm: false + is_active: true + type: TEXT + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: site + verbose_name: null + is_dttm: false + is_active: true + type: TEXT + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +version: 1.0.0 +database_uuid: bd98a864-83a0-4ef5-afdd-c30e022c6fa3 diff --git a/superset/dashboards/default_dashboards/datasets/susi/vw_site_week_timebucket.yaml b/superset/dashboards/default_dashboards/datasets/susi/vw_site_week_timebucket.yaml new file mode 100644 index 0000000..7523168 --- /dev/null +++ b/superset/dashboards/default_dashboards/datasets/susi/vw_site_week_timebucket.yaml @@ -0,0 +1,173 @@ +table_name: vw_site_week_timebucket +main_dttm_col: bucket +description: null +default_endpoint: null +offset: 0 +cache_timeout: null +schema: metrics +sql: null +params: null +template_params: null +filter_select_enabled: true +fetch_values_predicate: null +extra: null +normalize_columns: false +always_filter_main_dttm: false +uuid: b63486cc-73f0-4f2d-ae0f-e9d29dbd9bfd +metrics: +- metric_name: count + verbose_name: COUNT(*) + metric_type: count + expression: COUNT(*) + description: null + d3format: null + currency: null + extra: null + warning_text: null +columns: +- column_name: bucket + verbose_name: null + is_dttm: true + is_active: true + type: TIMESTAMP WITH TIME ZONE + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: co2_intensity + verbose_name: null + is_dttm: false + is_active: true + type: NUMERIC + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: traffic_efficiency + verbose_name: null + is_dttm: false + is_active: true + type: NUMERIC + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: power_utilization + verbose_name: null + is_dttm: false + is_active: true + type: NUMERIC + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: power_efficiency + verbose_name: null + is_dttm: false + is_active: true + type: NUMERIC + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: power_in + verbose_name: null + is_dttm: false + is_active: true + type: NUMERIC + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: temperature + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: cpu + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: memory + verbose_name: null + is_dttm: false + is_active: true + type: INTEGER + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: hostname + verbose_name: null + is_dttm: false + is_active: true + type: TEXT + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: family + verbose_name: null + is_dttm: false + is_active: true + type: TEXT + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +- column_name: site + verbose_name: null + is_dttm: false + is_active: true + type: TEXT + advanced_data_type: null + groupby: true + filterable: true + expression: null + description: null + python_date_format: null + extra: null +version: 1.0.0 +database_uuid: bd98a864-83a0-4ef5-afdd-c30e022c6fa3 diff --git a/superset/dashboards/default_dashboards/metadata.yaml b/superset/dashboards/default_dashboards/metadata.yaml new file mode 100644 index 0000000..8665be5 --- /dev/null +++ b/superset/dashboards/default_dashboards/metadata.yaml @@ -0,0 +1,3 @@ +version: 1.0.0 +type: Dashboard +timestamp: '2024-05-24T05:45:22.241969+00:00' diff --git a/superset/superset-init.sh b/superset/superset-init.sh new file mode 100755 index 0000000..6c55b0c --- /dev/null +++ b/superset/superset-init.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + + +echo "Waiting for Superset admin creation..." +# create Admin user, you can read these values from env or anywhere else possible +superset fab create-admin --username "$ADMIN_USERNAME" --firstname Superset --lastname Admin --email "$ADMIN_EMAIL" --password "$ADMIN_PASSWORD" + +echo "Waiting for Superset upgrade..." +# Upgrading Superset metastore +superset db upgrade + +echo "Waiting for Superset init..." +# setup roles and permissions +superset superset init + +echo "Waiting for Superset dashboard loading" + +# Wait for Superset server to start +sleep 5 + +sed -i'' -e "s/REPLACE_USER_NAME/$DBUSER/g; s/REPLACE_USER_PWD/$DBPASS/g; s/REPLACE_DB_PORT/$DBPORT/g; s/REPLACE_DB_NAME/$DBNAME/g" /tmp/default_dashboards/databases/susi.yaml + +# Create dashboard zip folder +cd /tmp && zip -r default_dashboards.zip default_dashboards + +sleep 10 + +# Run dashboard import command +superset import-dashboards -p /tmp/default_dashboards.zip -u admin + +echo "Waiting for Superset server start..." + +# Starting server +/bin/sh -c /usr/bin/run-server.sh diff --git a/superset/superset_config.py b/superset/superset_config.py new file mode 100644 index 0000000..0fb177c --- /dev/null +++ b/superset/superset_config.py @@ -0,0 +1,30 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +FEATURE_FLAGS = { + "ENABLE_TEMPLATE_PROCESSING": True, +} + +ENABLE_PROXY_FIX = True +EXTRA_CATEGORICAL_COLOR_SCHEMES = [ + { + "id": 'standard_color_scheme', + "description": '', + "label": 'Standard color scheme', + "colors": + ['#fbab18', '#0d274d', '#00bceb', '#6abf4b', '#e2231a', '#eed202', '#00bceb','#495057','#ced4da'] + }] +APP_NAME = "Sustainability Insights Tool (SIT)" \ No newline at end of file diff --git a/utils/README.md b/utils/README.md new file mode 100644 index 0000000..e69de29 diff --git a/utils/applog.py b/utils/applog.py new file mode 100644 index 0000000..53940aa --- /dev/null +++ b/utils/applog.py @@ -0,0 +1,56 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import logging + +# uses the root logger +logger = logging.getLogger() + +def logconfig(customer = 'System', level = 'INFO'): + """ + Configures the logging format and level + Parameters: + customer (string): customer name or defaults to 'System' + level (string): One of OFF, ERROR, INFO, DEBUG. Defaults to INFO + Returns: + logger (logging.Logger) logger instance for the app + """ + global logger + + # reset logging levels, this works only the first time + logging.basicConfig(level=logging.NOTSET) + + # fetch handler if already set, else create one + if len(logger.handlers) == 0: + console = logging.StreamHandler() + logger.addHandler(console) + else: + console = logger.handlers[0] + + format = logging.Formatter(f"%(asctime)s %(levelname)s %(filename)s:%(lineno)s {customer} %(message)s", datefmt='%d-%b-%y %H:%M:%S') + console.setFormatter(format) + + # Python logger does not have OFF level. + # If the user intends to turns off logging altogether, + # then set the log threshold to +1 more than the highest loglevel + # Else set the desired log level + if 'OFF' == level: + log_level = logging.CRITICAL + 1 + else: + log_level = logging.getLevelName(level) + console.setLevel(log_level) + + return logger diff --git a/utils/dbcon.py b/utils/dbcon.py new file mode 100644 index 0000000..e257ff8 --- /dev/null +++ b/utils/dbcon.py @@ -0,0 +1,346 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +import os +import psycopg2 +from utils.applog import logger + +cnxn = None + +def connect(): + global cnxn + + if not cnxn: + dbuser = os.environ.get('DBUSER', 'susit') + dbpass = os.environ.get('DBPASS') + dbhost = os.environ.get('DBHOST', 'localhost') + dbport = os.environ.get('DBPORT', '5432') + dbname = os.environ.get('DBNAME', 'susit') + + try: + dbstr = f"postgres://{dbuser}:{dbpass}@{dbhost}:{dbport}/{dbname}" + cnxn = psycopg2.connect(dbstr) + logger.info(f"Connected to database {dbname}") + except (Exception, psycopg2.DatabaseError) as e: + raise e + return cnxn + +def fetch_assets(customer, hostname): + """ + Reads device asset information from asset table in customer schema + Parameters: + customer: customer name/schema + hostname: device hostname + Returns: + assets: array of assets in the form + [ + { + 'hostname': device name + 'serial': integer, input power in watts + 'pid': string, product ID + } + ] + Exception on failure + """ + assets = [] + try: + connect() + cursor = cnxn.cursor() + cursor.execute( + f"SELECT serial, pid from {customer}.assets WHERE hostname = '{hostname}'") + results = cursor.fetchall() + for i in results: + assets.append( + dict([('hostname', hostname), ('serial', i[0]), ('pid', i[1])])) + except (Exception, psycopg2.DatabaseError) as e: + logger.error(f"{hostname} failed to fetch assets details {e}") + cnxn.rollback() + finally: + cursor.close() + return assets + +def insert_assets(customer, hostname, assets): + """ + Inserts device asset information to asset table in customer schema + Parameters: + customer: customer name/schema to insert to + hostname: device hostname + assets: array of assets in the form + [ + { + 'hostname': device name + 'serial': inger, input power in watts + 'pid': string, product ID + } + ] + Returns: + None on success + Exception on failure + """ + + # if matching values already exist, then skip + existing = fetch_assets(customer, hostname) + if assets and assets == existing: + return + + try: + connect() + cursor = cnxn.cursor() + + # this table needs to hold only the latest entries + # in the rare event of new assets getting added, then + # delete all entries and then insert, rather than selecting updates and deletes + if existing: + cursor.execute( + f"DELETE FROM {customer}.assets WHERE hostname = '{hostname}'") + + # insert new values + values = ','.join(cursor.mogrify('(%s, %s, %s)', (hostname, i['serial'], i['pid'])).decode('utf-8') for i in assets) + cursor.execute( + f"INSERT INTO {customer}.assets (hostname, serial, pid) VALUES {values}") + cnxn.commit() + except (Exception, psycopg2.DatabaseError) as e: + logger.error(f"{hostname} failed to insert assets details {e}") + logger.error(f"{hostname} attempted to insert {assets}") + cnxn.rollback() + finally: + cursor.close() + return + +def insert_psumetrics(customer, hostname, metrics): + """ + Inserts PSU metrics to psumetrics timeseries table in customer schema + Parameters: + customer: customer name/schema to insert to + hostname: device hostname + metrics: array of psu metrics in the form + [ + { + 'timestamp': timestamp with timezone + 'hostname': device name + 'power_in': integer, input power in watts + 'power_out': integer, output power in watts + 'power_efficiency': integer, psu efficiency in percentage + } + ] + Returns: + None on success + Exception on failure + """ + try: + connect() + cursor = cnxn.cursor() + values = ','.join(cursor.mogrify( + '(%s, %s, %s, %s, %s, %s)', ( + i['timestamp'], hostname, i['psuname'],i['power_in'], i['power_out'], i['power_efficiency'] + )).decode('utf-8') for i in metrics) + cursor.execute(f"INSERT INTO {customer}.psumetrics VALUES {values}") + cnxn.commit() + except (Exception, psycopg2.DatabaseError) as e: + logger.error(f"{hostname} failed to insert psu metrics {e}") + logger.error(f"{hostname} attempted to insert {metrics}") + cnxn.rollback() + finally: + cursor.close() + return + +def insert_ifmetrics(customer, hostname, metrics): + """ + Inserts Interface metrics to ifmetrics timeseries table in customer schema + Parameters: + customer: customer name/schema to insert to + hostname: device hostname + metrics: array of interface metrics in the form + [ + { + 'timestamp': timestamp with timezone + 'hostname': device name + 'ifname': integer, power input in watts + 'bandwidth': integer, interface bandwidth in Kbps + 'traffic_in': integer, total incoming traffic in Kbps + 'traffic_out': integer, total outgoinf traffic in Kbps + 'utilization': integer, psu efficiency in percentage + } + ] + Returns: + None on success + Exception on failure + """ + try: + connect() + cursor = cnxn.cursor() + values = ','.join(cursor.mogrify( + '(%s, %s, %s, %s, %s, %s, %s)', ( + i['timestamp'], hostname, i['ifname'],i['bandwidth'], i['traffic_in'], i['traffic_out'], i['utilization'] + )).decode('utf-8') for i in metrics) + cursor.execute(f"INSERT INTO {customer}.ifmetrics VALUES {values}") + cnxn.commit() + except (Exception, psycopg2.DatabaseError) as e: + logger.error(f"{hostname} failed to insert interface metrics {e}") + logger.error(f"{hostname} attempted to insert {metrics}") + cnxn.rollback() + finally: + cursor.close() + return + +def fetch_powermetrics(customer, site, duration): + """ + Reads power metrics in customer schema + Parameters: + customer: customer name/schema + site: site name + duration: query duration in number of days + timezone: timezone of the site + Returns: + assets: array of assets in the form, time bucketed into 1hr each + [ + { + 'timestamp': timebucket + 'site': integer, input power in watts + 'family': string, device family + 'hostname': string, device hostname + 'power_in': float, avg power consumed in kWh + 'power_efficiency': float, avg PSU efficiency + 'power_utilization': float, avg PSU utilization + 'traffic_efficiency': float, avg traffic utilization + 'temperature': max temperature status + 'cpu': max cpu usage + 'memory': max memory usage + 'co2_intensity': float, average co2 intensity + 'co2_emission': float, average CO2 Emission in gEqCO2/kWh + } + ] + Exception on failure + """ + metrics = [] + try: + connect() + cursor = cnxn.cursor() + cursor.execute( + f""" + SELECT time_bucket_gapfill('1 hour', timestamp) as bucket, + site, + family, + hostname, + locf(avg(power_in)) as power_in, + locf(avg(power_efficiency)) as power_efficiency, + locf(avg(power_utilization)) as power_utilization, + locf(avg(traffic_efficiency)) as traffic_efficiency, + max(temperature) as temperature, + max(cpu_usage) as cpu, + max(memory_usage) as memory, + locf(avg(co2_intensity)) as co2_intensity + FROM {customer}.powermetrics + WHERE site = '{site}' + AND timestamp < NOW() + AND timestamp > NOW() - INTERVAL '{duration} days' + GROUP BY bucket, site, family, hostname + ORDER BY hostname, bucket ASC; + """) + results = cursor.fetchall() + for i in results: + metrics.append( + dict([ + ('timestamp', i[0]), + ('site', i[1]), + ('family', i[2]), + ('hostname', i[3]), + ('power_in', i[4]/1000 if i[4] else None), + ('power_efficiency', i[5]), + ('power_utilization', i[6]), + ('traffic_efficiency', i[7]/1000 if i[7] else None), + ('temperature', i[8]), + ('cpu', i[9]), + ('memory', i[10]), + ('co2_intensity', i[11]), + ('co2_emission', (i[4]/1000 * i[11]) if i[4] and i[11] else None) + ])) + except (Exception, psycopg2.DatabaseError) as e: + logger.error(f"{site} failed to fetch power metrics {e}") + cnxn.rollback() + finally: + cursor.close() + return metrics + +def insert_powermetrics(customer, hostname, metrics): + """ + Inserts power metrics to powermetrics timeseries table in customer schema + Parameters: + customer: customer name/schema to insert to + hostname: device hostname + metrics: array of interface metrics in the form + [ + { + 'timestamp': timestamp with timezone + 'site': site name + 'hostname': device name + 'power_in': integer, power input in watts + 'power_out': integer, power output in watts + 'power_efficiency': integer, power output in watts + 'power_available': integer, total nominal power in watts + 'power_utilization': integer, total power consumed / total nominal power in percentage + 'traffic_in': integer, total incoming traffic in Kbs + 'traffic_out': integer, total outgoinf traffic in Kbs + 'traffic_efficiency': integer, total power consumed / total traffic in Watts/Gbps + 'temperature': temperature status -1 unknown, 0 normal, 1 warning, 2 critical + 'cpu_usage': -1 unknown, 0 - 100% otherwise + 'memory_usage': -1 unknown, 0 - 100% otherwise + 'co2_intensity': co2 intensity at the given site at the given time + } + ] + Returns: + None on success + Exception on failure + """ + try: + connect() + cursor = cnxn.cursor() + values = cursor.mogrify('(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', list(metrics.values())).decode('utf-8') + cursor.execute(f"INSERT INTO {customer}.powermetrics VALUES {values}") + cnxn.commit() + except (Exception, psycopg2.DatabaseError) as e: + logger.error(f"{hostname} failed to insert power metrics {e}") + logger.error(f"{hostname} attempted to insert {metrics}") + cnxn.rollback() + finally: + cursor.close() + return + +def fetch_psu_specs(hostname, pidlist): + specs = [] + + if not pidlist: + return [] + + try: + connect() + cursor = cnxn.cursor() + cursor.execute( + f"SELECT pid, nominal_power, available_power, efficiency from common.psu WHERE pid = ANY (%s)", (pidlist,)) + results = cursor.fetchall() + for i in results: + specs.append( + dict([('pid', i[0]), ('nominal_power', i[1]), ('available_power', i[2]), ('efficiency', i[3])])) + except (Exception, psycopg2.DatabaseError) as e: + logger.error(f"{hostname} failed to fetch PSU specs {e}") + cnxn.rollback() + finally: + cursor.close() + return specs + +def fetch_module_specs(pids): + pass + diff --git a/utils/messaging.py b/utils/messaging.py new file mode 100644 index 0000000..6087ee0 --- /dev/null +++ b/utils/messaging.py @@ -0,0 +1,75 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +from confluent_kafka import Producer, Consumer +import json +import os +import logging + +_producer = _consumer = None + + +def produce(topic, key, message): + + global _producer + + if _producer is None: + kafka_config = {} + kafka_config['bootstrap.servers'] = os.environ.get('BOOTSTRAP_SERVERS', 'localhost:29092') + _producer = Producer(kafka_config) + + try: + _producer.produce(topic, key = key, value = json.dumps(message)) + except Exception as e: + logging.error(f"Failed to publish to message queue {topic}") + raise e + + return True + +def shutdown(): + if _producer: + _producer.flush() + if _consumer: + _consumer.close() + +def consume(topic, group): + + global _consumer + + if _consumer is None: + props = { + 'bootstrap.servers' : os.environ.get('BOOTSTRAP_SERVERS', 'localhost:29092'), + 'group.id' : group, + 'enable.partition.eof' : False, + 'enable.auto.commit' : True, + 'auto.commit.interval.ms': 5000 + } + _consumer = Consumer(props) + _consumer.subscribe([topic]) + + try: + while True: + message = _consumer.poll(timeout = 1) + if message is None: + continue + + if message.error(): + logging.error(f"error {message.error()}") + continue + return message.value().decode('utf-8') + except Exception as e: + logging.error(f"Could not fetch from message queue {topic}") + raise e diff --git a/utils/secrets.py b/utils/secrets.py new file mode 100644 index 0000000..2b07417 --- /dev/null +++ b/utils/secrets.py @@ -0,0 +1,55 @@ +# Copyright 2024 Cisco Systems, Inc. and its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +from cryptography.fernet import Fernet + +def encrypt(secret): + """ + Encrypts given secrets, generates encryption key + Parameters: + secret: text like device password to be encrypted + Returns: + encrypted: encrypted secret + key: encryption key, required to decrypt + """ + if secret is None: + return None + + key = Fernet.generate_key() + fernet = Fernet(key) + encrypted = fernet.encrypt(secret.encode()) + return (encrypted.decode(), key.decode()) + +def decrypt(secret, key): + """ + Decrypts given secret, generates encryption key + Parameters: + secret: secret to be decrypted + key: secret's encryption key + Returns: + decrypted secret (DO NOT log decrypted secrets) + None on failure to decrypt say due to invalid key + """ + if secret is None or key is None: + return None + + fernet = Fernet(key) + try: + decrypted = fernet.decrypt(secret.encode()).decode() + except: + return None + return decrypted +