From 202fb2c6196daadd8bfce79ac877599025ae90a6 Mon Sep 17 00:00:00 2001 From: Dan With Date: Tue, 12 Nov 2024 09:10:20 -0600 Subject: [PATCH 1/8] fix: Edit cinder volume netapp playbook: OSPC-802 (#551) --- .../deploy-cinder-netapp-volumes-reference.yaml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/ansible/playbooks/deploy-cinder-netapp-volumes-reference.yaml b/ansible/playbooks/deploy-cinder-netapp-volumes-reference.yaml index e9a769d9..03a3bc78 100644 --- a/ansible/playbooks/deploy-cinder-netapp-volumes-reference.yaml +++ b/ansible/playbooks/deploy-cinder-netapp-volumes-reference.yaml @@ -101,8 +101,8 @@ group: root mode: "{{ item.mode | default('0644') }}" loop: - - src: "{{ playbook_dir }}/templates/cinder-netapp-volume.service" - dest: /etc/systemd/system/cinder-netapp-volume.service + - src: "{{ playbook_dir }}/templates/cinder-volume-netapp.service" + dest: /etc/systemd/system/cinder-volume-netapp.service - src: "{{ playbook_dir }}/templates/sudoers" dest: /etc/sudoers.d/cinder-volume mode: "0440" @@ -168,12 +168,6 @@ {% set rendered_backend = {} %} {% for backend in cinder_backend_name.split(',') %} {% set default_backend = (_kubernetes_cinder_etc_secret.resources[0].data['backends.conf'] | b64decode | community.general.from_ini)[backend] %} - {% set network_interface = hostvars[inventory_hostname][cinder_storage_network_interface]['ipv4']['address'] | default(ansible_default_ipv4.address) %} - {% set network_interface_secondary = hostvars[inventory_hostname][cinder_storage_network_interface_secondary]['ipv4']['address'] %} - {% set _ = default_backend.__setitem__("target_ip_address", network_interface) %} - {% if (custom_multipath | bool) %} - {% set _ = default_backend.__setitem__("iscsi_secondary_ip_addresses", network_interface_secondary) %} - {% endif %} {% set _ = rendered_backend.__setitem__(backend, default_backend) %} {% endfor %} {{ rendered_backend }} From 76557120d1183bc21dd3578fd93d70145d86214a Mon Sep 17 00:00:00 2001 From: "phillip.toohill" Date: Tue, 12 Nov 2024 09:40:50 -0600 Subject: [PATCH 2/8] feat: Adding additional monitoring info to the operational guide docs (#550) --- docs/monitoring-info.md | 173 ++++++++++++++++++++++++++++++++++++++++ mkdocs.yml | 2 + 2 files changed, 175 insertions(+) create mode 100644 docs/monitoring-info.md diff --git a/docs/monitoring-info.md b/docs/monitoring-info.md new file mode 100644 index 00000000..75bf19e3 --- /dev/null +++ b/docs/monitoring-info.md @@ -0,0 +1,173 @@ +# Genestack Monitoring + +Genestack is made up of a vast array of components working away to provide a Kubernetes and OpenStack cloud infrastructure +to serve our needs. Here we'll discuss in a bit more detail about how we're monitoring these components and what that +looks like. + +## Overview + +In this document we'll dive a bit deeper into the components and how they're being used, for a quick overview take a look +at the [Monitoring Overview](prometheus-monitoring-overview.md) documentation. + +The following tooling are what was chosen as part of Genestack's default monitoring workflow primarily for their open-sourced nature and ease of integration. +These tools are not an absolute requirement and can easily be replaced by tooling of the end users choice as they see fit. + +## Prometheus + +Prometheus is the heavy lifter in Genestack when it comes to monitoring. We rely on Prometheus to monitor and collect metrics +for everything from the node/host health itself to Kubernetes stats and even OpenStack service metrics and operations. + +Prometheus is an open-source systems monitoring and alerting toolkit built in 2012. It joined the Cloud Native Computing Foundation in 2016 as the second hosted project, after Kubernetes. + +Prometheus is a powerful system that collects and stores its metrics as time series data, i.e. metrics information is stored with the timestamp at which it was recorded, alongside optional key-value pairs called labels. + +To read more about Prometheus from the official source take a look at [Prometheus Docs](https://prometheus.io). + +To install Prometheus within the Genestack workflow we make use of the helm charts found in the kube-prometheus-stack. + + +## The Kube Prometheus Stack + +Genestack takes full advantage of [Helm](https://helm.sh/) and [Kustomize maninfests](https://kustomize.io/) to build a production grade Kubernetes and OpenStack Cloud. +When it comes to monitoring Genestack this is no different, Genestack makes use of the [Prometheus Community's](https://github.com/prometheus-community) [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack). + +The kube-prometheus-stack provides an easy to operate end-to-end Kubernetes cluster monitoring system with Prometheus using the [Prometheus Operator](https://github.com/prometheus-operator/prometheus-operator). + +The kube-prometheus-stack offers many components that make monitoring fairly straight forward, scalable and easy to maintain. +In Genestack we have opted to make use of a subset of the components. As our needs change we may make further use of more of the components that the kube-prometheus-stack provides. +At the time of writing the primary components Genestack is not making use of as part of the kube-prometheus-stack are [Thanos](https://thanos.io/), a HA, long term storage Prometheus setup and [Grafana](https://grafana.com/), a metrics and alerting visualization platform. + +Thanos hasn't been a need or priority to setup by default in Genestack but is available to anyone utilizing Genestack by configuring the ThanosService section found in the [prometheus-helm-overrides.yaml](https://github.com/rackerlabs/genestack/blob/main/base-helm-configs/prometheus/prometheus-helm-overrides.yaml) in the Genestack repo. +For configuration documentation of Thanos view the [Thanos Docs](https://thanos.io/tip/thanos/getting-started.md/). + +As for Grafana, we install this separately to fit our needs with datasources, custom routes, auth and certs. To see more information about how we're installing Grafana as part of the Genestack workflow see: [Grafana README](https://github.com/rackerlabs/genestack/blob/main/base-helm-configs/grafana/README.md) and the installation documentation found at [Install Grafana](grafana.md). + +Some of the components that we do take advantage of are the [Prometheus Operator](https://github.com/prometheus-operator/prometheus-operator), [AlertManager](https://prometheus.io/docs/alerting/latest/alertmanager/) +and various custom resource definitions(CRD). These CRD's include the AlertManagerConfig, PrometheusRule and things like the ServiceMonitors, which allows for dynamic service monitoring configured outside the traditional Prometheus configuration methods. +For a more complete list and their definitions view: [Prometheus Operator Design](https://prometheus-operator.dev/docs/getting-started/design/). + +To install the kube-prometheus-stack as part of Genestack's workflow view the [Installing Prometheus Doc](prometheus.md). + +As for the metrics themselves they are largely provided by 'exporters' which simply export the data exposed by various services we wish to monitor in order for Prometheus to injest them. +The kube-prometheus-stack provides a set of key exporters deployed by default, such as, node-exporter and kube-state-metrics, that Genestack relies on to monitor its infrastructure. + +## Metric Exporters + +Genestack makes heavy use of prometheus exporters as there are many services that require monitoring. Below is the list of exporters Genestack deploys to monitor its systems. + +* ### Node Exporter: +The [node-exporter](https://github.com/prometheus/node_exporter) is geared toward hardware and OS metrics exposed by *NIX kernels. +The node-exporter exposes many important metrics by default such as cpu, hwmon, meminfo, loadavg and many more. For a full list view the [node-exporter README](https://github.com/prometheus/node_exporter?tab=readme-ov-file#collectors). + +* ### Kube State Metrics: +The [kube-state-metrics](https://github.com/kubernetes/kube-state-metrics) service provides metrics regarding the health of Kubernetes objects such as deployments, nodes and pods. +The kube-state-metrics service provides detailed information about the health and state of Kubernetes components and objects such as ConfigMaps, Jobs, Nodes, Deployments and many many more. +View the [kube-state-docs](https://github.com/kubernetes/kube-state-metrics/tree/main/docs) for a complete list and further information. + +Beyond those two highly important ones installed by default are many more equally important metric exporters that we install as part of Genestack's workflow that we'll go over next. + +* ### MariaDB/MySQL Exporter: +Genestack uses a couple different database solutions to run OpenStack or just for general storage capabilities, the most prominent of them is MySQL or more specifically within Genestack MariaDB and Galera. +When installing [MariaDB](infrastructure-mariadb.md) as part of Genestack's workflow it is default to enable metrics which deploys its own service monitor as part of the [mariadb-operator](https://mariadb-operator.github.io/mariadb-operator/latest/) helm charts. +This is great if you have already installed Prometheus, if not the MariaDB deploy with fail, or if are fine with potentially disrupting database services if you have a need to update metrics collection separately. It is encouraged to install the [Mysql Exporter](prometheus-mysql-exporter.md) as a separate exporter that can be updated without having to run MariaDB deploy/update commands. +The [mysql-exporter](https://github.com/prometheus/mysqld_exporter) is provided by the prometheus organization and is also what's used within the MariaDB Operator. When installed separately via the Genestack [Mysql Exporter](prometheus-mysql-exporter.md) installation instructions the [prometheus-mysql-exporter](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-mysql-exporter) helm charts are used. +The mysql-exporter provides many important metrics related to the overall health and operation of your MariaDB/Galera cluster. You can view more details about what's exported in the [mysqld-exporter README](https://github.com/prometheus/mysqld_exporter?tab=readme-ov-file#mysql-server-exporter-). + +* ### Postgres Exporter: +Genestack also makes use of PostgreSQL for a limited set of services. At the time of writing only [Gnocchi](openstack-gnocchi.md) is making use of it. It's still an important part of the system and requires monitoring. +To do so we make use of the Prometheus community helm charts [prometheus-postgres-exporter](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-postgres-exporter) and it's installed as part of Genestack's workflow by following the [Postgres Exporter](prometheus-postgres-exporter.md). +Further information about the exporter and the metrics it collects and exposes can be found in the [postgres_exporter](https://github.com/prometheus-community/postgres_exporter/blob/master/README.md) documentation. + +* ### RabbitMQ Exporter: +Many OpenStack services require RabbitMQ to operate and is part of Genestack's infrastructure deployment. [RabbitMQ](infrastructure-rabbitmq.md) cluster can be finicky at times and it's important to be able to monitor it. +Genestack makes use of the Prometheus community's [prometheus-rabbitmq-exporter](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-rabbitmq-exporter) helm charts and is installed as part of Genestack's workflow via [RabbitMQ Exporter](prometheus-rabbitmq-exporter.md). +The RabbitMQ exporter provides many detailed metrics such as channels, connections and queues. View a complete list of the metrics exposed in the [RabbitMQ Exporter Docs](https://github.com/kbudde/rabbitmq_exporter/blob/main/metrics.md). + +* ### Memcached Exporter: +Many OpenStack services make use of Memcached as a caching layer which is part of Genestack's infrastructure deployment found in the [Memcached Deployment Doc](infrastructure-memcached.md). +We monitor Memcached utilizing Prometheus community's helm chart for the [prometheus-memcached-exporter](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-memcached-exporter). +The memcached-exporter offers many metrics for things like uptime, connections and limits. For a full list view the [Memcached Exporter Docs](https://github.com/prometheus/memcached_exporter/blob/master/README.md#collectors). + +* ### BlackBox Exporter: +The blackbox exporter allows blackbox probing of endpoints over HTTP, HTTPS, DNS, TCP, ICMP and gRPC. This exporter is ideally deployed cross region in order to check the service health across the network. +Deploying it as part of the cluster it's monitoring does still have its benefits as it will reach out the gateways and back in to provide some context about the health of your services. This can also serve as a simple way to check endpoint cert expiration. +Install this exporter following the documentation found at [BlackBox Deployment Doc](prometheus-blackbox-exporter.md). For more information regarding the BlackBox exporter see the upstream [BlackBox Exporter Doc](https://github.com/prometheus/blackbox_exporter) + +* ### OVN Monitoring: +OVN is installed a bit differently compared to the rest of the services as you can see in the [OVN Deployment Doc](infrastructure-ovn-setup.md). The installation ends up installing [Kube-OVN](https://github.com/kubeovn/kube-ovn) which exposes metrics about its operations. +However, at this point, there's no way for Prometheus to scrape those metrics. The way Genestack achieves this is by applying ServiceMonitor CRD's so Prometheus knows how to find and scrape these services for metric collection. +In the [Kube-OVN Deployment Doc](https://docs.rackspacecloud.com/prometheus-kube-ovn/) we see a simple command to apply the contents of [prometheus-ovn](https://github.com/rackerlabs/genestack/tree/main/base-kustomize/prometheus-ovn). +The contents are a set of ServiceMonitor manifests that define labels, namespaces and names to match to a service to monitor which is percisely what a [ServiceMonitor](https://prometheus-operator.dev/docs/api-reference/api/#monitoring.coreos.com/v1.ServiceMonitor) CRD is designed to do. +You can view more information about the metrics provided in the [Kube-OVN Metrics Doc](https://kubeovn.github.io/docs/stable/en/reference/metrics/). +Once we've ran the apply command we will have installed ServiceMonitors for Kube-OVN services: + * CNI + * Controller + * OVN + * Pinger + +* ### Nginx Gateway Monitoring: +Genestack makes use of the [Nginx Gateway Fabric](https://github.com/nginxinc/nginx-gateway-fabric/tree/main/charts/nginx-gateway-fabric) for its implementation of [Kubernetes Gateway API](https://gateway-api.sigs.k8s.io/). Genestack deploys this as part of its infrastructure, view the [Nginx Gateway Deployment Doc](infrastructure-gateway-api.md) for more information. +Nginx Gateway does expose important metrics for us to gather but it does not do so via a service. Instead we must make use another Prometheus CRD the [PodMonitor](https://prometheus-operator.dev/docs/getting-started/design/#podmonitor). +The install is similar to the above OVN monitoring as you can see in the [Nginx Gateway Exporter Deployment Doc](prometheus-nginx-gateway.md). The primary difference is the need to target and match on a pod that's exposing the metrics rather than a service. +You can view more information about the metrics exposed by the Nginx Gateway by viewing the [Nginx Gateway Fabric Docs](https://docs.nginx.com/nginx-gateway-fabric/how-to/monitoring/prometheus/). + +* ### OpenStack Metrics: +OpenStack Metrics are a bit different compared to the rest of the exporters as there's no single service, pod or deployment that exposes Prometheus metrics for collection. Instead, Genestack uses the [OpenStack Exporter](https://github.com/openstack-exporter/openstack-exporter) to gather the metrics for us. +The OpenStack exporter reaches out to all the configured OpenStack services, queries their API for stats and packages them as metrics Prometheus can then process. The OpenStack exporter is configurable and can collect metrics from just about every OpenStack service such as Keystone, Nova, Octavia etc.. +View the [OpenStack Exporter Deployment Doc](prometheus-openstack-metrics-exporter.md) for more information on how to configure and deploy the exporter in the Genestack workflow. +You can view more information about the OpenStack exporter in general and what metrics are collected in the [OpenStack Exporter Doc](https://github.com/openstack-exporter/openstack-exporter?tab=readme-ov-file#metrics). + +* ### Ceph Monitoring: +[Ceph](https://rook.io/docs/rook/latest-release/Getting-Started/intro/) comes with its own set of optimized collectors and exporters. In terms of deploying [Ceph Internally](storage-ceph-rook-internal.md) there is nothing for us to do. The service and ServiceMonitor CRD's are created and metrics will be available in Prometheus assuming metric collection is enabled in the helm chart. +If we are deploying [Ceph externally](storage-ceph-rook-external.md) then we will want to add another Prometheus CRD, the [ScrapeConfig](https://prometheus-operator.dev/docs/getting-started/design/#scrapeconfig). +The ScrapeConfig allows us to define external sources for Prometheus to scrape. + !!! example "Example ScrapeConfig for external Ceph monitoring" + + ``` yaml + apiVersion: monitoring.coreos.com/v1alpha1 + kind: ScrapeConfig + metadata: + name: external-ceph-monitor + namespace: prometheus + labels: + prometheus: sys\em-monitoring-prometheus + spec: + staticConfigs: + - labels: + job: prometheus + targets: + - 192.12.34.567:9283 + ``` +With this example we can simply apply it to the cluster and Prometheus will soon begin scraping metrics for our external Ceph cluster. +We can see additional information about the Ceph exporter at the [Ceph Github Docs](https://github.com/rook/rook/blob/master/design/ceph/ceph-exporter.md). +For additional information regarding the metrics collected and exposed from Ceph clusters view the [Ceph Telemetry Doc](https://github.com/rook/rook/blob/master/design/ceph/ceph-telemetry.md?plain=1). + +* ### Push Gateway: +The [Prometheus Push Gateway](https://github.com/prometheus/pushgateway) is used to gather metrics from short-lived jobs, like Kubernetes CronJobs. +It's not capable of turning Prometheus into a push-based monitoring system and should only be used when there is no other way to collect the desired metrics. +Currently, in Genestack the push gateway is only being used to gather stats from the OVN-Backup CronJob as noted in the [Pushgateway Deployment Doc](prometheus-pushgateway.md). + +* ### Textfile Collector: +It's possible to gather node/host metrics that aren't exposed by any of the above exporters by utilizing the [Node Exporter Textfile Collector](https://github.com/prometheus/node_exporter?tab=readme-ov-file#textfile-collector). +Currently, in Genestack the textfile-collector is used to collect kernel-taint stats. To view more information about the textfile-collector and how to deploy your own custom exporter view the [Custom Metrics Deployment Doc](prometheus-custom-node-metrics.md). + +This is currently the complete list of exporters and monitoring callouts deployed within the Genestack workflow. That said, Genestack is constantly evolving and list may grow or change entirely as we look to further improve our systems! +With all these metrics available we need a way to visualize them to get a better picture of our systems and their health, we'll discuss that next! + + +## Visualization + +In Genestack we deploy [Grafana](https://grafana.com/) as our default visualization tool. Grafana is open-sourced tooling which aligns well with the Genestack ethos while providing seamless visualization of the metrics generated by our systems. +Grafana also plays well with Prometheus and [Loki](infrastructure-loki.md), the default logging tooling deployed in Genestacks workflow, with various datasource plugins making integration a breeze. +Installing [Grafana](grafana.md) within Genestack is fairly straight forward, just follow the [Grafana Deployment Doc](grafana.md). + +As things stand now, the Grafana deployment does not deploy dashboards as part of the default deployment instructions. However, there are dashboards available found in the [etc directory](https://github.com/rackerlabs/genestack/tree/main/etc/grafana-dashboards) of the Genestack repo that can be installed manually. +The dashboards available cover just about every exporter/metric noted here and then some. Some of the dashboards may not be complete or may not provide the desired view. Please feel free to adjust them as needed and submit a PR to [Genestack repo](https://github.com/rackerlabs/genestack) if they may help others! + + +## Next Steps + +With what's deployed as part of our Genestack workflow today we get a fairly clear view of all our systems that allows us to properly monitor our Genestack cluster. +As we begin to expand to more regions or add other services that exist outside of our cluster, such as Swift, with its own monitoring systems a need may arise for tooling not provided within Genestack. +For example, Grafana may not provide all the features we'd like in a dashboard and we may want to find something that could combine multiple regions while being able to provide automation activity on alerts and way to notify support and on-call team members. +At that point it may be time to look at replacing certain tooling or running them in conjunction with things like [Dynatrace](https://www.dynatrace.com/) or [Datadog](https://www.datadoghq.com/) or any of the many tools available to fit our needs. diff --git a/mkdocs.yml b/mkdocs.yml index a69ec846..325c130d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -244,6 +244,8 @@ nav: - MariaDB Operations: infrastructure-mariadb-ops.md - Adding New Node: adding-new-node.md - Host Aggregates: openstack-host-aggregates.md + - Monitoring and Alerting: + - Monitoring Information: monitoring-info.md - Third Party Tools: - OSIE: extra-osie.md - OpenStack: From bf0f8703bf2854365f39a5a9fcc67e06f07c4604 Mon Sep 17 00:00:00 2001 From: "phillip.toohill" Date: Tue, 12 Nov 2024 15:41:58 -0600 Subject: [PATCH 3/8] Updating Monitoring info op doc with OVN monitoring linkage (#554) --- docs/monitoring-info.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/monitoring-info.md b/docs/monitoring-info.md index 75bf19e3..05ea8d05 100644 --- a/docs/monitoring-info.md +++ b/docs/monitoring-info.md @@ -69,7 +69,7 @@ Beyond those two highly important ones installed by default are many more equall * ### MariaDB/MySQL Exporter: Genestack uses a couple different database solutions to run OpenStack or just for general storage capabilities, the most prominent of them is MySQL or more specifically within Genestack MariaDB and Galera. When installing [MariaDB](infrastructure-mariadb.md) as part of Genestack's workflow it is default to enable metrics which deploys its own service monitor as part of the [mariadb-operator](https://mariadb-operator.github.io/mariadb-operator/latest/) helm charts. -This is great if you have already installed Prometheus, if not the MariaDB deploy with fail, or if are fine with potentially disrupting database services if you have a need to update metrics collection separately. It is encouraged to install the [Mysql Exporter](prometheus-mysql-exporter.md) as a separate exporter that can be updated without having to run MariaDB deploy/update commands. +This is great if you have already installed Prometheus, if not the MariaDB deploy will fail and there may be other potential database disrupting issues if you have a need to update metrics settings alone. It is encouraged to install the [Mysql Exporter](prometheus-mysql-exporter.md) as a separate exporter that can be updated without having to run MariaDB deploy/update commands. The [mysql-exporter](https://github.com/prometheus/mysqld_exporter) is provided by the prometheus organization and is also what's used within the MariaDB Operator. When installed separately via the Genestack [Mysql Exporter](prometheus-mysql-exporter.md) installation instructions the [prometheus-mysql-exporter](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-mysql-exporter) helm charts are used. The mysql-exporter provides many important metrics related to the overall health and operation of your MariaDB/Galera cluster. You can view more details about what's exported in the [mysqld-exporter README](https://github.com/prometheus/mysqld_exporter?tab=readme-ov-file#mysql-server-exporter-). @@ -105,6 +105,8 @@ Once we've ran the apply command we will have installed ServiceMonitors for Kube * OVN * Pinger + You can view more information about OVN monitoring in the [OVN Monitoring Introduction Docs](ovn-monitoring-introduction.md). + * ### Nginx Gateway Monitoring: Genestack makes use of the [Nginx Gateway Fabric](https://github.com/nginxinc/nginx-gateway-fabric/tree/main/charts/nginx-gateway-fabric) for its implementation of [Kubernetes Gateway API](https://gateway-api.sigs.k8s.io/). Genestack deploys this as part of its infrastructure, view the [Nginx Gateway Deployment Doc](infrastructure-gateway-api.md) for more information. Nginx Gateway does expose important metrics for us to gather but it does not do so via a service. Instead we must make use another Prometheus CRD the [PodMonitor](https://prometheus-operator.dev/docs/getting-started/design/#podmonitor). From 003901933173165388b5c53952285e087e1d9dd1 Mon Sep 17 00:00:00 2001 From: "phillip.toohill" Date: Wed, 13 Nov 2024 08:43:25 -0600 Subject: [PATCH 4/8] Updating openstack metrics dashboard with proper queries (#555) --- etc/grafana-dashboards/openstack_metrics.json | 183 ++++++++++-------- 1 file changed, 102 insertions(+), 81 deletions(-) diff --git a/etc/grafana-dashboards/openstack_metrics.json b/etc/grafana-dashboards/openstack_metrics.json index b273baa5..495e1f1a 100644 --- a/etc/grafana-dashboards/openstack_metrics.json +++ b/etc/grafana-dashboards/openstack_metrics.json @@ -168,8 +168,9 @@ "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "editorMode": "code", "exemplar": true, - "expr": "count(last_over_time(openstack_nova_agent_state{adminState=\"enabled\"}[1h]))-sum(last_over_time(openstack_nova_agent_state{adminState=\"enabled\"}[1h]))", + "expr": "count(last_over_time(openstack_nova_agent_state{adminState=\"enabled\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}[1h]))-sum(last_over_time(openstack_nova_agent_state{adminState=\"enabled\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}[1h]))", "format": "time_series", "hide": false, "instant": true, @@ -294,8 +295,9 @@ "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "editorMode": "code", "exemplar": true, - "expr": "last_over_time(openstack_nova_agent_state{adminState=\"enabled\"}[1h])", + "expr": "last_over_time(openstack_nova_agent_state{adminState=\"enabled\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}[1h])", "format": "table", "instant": true, "interval": "", @@ -431,7 +433,7 @@ }, "editorMode": "code", "exemplar": true, - "expr": "sum(last_over_time(openstack_nova_agent_state{adminState=\"enabled\"}[1h]))", + "expr": "sum(last_over_time(openstack_nova_agent_state{adminState=\"enabled\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}[1h]))", "format": "time_series", "hide": false, "instant": true, @@ -867,7 +869,8 @@ "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, - "expr": "count(last_over_time(openstack_neutron_agent_state{adminState=\"up\"}[1h]))-sum(last_over_time(openstack_neutron_agent_state{adminState=\"up\"}[1h]))", + "editorMode": "code", + "expr": "count(last_over_time(openstack_neutron_agent_state{adminState=\"up\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}[1h]))-sum(last_over_time(openstack_neutron_agent_state{adminState=\"up\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}[1h]))", "format": "time_series", "hide": false, "instant": true, @@ -994,8 +997,9 @@ "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "editorMode": "code", "exemplar": true, - "expr": "last_over_time(openstack_neutron_agent_state[1h])", + "expr": "last_over_time(openstack_neutron_agent_state{hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}[1h])", "format": "table", "instant": true, "interval": "", @@ -1130,7 +1134,8 @@ "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, - "expr": "sum(last_over_time(openstack_neutron_agent_state{adminState=\"up\"}[1h]))", + "editorMode": "code", + "expr": "sum(last_over_time(openstack_neutron_agent_state{adminState=\"up\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}[1h]))", "format": "time_series", "hide": false, "instant": true, @@ -1257,7 +1262,7 @@ "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", - "expr": "sum(openstack_placement_resource_usage{resourcetype=\"VCPU\"})", + "expr": "sum(openstack_placement_resource_usage{resourcetype=\"VCPU\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"})", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1272,7 +1277,7 @@ }, "editorMode": "code", "exemplar": true, - "expr": "sum(openstack_placement_resource_total{resourcetype=\"VCPU\"})", + "expr": "sum(openstack_placement_resource_total{resourcetype=\"VCPU\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"})", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1286,7 +1291,7 @@ "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", - "expr": "sum(openstack_placement_resource_total{resourcetype=\"VCPU\"}) * 6", + "expr": "sum(openstack_placement_resource_total{resourcetype=\"VCPU\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}) * 6", "hide": false, "instant": false, "legendFormat": "overcommit vcpu availability", @@ -1387,7 +1392,7 @@ }, "editorMode": "code", "exemplar": true, - "expr": "sum(openstack_placement_resource_usage{resourcetype=\"MEMORY_MB\"}) / 1024 / 1024", + "expr": "sum(openstack_placement_resource_usage{resourcetype=\"MEMORY_MB\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}) / 1024 / 1024", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1402,7 +1407,7 @@ }, "editorMode": "code", "exemplar": true, - "expr": "sum(openstack_placement_resource_total{resourcetype=\"MEMORY_MB\"}) / 1024 / 1024", + "expr": "sum(openstack_placement_resource_total{resourcetype=\"MEMORY_MB\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}) / 1024 / 1024", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1503,7 +1508,7 @@ "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", - "expr": "count(openstack_nova_server_status{status=\"ACTIVE\"})", + "expr": "count(openstack_nova_server_status{status=\"ACTIVE\", hypervisor_hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"})", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1518,7 +1523,7 @@ }, "editorMode": "code", "exemplar": true, - "expr": "count(openstack_nova_server_status)", + "expr": "count(openstack_nova_server_status{hypervisor_hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"})", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1769,7 +1774,7 @@ }, "editorMode": "code", "exemplar": true, - "expr": "sum(openstack_placement_resource_usage{resourcetype=\"DISK_GB\"}) / 1024", + "expr": "sum(openstack_placement_resource_usage{resourcetype=\"DISK_GB\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}) / 1024", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1783,7 +1788,7 @@ "uid": "${DS_PROMETHEUS}" }, "editorMode": "code", - "expr": "sum(openstack_placement_resource_total{resourcetype=\"DISK_GB\"}) / 1024", + "expr": "sum(openstack_placement_resource_total{resourcetype=\"DISK_GB\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}) / 1024", "hide": false, "instant": false, "legendFormat": "local storage total", @@ -2362,9 +2367,9 @@ "exemplar": false, "expr": "openstack_neutron_ports", "format": "table", - "instant": false, + "instant": true, "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A" } ], @@ -2401,7 +2406,7 @@ "x": 12, "y": 57 }, - "id": 82, + "id": 83, "options": { "colorMode": "value", "graphMode": "area", @@ -2427,7 +2432,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "openstack_neutron_routers", + "expr": "openstack_neutron_security_groups", "format": "table", "instant": true, "legendFormat": "__auto", @@ -2435,7 +2440,7 @@ "refId": "A" } ], - "title": "Routers", + "title": "Security Groups", "type": "stat" }, { @@ -2532,10 +2537,10 @@ "gridPos": { "h": 4, "w": 4, - "x": 20, - "y": 57 + "x": 0, + "y": 61 }, - "id": 83, + "id": 79, "options": { "colorMode": "value", "graphMode": "area", @@ -2561,7 +2566,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "openstack_neutron_security_groups", + "expr": "openstack_neutron_networks", "format": "table", "instant": true, "legendFormat": "__auto", @@ -2569,7 +2574,7 @@ "refId": "A" } ], - "title": "Security Groups", + "title": "Networks", "type": "stat" }, { @@ -2589,10 +2594,6 @@ { "color": "green", "value": null - }, - { - "color": "red", - "value": 80 } ] }, @@ -2603,10 +2604,10 @@ "gridPos": { "h": 4, "w": 4, - "x": 0, + "x": 4, "y": 61 }, - "id": 79, + "id": 81, "options": { "colorMode": "value", "graphMode": "area", @@ -2632,7 +2633,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "openstack_neutron_networks", + "expr": "openstack_neutron_subnets", "format": "table", "instant": true, "legendFormat": "__auto", @@ -2640,7 +2641,7 @@ "refId": "A" } ], - "title": "Networks", + "title": "Subnets", "type": "stat" }, { @@ -2670,10 +2671,10 @@ "gridPos": { "h": 4, "w": 4, - "x": 4, + "x": 8, "y": 61 }, - "id": 81, + "id": 82, "options": { "colorMode": "value", "graphMode": "area", @@ -2699,7 +2700,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "openstack_neutron_subnets", + "expr": "openstack_neutron_routers", "format": "table", "instant": true, "legendFormat": "__auto", @@ -2707,7 +2708,7 @@ "refId": "A" } ], - "title": "Subnets", + "title": "Routers", "type": "stat" }, { @@ -3623,10 +3624,10 @@ "exemplar": false, "expr": "sum(openstack_nova_limits_vcpus_used)", "format": "table", - "instant": false, + "instant": true, "interval": "", "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A" } ], @@ -3726,7 +3727,7 @@ }, "editorMode": "code", "exemplar": true, - "expr": "(((openstack_placement_resource_usage{resourcetype=\"VCPU\"} * openstack_placement_resource_total{resourcetype=\"VCPU\"}) / 100) / (openstack_placement_resource_total{resourcetype=\"VCPU\"} * 6) * 100)", + "expr": "(((openstack_placement_resource_usage{resourcetype=\"VCPU\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"} * openstack_placement_resource_total{resourcetype=\"VCPU\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"}) / 100) / (openstack_placement_resource_total{resourcetype=\"VCPU\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"} * 6) * 100)", "format": "time_series", "hide": false, "interval": "", @@ -3833,7 +3834,7 @@ }, "editorMode": "code", "exemplar": true, - "expr": "openstack_placement_resource_usage{resourcetype=\"MEMORY_MB\"} / 1024 / 1024", + "expr": "openstack_placement_resource_usage{resourcetype=\"MEMORY_MB\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"} / 1024 / 1024", "format": "time_series", "hide": false, "interval": "", @@ -3851,6 +3852,7 @@ "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "description": "Details of instances that are stuck in a state other than ACTIVE", "fieldConfig": { "defaults": { "color": { @@ -3868,7 +3870,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4030,7 +4033,8 @@ "mode": "absolute", "steps": [ { - "color": "yellow" + "color": "yellow", + "value": null }, { "color": "red", @@ -4108,15 +4112,15 @@ }, "editorMode": "code", "exemplar": false, - "expr": "openstack_nova_server_status", + "expr": " openstack_nova_server_status", "format": "table", "instant": true, "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A" } ], - "title": "Instance Details", + "title": "Non-Active Instance Details", "transformations": [ { "id": "filterFieldsByName", @@ -4237,7 +4241,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4279,7 +4284,7 @@ }, "editorMode": "code", "exemplar": true, - "expr": "openstack_placement_resource_usage{resourcetype=\"DISK_GB\"} / 1024", + "expr": "openstack_placement_resource_usage{resourcetype=\"DISK_GB\", hostname!~\".*.a30.*|.*.h100.*|.*.p40.*|.*gpu.*\"} / 1024", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -4366,7 +4371,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4465,7 +4471,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4532,7 +4539,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] }, @@ -4576,7 +4584,7 @@ "format": "table", "instant": true, "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A" } ], @@ -4599,7 +4607,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] }, @@ -4640,11 +4649,11 @@ }, "editorMode": "code", "exemplar": false, - "expr": "sum(openstack_cinder_limits_volume_used_gb)", + "expr": "sum(openstack_cinder_limits_volume_used_gb) ", "format": "table", "instant": true, "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A" } ], @@ -4667,7 +4676,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] }, @@ -4708,11 +4718,11 @@ }, "editorMode": "code", "exemplar": false, - "expr": "sum(openstack_glance_image_bytes)", + "expr": "sum(openstack_glance_image_bytes) ", "format": "table", "instant": true, "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A" } ], @@ -4747,7 +4757,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4793,9 +4804,9 @@ "exemplar": false, "expr": "openstack_identity_domains ", "format": "table", - "instant": false, + "instant": true, "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A" } ], @@ -4817,7 +4828,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4863,9 +4875,9 @@ "exemplar": false, "expr": "openstack_identity_users", "format": "table", - "instant": false, + "instant": true, "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A" } ], @@ -4887,7 +4899,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -4935,7 +4948,7 @@ "format": "table", "instant": true, "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A" } ], @@ -4957,7 +4970,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5005,7 +5019,7 @@ "format": "table", "instant": true, "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A" } ], @@ -5027,7 +5041,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5075,7 +5090,7 @@ "format": "table", "instant": true, "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A" } ], @@ -5110,7 +5125,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5154,7 +5170,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "openstack_loadbalancer_total_loadbalancers[1h]", + "expr": "openstack_loadbalancer_total_loadbalancers", "format": "table", "instant": true, "legendFormat": "__auto", @@ -5181,7 +5197,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5252,7 +5269,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5296,7 +5314,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "openstack_loadbalancer_total_amphorae[1h]", + "expr": "openstack_loadbalancer_total_amphorae", "format": "table", "instant": true, "legendFormat": "__auto", @@ -5323,7 +5341,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5393,7 +5412,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5437,7 +5457,7 @@ }, "editorMode": "code", "exemplar": false, - "expr": "openstack_loadbalancer_total_pools[1h]", + "expr": "openstack_loadbalancer_total_pools", "format": "table", "instant": true, "legendFormat": "__auto", @@ -5464,7 +5484,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "red", @@ -5550,7 +5571,7 @@ ] }, "time": { - "from": "now-2d", + "from": "now-24h", "to": "now" }, "timepicker": { @@ -5581,6 +5602,6 @@ "timezone": "", "title": "OpenStack Exporter", "uid": "YZCsB1Qmy", - "version": 68, + "version": 85, "weekStart": "" } From d757787a3d340e9dacd9f9d1e5c76a033cbd1812 Mon Sep 17 00:00:00 2001 From: Dan With Date: Wed, 13 Nov 2024 10:29:02 -0600 Subject: [PATCH 5/8] Fix: edit cinder volume netapp playbook to prevent configuration collisions: OSPC-802 (#556) * Fix: edit cinder volume netapp playbook to prevent configuration collisions: OSPC-802 * Docs: adding volume QoS and provisioning min and max size instructions --- ...eploy-cinder-netapp-volumes-reference.yaml | 50 +++++++++++++------ .../deploy-cinder-volumes-reference.yaml | 5 ++ .../templates/cinder-volume-netapp.service | 2 +- docs/openstack-cinder-lvmisci.md | 32 ++++++++++++ docs/openstack-cinder-netapp-worker.md | 9 ++-- 5 files changed, 80 insertions(+), 18 deletions(-) diff --git a/ansible/playbooks/deploy-cinder-netapp-volumes-reference.yaml b/ansible/playbooks/deploy-cinder-netapp-volumes-reference.yaml index 03a3bc78..b01931b6 100644 --- a/ansible/playbooks/deploy-cinder-netapp-volumes-reference.yaml +++ b/ansible/playbooks/deploy-cinder-netapp-volumes-reference.yaml @@ -142,19 +142,37 @@ value: "{{ ansible_fqdn }}" create: true + - name: Create the cinder-volume-netapp configuration stage file + ansible.builtin.copy: + src: "/etc/cinder/cinder.conf.stage" + dest: "/etc/cinder/netapp-cinder.conf.stage" + owner: root + group: root + mode: "0644" + remote_src: true + - name: Ensure the backend configuration is set to our expected value changed_when: false community.general.ini_file: - path: "/etc/cinder/cinder.conf.stage" + path: "/etc/cinder/netapp-cinder.conf.stage" section: DEFAULT option: enabled_backends value: "{{ cinder_backend_name }}" create: true + - name: Override host value in netapp-cinder.conf.stage + community.general.ini_file: + path: "/etc/cinder/netapp-cinder.conf.stage" + section: DEFAULT + option: host + value: cinder-volume-netapp-worker + mode: '0644' + state: present + - name: Create the cinder-volume-netapp configuration ansible.builtin.copy: - src: "/etc/cinder/cinder.conf.stage" - dest: "/etc/cinder/cinder.conf" + src: "/etc/cinder/netapp-cinder.conf.stage" + dest: "/etc/cinder/netapp-cinder.conf" owner: root group: root mode: "0644" @@ -179,18 +197,12 @@ owner: root group: root mode: "0644" - notify: - - Restart cinder-volume-netapp systemd services - - name: Create the cinder-volume-netapp overrides configuration - ansible.builtin.copy: - content: | - [DEFAULT] - host = cinder-volume-netapp-worker - dest: "/etc/cinder/netapp-cinder.conf" - owner: root - group: root - mode: "0644" + - name: Replace yaml safe qos policy key in netapp-backends configuration + ansible.builtin.replace: + path: /etc/cinder/netapp-backends.conf + regexp: 'netapp_qos_policy_group' + replace: 'netapp:qos_policy_group' notify: - Restart cinder-volume-netapp systemd services @@ -208,3 +220,13 @@ value: "/etc/cinder/rootwrap.d" notify: - Restart cinder-volume-netapp systemd services + + - name: Remove netapp-cinder conf staging file + ansible.builtin.file: + path: /etc/cinder/netapp-cinder.conf.stage + state: absent + + - name: Remove cinder conf staging file + ansible.builtin.file: + path: /etc/cinder/cinder.conf.stage + state: absent diff --git a/ansible/playbooks/deploy-cinder-volumes-reference.yaml b/ansible/playbooks/deploy-cinder-volumes-reference.yaml index a8ddd15b..f684aeca 100644 --- a/ansible/playbooks/deploy-cinder-volumes-reference.yaml +++ b/ansible/playbooks/deploy-cinder-volumes-reference.yaml @@ -219,3 +219,8 @@ owner: root group: root mode: "0644" + + - name: Remove cinder conf staging file + ansible.builtin.file: + path: /etc/cinder/cinder.conf.stage + state: absent diff --git a/ansible/playbooks/templates/cinder-volume-netapp.service b/ansible/playbooks/templates/cinder-volume-netapp.service index 190d4ade..ae005c23 100644 --- a/ansible/playbooks/templates/cinder-volume-netapp.service +++ b/ansible/playbooks/templates/cinder-volume-netapp.service @@ -7,7 +7,7 @@ After = syslog.target Type = simple User = cinder Group = cinder -ExecStart = /opt/cinder/bin/cinder-volume --config-file /etc/cinder/cinder.conf --config-file /etc/cinder/netapp-cinder.conf --config-file /etc/cinder/netapp-backends.conf +ExecStart = /opt/cinder/bin/cinder-volume --config-file /etc/cinder/netapp-cinder.conf --config-file /etc/cinder/netapp-backends.conf ExecReload = /bin/kill -HUP $MAINPID # Give a reasonable amount of time for the server to start up/shut down TimeoutSec = 120 diff --git a/docs/openstack-cinder-lvmisci.md b/docs/openstack-cinder-lvmisci.md index 66381dd5..fbbf3365 100644 --- a/docs/openstack-cinder-lvmisci.md +++ b/docs/openstack-cinder-lvmisci.md @@ -117,6 +117,38 @@ root@openstack-node-0:~# kubectl --namespace openstack exec -ti openstack-admin- +-------------+--------------------------------------+ ``` +!!! warning + + You must define and apply the volume type QoS policies **before** creating a volume within your new volume type (`lvmdriver-1`). Also, any additional volume provisioning specifications like the minimum and maximum size for the volume type must be set **before** creating a volume within your new volume type (`lvmdriver-1`). + +In order to apply a QoS policy to the `lvmdriver-1` volume type, you must first create the QoS policy. + +``` shell +root@openstack-node-0:~# kubectl --namespace openstack exec -ti openstack-admin-client -- openstack volume qos create --consumer "both" --property "read_iops_sec_per_gb=1" --property "write_iops_sec_per_gb=1" lvmdriver-1-iops ++------------+-----------------------------------------------------+ +| Field | Value | ++------------+-----------------------------------------------------+ +| consumer | both | +| id | b35fdf9c-d5bd-40f9-ae3a-8605c246ef2e | +| name | lvmdriver-1-iops | +| properties | read_iops_sec_per_gb='1', write_iops_sec_per_gb='1' | ++------------+-----------------------------------------------------+ +``` + +Once you have created the QoS policy, apply it to the `lvmdriver-1` volume type. +The command will utilize the `QOS_ID` and `VOLUME_TYPE_ID`. + +``` shell +root@openstack-node-0:~# kubectl --namespace openstack exec -ti openstack-admin-client -- openstack volume qos associate b35fdf9c-d5bd-40f9-ae3a-8605c246ef2e 6af6ade2-53ca-4260-8b79-1ba2f208c91d +``` + +Set any additional volume provisioning specifications like the minimum and maximum volume size. These specifications are set in the volume type. The following commands contrain the `lvmdriver-1` volume type to a size between 10 GB and 2 TB. + +``` shell +root@openstack-node-0:~# kubectl --namespace openstack exec -ti openstack-admin-client -- openstack volume type set --property provisioning:min_vol_size=10 6af6ade2-53ca-4260-8b79-1ba2f208c91d +root@openstack-node-0:~# kubectl --namespace openstack exec -ti openstack-admin-client -- openstack volume type set --property provisioning:max_vol_size=2048 6af6ade2-53ca-4260-8b79-1ba2f208c91d +``` + ## Validate functionality If wanted, create a test volume to tinker with diff --git a/docs/openstack-cinder-netapp-worker.md b/docs/openstack-cinder-netapp-worker.md index b2f9b042..b4abf9bf 100644 --- a/docs/openstack-cinder-netapp-worker.md +++ b/docs/openstack-cinder-netapp-worker.md @@ -24,7 +24,7 @@ The NetApp ONTAP driver requires a backend configuration to be set in the Kubern netapp_storage_protocol: iscsi netapp_transport_type: http netapp_vserver: - netapp:qos_policy_group: + netapp_qos_policy_group: netapp_dedup: True netapp_compression: True netapp_thick_provisioned: True @@ -40,7 +40,7 @@ The NetApp ONTAP driver requires a backend configuration to be set in the Kubern netapp_storage_protocol: iscsi netapp_transport_type: http netapp_vserver: - netapp:qos_policy_group: + netapp_qos_policy_group: netapp_dedup: True netapp_compression: True netapp_thick_provisioned: True @@ -56,7 +56,10 @@ The NetApp ONTAP driver requires a backend configuration to be set in the Kubern - **`SERVER_NAME_OR_ADDRESS`**: The address of the NetApp storage system. This can be either an IP address or a fully qualified domain name (FQDN). - **`SERVER_PORT`**: The port number used for communication with the NetApp storage system. Common ports are `80` for HTTP and `443` for HTTPS. - **`VSERVER`**: Specifies the virtual storage server (Vserver) on the NetApp storage system that will serve the volumes. -- **`QOS_POLICY`**: The Quality of Service (QoS) policy group name that will be applied to volumes for this backend. +- **`QOS_POLICY_GROUP`**: The Quality of Service (QoS) policy group name that will be applied to volumes for this backend. + +!!! note + The Cinder backends configuration file utilizes a colon (:) in the variable name `netapp:qos_policy_group`, but it has been replaced in the Helm overrides file with an underscore. Helm recognizes a colon (:) as a special character and renders it as an equal (=) sign. This is undesired behavior for the final rendering of the Cinder backends configuration file, and the Ansible playbook replaces the underscore with a colon (:). The extra spec requires the colon (:) in its name because it is used by the NetAppdriver to assign the QoS policy group to the OpenStack Block Storage volume after it has been provisioned. See [NetApp unified driver](https://docs.openstack.org/cinder/latest/configuration/block-storage/drivers/netapp-volume-driver.html) for more detailed information on the NetApp driver extra specs. ## Host Setup From 2dbaf9d890a97473be9e4a3e51a564308c3a823a Mon Sep 17 00:00:00 2001 From: Dan With Date: Wed, 13 Nov 2024 12:43:10 -0600 Subject: [PATCH 6/8] Docs: lvmiscsi typo (#558) * Fix: edit cinder volume netapp playbook to prevent configuration collisions: OSPC-802 * Docs: adding volume QoS and provisioning min and max size instructions * Docs: lvmiscsi typo --- docs/openstack-cinder-lvmisci.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/openstack-cinder-lvmisci.md b/docs/openstack-cinder-lvmisci.md index fbbf3365..640f5dcc 100644 --- a/docs/openstack-cinder-lvmisci.md +++ b/docs/openstack-cinder-lvmisci.md @@ -142,7 +142,7 @@ The command will utilize the `QOS_ID` and `VOLUME_TYPE_ID`. root@openstack-node-0:~# kubectl --namespace openstack exec -ti openstack-admin-client -- openstack volume qos associate b35fdf9c-d5bd-40f9-ae3a-8605c246ef2e 6af6ade2-53ca-4260-8b79-1ba2f208c91d ``` -Set any additional volume provisioning specifications like the minimum and maximum volume size. These specifications are set in the volume type. The following commands contrain the `lvmdriver-1` volume type to a size between 10 GB and 2 TB. +Set any additional volume provisioning specifications like the minimum and maximum volume size. These specifications are set in the volume type. The following commands constrain the `lvmdriver-1` volume type to a size between 10 GB and 2 TB. ``` shell root@openstack-node-0:~# kubectl --namespace openstack exec -ti openstack-admin-client -- openstack volume type set --property provisioning:min_vol_size=10 6af6ade2-53ca-4260-8b79-1ba2f208c91d From 60e409596b41bb63a55b54f0d9e3dc1d5ffbefec Mon Sep 17 00:00:00 2001 From: retreved Date: Wed, 13 Nov 2024 14:58:26 -0600 Subject: [PATCH 7/8] Logging docs (#557) * [docs] adding genestack logging doc * [docs]document edits and TOC in mkdocs * [docs]grammatical fixes * [docs]fixed file name * [docs]fix link error again * whitespace removal services, llc * [docs]another visit by the whitespace fairie, file renames --- docs/assets/images/grafana-explore.png | Bin 0 -> 58090 bytes docs/assets/images/grafana-search.png | Bin 0 -> 59633 bytes docs/genestack-logging.md | 72 +++++++++++++++++++++++++ mkdocs.yml | 1 + 4 files changed, 73 insertions(+) create mode 100644 docs/assets/images/grafana-explore.png create mode 100644 docs/assets/images/grafana-search.png create mode 100644 docs/genestack-logging.md diff --git a/docs/assets/images/grafana-explore.png b/docs/assets/images/grafana-explore.png new file mode 100644 index 0000000000000000000000000000000000000000..1db146620b6dfa7135a99373c0f4fa902bbc200c GIT binary patch literal 58090 zcmce-bzGEB*EmcGNFz!&0xI2I(v6~YBOOaOEJ#a(NJ&YTG%FoTNS8EAcQ*^{F2D7A z-}e*m^Z(1|bFp(>Gv~~lGc#vSO|+JVB0df!4hjkizOs_sdlVEj7_xkVjfwm(zc4L` zf`V#jCo8L^EGtW|;y(LKpNRc{`)=vmu>rDSl|e(o^4Ip0X_YEkqmzO4Ht;rz zlSwMiG%h`$*~^}VfrF!j`H`<>O&05(yXb%*hHZ#i|E%56beoj67SO|ZxcS;xl=FCi zTbO2fMU?vf5a63l0iLw$oQ~Ze@j@McRa9{vjFq z<(J}k8O4U!M&fLtO_ng==f0^>)FFCAqp)UcmNg2_C%Gh9a$+?tp-2A$0l>2-+>Sl{ zZ|bfF!o!4L*Y*}jGh>gKi2Pc$&CS&;2@0&Ky5WL&U> zJFUyB5c~&aKG~^JM!V8zXA*7*UNk6Suzk`ch# zhdI5ElcTe{sE-8WKP^O&<-eb~80r6M;^82{sHd()FAH$9q8H@k=HzCS#G$9B7kB$) zE&5(g;osoMHwi{t4-XenE-r6xZ%%JMPJo*Y7mtXD2p2am7cVadvIU2`ud|1_4~Mfm z)4!1X2alYUyQQ0*i-#S+nf@;0 zJe=HI|AiX~D*pGYsFt0Nm7~6#ofDEh$UY=_`Gm#)Y5#v}{=3Kj0jc-jkV1m|{}b|m z)ck)TKe}7F$pV~^U3y6V_ssko_sMANceSG3Q%1m`iSEL~2moB-!HD}?Efz$%#e>6{=*^{ z6rxvY!wj=(ES87>lw{%pYA|-;A?f(!zd6;lg5<;F%6YUY6LMMtrMoEnZ9053Tbmyw z6Tg@+qWQ~p9e!+aUeCDI8@RzXg#C*g_JVj`{rDKOe<2B!HUk((@R_8J=$3uJ`Fdya z>bW0Kc*7gOf6JgeIZQ5>S6)5@voYu$-!m0#ZGHacy8qC~l<31OxC15!`qxsRB|;9v z=hb%lKvWkI{hC@c-@7qKnU-W?!zRa!6$x|C!BL5)4MLlm?EdH6J54ImT3MI^Vq=3-EBZs>yXz!T)~0#A&I? z$>PAFGQWd?+iJR4y*`?R)j%+<{!Ng@jrlwyx?uVN1-f_Higba0%<2vf55Wias;V&p{QO6xDbrn(xlAdIRC4E5bi{iVh!3;OIuB%A zCXO*_>`ei>E2Sv|G~Pz(7)0us=esnSsr)VpEdSyua{qv(NL2-PUNdrIBYCQoIl0&o z*eY=~A=~74ZJ#CLUd$oBj*-O^=m$_6(`pXYBz?2Wl(HQq=Wj}McE9IYTg@GCna$c! zZQ3cRrm}!4yq6c+Q!Zs;WkM>(yK<>cW51Bk%#33?_iPk^ANB1DW zbOoB8^o^Zjj&ELCUnA6iu_OB2qY6(uBP0KAVo7=JB_YOn*!9Ml@6ztc07@{}L{4 zw0|XBTOh)X?X&a)?|XElodFxZnD>fr$&9kc?os{NfyDC+>+~seLbU_SO5zZRyhmvY z?ECp@n{PeDbIy2ncGh|~+dF48N1_#!Q}U2~<=)HxF9tGWC{TknS=CDp)xtuvPud_H zi?I`f7Y$;0i}+4VrGBAf$k9-5Ct6;9mkj(ZOp@(jz z9`O`>gl{~|qu@*Ym8XXXhUf$)$r&oi#wLwaVJLdq1Pis>PqUC%Hp7*zP@f#1jp#g! zq=rOi04`EZ;>I+T3j`6ABb zWdA;j%Jt@&wUwJ#Dhr3jdsS=#gEhHqiYr9*;W2(dj%l zC3igcp~u+mDiCPq+#K*^CudmK%-&pF$`^nJ!_EAj=_jBWys@FLp+}64$HFVJZ|vm zz71pV8t%6-SmfKIyOf_););Ae7^Q@EvJ~%F)WU%9L(?UONNS7S?|~XFn^|*Igk-}E zaV7z@(bztnA;(guy9CHBUxVGf@SId?FQs&M-!D6eHu^5c?#n;Q093#L!4xG(^J&H?l#OnF&+GE__yG$KKp8XO}H`A>JqDFW<%Eq1mR5h_d48?zoy#4gF2&MC?5v zYH<`L@6S#z-5%L&^A1&AQfM{6ePRJP!ZRRO3}kPu07Mcs;jMo>oufdVZi{f~uJY&`MYZJNQFH3zZ@Ad});jNTUrxISKz7fy(|B{Vt( zb1j?gbnn)y>M1uJB0GLYOdodVe&ix!d6Y51^TyC*Y%6j1DmccPW#zQ})I{vycR@~p z2qtB1kT?)>CaB;qyE)APTDH(Na+N2_dK=3c=*+lr2lG*&D1$TE8NYYCP${478KiT5N&rd9Bd>g)g;hsZcD7x{LyHT)WDa}Nuihp;5x49{P0mI z=)v7FQt(BRft=YE{aPTV;D{s~4_9mVySqj@HlIc_9e|99^_qv7i5T@%XxLzZa0KzC zr1DrBPx0FJp%LdABx0Em;?iDB z$H{u&7r8wnDnemDs@P+IH*8~RUY;H@em25M=7h#!PQ7*Aq_q&y&&kMR6Dkwzx8Ygz zXVUuk@%*t8dNloQliHxnQKW3DY0T>odNIHbe00Kd9_(JpaS4qUi-^M(r$c*)TfhBs zDu~zDA4dg7h476DGgZE+`>_!R7Be|D%jH@>f0$S7I{Z9G>~`e2GjExI?};5Jxpy=0 zORCzvn+LI#fX^kF9GWSJW48M=7zxRm7zKZTj+tUj{x$ZlBKHf3)_?fJ&D_(db%7qidJN5xgJKn$a%~I=+ zwENOAh)T>cP`w3W+Q5XiNsJ2MTA8aU?Fu(CQiv=iWVzwkthK(%wyDOA75#n08tKwE zAG5pPvM;8y*gRS%Fq1#_X?yUHOpq`5dxs~)x4={CI+&B;jb6kcDrI1U7?A=m?3^9M zy>q;5Uv!*R`7(*Vx*$Ynbui{9amX&c)-`pSjHvMR6WM+~Mlv95lkT_&mkSSz3j$#) zf1vx+zylSQ?mGP9{k=^WX>G((@bxqkHLW#gEF6-rLQaK)cSZECV4^q)1xk$rrKfU`9%}XJEo5W!CKH%g~)5pLpvlrnNx&8|R1_PwyWl zSAXzfK7mio|8!E4fp=Rg{by2ie2zGW?Zt8uDMi5 z?u!p=WI4^0v`y6U?O@*bsXKVC-KOan-4}XFxs{|A9To2Mx>v0OI>@J0KpI$e#41-H639xuYLU6_i{Xs?uM0z{Q$#vS6?ZQN&iGePT}u) z;?F`Ss|`kdF{8k1-fT zOEG?0&Vaftc@3^Vrg_45Saporm+OwOqbBEO-Rr(20Mh+faKsOCHObme!k}k8x_4~$ zX)@| zPfeivL0WG!PM{V(a2N!WSR@V!pk>u_ zeY}#Ly<5uF^PRS@Z^||>Hnm{B&gEWgrl{xepFpe66s>5#y8c#H0g4A8VqWCk-dSK9-o*aR?@y5rIO*67Lz`kQn@@17$tL5mudq;UuIyA{wqn{P z8u%A5)drR~u=RsXSscC@JiFBVWms+*VgrcTrASzJ?w2gAN%GK zl#jpatw(V*0_YMLHR2VKM+97k9%56Ys$gi)=HoiyvF*fx6ip2Ut4YDqby^sgIc0zv zM_vEA-<&KGtSe874UIgNY+u>v>|F0yjU6|WuYgH{o}wqL%oK(GGUx;Rd1-#2MpGv- zSJ}Z6Fh1f?yIlFiZ!COJ!R~H)5C^g2`3<;tyKcd$ZBW;EZT{@p9$y6Wq<*oTiV~L_ zT=`l50F<;V9*7y+l}8cu=10uaM4S&UO-PY)I0y-B<2FR+3@3Nd!uHw4C0@19gZhNb zHUH;yXVF7$j@cxoJhoO)#{MO{n19F%p~^W%TK6BW$sPI`A%y<$W<e9MdM<2r1SiBZY^E6~}n!$Ei(LO8vRVkP6Gn4f)bW z6kA<-9&xO+mA{>{GXWcnhK5E)p7nTiX&HM=L2WUINK5KzO17PC!^j_fO4f!~Jw6Oh zVwGnOXM6YyhGbhiKl6{aLkCekRE~XzN5$qTxjGlixqPdvST%5iz)^qd#ZbEWLr;iH zSzdQk5?~4$Rs{*{nwW>%^g>s!oQ79#`0BlAXlDsXFzQ7sm(J^}4XtwuUz=Q5)9i4R z(+)|bnv_r-M+Gx+ze3uLM>RY~vhf{(&NH6VOG?WONZ|?(L-8C1%5|ffY~2|<5IURa z`qIX*KvRas-t0QXoleG@V3;+84yi7D zwd)zXy-KYSd?CfONY!ye3jW95^lq%{NYzJ54FgJg@HFTadP(J# zg5FLs11blT8Gu_KXDA;}4!?=*$kF^c#(N_svXxa;-ZXX!9K%ti!)<}eay)mMdZ8|t z$Ay8}cjm7c31RjX_(Wy?vrT4=md(_(MiB%L51x|%k#QJ&s?b&K%fxdwvANZSVP*aV zi5z{b(0Ot!zO^Ku-S3AW#=x0i!W z@?;x4Lu3?rS-*0|BnnWMipbGUR16Z4q1hDaZQ=w9ARyw|TO z*Sw8<^`5UDs%#h*So>{?#aq&;DzV=DOo=Djwz9aS?AUmnF}TG8-IL$P&(pnjHESF+ zI`j;@DSJ%|m|68J*;Qx8+<~p62@|EEKI&joME#8MeaYv$J)cuG>ra{$+E40Cd4E6JsZdC z-{%0NgIfsGxnb8;9O=L5qsL)N&6u(2oL6aatVn+`UF8oNdba!eu$f)s_1$3h?stM4 z(n}rp1798Y!H*XG%pD{;*C|iP4pdt@nQ5(w)#$hM$0bOVqEBkR}BTA-q`vqhOHk2&n!w~&sq-z;2pvnOp_U?JfkWtZ#pgsDrKof$>2Q$g2 z)fbQ_Q3~ZOQhMXXOEE7|4kaZfr^RR^xfS*6r?AmeRaM;!CiZr{T~{7G>wDWFe)`=o zohMKsYWece$sPLsx#bt^SPl$Z*((Nhb@g>YfZMKMl-rMD`2!x#vgx-V0amg@2{F{@x zy>gwzA^FmI$=yx>0BC^Le`HMjazx9torLzwFNJ4u6WtD4T{ZVn-+p))dKf9Z&$KjP zL@RiLx|k4y(R1alfJw46WBayXHTkdT*u!~S(JBt1lOZ&=-XC-WI zNF-M3hd|n6SvulQXD665)`zel_r(1v@uz!ql4{kaCa0Pcf9IMFIB2gQ!l7eOJ3o~D z9`qC*!BTc5t|oLhBzePLA$ceNEgSgKw1?m=IVc^wls2NY7dT^b$H^w{<*&7>KlKK< z9xYb2^L6<7+msmIUF_s@X#%83aqPmAn)kJ`Xe?0CRgc7>cwg4w;vsUmMZAmY zP<)2=HD4jJCey_IKBmfjr=+UEtH{cIW}Rip@$?0VQtHC^TQ;c6-o!(_CyLE6v+Cyj ziD9UE-TUehFZe3ZU=Gk>Q}l6|A9vzq$PB{X_~K)@0TKnYCkMHLB~3Nt)*BKDv#=LgGllyx$&3Vh*YDi3w#kLmq>)lME||{^Lyn53ywtMwKq!`pGdKY&gWizKE=Lgnx)@Wp7O*%W z-Y=WlAf6IH)PHt;t>e7m!L#1_Y1@DQ>P$Yrqh_MPE4mSQ;xv0+rKxXz{J#F)ewcsu zu;k&Ly$8AOxn6321*Lqje+nmRMRij7D9x~(q$9@R%)e*;y*qW9;ACCg6kR%1j^FvC-7m|8m<7jGj^t!bw@?U^2ps6 z@HfNm)rLUOD`N|&=lExxRgqs=Nh3jtn}p&GFtzVyA4@vq@EX(MX8l6q4k zM0z89>EpM~O(0sR=|@vgjEO#@tnaxxB)OZc{=^1@cYQh7tHjesm~CgZrI7gG;n9L- z&cvyRhN@AuiU!pKb{h*|uh;23qZ}Tc$f$y8sG}9?JXa*3W{X3vUFv^C)dJDB$U$kr zXQc#^xYUuPsGATudSgOjG0Q|Rp@UOB{$=uv@m;VLw_Q?BZTeh#NmQ2$lk}s^YPZt` zWU8A0d>T09Qeq|Ei`5igEp=-}h>2U0HaXh3{nLxBDyWCI@mb@bn=7eB-uzSq6GCbU z!ZMT1sz0+_&~qU9y|H5aCB6pRuU)Y!coxvINMPJnC{KAqhI zU6HzCCa~&0Ed@}F-rf6x0MDkkP1lB9Nap%DX;pt|cg42onCf%7mf5{PS+M=b%X1y~ zkusf?j!B$hI%RHEb5<@Sxe*Exz?-9mRvwsTYQ~pqD-VXXYodp}f+Am;e#l-r+}C5< z{;v%Wpi4F40o+g z2i@FI!y;d}SN#T<0>W+Ro~2YZPJG`;%7L4p238TL_C@KAX3{xtsZZsn`b6FSiQ)bk zRwk{$3w?C#>$}AyrYRGy<^3Vpk^#E!Rjs=JETnHeI zn&@`Dcoj)Vd{?l8Z0US?tPu|a87{-Xe?{c!oj{LNOVOi)=LV3`UVgl(BL(K{EzX@s z>0&_Xru8aXL~i%*adtdUYRhnw#LjINb%L$q5L5K=vq6d$V*>NUx!fQyvC`GVJF+*^ zKuUN#KPEXZ#-5a|p;5qx!2kmNmq}Uxsbj6Y7f&(MA*m{x@PML+m6bs1E=}8&J-ZV;dsA%bfogsmT6%Y-+kj5Vq~WxHpk_n1 zd-okfNN(Gz{g|KeSuP^wJ6597BhRj(E94pE`-9!Elurr^wZXa~gG#!OZJN17!He9s z>6V~tkqZB7)<(8OHB2Ry8S@fDuN`)E>SQsSy&L$#xtiryf^0Rpx8vzsVsM`8 zHX%_BrnPT4d=mrheNRTadv}F}G&M!DbgnRCWe0GZ25xXVz;w4b0GgW*#*dUpzB7aJ(*M1fPBm!^ZHDJVwJ7^ z=1?Mkp_+d35*ul{_2rEcR+&!XQHStfZjNh=x>~<~GKNfgsO@}c?W}*TT{53x^WBci zryKWkQ(>8Q$&H~=%CBUWxblxY_eMcQ3JdL5CU)zS%s;3LXWmLj^abZMjrT|^P-_== zC~K6XmwiOj^k=kAsqcZTrf9&No-NrWr)x!8m5kQ)dz)}IW=%DL^9{*8X)41BSSH?o zm|s|kG=ML4S~rVznA5C2M)f|J->1m_%0x{U5YR(-uQrr#ayA?kaN?zm{YXV1iw>B?c%B_EKu zPSRc5u9r#NQnr&-USiSBfWoR7j~Uu&mOSfEc0HBno1b!Aa|ToZXIN8r!m6lBg*98m zUtyiy@@nDu z5TCYA%&XwyxW3M?&|eh|5}=~?M@b?t$7N6Q8wG^+|B-#8SIcvY3b>s>DlL@ zS1o90X>6#oG<%8&opG8i65$GH|5)X-SWf$ES}+^>Rt#EQ-FUEAMp@WLeZ}6xoDwB1 zSh}PT=}qCgRs)Y$k+^b>>DU;~%Vts|`Xo<6Om2x?IG_#Guu1aTJLZ9yuJ4>^N?d;p zJkZWPFs89Sj|hT)Vf$HAQQaZBEVL0c%|CSxt$)D1(ic%2NA%lNZML>_9c1{wRoyys z-XnQSKQ)kV%;S56p_at*y}0bD$fBpF>05sSw(|vhHb;Hu@N3P(H9(vf?qbzJX?^8R z8z@4O(flSQvmoJ}MPFuu{UX zj9$#Tp6{LCA|09wNH6Sj&ak$NAvRgPJwC}xh@A+*ehmU&=rKNv>TwM8nPB=6wkrjy z9}{J>O$hj4`KbE1rRlftPkz*4TLgiNIrqxY{azB-ZNo+y*Sf2|Yi5J-+7u$$pLW|Gw0_96lTZ8T#fQ(mRW7%SJ8Y0_YCD1@Z znG-Ie&`a+tDyC{7YAOCqpSJv@>q0QDJzzg!RY4L>lBy)1CJ4ID&~389Bz4UbE*pn( zoOwZbY$yn3HN1Ud2R5Uw;+Qi`#hg7TH>h}{ET0?jK~wCv%JfdAXOls;&QV=G;pCo9 zO@GyR=JEWPk`1#u!H|sPD<%W2nVL%GR=3nwzX8SRco$JmFn01-SBM_9YQ{l+AsoypodW5|gKZ)dCe_s_hTzTxEtADHA2~x`@5478Tn&Qq8?j}v9kLcCO z4Jpovo-QXWCY=oQsefpCL^)))XZ^&`vwKE-&%TPYOV^1)p+r(MFIynod5aCRYU z6=wZ#k=EgOI9E-G+bVTGnGk#FQusoF28amdJZXCn+FMtECLlvrA<8$<^GJ)Qj<7>P#1v1=ji|KJn~BwmhZ!6a46*@%NdxqXQqJOZmWW68mm3C~#1V$W2ZAI0 zDVz;0mg5cf_!l#y1A6DRVwFEzXIggJyF@*GH3AR)4h>r8%LP#LR<#q%A(=0^-Lcsa zSK$Zdd_UrBH9`G9DFaIYubx>AqQ)=hRko z;^435;B;eeh^P5=O6mldK#bjvH50q0e1s5u;O6dLZya>D-R?@1lUu^%bF`TN)SUXE z)8ZQKX~HFt=0FRoB-o5N78X!=r@dz^{-p)mHTa$>5SH!C<+aZy*6a>E*q7~(s=cQbdhB!M1#StW_nA*VsNt(duCA?EV0F%WD-+#INLCk8caLb;u6rXxT&;V$-*TkcT|heD&0*h$(!sh+ZtBvmX-{^Z4e^ua zC{7L8i#KRU!LJ}J3BBqaZa)TvL+S`wGIQZaHphXd{<-bcKd!~qO(SF_4nJZ;e^4L)_JY(nAmiA1kh!IZ%zU=YG#Nd&BJQjUM(2W{Bc;V?QaS?br*D> zp4M@kvVW|#v2&@aI|wDHO~!1`KFn!6$}che2>!&@&BK zm$jB+JErudK^Xy`&8dB*!=GaA^_4?<7S2z6=joIPEYqX95Hej$>Mi(1mKQwjQ~e1E zAcwi1_-xg~X204i1hR&BrUvh~8kT|dL z;>gYrXQh(GK;h*WYZ@Lzk%h_nwqjfm!0rl~H-PcE4}~ASmL$ozW}=P|rZ;ZUBA-_H zO>cX(IMu4*LhX-6AilfV z47uD7YV5zoydT;gAg4{YosV$yIug#Ug4|P{_O z@Ai{5^Pq}jG4j)4(Q#DN65?;#&M^o=D@vaG&hI|r&54o? zl=zI`8x6J4$UyH&$R?qH(@M#3sI|94txEJ6PPbrrc4&v0P+%4}Jr+q=Ne_t9qj?p&%{5vL4s z)J;|_T&~ii=knTOKBc!F?{Xz=PX}KUKP@Q-Wt;1dR``{9BR6mZXK(3H>(Yp5|25r1aS?tFu;s)e&@oBx(&A*S$ z#9Y_d^JCP;D&lw*ZF59!P4nfn#sbsNa2cbA`@^C}rE9D^FLGxBGjQ&^$d&VW?=a(R zQ^W<*o;<$+bxLs00Uz=SuYWE-MsHo5c04#|Jr2q7hI$|s-4q>G78p_wgH#cOEBPaW z$8|d{UQ`fQ--UApFtBq1Rcz$a^SJZrC4R3lNh-kQzs81}k%q&M&nF*Y<m9uU|>IpnwK)iMFBBjJ||9urv zUEesNNG?$YJN`s#jxRDJ+{KLO%(a=<>r~cGcHaheKBmGNOXY;iL-?st$a$HZJfDx* zYu)MeLsdFsM3P{b_s#(1JXa8^Ox59U;8J~+dviD*g6Uz_u_S1Cds*+c_M6Z{uSyD>B9Ns!PtQ!8_9xok;}1%K)HJwgFAxZ zH?lGn_n3H`)3!s-aR7+$H;t^`!N*<1DU5zI_w3y6=nV z2+xQ(Zaeko>t8j*xiW2(ncpYPMj{5}D)+oQAF?Ho8h!ql<9v;be43j0AdL_2SPDT9 z`8bK7)ahf!M9q|jflK7$r)!Do%YyIMp@Sq8CKBEy=FRs`cE>2!4S>DH6dOw=G&X>`!qB(ls>m#o#Zxfi8yNE_sRu$((3{m5$Qdic7K z0fCJ63!$xGSv>IBDJ8^-KctU9N5o=DBgsUBAHIRwn7PeYnzYjH7^-?0pPj=`fl}Pi zl^wI5yzXD8cuA3}12I&cDxfR>ZTGXbG%00-*}TB(&eIB=68j9DUE>U;VtJM*vs)OH`jXl-e$#1ytW$k zN5*|#>GtZsQd~|)=?W8Dz3DN$cx{)gC+<>|y)M@co(8GV!cc$drI^c%Lh<2h9uD(UR3WV857Dj~r;2oZ0}FO~mp zPu2AP{qNlYNkpv)UV5oC37!(wxRE$60bhgIk@LPVoI)Y@>SOU>Ct+ke?sicBPP77b zL@0&xGGz7k(`Ld@7&{pjmvABOUhp`GKl|!3XYYD|#?NFzV~K67e@`R?abZ{SQ=}tSXDj3-!0vB<|Zl7+O4M- za$Gf5R61wF~)JD4a~keZ>G=l5I!1H75vKLW295-{^9IR zIHAFQl33M#V#-UK3QjKwFWXQ3@);?KwB#rF$@wNqk6v_%Q+9tdxAPUc1|&)jV?iL? z`~E9Fwz?<=;mrY|Ue5`Q9#oZHQ}cQ82T&#(rEao32EPD{R73&Iix!B5Lcaa>g$ zx?EM}u5=1?t~t98-DkV}BHYIq-vlL#KL)8^+_Co9we1=6+V2XmcIs0C4?N-(M-H_+ z8+u5jCU-uQVw+6}yr##q!`Xk!ADI(Ow(Ljyxe5T~kbDqhYpeoQZrv;}pw)cH0M&eTeOf)Bn&E1jd7ccR95WP_9m!B9*NuI+y$D;6Jcl24A{@jXVV9xv z1b8(M%>K}AaT>~C#EB(cJuc@j`l$XqXy3lMn0i9m3s-`+I@zn1x%M#);q@?XhNr#P zk=$!??M#7%Dc(Wc3zEtqw4L9+eRDCJ+iW>*TKfEpfHGhBw||qIuW;V5JRp+J&nGVd zn>c3ayKz?{3v|w*x?Qjkm-rP_Z{sqwr+1hT{DX5z)+DtG?I6_=YyLI<( z1&*I%tZ6X_?>Rd-~leFDC3l^7WVAn(@~3aw!F$K+ePrj8j;MWIVAGZzk|hLEJ)sC`XL zzpr-~Pf_u&{4QR~i!pM)#P%^J^lbb5BO!1eab!Y{WgbN|8j>V4N{=@((EFXihET%! z*ETovW)s!&Q=~hxc)tW99=nuk=W?6h5ULiCfqrR!Skk7S>3cFawycv)@m114yPcQ{ zLSnpn{7&1G!kkIueq&Lw^4FCD%^r|uDa<7cRq+D5J|W`gQTJ3k5YbxYvLxlO1Ss)b zz2G@MQ??vmPh&m*osf9&G)s%sIwURN^lq5S;%%n+p0d;!)+_e(*E==Exposp$-ToA zjLn-;$}ziTk@J^&w3t-I&#fPk_nT_k5!cm(F?B(&Nb!})x6ZQjS@F~mkFfE_d8$=t zKhlGgOc)vy0eoa;nF^{rjUXqQg)l_$8j!b@Lg?G9d#COjR{_FvBBVhUphd$7=A`u~zS6F2kE{2GNWi0&`Bym5{lQ+?r8b}@MA#QjtK#fINsmeTZ`5#dwMn^fgkuCxt?BD=Yq^j}(=;{EWVB+@fq zmoAOmJ&`hUXwDc=Ng2OmEQX*5zLUB7rkI2}0iD0sT!-&(G-!Hgz8r z2r(ZZjC9n0-WQBocN(>v=S*V7$=${I*9uS#V;%||0{V3S<9GT&-R2!P9 zY8GrbtKu`0pQeA4y4v*96wyr3BgsUZA?iAr`MaylKgB~b=k{#*l4Hp%eCAf)e3G#8 ze!ikFQI)HmV53BL7M((!)1DLhRp*9Tz-3jp@=wdq1t@492lza6#qFn@>r0u5=9w>= ztK}WrE)^{YZC#JS`k!6vEVY)4!y}78DiLz~+H_2UY}|-1!lej~#;T^V+|JPh)633G zC2AT1ELE2$5jgMRye2_kImWM&Dwl7q%qk(=V;i}t{z1-056?(Ybeq3OEt}pA>9z@!Xgq*X8?$Y4T&&u#wesBX9?A)2Sv)E1sU%AK)J?_RXtHav_p=D5q~ zX*IcSTr!dQIw%Sj3scfYpPeWv!&^^PS#G}V|J8bsE~2blevTX-yNQJh%Lv-hdFig< ztdHz?2Q5D+{$_5J)L$#pdltN6Uef>MepsTHCVF@;0GZ80u=`J#%N#2B#^~fMf|QCo zC*4Sj^+%7MeA7RV`UudsfMC%$E+`&WHNf@RJe(TJ?-z6=iux{)>FQqlmf!v#PiOrQ z)faAkLP4ZOq(jg_MM|2HMv+F5?#`hZx}-!(x;usj>F(~1nV~y|&Y|And+&Y!fcasc zIcM+vJkMI6MKYPLX$tny4jp+gGK1|obf?R~a2cf&zf*%vwc z`XLT{>K0ziWr0Nj`To}zDxo5cGYN-VJ=`BYSm*cp+qEwfL+SC8qe$s>SGXSX|p zEO&PzLQD*T(v2rs!m9_4?;IBsRlKLmSY)$Qc>j+D;5{p>b{tG6)4X9q^9M9#sxm?H zI-MR6?f>kv@O9aX-Y^mQ%hdF${bHpK3&EnJ;$mTJOw@Zca-T2Zs$&rV@iOZ+ZlG|6 zAY(|KEfyo=HO6*SoGx_Lr#XHY7kt6S*uZ-Fj1V0{PRbO`5KgSPg zmrYD5P9jyojybJw3#3jiOP!mUWw9n)k8c}VSIQ@qA-cz|29d7m?B8og&dHrGFSjb0 z?@kXg&}a`2Hmg2#*17A}Om_6}u{d8k6UuPoe{wh=LU8z^RXC1^qRt3Hw1AvD&U}+! z)E1pn^EIa#t~1S7=tb%+UDA^2`U@KU1+!m(3(2a|GNZ3GuXFL#vmbp5gkjhNj znJ`vMr*h|DQgCVQE>e9(WwE1JyyRlXz2xI%;Wd-xr(;Iu+QX`j8ITIlS(?1^`yRI6 z-;ewUl+?Y>INfjv@ey)&O*@HSDnj!<)$dOqb7emIq_~U9Im$GvkLnn%fHg*-{MuE2 zjymf!-)cj&chcmy%v=bDDqrkg<7Dv}AVI&XY_#oDV|8q+orD<>f-+v9nfir+g^ADk zqz|&y;QJ0?dL!r*Y~CU@!_Kim5QGV|kbcO(_M-Bucg_l3uk zApLtzy}+f({x45%f1w}xmtBnB)zC;-0Z1I}`$Q2qZ*KLG$h5qTrA*1EK0LB|P=!_! zD$G!qCr$83$uJWS#$~5=*k?2U_KcrnbF371PlGfIT4qjQvu4x91Ai*F)TTKn`u8@ zGilU-D-dS07CL)8MYHJoSlgde?Jmx=*BXBs95f3VG}`g*S|R6K4R3ytS9HPU2V4T{ zMqrBsUx_Y?ZsN_0A#V-Tc2ZM-#n#%;-`ty^Ec= z>9XR5hSelsaoy^yKv1^$jV0|fsMCvnSFsh(|KP4N9d3@lHEpn^TpC}~=`!|XpFp!*%sq=00b5!jXf_@CK%AS86>T7u zb90kjgvn>dj1x)A@S5!clIlv$Vwsbg+ykCL%jzoduH(+ah~`$(+nL`4`=RTHmH@>J>zvbll~ z12rb2t^=BCLmFxY?y(!jL%$EF2TK%_>?2bSnMBAI{_?9{;d_og+H@2>pq{ZmEB@#_a}96!Q@!5NS>D(jvFsSZWoor*i@E2 z)QgbZ->_s$H9p5=Lmq~ymZ&p`boaIxxEAyk^WRh&H0}M874Epe8Cje%-#X)DN04F> zXVIGc8!BmK-*p=mrvIL8>XjAzw5apBWYtQ!@I|SzGr{4DaF3W8A>xh~t?{m3tPC%v z2WLQ|W*d!-5Kwu?8{@d6Kle1e&d$QIOB088uHe>A+IGLh8okUt*e@zA=x!;V?OXu{X6}GGOi#VV~W0Jdh?Xb|WeN;K6^rnQg7Q9TF(JILZKg?ymMbaWMA}=RK_we2zr7J{dbAoFHMR0 z4@=T%w_1r1cXoE`kG2Z)_uqw58ev5f`f&WglCk;1MLAe!)Y_=DNlhszWLm0Ge0E5@ zScUgc#U}PunnzHevGyxY%bIEVxFO*Wz|*&TQ}~JSn#2WU@yOHPf3Ws!e=9EFu7zH* zSQAQpWsD^DL)%DV)%3o!>)m7IF{I;ZIJgs&Ssd5Cr+YZ26Q!Yt$|of!i{EDiT#b;b zY7zf51cHQKjDR2^R9@wG?nhh%4}7os-x0##oqsL6n{$NdH7CuKAzt5tEFrrgIe3nG zJe^;(SCgs|*fjZe<4e->Inf?UFx%KFCZMqO($4DQ8Otrj5+HqY%#(=E2&5~85f}0D zkQ*Jp>lNlm{H5y}=VDGO_F?4G3pLMz z{6W)nsA{4n)&!=aX@~r&o$^+W3N|ByrCZ4R)>4z#p|o0xRNHFk{kul=n6ylKxf z1SXz#{LNO4=;*$CFHv&$PBC}bx#x2ac~AZ0*i^qaC8V^j`{FH|tJGEaw^bCugN)#w zU#^UKZp;UqT`aqqqb-pp@d(~Pp=*(3kpI|iO zk*~ZbqO+I8RHDs%nT!0okX*TVvPUdGR^zF^)zym{3x_~&g6O-CjUhYh_ zt6WBEQL4p;ltVYKqsH*XbX+300-0l6u?!b(36)YAhGb=oOvg!P05)g#iont^^`k*9R1Yrc5=Oc7Zjtj`a|^uObe)7<9vGPdY@ z6t7b7-sZ0L3MMr(E~`Cncp~0qKlaOERnjqXrdva5smCP4D=DYw?sRRwJolF>nS)w= zdH-|5yGo}8$KZ`a(zTXrQN&609*{w(_|~v8J7JC*&jhLXb#TO!t|DAlOE1^>#acmp z4=qb?oKvvwZ??HJWdTO|f0>224}-fpcIneCw}dM0E44ZJvW4`CTxO8A!Bhbv6iF+r z%}4dB*)F5u*+25d=4dI&^0HC?ji5e)PzthN^ftq1SEdiAmA1;CQYnL?#)<}5Ec%wS zS#gG+{Jtok@ZMl9!=qtrM9*h*KeyDOA=tdWc+Y&#e%4YLW&QH=)|sbYg6Gt`<{dek zibt80KP38Gp42<-!E;#m%vq0EudS=A0$9Fbn_+l)(z{7l{sDDf5!2^3-g~Lr8IPy8RzOQtOeCfU?K3T zQeK0E@Mri%?+bHX^k9^h!mC`&JY4G5Hv)Um3TYDmry99R+Uv`@Y6}WjJBvsuNc@o< zHf1Tfw=i*rjy^e^N9YQTb58`!rd9CwW_d^$tNlpJ^<1#dX_d7D;ntFCZ%*&)#T&{H zq;AGiUkbBR6Pef2No}(R1F$t3F0{)Td0oa8)oL26gI8a@cXXJY9*K9) z`}PHw5=mhEpWyUd1hpJqLJmLMi0G1&^S13#>I6ZR&Rwutg~s@nEczYh_a|O{)#~TU zNuSrlT`Q}+gWKc#zbTvMJFp|6f_f)D4@Y4xS;5b8h{#bYQZAIiD=$RxJxShD>v?Zp z$tDiUhV-s>wt2(<;vzq>YZ0d23J_x6E)N2sD?RtE#zpg4?=`nZRJ(T{lkQ5S%p-^M-X9lV4y;=>;kb6{ zE8aGkS6^RW+eDycVK9VEiC#w7E+2l7j~)`7r8~w3!L^0%Q56dDl=>RTa&{sTZ6yh2^wQW z5(g{Sa-J~3fll$r$!yfl<+N*!XgwZ!tJcD2$=bT_)sC<~^!Jyi5SH)VQJn}m#HK}OI}PI2H=;`Y z!|uG_Bua)yR50v7V`dym8P5 zCA}>E5m)WTB=Gyi)5&OpL#3%|2~KI^3~#$m>+>&U+AkB_4;|EG1vX-oI)44!;1lC} zRps$?>E;8SX^M5#r7(sR|BtxP)2Ou_we0CT&1xvy!fitY}`|Tc-GNux42i0`MP#9dO zs!hxHBY34lf(T|wYm5J_5)|yk6gydet#sm&FV8DUe$!Jq)BvG1SDxn8fED(Z6lhko zQP3Qa_9|dg1E_wJ?&#u_(0!yQD5s;j{vCmMnb(T}PJdJ<1mWGx{TjaV6TS>drgDZ& zHa1GSKQIyv$l?=IvFK=^|IG;-kOny}h26-3t&w=~)_Xgq;O9ot3)*qORfQ7d8;+ab zM`q6K?8q}U23>ViWGJJ+*C+mu=L?M>rTD+G_|M5VbG%fWw8zQy8YSK^%_T~V_Lxo= zUS3}8u%}%C`)ftIcf0h1DCW`@Hdd2P(G@j(L)ysbX2qkxT9rjp`ZRkIEM zVQbmnuTN!qxs%fR|7~SH)F0|TV}qGb6i>K|YCU|DSTZE{E&qn@9L9&AypFo$tJ_vN zm3OxoHgXRM$)c<%{pOmvUs`&_bbV!Q?4s6>oa$yZc)yK!M{Q716<3+(lFpRG0KCo_ zNg&b>_xrZwbyc4Av3bMQKeWR(W`uL4+OdM~%wA<4sP20%)9K-=9dBvb9u7Q^_jneY zgn13$P^VD{!-sD^>vm&f-sX85lE#lGlqp)XPai!EP~lcR<{ug}Z@4)R`bK1z?>+W< zVL#F)j(l{sYoGVP-~zKOYASvFH%Ru>S5yxrvv$_`J@vWrDse%e-q$EVo^bP~YEm9o zGmZU$eX6Co|ATua`NPG<1-;>DCiK5ajukdwak6uy?Pl?^MFg9YLhelyCP15gOO}!q z1t=qmb6&OeTe3xXD)bHmQ+a^+vJ7*gbto;B7<`|>g>q8E`&o4Oq&Z>F#jP^bFVi)n z!;SWL`qtTvA|&{vyPPWK)y{mn9f1=qL-U=#$Z~1oa*^&|9JZ~ zDp|mQ{>c(}^)%GcmN%s)c6WGaKf72H(>~9sBzDif0pyT1?Ibnh4f}+%ZwArJay%Xt zl+fULX@sCG8h^q7n=^Vlz7wZLND1tsoOr!cwy&){<~3mT21xyE>=1JEimui6)ULf3 zt2T&Hn4INqE74I|lL{I%w^Nz|2_P(S+-z>uXq%;3FR}v;-6V$WJjVA6QAgOZBVGc;S zOa(dzPPXnXnV4fcC_#AHr2|I7mteNAoq3ng*AI3g6dEJ@4tV(Kyf*>Z>(OuQG+q)1@iWP92~pxlwF zgHi_ME8Q@LXG&Yu~|;E zWr-x7N{H&{wqJDe%}ajDnk1Kae5(!7Px1YRSLPH8?!<-n9iPfOhaMbQ|K6n+7dGq( zZS%MpE?_^5*9NN-Rf=*dxG4u1`3K5mBV2pr72f^sl|xeS5{Afmu%FAKJ?gUN0?2g8 zxp4j)eil8DY1xX>uZ0TR@d=KKA02)6{?PfeMV!tg5$73$0`1c2U%`y@esN?J4=ay@ z>_n)yu?}{!S%hCOL!fhnVR@C|)%S3pq~=1u9@`p(`U0D}C;@lnmb&PWtJj*F`JQ?0 zk2RyMsKEYTvg*ed5veDhB28LQ3f zcOO1qws8?-7P?n*jz*hBfM0H~)$K$?nEwq1FpSYX`m8&-z8~{|pf4RavnjBZOt9b) z?S)a-(n05@R=4eDwJ81ssh8=C;AqqJO8s(ez*1+9`7+s>b-(7x!A=GaHkQcodBb^E zg!hDqhX?SakFj&({StDfwqr$SgpmG%6UF#h?q$OE@ANiqs=G9X)9GJbuN%!*7}ua2 z>9!jJ(BFJ1q4~s1QqebiA)CJTjM~->iPXEr0Y1;7YuFxy?eOF*r)jx=)(aV$mEhp{O=Xiw6LlRX z=SJ{1C50RNopIs0PjU{$Ty}ZJJY}&J_f69yiH3=}0*qA-e$}8Q3ldY=+7y+mMkgwh zu(NYAXY1KYc;U$mOHytrjX)Q3b*M2^yoBrKTZ^uEgWIcEOl%j_+*jfW!5a+y{fxJT zQgM|UW5ufOAlQIKCUw{HAtlri>w%tQi|wD*pk$6sD}U9J{l7tJ-~nN+W&EJ)Ir?Q1 z=+1A3RAAcFYSLJfun6Hm5pUn0@X~7Z-(peqDc|X*ZV1PBJ$HcT|U0`cKnMy|;j)<`hUr^0doof3ALqnjkM@ z>XpWcp_a7E5uX-ot+g}x;EsmiPFid+%kbS|ncai5_K2f`YXb7;g@KR33Or@KqBRG)tAUa~K<5bg$W0q84 z+dJqscxU#FaOi{ontF7={+ZH8PQ(d2h0lD%nhJ)^EztJyJ93XP>lL;3T5NL76bqEz zqq{Uva!plt>KS3Kg3+d2N(>x2c)cXJxZhQ6tswL|@>^*^Gj&|>7HFn*P7=Bg#(k(o$=21TO^uP;+3o@{ zKj{@@2F$yJ-0s^GHDj*-8QNVgIAiyu<602GPHusVe*J$95ryiRbaE1CPyWs-+?yGc znC@&w{TXUfEks}Ww=ftn0_#dec%Ae_}-4py108F{W5_pNzLObUI< zA}RA!(%`A|>XqLa8go$O6680ku%%Xf;(_-({)EOc%y^INH*eW2!IE8EqHST?-jvGt z;9JH-50>xd`>#4_7hT0)VpC;&D(lCOpiS6;cXd5 z{TFmk8pccvmWMu8O`hE?EM$1Dh4DheX@L96Wp2uP7uR2}q+55Y!q&GO8~U+b$_?$h zNmc!ECh>XUL?dr}l%a=uCr@bbRuxghCj^V7GaVj+9PG&WcY9eC7IZq>u9@%WCA;x?Pb}ppyF~AlxbHT$O4oign$85WXoT{4&8WXC&O( z(Qua$Bb(0GD0J2(rzSDgr7+=$(8B(Kw)#9|s--?gVF+ceMW}+*g23H!Pg+N)-jJZ> zoyuY)jLB%R6_I)-TqVt`ICYT~@7CGKSRH)~KAIYA7C*%@-!k_q0u$)OCrP|Dr>VHwXl-} zI}GREuaL<}v=L`KeOm8&|1JM(tbCJKEHs(Re#ZxNo>RZ#qYayhjhlS#O)v}uzRgaL zw~*&^U|mk)lOg$~GU!~TK3(+``g>GO9KyOBr9vx5SPZU+!IL$s@UVld_U(z4n!g~P zhz}<{$zH%DSTT=6>!kxzz63my&Gn4vm)BkvNKF}JX@>_i4jl8jeABQQor9|qfX59v zWVoKSAEZgR+DEgN7mBwUD6>3dPJ0J`;{*q**d#QMA(%_IUlHd&URi}>i8|4T!b>Hb zg$@r!PSfzb^v?8p)HYgIjaBD%m5UG;Fq=bVP8`fWQ7v8cP0xIA|s#CohQ+ae%B=kISGJ6*!}#}SAm%hG>LRUtlfy*_?@w691Z z9>SL?r*5r4rG0ZKNon?Q>a9yldzd}SPpQ<=ZUu-8kGP?dy`L#oH!M;uJ79sdkNwf_ z#lk4G*Y{Cj`Kdk0rWDJ*P+YgQ+m$kk$GaL=Q_NwRVsV|<-=O9kFy&M__PiBY9{64* z&9yk~bY`q!s)0$qA{;7E)PGq1V+$}&;#sgaBnRxVa9XY{^lVOBVE)UAbAx*yc{ZjPkFn0LQulcQezaN+wapX^=^ zA`OnAIWc;3l=jJ-EKJ!etc7~f_!W`LEP&SNOF@sNl{QPBPL_Z`pKj4Y-^7fuN}59x z!KDePLzJyNyhmfu#&h7)seH`+{rt>)b^9)GM!g#9*<$ibd6<9TkBpZ!Xpamv$luys zwoWxd)@pj4+V@|j7xZHV-9;&TU66N_cFz40*nF%2zP(;vdm%3b;J_)Tr}d|4$Xv7u zmbs-OCa1>0G`VVyst{;#J>Ar~HgjImteA*RH6_v{Ig;HZJsO4|prAUj2uM+j^# zlRgKkP%TC=Lz*C`lG~C9c=Z~_0y0N1vS;pT$PZ}`!4YkHDLb< zkY_%}!U>|3r(t(pDc}x)IT@=p56W=m|5OG|YfP6VawJ>e)}c|8AfT z(bvWM%q*EBfnz8JA}TRthWO}s6yfM~V=ve)ib4PPr;?p&vLk&xQA=@H)B<-qSJpA&0OSe zDmV%Cp^YC%68doD{%^_%yYzn}glq9?lS7t9{k}7{Q5#_AQ}K8&ulv8^hm3+dM^$)V zK91Q3#+s6QC){h=G;`NEFtgd;JWB35tkIwrN28;YTroQoe?B7!DPvtFZYCd5{LM$m z6|ncJbHny6or22+cJ}ce?~ZenTWm(gd$5`NTl4*bq%4?Ycblnmah%Y7w@SkM@f3@K z6?mRZC|g+}0mPjgua>9Hdn}&_;aN1wWf?4j{K zhL0SG>^lST!4pzU0q92b?EFfb7b0eOUlQ&}TPKZuobpaXIY*uaxzzXS-67A>#Z{_w zPom<_OpKfG`VF9K^wJu7mFo7X8Bc*Ez&cC zdYSGs^)8za8dF*AoQtX^y;lGKa%mpRj~fwm!HCfreK_XK{B1OJ^^!usVKa!m9}BjGsErqA)Vk_tno ztV#Y&%^V^N$)R1WBz$Mf%r=<`r%5gmVvbGKNM*Cpuv!4dZ7UumHsB~>+a{Z66qNQr zYlRH)v31Sn3o47JN~zqOKNoDh+KcOxcO4j?xH=^nEc1q2gbV2wAscdJkT)R#aw?sf zD~mr-#q7&{uOF?*7EoH~Qznm`r z;mj`EpFdPO1JLZrl<&(Dck1nz$Rq(cL((D|3KrRFXF0bIq;!|{D(>{hk*!IoS|{9JdA*so$>yOCzcp)JKXbf0h16* z_*(T<05z;VS0t0h3duTN1`0BjD{Ps8>d1i{$hi#(4M&m@n{cwuKqt09=;Z*>A45nT&nawN9Eo7a?m5QrIwA-=BZZ7}{b{_{p zq@5(pI|V}?9pa;uk@QaSQzsoZdG-^i!a>7cDFf!)2MdM?z1T0ZdF1j5?i@AGN$$>s z)Lc~=sOA2kmN=<(V~%D@Q;ds%|k@s|fv;3`-qT*@x2#o>H)Y`lJPVpH7n zbZ$&P{$>L<1Cz)ESXreRnIo(tH)KGnTorH?zJ!Y_8^n~=ps)>zZ+?2ZRH5rk&LM}# zre9R3WwyOvewqK_dCbs}B|U|uYWHC| zGLek0GrYy ze2vrJ2)_fouT6RS_W2a%wfmH0T9wxIc4u-tQZ~=3_tJ4`F4_utL#y4tQGQLbP=FP1 zrrya7D~Su4#_tqs8Wmj)f>!l{?BwXY$<0q5K;Sv&PTWlElY`AA6Kqd9u4gnnqVL$D zk>*UgCz!#%3H9ShK(n{FvaY<9v@i$sE%G3j1;T2~-&cm=r7n?~0Wi9^5w1V<_-?J| z0{Wl6U*LQC-@hut{XN4dP*;L{{4;}W3j4pKfp@EUM$h>wTZ0|_zTmb$au$|@nG@Oh zty3_1t_+@&h;R(d@Gv|KqMsxw+5}lQTE({d@l?*JT*-w(7-!AgE>!))xfLk0tsHzd zX~Yn7iJNdDsH)(rB-wq4WmlhK=|NlvZL5n1NWGZhA#A9uF2Ft`{{qWK34*B1VYbt%3NPtaRC|@ zrw}#sneZ9z%b=9*{^>B>RD4cQg`O&?#8qG&QEr3S#?eO%Fm)!8)(qGP+WmCV3w2(Z z(Iq$mGmDBCGdYlW>5cgz-jH_^7}7R}&fC;3`~oMV`GZL~2DZc?<}|yX5MtctF*tyw zpZ;K00xDHFIZyFbGP-31cJ%2xb@uY#=j68e#1!5Rb#~AHdkVfEvPAkd+@AXx{igg` z_bvo|A~5ctz4Fhy^)Cfx&vOtlzm8~OABvJu|GT#&x?z_7Eu!odF-`PF8J%fRGeXh2 z#UX5=97buM4G0Q6Ck&b~CJbON5?tSv+g$4Mf`%oQaVsZRYY&Qf<#5~%#wQ5f2X*u% z_GoQcov@n}9^-eO>H6ArYL0 zgRp!R)Id@8d<}45!-*GSxkYN9S~IP;bHXE)kHBC+$=!rPiBL;JZEPabk1vDnOOc+2 z%*@QA0rGZ+NGga(qM``iL(F?6hOaFZx&Tt89y7->hh$kVkkQyFBU2z4XbUU92pChd z+~tx)knifc&|7ht2rN}ktluyN!ME$dM6;|b7M|^0E-C?~fx-Iz!LW5%Uhl?*0Zq$L zugN<8%+8+|j@4|uCh*lc{ATV{DlzLY^MikWO-E2IY@z_y27$F4Ot19VTY{MzO98P| zIS~s1Dp{^RS(c*P51$iAvf zQGS-a8MikI*75HrHnpwD_osybOy!?iYy%?ieavL+RyxRy)~}M8g7DY&Yv9u%VtyR+ zG=>^ti{w|xa8q$P*lAwPB-cSG2&X=hM3!c&Qh(vkmbms^K05}$b73vha!n?)w7#3` zcIY{1coIaWS6#3=9F&(Tk4Iy8iKjhDh)2`oIP0AFM}egCU&#}a-uK0DSW@H4q?P6M z(JK3urMRV+dVXa{E9xMm(9m_`a;##-p+U%4W&L{-I#({hRh7-!H}l{C*0c?Wxl4h7 zFKaApElU*zdQY+yfpDtgzh8`aDQ7~IEBkGawGp&cLd!8*B z6zvU)4PV`XHkOQzfN7PObqWE29PY`*5AT#_g}JTvn|Q6@M=oZi-s*Gg9cQOheu51M z^JKIt|M2e)9r?{dHrT#$JzgCtV{_$xJKMFe9MFm4;1}IECP}OBxKQIp3t zX17|?i+AqYcUr+e%#v)L-?uw6Z<=)e(S1|rE}?j9>o`>$KFN! z*Ai4>TH$9$lh!Plm@)&~rq_C3q_VmY+mxOX+Ptf#5ifCkQ)*7h9vA;Tmf-P&rHs@bdlAF+N1X-y#YsD5PaV5jxtHM+thGyPtL8!df%AIH>A-%#nYmC!)Y+W*mDxr3hqA?@2#v&c$EQ>dubY0 za$Clp=2;z#1*)n`{l3(?AZ>~r9OhdK8BDm6cZX(YC@g|8@xq;Yw4G`!(UNU&@0|pu zWLB&&B6;z}oz_5K(*2r`C2TuZG+*kj((Qvcj{e&g+AeZM`te#-&UD>&a?4SMe0HZo z8WF>c^&?gpBh=1eEP`I$i%si7Z{V=(i`~OB5K=q&DL=zryq(<6#cq9bZ#gE+^Q(;4 zU7xwWr?~cZ`C!%8gik3oJMKY9Wy8({ERrqJR!@+4->{b@Iq!{{VTCC;_+sUHr@T!7Mq<7VeIjdY03)va%ioedf5OOQmP zlk9M;+&8tCZGB=l9BZ_S`pb(imcJHSA$$$+Td*bxmhVjL>;XL3_^hsIGm8fG@77Ms zvqv&^R`-uoa3v;$k;*%tz4h+O$ zBfO?y!^P*W@k)bn6t)%bS>RXKbJYA0UVL?s$WT6Dy;5V4K4|ld27vMMByZSim?SS| z%N?9>*)j%g_{;^es&+u*(Pxj$7jdFA2FxxQpIptjfMOTB zz<6L)Rln?0xhG7YeB9vE zO{JK2r@X!_ImqHOs8p{|pnd!d`wPA(H}^YTktg4%TiMR3IN<+tZWd-dz8BK1`kjI0 zCJRaIhEP1yi!U#02g5NYdUe6S`NfPSeKC>;p$+fbsz}c@8WRdfy6k)Cj$AeCdHG#6 zN$H+;!p$4e%?3D>Q!^)3U@ZD%Zb+Ceo;LFVF4fFuq6Q7Re@6nED7{-gRXwDnQ1eQr zHlRl(da#U6Kgg%#YPcltcxy$mGLw;uYdSzh>3CjWpAp1__H}9I7C*3L4kqmt#Bt-a z;C2Ng;;+bV-+nl(;L`solTTHxX=VnWp7O8pr)=CV0`QIlo-%^$^{hO)M%ySx!Zt^o z*JTxiAy^413ICc_eYH2q#ybJP)w{LE|9^AJ{qcBMX1yp#}@)<6Lm9v`-QB$fm#1bdJMP87WQ1*eiiP_l*TpFcx0{u|Lr?3PAW&|+l+k-=ozr*jDIoHXY z$$#SnXfS=K2}%7<1?hDuVDhTc#MrDBM|AOQeRi{FzVQB=;p$$ez$BDp7ZNZ|a>4Ud zs8SqKvd$X;=a}M_ulYQ_twb~&tlNC&$e?Icdp)xWs?fI(Ii(rg7dcwXY_V=BpjenB zKr&c&Eq+X#Z(Vt!bDUcT9Yv{D|F@_>MVSsAg{Vv1^b-L0i4yZWGKeMrNaspUFS7u& zo=PW*Pp5WB|5I|AKl4Ku#;u%keoU8iKTv=2UH*zRau$|+l)I`^7ogjF&ZaI_0mkJ&!Q<9{k`a#h{Ym$@)qq#A@W2Y2i$UJk7NH9VlO zio__SV#u+^I^36__hiztTVIM!|D>X2g;%t5vZj4sS6eH3hR10!m5&G;$XHLGA+#2h zwSCF+jsl;PzRJi&JBjP$nD1|PSxHH)(@A4TLpPa!|6V$KWb(zklgVl8Pe*wlDur6d zpBT#8d*ABlXP1o3&Ks+pYritNbqTuL&_rOchC~)o(AckmaZ*QTlZEbyG~^s1oTiq0 z{6JY0ukz%fZ!7}O5PXwApQqGnU9oTi9A7`f|GQA7+1rc;SXAm{m5ABmO}(dK`vMSJ zYIx^Z;`wfO>kwMkWy|h)*K?cQz^S|RO4%u}sedOKE6apL$wK$?Z^?b~t*{%CMVAYE zI;l<}jN?u_as?vH&h{KrGu?K=>ppM{atVOHC@8y1IZt{)DQkN$Wc^{IGyznv<#<(Xrazh~9^D6}GvK5^ z+DV&;P?<38$YjeD;;*4x$JCb5W*Y_E+)1fDKF-!!uaZvk*jg=r=G#EI9eGBdIa%sf z7^yH_+;Lae1YIaAsJDQ>@d(eb?m(Fw<%9-e?4Sf~T?_kIiwi83>OCRJe1wy~8ot6v z%{Z>zt>=t47ND*57IoieC4!+==PeF*KayEK643N4*MeNS0JwwVrNad1uu{KV_J#XR zV}ox_=Kz8!MH>(;=<~M^6dxz)r}T(VXhOtQgBJRdE&u)H8|Fy9#RECi|6ldAoB4PO zkc)M>zM1HJr!Q`Jt_Ts6VK7mUUBTyFB%<{^8@FAP(HxT6 zq2rDqRY7HrTDRU^jLprFZw@DuB_$#7bHX4Go53R7OkCqfNvY zckU4$8E|*GB+SK|%oBCc-y`zvS?JmOr>}N6WWTbz^{P;XqibI6$fU5mq2W4QwDlQ( zK;b7z(%g0nYzN*$P{E!|J^f_nKW9Y6jmXhHus41Mt{WvNj;AL!3~I2JS14a0i7Ul= z3j>aC^bw1ErfXU0pXObFdYZryz|%D`h#=MMjDJ`d4?5?tAV0}U0q6Hr>Z0wQ&DpSd z!O(@%BCO5?Z^Ir-0m+`}2La%irP$T+tEF(t$@(Sp=)h9$9ylAp^*JEUFy7cH@%~ni zcNa|Ir|TE)r9=ZIx2qO!2EWQ^j!gA|j_Jvq;pf#uCM6>Aa#n0YKNkuhi0qpYcvG4; zX2URbfAHkFZf&v?JRqb#-@wf_kNkfMIaG(r?Z0cv3tPR*TvE1xg)QiZ*a%{VL2z~V zcKeh=KJo&FLfIjwARS@6i{v_d$6ak7cth{!P19+>OP-gHJR~fYHhnk_aId(M0ToC4 z(7c&+R93_J*djQJE%SIwZP!KYD^twcbkuPa0ZF60sKMzVQJBNepyCa5KWyfeC;u8s z{vH11T>ue#QSrXtLjs3kLt@bndXRMIhHabSryqsBrEYD6+0OF?x?pE9yPEYfTfH3S z^DDy`dFxd!E-rtVbt8+%!_5+5ysnq4%WUH!sm{H<64iV!j@*-d;V;ic%vJj2%5&SE zFfJPGey|LEJwhR_&1q4!Q@vy+Thqjru%Mq;gL1D2B!lriMPPD%>1i|_)BBj73p~9O zAg=W$mNtO4Dz61l{BN-BtBsmIUsh#0ZX@5JSYzNuuN)=se>cmv_lo#0-zBarg=T*1 z2^hXD@)aXh!Qu!i4AQi&e;Z0E_@VUP{`#e?F!QnZRVUr*9gZ%F)YyTVD|9>}LXS|g z7lGSlY~kM;@sAkDw%t3^A)#Zs``1&mWL(}JsGo!b1yFIwI#&pkwqh*;$VzS7hHl4T zi)!?L`Ks(1FD)=(S@Dbfg)Atp9gF9Tn z@-}c~Fvd1~D^5Gvp0W`aQ=3d#<3%<=c;M_{^b>KyvA&-EjE zs~@q3(=@I%qMozYiP<^FCiIP&EIbI@$N!?Ssc0nOCJbQnu-Xhrs~jUggCH1KNro$= z9PZ@v_F9k02L~krG!A*k>0#zYwK$R^T|xUk)%Wa&fL;`mmA83r#HxM`ytf?2#=QGK7J%-JMohK$ zN&s003NX9L?yxyjZoATvUwSg?eedvcNk5iW*s4o{FWqjNS%(-Eok^xrszqTkoJ5+Z zkWQP3l!^w-7v^%1^kjhNYUZT%y8bXGv{%4GhtnTh`sXJc!v4}P9SgLv5 zPiQz~-W=?Idj=84U;4b4yh5s?3W1gmqT+~Oqa%4+8`M3%f6r#wmM!ZGx00-}sZ2ga zv#MF?(qw{1BU7$^p`4mY!m|h(IJb_Mzwgu=F4Mi6fd9wSRR%N}Xl+6^as%m{bP0?Q zkVZ6TI&1eER+DV6TdF+!T}#rxg+mw#+~&wI|3;VcVJmc(;4 zX&?V@Wgx$U!?OJY+T)Y7yF39|LaS(4Un{<~cD%v}2IMHL^t$G!6s?|De6KVhRPMNY zIf-J%T>=&xWf|AoI~R(PGCO?~Gm}h-$8J?`ltCrAqS?N|UZ@jAO$04J!xd}9lNpX* zaTKEYO0hBS25R*P}OTkcBMu@$CfKH}yL)HG_?XLF*)qA?rQg z7=@p(5~)q)~6(;CBK_$m4(*|WZCAG zim0AQr>Nc%8h#Dc`~)Gv0dkgGNC7^<3`!f9m^e<{(4n7#z(dt#(AT5QzU{AnqbHU3B|ENN9=WVd|32B(F}2WTHB4N}lU zZWm83Q%eLN_MEK~&d($n-!H=b_9h;*+eAjS)D-?>;;X@B$)mXoS8L&g*P+IL_;A07 z+jWSazsN0dZL&EuAQj8HwJ3gdXF zUN_>p^6S1zu$ioqnpphm#seifr?<86d8wZ)sQFzzP|s?^R8_vXYTgAU5(BX#s@bz` zlg;&6HD;3n2!6E78|=cOg+l175P(YznsTZv`aMkN$ortqbB6JWDD?cc;S)69A*4j* zO2pSe94GCp;y(-z+rMKB7ycd|NyAb(XKRB0;6Bz0*etS1%3gP!q}^kMc7dwA`E=U- zDP@^BWrnYhxmURJT{*N_tfcT~gXWIaBYtbdT?`g;e$ztBrGh2wmRit~?9oEg?ezh4 zLF#g5X*t`3PU>jur#uNAnm37&EpwX0p31rX0};fV-*j73DS{fev}IL9$4Ne+_G%;y z{d{4Ig^g$B`I7cmM}zrZm%+nM9Ln`j#W!yvGwVLL`kVmBSL7|d*i04y(O%tl%VBEe zZ^%*%OmK!~62kar1Ud9Q{MV{l`NDS3$6spYEj%t?rC_Qbdv%oy)7^(z#2>z?Uv-_Q z|A{wIzfl@JBVTspF=+O6k92a%&yut~6*W*<=X~&drb%PsblieVh<2xNa?Pmjb9PPA z`_BH;x!w0wDowjGeBUp`_po?e3DJ*EC@ha~8Z~ly*ys)eDjL2!Af29=E$Et`HGcDn zOyBDrKLr{5Z?ahY!w#^qnV7?lp9+RuaVO9v#eSudOOfhwsVpJY^{a|Mn77LI?g*7S z&TVU-?Sx88P+R~a9oq?X2iNt#Gzv^3bF@KOFP#^v{V<&G^ysr*GnZ7;&s0J7tJNau zaDm$}NC^>PqQL|2j~;t`s#HjX1UhVsOC<22^cnJkfSYYPMw+uF&#CTVSNwvj{MU|} z5KP6{0>qy#Wxr9N=O{XSU%&pr1aIRsl|zbMg0~2dl-VxDOyz#n2>%7*jou0J)%Y}|YTUwEO8CN1mGX4hbMeg=UQyF69>a24m%9HROEe$6Zs=BrZ1CE2Zdke;P46=D@lFI;C+ zy)~ zLLI^@iPGcFzS}JgU;J5_NH1~E*~h4G|4}7|>?AY(*eOr71!g&9R3RIfB<#A+6XB}ak<;Sliu%qbW;r=~E3?nYa=YL;`)@yH?3(vnX&nq_sz<`Cl;n!D zkJI3JHsHpgH)&<-_4=-)JS}RK%(rtk;`i#dV{v0kCWX2$KjKbZW7+FJa+RfYz|mc} z-#)p5Oj&O@=B9D&)g9PVX_e$u1{>9SHJjXj_qQY6z$cQth8^Nt7W7` zS99pT@X}qwCS+KH5WcoEjAJ}K8?Pp;WIvHXtSB6OaWWXa1+)8dRyW-;+GV-BJ{>X~ z-IE+k5WQj<`i@Uc*eOlZRn)C_WTYYTBtbm*q6$oN(_A*0 z0Bgj@@gzeP%Vrmq4dfq#eQ(-6fkNiD{q?+L;$FOO!tbLnoz4nUs0@D}WpzUF7n7;c z0dBgA3niWzI4)@URc`LUJu3nG2S`0HBLg&_KXZo*e)13wZlu2Acl*NXT{_OXK@Og!@a&q{m?)`vZzQ^Mt`+~0^>@rcHs>`jM8FNyrB zW&5%)ig+S!N6|asSodhXvxkHa%Ita*V^f!gV3J5s3to3I`yTBSi;4!@_R2%rL!-$Nk!+)=;N?3WX$Re-L zbhRy|nOD)uMYPuQ=^Iq%7n{_riM&r%4z2^ql@jH#6rI4*=F)MxZx z)VP?K0pZ#k1RlhuL-wnE$Pt3$#Yc~V#W*s4hTqI_;J>(H%CHAVo|mF2jaSGzHjUck zPEtQ+f7kRzIv2y_GHT27tfYMtVf}suUhb5T*OX_PN)k3=-D-Qayh)Im=zoupBYsL& zsQ-P&&)Bt2%rjFEvhpIB7yhSrLE`iiVCj0aU$H?|8 z-Nn2Z2<@@z|Gsp8Py+}DdO}%)JX;D5;i*YW1#t5miFjbpK%zX)w@7DK4P7t;r-d(u)a`H zDcxI>X3uv+(60@2L$Ti8T}3kN+r~B#VJGeJ%QrxUhf)D_B-85~seC=M=n!|jvARv; zBWeY_DYXdXL{o|HuOp3EX^_UkHBmxX>O!p#yKC;(4{sdBkymDPcf4-KP!3 zgFA&7awvtrYA?g7hkA*}!9&HCv`vqJi!%J=TFZokuI)h{u4>dYy-lJN=q&c%Pl>9B zjKd??gr1Xrufb_0A~5_alwYlR(?TBetI|GEn<(kX?EndpayTswx(%a~EX(_JYH3sn z79IMx;A7HYDLeM<7yb;>V4f5-2QoEr}5~~ zoCI5#!;P--N7OfJK%hdSJ;gacUn~=WMQLJwYG*Ms8}f{BkQq%ncUVL$yxP5-9u466(0JgQJh{;w!#ZSBzV)A$; z-{EEL3O(p%0La_`GFe5iC>wIi2-b-TiA271SS#lF%B<~>YDkbcScWjlCGmw`w;mVp zDTo@KD!ya`nQkW**^aVbW?5`kFFj)ykFID~y)nKHz|Yw=<#pZ?EW zV`{&t8@L9_=fE(Ex#Qrl{tE&J5*0q04@myPO&JtQS1v6@k4JuTW$2U`KG!l_ znv@VQ@SV@qpn-n37>_f)$@_w^KpyeBPqt}f+lnn0RfZ47%-z)=xRZ)3?aDkgQsurr z`yZZwb%*i)!sIiod-$LtGK$v+?S>_eGvJQ}&w$&8*&tkG>FlWpL=1~C7KBtOgcIJE z?fL>aqp@!(L zeHt#KjVSOvdqQN_%m+q^=r2MMe3R9O8Y?Ryr-p(y7ec%@i=iApKfn00Tu!hThPM(y z&TXo*s9o`2I1@qo@AC*}=Hds=<7EuCTQ!4*LC(r+jtA=&fV-6wjtq&YAHDenJ`NZS zhz}rX0mf?QodB7sMuRHvao<|&t_5FY+u=(4gY0IYVn8veSQXT8iy6;g?;-{G!I*2< zK+#QoV78d=E3ZyiQzp+!?462`pUAaSdoU@_S9;?1eQ!2=^M<4>0{0{jyGYGEL`x$? z2^!^sI8DalixB-W?yf6}bf~8*c$DX)A43vCB+PNSnXt?F3cSE~o8f#8AtSDN0cp^|hrqQ=zdOpw z>F)Rf)~g`)Y%hU`^~#sfm6JUOU-9yw&IjDlDH2pdx&t0}Q5>CD=SQ7#P)RZcAL2ts z!h}MV9fFj2>Ywl;Q+t2D`V`5jHde`yqzf`$o4#~BLi=TUml0Y2%*awkqvHqC42u>- zPJYVYwCKXXgjZU=x`popISScKwdYMICD250Hoh)YdBVZ3n^suQZj0+AT87u&OZ=xHie2P<4ls@VkT zayE|`W7j|g!P>q1cjSYv`RRL8W8?*5(hs`^GzZLfz(9G`mBXnae~;wPV&)vC&Le@* zoNWJZD@$}3pLLPe{u(XtG^5Ho&mY?(zYK_X5a71}Nx@%nM@&!}yXWF2!%<6&e1rs) zPzjWb%Tb`TNchi;$ATB}Fb_?JVMaghWz|ItwZ2Gt%wd6?w;#?@03Z)%|DnH6h6l#} z+2Km(@zyvqAwqcqFYWD(zeEnd(=T18BR|0<_|aZbc?O>62n2@l^E8uI66c-t}cZJ$`2u_fY-^yWrH=#|-_y+L- z!YoF5n-|Fk`AMTXtSghR*S!5=sW?9dzkc5H&0Tx}lLRET#;o>eSX?QCqyE2??WFvj z4~;O*dOP>%&x1<5rbaFNV|iwxoa*tj&M8U#W8!=k5NXuQmT?#$`(%sXKamK$S`*2H9Tkaw+6Bz(`#z&sDc-JezpY;l3Bi3t`dFd_zxdGKd zz?`+HNVm^|@f)C>^nkfm~|) zT7~cRn~8yYfj7W0DyHt3(sgX^rzW=nLKoSjz{Hacj_E7y-M zDz_IXya4pf+~w0Bz)Q!E8w{wGcs9TOF{Y)q)GhCh3LstD$oBOK!mb&#K)_>4BN8at zc({i+kW^!W9vGAS*0}y zc8t$c7H=h3~Z&D(+S?9cw?&;joXRxGCS9&zO^W_Kk= z{Tasdz>F6vWxyvx4Rx<8^>%#{>OPl7T;C`6_QU3m0 z<^L|eWcKchCvjt*CUj#nzVp~G?}N9j19v|^-)QJpLHX_V{A1QdafI(Qz}YcLF$RIo z=4W=heKTJV3kaFgpMN$^wq`SQF|F*1m94A`!fbfS0U|Qb!8`Wf>QwI}E0Pwb_E50uFHZ`y~F~0?TI`BCWwf3m-Hy@589V znjJSO^(EkrX9?NM%OEyn>3XLOQy{bxT$4J`l|bQzz|XD~1Y588$Fo3C??3x4VyDBG zAhydjfokU}FVnvg+ZxM^0-u zcd<(5`~E-W@o9T94hZ?hy3+ar52(}(O3{JhPVfOk;cM98R6L>xd|`Sz|E28~uKYKq5M{md{%t_M_il+a9ful|2`v z!uyS7|2}*a@fLGsFa{Hz>cZcjd$2eI$GrX zZyOvK*7#$q%4Z`^bNLfEsGPTB2`Y&jsUH88G(%~ZAvs1 zS{(5h?9(`qv$Hx{_l7$?T>^S`WqL4MfCM5vC%@1skE8Sjx)}a-WC^`bLfZI}uw#Ks zfWMzEoD!}*l9wn(qT0m)htu0%sAF35DpHFaC+6DAn_Ov$yaNk2zy3%CzpqJq5N?07$0L>rftieG0_19`-qML4*_T>8_>veOl0_055-# z2HTTdD-+$^LCKmAL2Psx`cAjIR?@W4Hm?00PzWR-^NN5M_!Uq()1) z#e;fS-V10ajaXxDWw&z+cyZlqo0Q%^cvmz;{n}dfJHWRcX*QRPnY99md=YO??(Cz? zc1abxLiQ$e69gy9Er5&N0Slk@EGwlp4(4th0RE9ejD}Bz=!S{$KQ^dD$Yz8!pOiW9 z)KMb@bC*g%7OXHr(yvhOO}Y3f_JxOPpqLjqYgqiuTMGO zl4BQ&wZVGy79y;bjXJD1;J#bWMEvkp7+a{kX4_sc1Qj`@5_TR7^7mj|J|nHjjYTNX ziXQmhUNYA}k2taEbOVvX1}Bz!(c!YcaoHV5y09}g|2%DNlMmgm##0RZh8#m8;#aJa z{jb8fsem}_LpVy>`z*U7kDY>CFMnKOyxQ3fQ?+sNIfc+MAW8sAv!nVsM3$e@No=^9 zp#pT_ovMTlgECvn7=#08De=n4>1ShvJ@S-I{lLx2&g6?$V7t9LaEAhg{aXi~ibl#> zkH{t}oz1yk+KoabUMw`E5^}({mw}#OhgpT(p|*Gb<&_FFb5*87xao;;D)`)WwCG0lYx6V0FzCGc+7)QD7`k^frgC7G z70rLS>VCW~F!S9U%Wilbs2XM9R2Xe)-T8Xvv-lMr088?dO*d_;IpK!JTmA_?{dq4N z-X#OKxo%s{?GJH8`Au1U@G1&V#4sde=N@Wf<*^C-DJT8JH=r2rnt<^A?>I#dQvxgW zig#{*R)vTr+v4w+45~6+yODUTd}uIiB6xVt+uj|O3pSgdx^iddg@>uUM3X^+miQ*y zJ`Ihe3z9A3m_?tNc;@J>QFtv1P@j!w-;f>c;6cwxCucH=_{E{>eIHM)CaTjH>n#y%%5Ga0RI)crqHW}At{DtNX1X;i*y zNN2oTPG8uvueH9E`gvHd+(wKMS9Jy9P$>mJ9A5dR5`*FpGzhOm^kvIN{F0_}0*&8Y zZY0oUKPy+%3=PD_3lRriLyTCyr?(>yh55KAA}zjFb?e?^O&;Q+OJMIJr|L_R3jX%> zikm+JT_U-t2%=H6o1O^xuJ<)TYe4ZOg4e@RS#|hXReFmy#`NKHSeV&R+9U2+z}S3v zDGwGCn1VY8Mar^Dk?Lp76Vmu1cEdDYBFu^fsei!^jxoD}&x4&PjWfKF^@Mb1zu`g1 zu6u$ue&LFxpZF9-F+zo2A}zH#o;9MFjO@``3jtozKpWrtfrPV9l;x9&{ChiOir+Si z^fTJj48F0bT5+)aQJ3Npw0AiiZynJfptv!ROBs-*vS(0DgNR%|I$r@%0*bsc$3Nmr zXZ+tV_0DU=v5zzw&}^z(oYEQ_d&788@{$RpX^>4fq1GO*}slU3-)eFed zl%WSMv+;$sVJ0TguYgkc{2ioJS~HA)=V@j7fnY-DQY9u)oFk8;1sf7{Z>sA*09FUC!h?)m5NDA{c)Ao6t#zH^p|K zUEJ=zzQ7r0Hkk;U(tuLk7-CRElvCAW<<&X2swjtaxC$P{p_a%2XUnrt-`^a3Q#M9d z?x+Mc&vWf;s^AqqIS(?vXt{5{eiE?x)RJC!bfl=hO~yl`1 z$Q|xXm#1J%tN&>Q^%-(g1>3Dud+%PtQdB}{VgrTqDisqP;#DY zjE6My{_R0@*iuw$1x<(8>=)$iZG4Y7uO?tu@J}o8jC^b)BV;05B)(mnuROLg;a%A6 z248MCV}cy|iTP-g-OxEd!3_530RCh{C-+`lO14nd1{-h}vKvOi-$9=2+9o(kBSY0BZnu_u(Bh=*uoxSkhiP6~xHpt>yKrZU(J(`Oey~0Qepz0>)H4s<)90zm!gFTQ)DMy_vK69oTqoerMpQq(^xLG?Pzi$3w^EE&`roZ;Y)2WBHB(s4#(#9s9$ggV+H91)a?^on1BS%Ap5{Gbfl19{zb zf>Rzcwbl+T%Cvm=x}asum5e6ItRsV^?D{<6M(5KVLszlYUg$cqWVj&~Y)thYN`$!@ zoLxxOovL9(iY|uJSfbj9jCi4D@hshea0WuB=Rd!m5%aMNhjl}aD{2QX=S{?FBjO&)sI6GKfa&KH+>`3iuc9h(rfY4gzKde$doAfbG)KjiS1(YLjUOYD9p3FZoHLl{sYfHjU7LI zPHT#hLH-dgZC#6O%?wG&ZnH{sPVz>hjRWR4)Er6b9-LCHtda&|TD%NYb?j=_55On2 zzxZAjm)cCNf!L~y9&|vHt-@K`6LyJYiTGG_H&IJ* zpM1S!NaYO`TImKB&&(#$W{&n-r=4BwkTcM6o!F}uP@Ctxv1vIgLM|qaiAR5VJO1bG z6ty?rd6j-gu9Yt8J(tK|ETd7LJY0!iND5(h;zGyy54G`LY#-2}oP}LX?Ygp;^w~yMCnGYH-B;ErGkxBDurMFMO(r2=tq|Yrb+i;7c ze6^-OXC!j(WRJEIwdLn2E+-!DR^I)lBbW=1jv~p>S%j|qG@$EpO>qx<9AdEcTxy8Nf}*_Rm51qH9o?&b2NiFehPUlN zCi^SBjM+BT1io!<0}n8->Z3*rqe&d^AQ-9!l=6wuWNPupl56YPNooqsBHhF`5QRSS!68eiN6?fLdHy=Gg_>*E^k<`ZKX7 z_`pq5%1^G@m#D@DGI{hKHwQ99T@-VV`LilB!L%3$-J_4TRI&2F^~ zEk?xHT(w-S@rB<0y}dC}1v!6`)!xE;o)y4j=#&$Qmf5HKwgrT%u&c9Cg&Eq8SP+Mf znpPH*VSDS72l4hDGnrzSaWaFG`4bJX>Gyd?KUY{#5ZYMDCSpjyv4iLI=(rvkf0P=z zFLzzV6{}Cg-8e!~Ncbq7ZaH|%qPo<9cAc^?F;w`Ao2&Dgu|E81Ymse>XR?|n+A_dt zJ=Lm5SiuK=4Zm7^LL1;@>K1kMc$J_gJd>tf^;$)Pi<4RYov7L35EA1gi zYTXmv@k#UX3*ITT(hqhKT3>WRcGU8dwuV0ISdhp*O(b8N5wOb`kX!fklA|d;~u~;J_1?(j+9IgXv?aZupBrjX+st#ud z{;jUB^?`G;#KOkt#+%cN{KE=kT0FFvw)fFBrBqTF!oETSCXl(C|Wi>KS{wXdH zpmc-XGG+{pa@;d~K8KMUpl7#MD%HC9WkJR0U>foy~_*se+i_}9R7P=I10RLz1?1-Qo;tuhz7sb4P|GGAqv~Jc< zCME@p&0AVrZ5JaRP05_t4|PZ8Fn{q=B}QUtF<-p^6)3MHZc~&R%!$pb1Pf-27o2p| z`?bf`K}e&me-#FQf_13PSYN1|cTJP+lQq1hfazZ@Vk~a4v2z=_r@6pD{ z8w)ZkP?!i&UI9{_>DW6yF+#Sg{1sa0a=?1_bKS8@YtI&x!M0HyRh*>m)nY$>G?b22 zt0+)eJcu3$|HxxMps>fGDtgn!$m`O*l?~m1xM$Jh(#FO@W1SCAQ?wHaA@s8T( zoGOp0P+bUZOSa%z1BNJ6p{g}!!2BJTPG<;6GAkovxD4%)zyIcmb*{%V!q$Sb(RvLt z=^SwdjCGj_HX1ugZ(koBug9Gb_ZK0 z0zMHX#tsO-@?#&iDN5Fw%!Gt;C@ay5_vs8U<~F)Q1W8MX%h z@bgfMsK`cX{RkzQTwRWPPfSuO17uk4LXNwM+!(R1=Qi}L}^ z=a^$jw4{s*n`2)bbE|hRy<3;zhjaCmxQ+}*;;e8WBYFZ#YpF;IMM?Sv&M=E6HeWS-E?v~PT=gIQv>PEOzJmBZa1M0B6-_3G z^G->~gV%~2&yQl>i_(m;6yUftt*5=|(D1z&@7t~6F2o6Xn@@6fkJK8FxktQ9Az_!+I|cYDJyn-kj!I| zf&=mfaiOu4K=jmW6@UGw141(&NuFD*Bo2z7#67Z^Gw%egyiz4f(Aw4$XKCBV%Wm&; ze&7CF9GMev7<_2{Lgxm%T?IaN`tgE)WK&#I3jdF|@B*cxDr{ef!G4?b(OH30vB>s| zkS6~k7yNPYLxiew@-m=cbMjX*`U*w&aF{F>IlBMsDFRYQ1lk@LPiqi|WDkG{XQ$A_ z8e74nKHKS9((O!i*bJO@DCS|{Bu=z?sXOKm16>5PZYBX!>D?_Z)L7xm!}16|PjtBe zm#VPS*hRNVZCAF0XGH#S!E_!yiW)ju^@PG##iD;b-#sATadC;=H%YD5&nF`ZfiA!i zW=p1m0IDj1LyLexebpJ2!R&%))bpFpUm?6yo6%2sUv@3paQ$eDeBk6)%(9R_4PDEz z13X|d{vY(t6r^ahryEvHBFfZp8|TFy)_pOcHVsx+mG&TkFn9KT=6Q84*w8*wKlNI( zDEJFA4h$5#X5T&~&EX^fE9TVrs36piP}4G`BJ^=-BLJ(s2BM zIgFrbPsr@p@8=_`xcB$@N7+hN0z6NXFy|Ft$h&+l5@7TE_a+iiBqp7Y3WiqV&e6g6bLe_#AD`RQ&9;f z$g&<3M+J!-R271#Xz zH;iy%30?f9b~oXWn^kt{@D-Lk{jevPDns0nRswlMb+h;hJQByoc6FO7-#B)FOQO9Y zrMJ;KtEat{E_xg9klEFHF*Qc=bn@&6aba~L^M1^D-JJuaRSe$+F5P%M1^1oz+OYut z9vzeMSJ?nLM;oCYCfp|erWJDq$#zW9FJ56V@wm9!f(0?E_l5#9cn-RH7cJM0*3<1{ z5^zBeERR-ug~jRf(N@DhT~ozI7pB!>7u!C5whv{Yhb4?58abu$M=YtxSjPgbaeSyM zYHt1{x4hp?3_))+4)~Dbue>MOORCwHaYC^(#9o<`e*EsC=Q%r3g9ZwSMX3rB=p`F{ z$C|W!yUB-yD#(-uK2=V@^nu13662C|cXY3AOCmVI;^QG{Q&tB#o8e*2n(85&MhE`@ zj24?t^_j{1xZ~Qd1Q;@)#3g{!(1SE4UV1A?_q-EkN#Q<`;ySlk3M#;)0`~&-21~uHfp1weL z%BP;*%WfZTo~EuXA4BgOMD9EwWP8)*Fk=d_hyxb{K#z%!G61WW@(r(92N2tEVHsf-;)`e zUZ$?QX|UJ!<5K`69^3Ikbn}$z^v3q3l8*%!DD~-s?1&7y5WIVt_fQt{1kH`Fq{yDn zJ=lpf+^hA1mp)XL*O)Tc)xLe$tZ*p=*;-rB)90MEec7&V*B!s`5j~~VFjlk$U~ieT z-e0v-8kCa@)sFgm_Bd5-aJbdvy!aoTSzW?A_}iY&jn-T$p)9x`M#rW*c8|WN33b7z zjGE9*vy~`_FB95ooaH3!{=#Co_SD8Ndw?~apHzetWB*NiA5`sGhTuvQ-i8EKuZs!x zmyX%EA$1W#CPnz#M;;^G-c89ColWS9=-Sy`IJ4bAA^OG3_+p0vxy-yajFT=D*F%@@ zPWWM1=?%K)$K#fUnr~61sN~mYBNNuh$*l}^sqT z;xLJ04amMj@y{W4f%oPyTIKT)&?f+!cy@S^i3>vyKC`#lp!B zKP!eec+4h>;OJD;Qq$``bco_6Xgn5=qow^m*pn$Wb^mkB*l~$Cfr_KH_`4#HerbaI zBGE227)rT{e;6DIb-N-SSiL#vTGinCnoD@M*!Ft=5RQL;Slu&T^19B;aKX!iy|^ z_@#^2+D-f4(BGY`<$fr&V1;!~1YsBxX7SXu3u$V&^Q zib#J~gd$gRtVVijbiN-@In-)opTt&9@94=~P9z#^ao}9Ya%8d7IIMB1Ip29z=lFDC z?PHm!K|1OoMDjdd{pPI|^2N;MZ|meSwUw-~FkL#d1!ZPSe78W?izEoiQ(j&1T~ues z?A*Fy72`x07B@YC_T)1|yjn}uP>A)KtQJBgM4$>cEDmx|Vr$UgJ%`8h)Fb|JCzxw@QQ>sX2 z-}6C}4%XHN7O%rdlPEJLM?jlIN_lQMbuJbj#ldIWzF8vWiB@r%(Y0UVRx}n;KI(=3 zY6!a$;Jmo_)5^f7y2ELoX8-I#hFGjQd!NIXP_DY9e9IV{UH6FBx3$$hgn$2!V z(eS355waT*m>bw8!ERQQ*3+ZKCl2z$ZI?bQ_hb^!E=Mn639%`tVi0o|W+c`d5v@J5 zF)9ao_GUg}rE6SY#@9;`r+CkaruvLrW4wqOcr8AoNhgseXr(?;*BOLm;7KK1M@_ON zdm2Y8s43S|mgyA+-?wI8R8*9DChsp=+NIQAju9mt>dObT#DpDCn@BJlD>?%eJ`TSz z0|-U-(6V0yM|!p8C+NxLFu!WEeUR9`w`RhR<0StNQfkBCjEk|LSs1H=pthM=Asr3) zq55gGpivkuW79(_=lgJLv+@ z9er)Mh{>Sg{@W$z^N(%KAkGPiBKN#XeF}F%kS`|}dW4>Bf7%=hs@c6+-ai~n#v-(& za`ko;taO)5cJO{|34B>?b@_f5Po_+pJoJ1yZBfh_{CDXI(Xkx}zc-~omxTq+)dj6R zF83~II~LG;FGV|enVH8a4|d6V3)uXEnJH08!siF%&X2O*aStOVJ8TY@yO+uwyx%lz zfBv#e4PxWl^?KmchTOapUX%C^S%CfAhDq-{mgNse&WoKf87LDg ziNYC)pi$C*a@xu4-fam!esN|skD7N8<%o^~W;5}>A0;A=Lk7l~@O?|^SMoq~G;%h| zX)m)z>rOu?82%;X-uvkrZ;h1Ge z7lkStAA5%5lZo-z0H`|-dd(htUiv8Yr+hHeh>SZCi;2b#8PzlV#D`<~u?fH4QrS_T z?=)A`Nx`Yyr0BedCMCSAsi?eDgsDXNj~Cl`u}x)EG4y}vv11vv_ry9fxRQnyLG{nc zzgM=H?j3RkWBrskQeD)P)We^TDf&mxOwN;yh?Z6*x}_NLU-Hk!v1B-XR1ncIu3_RG z2WTC2ua)pRj+EHEudx#7r@OIuN?srf`i%a;bsPzbb#rcw`SFGUt4iB}C&r5&%i-)H z6<%xHnr2XNlEI!YkOa)&14xs5Ga*X?`X1tRMQzWY=d66ff^H_Ek|kAgRwl~!OIU?4PZ03cokuS_#iQu9wjlH9IV7m}YGAq!z#Hr;VM`AL}_ zD%aKLoZd7rw=_1|!oN(V`)^VEh1HxnVrvXwLXmx7_4!YdQhRQjr5U$sEA{#4?Pq8Y z1@;e7qRw*1uJ;X#9|qwEfFiG$LdUUzDl+N#PDwWFGOl*G{+@S8>~a_AzT}0Ii->{F z*}HEuU|FR54c9Tn@Ox_h4<+g*hr90}C^oe;vOD>cX)1_1+764C=gaH_t9{h=*NQ%l z%;h6qX+%M#4XI7a_M;s>efz)JSgeu99Nb({fucG(zBJf}CC>{~>}E@rBrl1xdIm#w zB!kBj(%oOXOct+p6~>{zm{%$`a1bu)~SrDcpz7zZc0$^NUj z|6~D>GcF$S_pEZ-(4?dGh>?T&334`ni3si4CLZ& zc)l2`yt48q!8dACniUX#=#~svrP~jza@Hy6oh97A*8@j z`*tF;XX{6qg!yoK|i`JW*8#jrx5x8syw zq>{;*-wM&#E!=cj}yr6V(H~UpqCO^h25-D^4ZAW=e_(P+&w0s-* z@3P|Yc9QSOVqh>VE6dC3$gtA<0$T*uskV){7hjMN>1Z?!YOMVlXqv~PTmdQucZU~y zF&*Tq4!&(<=_k_#P#7&cFJQlml7<5-l}E#z$epi`;OYabN=G$iaxnI(bj~CP+3$3< z?rNOhlM__XU7*ZTQL*5Dh~$K#M?BO+;9O>h_zTeo=&_>k#8-GN>eojKo|ihi<|ya? zN@iwav8MQq4-5>41P6o>XPV8?qH2-hV~%{W7tRH=5%)3Ez1&ASf6~hovnyHthQbt73oj2wjpQb?fh7&m*%@A4s6d`0nHlLvQbyNMx&g;KjR{@@|kp=hrI1Q z;XgYGFV)A;Z8|@*9*gTre6BdwJfXk#@77`NF66hfouOiINBKJr?Zj{<_R{c)ek%by zT8&RXyH(5#ROs>f-_dU8WY0|=rr$5grf}}hlr{lGcp}^noe~ufPg)GRFq`6}3Hcgt z?(F<4-KJ;lyPYW=rEmXW3`uzq#A2F%oBI&qng}J~4rg1+4v_@(^M_3ek!s&hC(UA+ zT7#xth7oOxoeS-H&CBE!xOckVj*ei0P6g>(kI8llH~uahslz^kgmr9(DIod%x?Sm9 z33|&Jem6;&q&)X}fw%`j5#bh%q`X=$`Ahmr6aBNr4)?Ll^xb2p0@zz+)*U$}G$6az zg_eI?Pm{r3M-)lDT$%%| z70zn?`;SZ!!k~dONdo09M4@zVpW4!)4~THa4vCXvLF7hv4AgpN{!8hozKAs91VC{3(?V*B{1I^dF81@UvPEWCdPefR$(bWaWQ zWNDJB$1M7XXDp^13VR$+1FPoevqw>-5E9=l6%+hBk5I(WYlk7JV!T^M8Rrq%h@NF{ z;u3%M_dsqTusdH_oDJ8v(nG{Hb2xl`0fW1O!4=>m;VU)zCXfNR4M?&RG^8G@$LW_S zA$tI>l+=cGly2WhOG=VFr@k_4xpCq5KWsV#?m4uX5=m2Y^?pz+dJx=Q2T9hiTUBRGl9H3oK|DaDdykcZHDL14mKG2Csz9sI6(qoYdcuIZsA@uj+j( zcsulO-}Tc*aB$=t`T{#5kHF>2DJ7}vJLg|y!s-uGR_@DQI%ieU1Emc+a(c-BRdwF+ zaCKWBkIoQ`5=0rI6G0v&LX;>WdI_R45m82sUI#IVmS|!0Hp-*--ib(bAqJyH4md=bH?=;0RW#(VrlP*_XL? z(~xVjw7^d{X+`b7Oflz%^Yp%>{uo*uQmS4s_O7@9`>EV;0pHSY4iftynHIZe^+o&I znTid!VN^nQmvBW!#^64MpHYWP8Ok0yLBbPZT2>uq^mUO#_YQ>*DZ}y%FxZ5=L1RU; zqBgepy|Jx~^%(4m+#lNmN6HofMM6UOZ7;j3YJ#thXArnBewnki#1Gc*mXn#}g4#0L z=V*DgVphQ)`W%nat)z(@0+O&a62!;f8O-168XwK(iP+6ZEtjCOLBef&Pmk<2pa5Wh z8O^iP`${e1p@;q4X~${1PxIZE}qE7C?5 zzP7L4g7vNMvA?!-zbH;wvk`gwz4vobjNp|hm5m&OWq@0f$IPR;z~>F?X5tc|atBzu zOix2Bpf+J%@Mo&M8PX28*LLDrNsbEMIpRy~1eC9?*k!~sl`Lt}rtz%W+hcIWW*2`n zdd1-eC3m$M^7jo|qaxV5RT6KXZ>lC32r-U1YCD;8?8T)i_EEwA2}xJvT(PcW{ChuO zn0qf_@ekE1#~{vtH+dqm9bZ|k5fO^-V5yJNid{kw{Pp)kDnt#XGLYU;3tp}p;xgP> zS*}}h&^ta41R=K+xzN{Ur%bxuTRoJwkq1ZM8oVa|z13&c%$C2_JuV(cb1Dni_X! z&(NaC?4Bzs|9(;$=RrF3J0}yrHw%AyE|}sXT9Z_s)sdo`*;`v>pYDNltl*<3?+W)D zP^Pf-ck?qpo(Fv=JOazsGt15N=v+Vuf`oj5ujl7Ty%Wgy10WX_JTceJ)Fl@|OI!!Z?YQVl*r#{o20dg)o}^FzpF)Tz)syca1c_F6~c2`Y+ew z?~VW}53zYKG)$DzB&vx%Z91^KXQW8|%D`g1*Z=p4s3x7jH#X{C?fz~hj@Ewqncsx_ zr_uc7Pi3Z;bVIy8c|CZ{u0%OKFMGzrFKIgZIrfi@OdOAY#M&YgDcc{bpJT$8;|BIu zhapA!)dy!Jfn@6Yt~-aLa*(qgR?R?O2dSuhY>mEOl#9ldE6PpZ`#-CY!9DtZykx)* z{>$|s9mXDGq=gaef>N>)y+QoVW|gl610txc0Ti8Jg@gfAdc9R?nBI03y|$Eu3lOw& zrOj$fMq9&yKQY$alX9!acEQ1Z$;?A!WHkx~5>8KRds zu_?tfP-HG@t7)0!_*JiucWvOG^-GJAS@Vfmhy1&P9s1Tl!D$cSx3UiLA{UWI?B0NH zT>!>pHRymh)R=;9c*?2=+BMK0@$E72xPzmV6Ic{tWBrdz@i{=#R`UCtpyiq!c*0-d z{s^l3T-+zUyC{UGpi8-(L7=bhz`Pu0u%5RSdE_KkWI4dQk{6EFf=}?}$Pyuy38P5Q z8(-Xg@+28p`>J64ItQTOFJ@!=3pnS;#P)LY*0hu}dd0_C3m&Taa*h}h@GJM*-0S)Y zRScH|;@8V}05xKf20|6n8hihRHXy)pLxR7^ckSip zBH~20=}4k8P=Lw#6mO10<>Y|DGRFO~u&cB{%todPrHQ;_QB^B`&ZF;VpqIvCgpzO8 z32})csg^Rtj-S6%>#TO~p5Ff#&gdnG!noiWg{6Uu+O3n&KHsmH2#& zDS4z_-=LmMjx77q4B;$P{=N9!bLC8mNFWVAKw1WPIc(((EOc;n-s5jC+<&lm<3^y* zAHVr?{s<+KKAzdRDVOiD!XwrKX5f`eK?w2d`X`kC$O3T;$nqY3C)1Vs@&moI=7j`x z?W~~lO`9KO&GYE!j;ztWf?H4)Dh&1AO>6^z=mTT+CygJ;l&luwIz#}DPhf+c9=Gnb z!bM0|gcL)Mw5n**ahb_eVJ}nf^O`zPqJ?| zqL_uEvqQWG=vIJI4R=R%g)jzzczK?mKmn1S5j}m;NXpIQG=C!MR{oyXSgF8QxmyQyQ6dM=2^p~;*?#fp+za0lSj zOxJajiu$7pB&>A({(8al*9tHE_2+`t^I@C1t-VD;H8hA1Hz&RB0NGwjbS%HSZj!7zZ~QrvjY{oaC8H-z7=cp2Mad3c=;|5IshC%jt1XSU|^bo5>u`ypzNzD z?#(AyW1mzkI=$Rijvurstu@GaDA1a($4!?5E8KQmXz^SIP-O80f7NW&DfA!|Nj{|{ ziwpMo;UEF`Jo0v{pO-GaU#4T!11{M8I=~-@=z0nyL$2;ryU65F?t@ba5Q*I}m@E(y zO8mmzslc5@P-YCG07Cuq^#&2h7yS|E5qXfQ{RpFKSiu$;1>4MJtyy0LTop8g6%rI) z7Ml_XCl0Y{_*;6rPQNY8YICBn|3Gl$R?U8a7Tj6^?^uxT&bG`yGnMfxGWMMh@004< zzB7QR-bA_+{BE9z9cUcSe>SMT?2~F)nEGuW!h*Xtm4JQkoHc^=-lTAHNH~g>7Z<)7 zrhr#3=rqUvRkl?FFvDE}AS0P(;tl$ik6tgh1$+cA9U)qr9|Ve{iY9M1wtY37>|H`qz_`dr z()bWTD>lcp{cQWTWX%ODE35U^Y_;;u^8857Z7R&XrX=R8gy|z-z`Z~C^I(5ObkfZ`dervcrM6&0_6gy#?I6!%^$ z-yBy42Q~p&Am6WMH;z9q9m*Z_)Oi*ldrw?s{_7`6r&(&}_T%rfjAZ&O&4`Z3EX8_V zc^Ikb4lY`8KKSP9!w(c^YUdoZe%#7&UH2>sabZisLY?Ka64j)~uL24F!*-B|UD31>U4`>eJQT3d z%hn$m7Rl!-7}d<0N4@~}=-s5Y+>?1=TZ8@ui&tH|+%nd6M`~k0R0n3X-Ixbj{Y=SE zM4Y)yVhZ$@L^A{cbL|1?AKwAWda*mIu@8kZCklc9qK-V?95_NE6p2tsec>o($8P#Q z*Zj)P#R2*0u>QjR0uM3#2u~u(Cg>yi$wS~F_W*_S0e~4 z#x%u^QG-B>H5enKnRxeQtivdC1n%czlP|*}A|_fgMqf70oQxxnFrM#CX{tvLp1U0sAjC`tp`GN{ava5rV2VOY->pt=hcXpCd^z!_Q|Ag5aTpc?vKI5IBDn@#i9A4oM$bQ@w$L+F99e#o9! zlxiuC&I8+OEQIO)?2eG6&gfE(pbt>;+H0Mj>)9!ibw_1-MR#v1iNMJ1{kq*+y+H+- zMSzIJ+|)z?CKh9h8VOxGqUWBkAO?+{*iUXscA1M7Lo?)pgW4k1Fd-{vk~+7=cWnWd zk_*U5KSGYXo>2n0E4|n<+K#Ie^lB-mkwxwKXF@ArY2%NyUXOSXCiRO#q7809EQocS zsfhjhlhu13Y$DkZad!Cg8Ng5z#oA2Cx>E57g-DuF9B18K%oRMi6uEi^34HrW#@F3! zq0bUy=YZN=0LBX;kod>~mKH=L%BDnobA*z67j_fuZ#R?P4~|%d`M;{B7r3oVr9sFI zdNBlNqZ_}jy)LrxV~>Pbt$cVx#y3vD%}YbY^=`IkYNCB$@uB&m5=>&KWmmlF$F7}S zrSC(3AhGSJS(|ZQ&@=}n!azF+l<_T}kW0i2pM(d?%b`}tB8s3cczRuUmFD^SbiTjrI(^Pf~5UIZMyI7rqdPbxYp^aSBdU<)dJLQ6s@z1*&_iMBJ z_Ggy@wyG{U8l>VcPpy%TA9=U9OTnknuvuyeAepgdLw#mZdbwPqEFY$RdriE-k*C`H zFSzji#lhB})aWFp{N?KfcUz_2U9|N#-=%|L$}sdEwQK;^wOP1glYjx_pSm=xbT*b5 z#{lc0rs+m4+DUDhGrjQ*CYuWS))hDmTR2oi*95QhMR|8R>w0e?;H7EVvtz;>Ys3G<*^iJR+zz^aGtA6vcb;*Zf@05UR%bs&CM^vLFRJQLP|Gj zNTi@pO3WvO&r1^%2a7sL(1c5xsxY!r63J-^v3FiN4M?Yf?2NII}Tp#9W!a zUbsGCyABx1{SvhhP6}P3u|vX6f=}_{Zo>g}5c#V*}zZCN8JJXcecG#gS||OA7;^DEWW^;e(}E z%eR4C=*(aic)GCNL7wN)ukiz$z|)mw(^P`L)RAf4=xpZ2&$Vqq$D zD#d^8&JD2nM#B!iv?sV!45{N?7!R;f@tL#_2{u$k<;YEe>g*C z$j6u@f9kY<+{`$geeeucQ@d7x+*SI!D zZm+ZNyTi{JWl--xR0o3Kk^ z5lJ<9pv|;!1+wc0#sXUf27M)c4}7;Fwkiza)dw<^|GtjvV$(MZfEPKfR6uLv&Y64H|*P!jo{p^y?8<{ zb~qT!ShrLug}PUK93?j<)YpW+@?r16oUo;7h15 z>8>_Di6(oG{YR@6bo_Kf=i!G2!Mj5FF)5lWEJcx*8N(e;&>vjz4q!GiV7@hA*)ZV! z1^NY!jg1XvlM}W2*lU_Wjs}M-%zx9(lb;p3BYE#py7~dccxD z5X5rO?Ol@&t+g0EyhqJpxa;u}f0vUwJEki8ZNRoE;T`s`_n&6pB4R>w%ceu2!v7?0 zwE)vRp^K4}4?Cz6y%2ek&-s?1b_MF*LeO!XExPf)P2wMqs;?17fEKR#>I-J zQv0S$S^WKe7Q~Il0f+1W_wSLpITJDg*Pmb0CQ9SuKRQ%HkcnGsk4L!K@yKGLLPCQz z3OCzTbL{ZzMWTJ;_cruM|K1qQmJIhUL{ia$k)-v{xp;_Pj1uKFKfPtiWx}|eVBc?P zX({|+c(1crg6l7RJ)tAu2IB6SJ!j5Rb_3065ci%O>Dza~8cJiddUy8w0maebWjPF1 zXnTy5cq?da;;Xhq6e7}+W?Z>FP;|J-9U`}+4?e=u=LVB)sDHNXleUf|^Zn}8L%(WD z8ZZ#s)u_5Jm;#Nr)eAV;P7lV_T!RFU=;m!wtv5g1f^;gBA`EQkStf^$+zDgPU(dD; zzl)!3_=EJ31;s}?YYx%&L#!StH4_Lg9wWkmWnvD86EV$-3`=E61*t^KDR0@eZyo&^ zb^KgF3woZOrf^p=qHQdNuKx)H7J~04N^+qPc*ErW!l5}t4vr-Z&BnX<)NlyC zjI!rd=$!1>pFE<(RjrLXXK98O=nivQ`L`b?@>((#`e(de&3Dkku`>lwhwRBt9-ja~+GVsGx98lsvg^5+=yXCr`imLx_(O>UFLOX>& z&V9h0?B7MZZjtd}NsRektNr^Te|`@H>+GE>>q-Cb(Twas@82TtzmIzy{HYI6G)EYi z0UfFi&;I+9JU#)?p%AOwPu%~lIv&}PvV1p&L2dg#tpSd<3IVE4aG$RB|FyD%^paq; WF*b{iSE%|H@KICNQmS}r75aZcGspJ; literal 0 HcmV?d00001 diff --git a/docs/assets/images/grafana-search.png b/docs/assets/images/grafana-search.png new file mode 100644 index 0000000000000000000000000000000000000000..e814962f8f1988fab5fdb6829987d47ae7924b48 GIT binary patch literal 59633 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
#4Gtw=jYaRSqDin^OlPW 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

2wXM9)*ICM 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¬>X*HV{GOHih(zvQ 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 literal 0 HcmV?d00001 diff --git a/docs/genestack-logging.md b/docs/genestack-logging.md new file mode 100644 index 00000000..a7a3bc85 --- /dev/null +++ b/docs/genestack-logging.md @@ -0,0 +1,72 @@ +#@ Genestack Logging + +[TOC] + +### Overview + +Genestack logging is a straight forward system that collects, stores and provides an interface to search and read logs on-demand. The storage backend is open to fit the needs of your deployment, so whether backing up to Openstack Swift, S3, Ceph, or file-share, Genestack logging can fit in your environment. + +Out of box Genestack logging is comprised of three separate technologies: + +- [Fluentbit](https://fluentbit.io/), a fast and lightweight telemetry agent for logs, metrics, and traces for Linux, macOS, Windows, and BSD family operating systems. Fluentbit grabs log entries immediately from your Kubernetes application and ships them to Loki for aggregation +- [Loki](https://github.com/grafana/loki), a log aggregation system for Kubernetes that stores logs in a time series database and is often used with Grafana to visualize them. +- [Grafana](https://grafana.com/), enables you to query, visualize, alert on, and explore your metrics, logs, and traces. + +These components are easily replaceable so that implementation in your existing environment is simple as possible. For example, Grafana needs not to be your dashboard if your environment you are licensed for Splunk. + +### Architecture + +![grafan architecture](assets/images/grafana-explore.png) + +### Configuration + +All configurations for Loki and FluentBit are in [genestack/base-helm-configs/loki](https://github.com/rackerlabs/genestack/tree/main/base-helm-configs/loki). Review the default deployment settings and overrides for your needs. + +### FluentBit, Loki, and Storage Operations + +Let's break down the process of how Fluent Bit, Kubernetes, Loki, and OpenStack Swift interact to efficiently collect and store application logs: + +1. Log Generation in Kubernetes: + + Kubernetes applications run within pods, which are the smallest deployable units of computing that contain one or more containers. Applications generate logs as part of their normal operation, recording events, errors, and other relevant information. + +2. Fluent Bit as the Log Collector: + + Fluent Bit is deployed as a **DaemonSet** in Kubernetes, ensuring it runs on every node of the cluster. It acts as a lightweight log collector, efficiently gathering logs from various sources, including application pods. It can parse and enrich logs with additional metadata, such as timestamps, hostnames, and Kubernetes labels. + +3. Sending Logs to Loki: + + Loki is configured as the output destination for Fluent Bit, which sends the collected and enriched logs to Loki which in turn indexes the logs, allowing for efficient querying and searching later. + +4. Loki's Role in Long-Term Storage: + + Loki can retain logs for a specified duration, depending on your configuration. Loki chunks the application logs it has received into large objects which are then sent via HTTP/HTTPS calls to Openstack Swift to reduce long-term storage costs and maintain historical data. + +5. OpenStack Swift as Object Storage: + + OpenStack Swift, or other S3-Compatible storage solutions such Ceph, provides object storage leveraging Swift's durability and scalability to store archived logs for extended periods. + +### Key Benefits of This Architecture: + +- Efficient Log Collection: Fluent Bit's lightweight design and efficient data transfer mechanisms ensure timely log collection. +- Scalable Log Aggregation: Loki's distributed architecture can handle large volumes of logs and scale horizontally to meet increasing demands. +- Flexible Log Retention: Loki's ability to archive logs to object storage provides a cost-effective solution for long-term retention. +- Powerful Log Querying: Loki's query language allows for complex log analysis and troubleshooting. +- Secure and Reliable Storage: OpenStack Swift offers durable and secure object storage for critical log data. + +### Accessing Log Information through Grafana + +The logs that Loki stores for us can be searched and read though Grafana. From the left-side menu bars, select 'Explore' to enter queries in Grafana. + +Start by selecting from the '**Label Filter**' drop-down for the application area of logs you want to search from. These are keyed on labels determined in the Kubernetes deployment. For example, the 'application' choice will allow you to choose all Openstack services by name (nova, cinder, etc ). All label filters are defined in base-helm-configs and can be referenced there. Only one selection is allowed per exporession, so you will need to select press the **+** to add more selections for refined searches. Then you enter the text you are searching for with its search qualifier ( line contains, line does not continue, etc). The example here shows searching for a server UUID in Nova: + +![grafana search](assets/images/grafana-search.png) + + Label matching operators are as follows: + +- `=`: exactly equal +- `!=`: not equal +- `=~`: regex matches +- `!~`: regex does not match + +Extensive documentation for query is available in the [Grafana](https://grafana.com/docs/loki/latest/query/) pages. diff --git a/mkdocs.yml b/mkdocs.yml index 325c130d..bb1a08d2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -233,6 +233,7 @@ nav: - Gnocchi: metering-gnocchi.md - Billing Tenants: metering-billing.md - Chargebacks: metering-chargebacks.md + - Logging Overview: genestack-logging.md - Infrastructure: - Etcd Backup: etcd-backup.md - OVN introduction: ovn-intro.md From a8879c51d24d57d7cc7d2843abb7dc68a72653b8 Mon Sep 17 00:00:00 2001 From: Jake Briggs Date: Wed, 13 Nov 2024 16:48:08 -0600 Subject: [PATCH 8/8] Update-repo (#560) Update repo to point to rackspace public repo --- .../barbican/barbican-helm-overrides.yaml | 24 ++++----- .../ceilometer/ceilometer-helm-overrides.yaml | 22 ++++---- .../cinder/cinder-helm-overrides.yaml | 36 ++++++------- .../designate/designate-helm-overrides.yaml | 32 ++++++------ .../glance/glance-helm-overrides.yaml | 28 +++++----- .../gnocchi/gnocchi-helm-overrides.yaml | 26 +++++----- .../heat/heat-helm-overrides.yaml | 34 ++++++------ .../horizon/horizon-helm-overrides.yaml | 14 ++--- .../keystone/keystone-helm-overrides.yaml | 34 ++++++------ .../magnum/magnum-helm-overrides.yaml | 24 ++++----- .../neutron/neutron-helm-overrides.yaml | 48 ++++++++--------- .../nova/nova-helm-overrides.yaml | 52 +++++++++---------- .../octavia/octavia-helm-overrides.yaml | 32 ++++++------ .../placement/placement-helm-overrides.yaml | 18 +++---- 14 files changed, 212 insertions(+), 212 deletions(-) diff --git a/base-helm-configs/barbican/barbican-helm-overrides.yaml b/base-helm-configs/barbican/barbican-helm-overrides.yaml index c618a175..65f96221 100644 --- a/base-helm-configs/barbican/barbican-helm-overrides.yaml +++ b/base-helm-configs/barbican/barbican-helm-overrides.yaml @@ -35,18 +35,18 @@ helm3_hook: true images: tags: - bootstrap: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - scripted_test: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - db_init: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - barbican_db_sync: docker.io/openstackhelm/barbican:2024.1-ubuntu_jammy - db_drop: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - ks_user: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - ks_service: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - ks_endpoints: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - barbican_api: docker.io/openstackhelm/barbican:2024.1-ubuntu_jammy - rabbit_init: docker.io/rabbitmq:3.13-management - image_repo_sync: docker.io/docker:17.07.0 + bootstrap: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + scripted_test: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + barbican_db_sync: "quay.io/rackspace/rackerlabs-barbican:2024.1-ubuntu_jammy" + db_drop: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + barbican_api: "quay.io/rackspace/rackerlabs-barbican:2024.1-ubuntu_jammy" + rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" pull_policy: "IfNotPresent" local_registry: active: false diff --git a/base-helm-configs/ceilometer/ceilometer-helm-overrides.yaml b/base-helm-configs/ceilometer/ceilometer-helm-overrides.yaml index 2d5f1302..252831c7 100644 --- a/base-helm-configs/ceilometer/ceilometer-helm-overrides.yaml +++ b/base-helm-configs/ceilometer/ceilometer-helm-overrides.yaml @@ -23,17 +23,17 @@ labels: images: tags: - test: docker.io/xrally/xrally-openstack:2.0.0 - ceilometer_db_sync: ghcr.io/rackerlabs/genestack/ceilometer:2024.1-ubuntu_jammy - rabbit_init: docker.io/rabbitmq:3.7-management - ks_user: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - ks_service: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - ceilometer_central: ghcr.io/rackerlabs/genestack/ceilometer:2024.1-ubuntu_jammy - ceilometer_compute: ghcr.io/rackerlabs/genestack/ceilometer:2024.1-ubuntu_jammy - ceilometer_ipmi: ghcr.io/rackerlabs/genestack/ceilometer:2024.1-ubuntu_jammy - ceilometer_notification: ghcr.io/rackerlabs/genestack/ceilometer:2024.1-ubuntu_jammy - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - image_repo_sync: docker.io/docker:17.07.0 + test: "quay.io/rackspace/rackerlabs-xrally-openstack:2.0.0" + ceilometer_db_sync: "quay.io/rackspace/rackerlabs-ceilometer:2024.1-ubuntu_jammy" + rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ceilometer_central: "quay.io/rackspace/rackerlabs-ceilometer:2024.1-ubuntu_jammy" + ceilometer_compute: "quay.io/rackspace/rackerlabs-ceilometer:2024.1-ubuntu_jammy" + ceilometer_ipmi: "quay.io/rackspace/rackerlabs-ceilometer:2024.1-ubuntu_jammy" + ceilometer_notification: "quay.io/rackspace/rackerlabs-ceilometer:2024.1-ubuntu_jammy" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" pull_policy: "Always" local_registry: active: false diff --git a/base-helm-configs/cinder/cinder-helm-overrides.yaml b/base-helm-configs/cinder/cinder-helm-overrides.yaml index b64959d7..bda3dd10 100644 --- a/base-helm-configs/cinder/cinder-helm-overrides.yaml +++ b/base-helm-configs/cinder/cinder-helm-overrides.yaml @@ -25,24 +25,24 @@ release_group: null images: tags: - db_init: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - cinder_db_sync: "docker.io/openstackhelm/cinder:2024.1-ubuntu_jammy" - db_drop: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_user: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_service: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_endpoints: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - cinder_api: "docker.io/openstackhelm/cinder:2024.1-ubuntu_jammy" - bootstrap: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - cinder_scheduler: "docker.io/openstackhelm/cinder:2024.1-ubuntu_jammy" - cinder_volume: "docker.io/openstackhelm/cinder:2024.1-ubuntu_jammy" - cinder_volume_usage_audit: "docker.io/openstackhelm/cinder:2024.1-ubuntu_jammy" - cinder_storage_init: "docker.io/openstackhelm/ceph-config-helper:latest-ubuntu_focal" - cinder_backup: "docker.io/openstackhelm/cinder:2024.1-ubuntu_jammy" - cinder_backup_storage_init: "docker.io/openstackhelm/ceph-config-helper:latest-ubuntu_focal" - test: docker.io/xrally/xrally-openstack:2.0.0 - rabbit_init: docker.io/rabbitmq:3.7-management - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - image_repo_sync: docker.io/docker:17.07.0 + db_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + cinder_db_sync: "quay.io/rackspace/rackerlabs-cinder:2024.1-ubuntu_jammy" + db_drop: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + cinder_api: "quay.io/rackspace/rackerlabs-cinder:2024.1-ubuntu_jammy" + bootstrap: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + cinder_scheduler: "quay.io/rackspace/rackerlabs-cinder:2024.1-ubuntu_jammy" + cinder_volume: "quay.io/rackspace/rackerlabs-cinder:2024.1-ubuntu_jammy" + cinder_volume_usage_audit: "quay.io/rackspace/rackerlabs-cinder:2024.1-ubuntu_jammy" + cinder_storage_init: "quay.io/rackspace/rackerlabs-ceph-config-helper:latest-ubuntu_jammy" + cinder_backup: "quay.io/rackspace/rackerlabs-cinder:2024.1-ubuntu_jammy" + cinder_backup_storage_init: "quay.io/rackspace/rackerlabs-ceph-config-helper:latest-ubuntu_jammy" + test: "quay.io/rackspace/rackerlabs-xrally-openstack:2.0.0" + rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" pull_policy: "IfNotPresent" local_registry: active: false diff --git a/base-helm-configs/designate/designate-helm-overrides.yaml b/base-helm-configs/designate/designate-helm-overrides.yaml index 65f6d63e..52ca1c50 100644 --- a/base-helm-configs/designate/designate-helm-overrides.yaml +++ b/base-helm-configs/designate/designate-helm-overrides.yaml @@ -43,22 +43,22 @@ labels: images: tags: - bootstrap: docker.io/openstackhelm/heat:2023.1-ubuntu_jammy - db_init: docker.io/openstackhelm/heat:2023.1-ubuntu_jammy - db_drop: docker.io/openstackhelm/heat:2023.1-ubuntu_jammy - rabbit_init: docker.io/rabbitmq:3.7-management - ks_user: docker.io/openstackhelm/heat:2023.1-ubuntu_jammy - ks_service: docker.io/openstackhelm/heat:2023.1-ubuntu_jammy - ks_endpoints: docker.io/openstackhelm/heat:2023.1-ubuntu_jammy - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - designate_db_sync: docker.io/openstackhelm/designate:2024.1-ubuntu_jammy - designate_api: docker.io/openstackhelm/designate:2024.1-ubuntu_jammy - designate_central: docker.io/openstackhelm/designate:2024.1-ubuntu_jammy - designate_mdns: docker.io/openstackhelm/designate:2024.1-ubuntu_jammy - designate_worker: docker.io/openstackhelm/designate:2024.1-ubuntu_jammy - designate_producer: docker.io/openstackhelm/designate:2024.1-ubuntu_jammy - designate_sink: docker.io/openstackhelm/designate:2024.1-ubuntu_jammy - image_repo_sync: docker.io/docker:17.07.0 + bootstrap: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_drop: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + designate_db_sync: "quay.io/rackspace/rackerlabs-designate:2024.1-ubuntu_jammy" + designate_api: "quay.io/rackspace/rackerlabs-designate:2024.1-ubuntu_jammy" + designate_central: "quay.io/rackspace/rackerlabs-designate:2024.1-ubuntu_jammy" + designate_mdns: "quay.io/rackspace/rackerlabs-designate:2024.1-ubuntu_jammy" + designate_worker: "quay.io/rackspace/rackerlabs-designate:2024.1-ubuntu_jammy" + designate_producer: "quay.io/rackspace/rackerlabs-designate:2024.1-ubuntu_jammy" + designate_sink: "quay.io/rackspace/rackerlabs-designate:2024.1-ubuntu_jammy" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" pull_policy: "IfNotPresent" local_registry: active: false diff --git a/base-helm-configs/glance/glance-helm-overrides.yaml b/base-helm-configs/glance/glance-helm-overrides.yaml index 27508e9c..23c684b8 100644 --- a/base-helm-configs/glance/glance-helm-overrides.yaml +++ b/base-helm-configs/glance/glance-helm-overrides.yaml @@ -16,21 +16,21 @@ release_group: null images: tags: - test: docker.io/xrally/xrally-openstack:2.0.0 - glance_storage_init: docker.io/openstackhelm/ceph-config-helper:latest-ubuntu_xenial - glance_metadefs_load: "docker.io/openstackhelm/glance:2024.1-ubuntu_jammy" - db_init: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - glance_db_sync: "docker.io/openstackhelm/glance:2024.1-ubuntu_jammy" - db_drop: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_user: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_service: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_endpoints: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - rabbit_init: docker.io/rabbitmq:3.7-management - glance_api: "docker.io/openstackhelm/glance:2024.1-ubuntu_jammy" + test: "quay.io/rackspace/rackerlabs-xrally-openstack:2.0.0" + glance_storage_init: "quay.io/rackspace/rackerlabs-ceph-config-helper:latest-ubuntu_jammy" + glance_metadefs_load: "quay.io/rackspace/rackerlabs-glance:2024.1-ubuntu_jammy" + db_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + glance_db_sync: "quay.io/rackspace/rackerlabs-glance:2024.1-ubuntu_jammy" + db_drop: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" + glance_api: "quay.io/rackspace/rackerlabs-glance:2024.1-ubuntu_jammy" # Bootstrap image requires curl - bootstrap: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - image_repo_sync: docker.io/docker:17.07.0 + bootstrap: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" pull_policy: "IfNotPresent" local_registry: active: false diff --git a/base-helm-configs/gnocchi/gnocchi-helm-overrides.yaml b/base-helm-configs/gnocchi/gnocchi-helm-overrides.yaml index a9a09c11..16086cf0 100644 --- a/base-helm-configs/gnocchi/gnocchi-helm-overrides.yaml +++ b/base-helm-configs/gnocchi/gnocchi-helm-overrides.yaml @@ -36,19 +36,19 @@ release_group: null images: tags: - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - gnocchi_storage_init: docker.io/openstackhelm/ceph-config-helper:latest-ubuntu_focal - db_init_indexer: docker.io/library/postgres:14.5 - db_init: ghcr.io/rackerlabs/genestack/gnocchi:2024.1-ubuntu_jammy - db_sync: ghcr.io/rackerlabs/genestack/gnocchi:2024.1-ubuntu_jammy - ks_user: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - ks_service: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - ks_endpoints: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - gnocchi_api: ghcr.io/rackerlabs/genestack/gnocchi:2024.1-ubuntu_jammy - gnocchi_statsd: ghcr.io/rackerlabs/genestack/gnocchi:2024.1-ubuntu_jammy - gnocchi_metricd: ghcr.io/rackerlabs/genestack/gnocchi:2024.1-ubuntu_jammy - gnocchi_resources_cleaner: ghcr.io/rackerlabs/genestack/gnocchi:2024.1-ubuntu_jammy - image_repo_sync: docker.io/library/docker:17.07.0 + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + gnocchi_storage_init: "quay.io/rackspace/rackerlabs-ceph-config-helper:latest-ubuntu_jammy" + db_init_indexer: "quay.io/rackspace/rackerlabs-postgres:14.5" + db_init: "quay.io/rackspace/rackerlabs-gnocchi:2024.1-ubuntu_jammy" + db_sync: "quay.io/rackspace/rackerlabs-gnocchi:2024.1-ubuntu_jammy" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + gnocchi_api: "quay.io/rackspace/rackerlabs-gnocchi:2024.1-ubuntu_jammy" + gnocchi_statsd: "quay.io/rackspace/rackerlabs-gnocchi:2024.1-ubuntu_jammy" + gnocchi_metricd: "quay.io/rackspace/rackerlabs-gnocchi:2024.1-ubuntu_jammy" + gnocchi_resources_cleaner: "quay.io/rackspace/rackerlabs-gnocchi:2024.1-ubuntu_jammy" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" pull_policy: "Always" local_registry: active: false diff --git a/base-helm-configs/heat/heat-helm-overrides.yaml b/base-helm-configs/heat/heat-helm-overrides.yaml index ed234e1c..9439c180 100644 --- a/base-helm-configs/heat/heat-helm-overrides.yaml +++ b/base-helm-configs/heat/heat-helm-overrides.yaml @@ -23,23 +23,23 @@ labels: images: tags: - bootstrap: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_init: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_drop: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_user: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_service: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_endpoints: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - heat_db_sync: "ghcr.io/rackerlabs/genestack/heat-rxt:2024.1-ubuntu_jammy" - heat_api: "ghcr.io/rackerlabs/genestack/heat-rxt:2024.1-ubuntu_jammy" - heat_cfn: "ghcr.io/rackerlabs/genestack/heat-rxt:2024.1-ubuntu_jammy" - heat_cloudwatch: "ghcr.io/rackerlabs/genestack/heat-rxt:2024.1-ubuntu_jammy" - heat_engine: "ghcr.io/rackerlabs/genestack/heat-rxt:2024.1-ubuntu_jammy" - heat_engine_cleaner: "ghcr.io/rackerlabs/genestack/heat-rxt:2024.1-ubuntu_jammy" - heat_purge_deleted: "ghcr.io/rackerlabs/genestack/heat-rxt:2024.1-ubuntu_jammy" - test: docker.io/xrally/xrally-openstack:2.0.0 - rabbit_init: docker.io/rabbitmq:3.7-management - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - image_repo_sync: docker.io/docker:17.07.0 + bootstrap: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_drop: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + heat_db_sync: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + heat_api: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + heat_cfn: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + heat_cloudwatch: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + heat_engine: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + heat_engine_cleaner: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + heat_purge_deleted: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + test: "quay.io/rackspace/rackerlabs-xrally-openstack:2.0.0" + rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" pull_policy: "IfNotPresent" local_registry: active: false diff --git a/base-helm-configs/horizon/horizon-helm-overrides.yaml b/base-helm-configs/horizon/horizon-helm-overrides.yaml index 09a13807..b69256eb 100644 --- a/base-helm-configs/horizon/horizon-helm-overrides.yaml +++ b/base-helm-configs/horizon/horizon-helm-overrides.yaml @@ -18,13 +18,13 @@ --- images: tags: - db_init: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - db_drop: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - horizon_db_sync: docker.io/openstackhelm/horizon:2023.1-ubuntu_jammy - horizon: docker.io/openstackhelm/horizon:2023.1-ubuntu_jammy - test: docker.io/openstackhelm/osh-selenium:latest-ubuntu_focal - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - image_repo_sync: docker.io/docker:17.07.0 + db_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_drop: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + horizon_db_sync: "quay.io/rackspace/rackerlabs-horizon:2024.1-ubuntu_jammy" + horizon: "quay.io/rackspace/rackerlabs-horizon:2024.1-ubuntu_jammy" + test: "quay.io/rackspace/rackerlabs-osh-selenium:latest-ubuntu_jammy" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" pull_policy: "IfNotPresent" local_registry: active: false diff --git a/base-helm-configs/keystone/keystone-helm-overrides.yaml b/base-helm-configs/keystone/keystone-helm-overrides.yaml index 716d145f..214ba982 100644 --- a/base-helm-configs/keystone/keystone-helm-overrides.yaml +++ b/base-helm-configs/keystone/keystone-helm-overrides.yaml @@ -18,23 +18,23 @@ helm3_hook: true images: tags: - bootstrap: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_init: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_drop: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - keystone_api: "ghcr.io/rackerlabs/keystone-rxt:2024.1-ubuntu_jammy-1720466623" - keystone_bootstrap: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - keystone_credential_rotate: "ghcr.io/rackerlabs/keystone-rxt:2024.1-ubuntu_jammy-1720466623" - keystone_credential_setup: "ghcr.io/rackerlabs/keystone-rxt:2024.1-ubuntu_jammy-1720466623" - keystone_db_sync: "ghcr.io/rackerlabs/keystone-rxt:2024.1-ubuntu_jammy-1720466623" - keystone_domain_manage: "ghcr.io/rackerlabs/keystone-rxt:2024.1-ubuntu_jammy-1720466623" - keystone_fernet_rotate: "ghcr.io/rackerlabs/keystone-rxt:2024.1-ubuntu_jammy-1720466623" - keystone_fernet_setup: "ghcr.io/rackerlabs/keystone-rxt:2024.1-ubuntu_jammy-1720466623" - ks_user: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - test: docker.io/xrally/xrally-openstack:2.0.0 - rabbit_init: docker.io/rabbitmq:3.7-management - keystone_credential_cleanup: "docker.io/aedan/heat:2024.1-ubuntu_jammy" - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - image_repo_sync: docker.io/docker:17.07.0 + bootstrap: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_drop: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + keystone_api: "quay.io/rackspace/rackerlabs-keystone-rxt:2024.1-ubuntu_jammy-1720466623" + keystone_bootstrap: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + keystone_credential_rotate: "quay.io/rackspace/rackerlabs-keystone-rxt:2024.1-ubuntu_jammy-1720466623" + keystone_credential_setup: "quay.io/rackspace/rackerlabs-keystone-rxt:2024.1-ubuntu_jammy-1720466623" + keystone_db_sync: "quay.io/rackspace/rackerlabs-keystone-rxt:2024.1-ubuntu_jammy-1720466623" + keystone_domain_manage: "quay.io/rackspace/rackerlabs-keystone-rxt:2024.1-ubuntu_jammy-1720466623" + keystone_fernet_rotate: "quay.io/rackspace/rackerlabs-keystone-rxt:2024.1-ubuntu_jammy-1720466623" + keystone_fernet_setup: "quay.io/rackspace/rackerlabs-keystone-rxt:2024.1-ubuntu_jammy-1720466623" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + test: "quay.io/rackspace/rackerlabs-xrally-openstack:2.0.0" + rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" + keystone_credential_cleanup: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" pull_policy: "IfNotPresent" local_registry: active: false diff --git a/base-helm-configs/magnum/magnum-helm-overrides.yaml b/base-helm-configs/magnum/magnum-helm-overrides.yaml index 2636484c..d027f31d 100644 --- a/base-helm-configs/magnum/magnum-helm-overrides.yaml +++ b/base-helm-configs/magnum/magnum-helm-overrides.yaml @@ -31,18 +31,18 @@ labels: images: tags: - bootstrap: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - db_init: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - magnum_db_sync: docker.io/openstackhelm/magnum:2024.1-ubuntu_jammy - db_drop: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - rabbit_init: docker.io/rabbitmq:3.13-management - ks_user: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - ks_service: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - ks_endpoints: docker.io/openstackhelm/heat:2024.1-ubuntu_jammy - magnum_api: docker.io/openstackhelm/magnum:2024.1-ubuntu_jammy - magnum_conductor: docker.io/openstackhelm/magnum:2024.1-ubuntu_jammy - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - image_repo_sync: docker.io/docker:17.07.0 + bootstrap: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_init: "qyay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + magnum_db_sync: "quay.io/rackspace/rackerlabs-magnum:2024.1-ubuntu_jammy" + db_drop: "qyay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + magnum_api: "quay.io/rackspace/rackerlabs-magnum:2024.1-ubuntu_jammy" + magnum_conductor: "quay.io/rackspace/rackerlabs-magnum:2024.1-ubuntu_jammy" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" pull_policy: "IfNotPresent" local_registry: active: false diff --git a/base-helm-configs/neutron/neutron-helm-overrides.yaml b/base-helm-configs/neutron/neutron-helm-overrides.yaml index f0225811..f06df466 100644 --- a/base-helm-configs/neutron/neutron-helm-overrides.yaml +++ b/base-helm-configs/neutron/neutron-helm-overrides.yaml @@ -2,34 +2,34 @@ release_group: null images: tags: - bootstrap: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_init: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_drop: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_user: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_service: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_endpoints: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - neutron_db_sync: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - neutron_dhcp: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - neutron_l3: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - neutron_l2gw: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - neutron_linuxbridge_agent: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - neutron_metadata: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - neutron_ovn_metadata: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - neutron_openvswitch_agent: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - neutron_server: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - neutron_rpc_server: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - neutron_bagpipe_bgp: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - neutron_netns_cleanup_cron: "docker.io/openstackhelm/neutron:2024.1-ubuntu_jammy" - test: docker.io/xrally/xrally-openstack:2.0.0 - purge_test: docker.io/openstackhelm/ospurge:latest - rabbit_init: docker.io/rabbitmq:3.7-management - netoffload: ghcr.io/vexxhost/netoffload:v1.0.1 + bootstrap: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_drop: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + neutron_db_sync: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + neutron_dhcp: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + neutron_l3: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + neutron_l2gw: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + neutron_linuxbridge_agent: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + neutron_metadata: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + neutron_ovn_metadata: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + neutron_openvswitch_agent: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + neutron_server: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + neutron_rpc_server: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + neutron_bagpipe_bgp: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + neutron_netns_cleanup_cron: "quay.io/rackspace/rackerlabs-neutron:2024.1-ubuntu_jammy" + test: "quay.io/rackspace/rackerlabs-xrally-openstack:2.0.0" + purge_test: "quay.io/rackspace/rackerlabs-ospurge:latest" + rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" + netoffload: "quay.io/rackspace/rackerlabs-netoffload:v1.0.1" neutron_sriov_agent: docker.io/openstackhelm/neutron:stein-18.04-sriov neutron_sriov_agent_init: docker.io/openstackhelm/neutron:stein-18.04-sriov neutron_bgp_dragent: docker.io/openstackhelm/neutron:stein-ubuntu_bionic neutron_ironic_agent: docker.io/openstackhelm/neutron:stein-ubuntu_bionic - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - image_repo_sync: docker.io/docker:17.07.0 + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" pull_policy: "IfNotPresent" local_registry: active: false diff --git a/base-helm-configs/nova/nova-helm-overrides.yaml b/base-helm-configs/nova/nova-helm-overrides.yaml index f6ef793f..2ff58a1d 100644 --- a/base-helm-configs/nova/nova-helm-overrides.yaml +++ b/base-helm-configs/nova/nova-helm-overrides.yaml @@ -52,33 +52,33 @@ labels: images: pull_policy: IfNotPresent tags: - bootstrap: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_drop: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_init: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_user: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_service: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_endpoints: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - nova_api: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" - nova_cell_setup: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" - nova_cell_setup_init: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - nova_compute: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" - nova_compute_ssh: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" - nova_conductor: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" - nova_db_sync: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" - nova_novncproxy: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" - nova_novncproxy_assets: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" - nova_scheduler: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" - nova_spiceproxy: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" - nova_spiceproxy_assets: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" - nova_service_cleaner: "docker.io/openstackhelm/ceph-config-helper:latest-ubuntu_focal" - dep_check: 'quay.io/airshipit/kubernetes-entrypoint:v1.0.0' - rabbit_init: docker.io/rabbitmq:3.7-management - nova_archive_deleted_rows: "ghcr.io/rackerlabs/genestack/nova-efi:2024.1-ubuntu_jammy" + bootstrap: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_drop: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + nova_api: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" + nova_cell_setup: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" + nova_cell_setup_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + nova_compute: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" + nova_compute_ssh: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" + nova_conductor: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" + nova_db_sync: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" + nova_novncproxy: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" + nova_novncproxy_assets: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" + nova_scheduler: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" + nova_spiceproxy: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" + nova_spiceproxy_assets: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" + nova_service_cleaner: "quay.io/rackspace/rackerlabs-ceph-config-helper:latest-ubuntu_jammy" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" + nova_archive_deleted_rows: "quay.io/rackspace/rackerlabs-nova-efi:2024.1-ubuntu_jammy" nova_compute_ironic: 'docker.io/kolla/ubuntu-source-nova-compute-ironic:wallaby' - nova_storage_init: 'docker.io/openstackhelm/ceph-config-helper:latest-ubuntu_focal' - test: docker.io/xrally/xrally-openstack:2.0.0 - image_repo_sync: docker.io/docker:17.07.0 - nova_wait_for_computes_init: gcr.io/google_containers/hyperkube-amd64:v1.11.6 + nova_storage_init: "quay.io/rackspace/rackerlabs-ceph-config-helper:latest-ubuntu_jammy" + test: "quay.io/rackspace/rackerlabs-xrally-openstack:2.0.0" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" + nova_wait_for_computes_init: "quay.io/rackspace/rackerlabs-hyperkube-amd64:v1.11.6" local_registry: active: false exclude: diff --git a/base-helm-configs/octavia/octavia-helm-overrides.yaml b/base-helm-configs/octavia/octavia-helm-overrides.yaml index 6db7c8a7..9a1b98b8 100644 --- a/base-helm-configs/octavia/octavia-helm-overrides.yaml +++ b/base-helm-configs/octavia/octavia-helm-overrides.yaml @@ -20,22 +20,22 @@ labels: images: tags: - test: docker.io/xrally/xrally-openstack:2.0.0 - bootstrap: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_init: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_drop: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - rabbit_init: docker.io/rabbitmq:3.7-management - ks_user: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_service: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_endpoints: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - dep_check: quay.io/airshipit/kubernetes-entrypoint:v1.0.0 - image_repo_sync: docker.io/docker:17.07.0 - octavia_db_sync: ghcr.io/rackerlabs/genestack/octavia-ovn:master-ubuntu_jammy - octavia_api: ghcr.io/rackerlabs/genestack/octavia-ovn:master-ubuntu_jammy - octavia_worker: ghcr.io/rackerlabs/genestack/octavia-ovn:master-ubuntu_jammy - octavia_housekeeping: ghcr.io/rackerlabs/genestack/octavia-ovn:master-ubuntu_jammy - octavia_health_manager: ghcr.io/rackerlabs/genestack/octavia-ovn:master-ubuntu_jammy - octavia_health_manager_init: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" + test: "quay.io/rackspace/rackerlabs-xrally-openstack:2.0.0" + bootstrap: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" + db_init: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" + db_drop: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" + rabbit_init: "quay.io/rackspace/rackerlabs-rabbitmq:3.13-management" + ks_user: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" + octavia_db_sync: "quay.io/rackspace/rackerlabs-octavia-ovn:master-ubuntu_jammy" + octavia_api: "quay.io/rackspace/rackerlabs-octavia-ovn:master-ubuntu_jammy" + octavia_worker: "quay.io/rackspace/rackerlabs-octavia-ovn:master-ubuntu_jammy" + octavia_housekeeping: "quay.io/rackspace/rackerlabs-octavia-ovn:master-ubuntu_jammy" + octavia_health_manager: "quay.io/rackspace/rackerlabs-octavia-ovn:master-ubuntu_jammy" + octavia_health_manager_init: "quay.rackspace.com/rackerlabs-heat:2024.1-ubuntu_jammy" openvswitch_vswitchd: docker.io/kolla/centos-source-openvswitch-vswitchd:rocky pull_policy: "IfNotPresent" local_registry: diff --git a/base-helm-configs/placement/placement-helm-overrides.yaml b/base-helm-configs/placement/placement-helm-overrides.yaml index a1bf1cc6..a77a6ad5 100644 --- a/base-helm-configs/placement/placement-helm-overrides.yaml +++ b/base-helm-configs/placement/placement-helm-overrides.yaml @@ -11,15 +11,15 @@ labels: images: pull_policy: IfNotPresent tags: - placement: "docker.io/openstackhelm/placement:2024.1-ubuntu_jammy" - ks_user: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_service: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - ks_endpoints: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_init: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - db_drop: "docker.io/openstackhelm/heat:2024.1-ubuntu_jammy" - placement_db_sync: "docker.io/openstackhelm/placement:2024.1-ubuntu_jammy" - dep_check: "quay.io/airshipit/kubernetes-entrypoint:v1.0.0" - image_repo_sync: "docker.io/docker:17.07.0" + placement: "quay.io/rackspace/rackerlabs-placement:2024.1-ubuntu_jammy" + ks_user: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_service: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + ks_endpoints: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_init: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + db_drop: "quay.io/rackspace/rackerlabs-heat:2024.1-ubuntu_jammy" + placement_db_sync: "quay.io/rackspace/rackerlabs-placement:2024.1-ubuntu_jammy" + dep_check: "quay.io/rackspace/rackerlabs-kubernetes-entrypoint:v1.0.0" + image_repo_sync: "quay.io/rackspace/rackerlabs-docker:17.07.0" local_registry: active: false exclude: