From e98b3965d8200e09321380fd19882f9e9eeb10db Mon Sep 17 00:00:00 2001 From: Ronan Hennessy Date: Wed, 24 Apr 2024 11:33:15 +0100 Subject: [PATCH] TELCODOCS-1887: Adding section for IBI workflow --- _topic_maps/_topic_map.yml | 15 +- ...ibi-understanding-image-based-install.adoc | 71 ---- .../_attributes | 0 .../ibi-factory-image-based-install.adoc | 14 +- ...ibi-preparing-for-image-based-install.adoc | 11 +- ...ibi-understanding-image-based-install.adoc | 131 ++++++++ .../ibi_deploying_sno_clusters/_attributes | 1 + ...i-edge-image-based-install-standalone.adoc | 7 +- .../ibi-edge-image-based-install.adoc | 61 ++++ .../ibi_deploying_sno_clusters/images | 1 + .../ibi_deploying_sno_clusters/modules | 1 + .../ibi_deploying_sno_clusters/snippets | 1 + .../images | 0 .../modules | 0 .../snippets | 0 ...Shift_IBI_Installation_high-level_0624.png | Bin 0 -> 109731 bytes ...age-based-upgrade-generate-seed-image.adoc | 7 +- ...image-based-upgrade-seed-image-config.adoc | 24 +- modules/ibi-create-config-iso.adoc | 314 ++++++++++++++++++ modules/ibi-create-iso-for-bmh.adoc | 2 +- modules/ibi-create-standalone-config-iso.adoc | 8 +- modules/ibi-extra-manifests-configmap.adoc | 144 ++++++++ ...ibi-image-based-install-cluster-guide.adoc | 9 +- .../ibi-image-cluster-install-api-spec.adoc | 62 ++++ modules/ibi-install-ibi-operator.adoc | 45 +++ .../ibi-managed-cluster-config-resources.adoc | 47 +++ modules/ibi-validated-software-versions.adoc | 3 + release_notes/ocp-4-17-release-notes.adoc | 2 +- 28 files changed, 876 insertions(+), 105 deletions(-) delete mode 100644 edge_computing/image-base-install/ibi-understanding-image-based-install.adoc rename edge_computing/{image-base-install => image_base_install}/_attributes (100%) rename edge_computing/{image-base-install => image_base_install}/ibi-factory-image-based-install.adoc (70%) rename edge_computing/{image-base-install => image_base_install}/ibi-preparing-for-image-based-install.adoc (71%) create mode 100644 edge_computing/image_base_install/ibi-understanding-image-based-install.adoc create mode 120000 edge_computing/image_base_install/ibi_deploying_sno_clusters/_attributes rename edge_computing/{image-base-install => image_base_install/ibi_deploying_sno_clusters}/ibi-edge-image-based-install-standalone.adoc (63%) create mode 100644 edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install.adoc create mode 120000 edge_computing/image_base_install/ibi_deploying_sno_clusters/images create mode 120000 edge_computing/image_base_install/ibi_deploying_sno_clusters/modules create mode 120000 edge_computing/image_base_install/ibi_deploying_sno_clusters/snippets rename edge_computing/{image-base-install => image_base_install}/images (100%) rename edge_computing/{image-base-install => image_base_install}/modules (100%) rename edge_computing/{image-base-install => image_base_install}/snippets (100%) create mode 100644 images/711_OpenShift_IBI_Installation_high-level_0624.png create mode 100644 modules/ibi-create-config-iso.adoc create mode 100644 modules/ibi-extra-manifests-configmap.adoc create mode 100644 modules/ibi-image-cluster-install-api-spec.adoc create mode 100644 modules/ibi-install-ibi-operator.adoc create mode 100644 modules/ibi-managed-cluster-config-resources.adoc diff --git a/_topic_maps/_topic_map.yml b/_topic_maps/_topic_map.yml index d4dafc1f2f..38aa122132 100644 --- a/_topic_maps/_topic_map.yml +++ b/_topic_maps/_topic_map.yml @@ -3339,16 +3339,23 @@ Topics: - Name: Performing an image-based upgrade for single-node OpenShift clusters using GitOps ZTP File: ztp-image-based-upgrade - Name: Image-based installation for single-node OpenShift - Dir: image-base-install + Dir: image_base_install + Distros: openshift-origin,openshift-enterprise Topics: - Name: Understanding image-based installation and deployment for single-node OpenShift File: ibi-understanding-image-based-install - Name: Preparing for a single-node OpenShift image-based installation File: ibi-preparing-for-image-based-install - - Name: Installing single-node OpenShift using an image-based installation + - Name: Preinstalling single-node OpenShift using an image-based installation File: ibi-factory-image-based-install - - Name: Deploying single-node OpenShift using the installation program - File: ibi-edge-image-based-install-standalone + - Name: Deploying single-node OpenShift clusters + Dir: ibi_deploying_sno_clusters + Distros: openshift-origin,openshift-enterprise + Topics: + - Name: Deploying managed single-node OpenShift using the IBI Operator + File: ibi-edge-image-based-install + - Name: Deploying single-node OpenShift using the installation program + File: ibi-edge-image-based-install-standalone - Name: Day 2 operations for telco core CNF clusters Dir: day_2_core_cnf_clusters Distros: openshift-origin,openshift-enterprise diff --git a/edge_computing/image-base-install/ibi-understanding-image-based-install.adoc b/edge_computing/image-base-install/ibi-understanding-image-based-install.adoc deleted file mode 100644 index 30279bcddb..0000000000 --- a/edge_computing/image-base-install/ibi-understanding-image-based-install.adoc +++ /dev/null @@ -1,71 +0,0 @@ -:_mod-docs-content-type: ASSEMBLY -[id="ibi-image-based-install_overview"] -= Understanding an image-based installation and deployment for {sno} clusters -include::_attributes/common-attributes.adoc[] -:context: ibi-understanding-image-based-install - -toc::[] - -Image-based installations streamline the deployment process for {sno} clusters by significantly reducing installation and deployment times. - -This approach enables the preinstallation of configured and validated instances of {sno} on target hosts. These preinstalled hosts can be rapidly reconfigured and deployed at the far edge of the network, including in disconnected environments, with minimal intervention. - -[id="ibi-installation-deployment-overview"] -== Overview of image-based installation and deployment for {sno} clusters - -Deploying infrastructure at the far edge of the network presents challenges for service providers with low bandwidth, high latency, and disconnected environments. - -It is also costly and time-consuming to install and deploy {sno} clusters. - -An image-based approach to installing and deploying {sno} clusters at the far edge of the network overcomes these challenges by separating the installation and deployment stages. - -Imaged-based installation:: -Preinstall multiple hosts with {sno} at a central site, such as a service depot or a factory. -Then, validate the base configuration for these hosts and leverage the image-based approach to perform reproducible factory installs at scale by using a single container image. - -Image-based deployment:: -Ship the preinstalled and validated hosts to a remote site and rapidly reconfigure and deploy the clusters in a matter of minutes by using a configuration image. - -[id="ibi-installation-overview"] -=== Image-based installation for {sno} clusters -Using the {lcao}, you can generate an OCI container image that encapsulates an instance of a {sno} cluster. This image is derived from a dedicated cluster that you can configure with the target {product-title} version. - -You can reference this image in a live installation ISO to consistently preinstall configured and validated instances of {sno} to multiple hosts. This approach enables the preparation of hosts at a central location, for example in a factory or service depot, before shipping the preinstalled hosts to a remote site for rapid reconfiguration and deployment. - -The following is a high-level overview of the image-based installation process: - -* Generate an image from a {sno} cluster. -* Use the `openshift-install` program to embed the seed image URL, and other installation artifacts, in a live installation ISO. -* Start the host using the live installation ISO to preinstall the host. -+ -During this process, the `openshift-install` program installs {op-system-first} to the disk, pulls the image you generated, and precaches release container images to the disk. - -* When the installation completes, the host is ready to ship to the remote site for rapid reconfiguration and deployment. - -[id="ibi-deployment-overview"] -=== Image-based deployment for {sno} clusters - -You can use the `openshift-install` program to configure and deploy a host that you preinstalled with an image-based installation. To configure the target host with site-specific details, you must create the following resources: - -* The `install-config.yaml` installation manifest - -* The `image-based-config.yaml` manifest - -The `openshift-install` program uses these resources to generate a configuration ISO that you attach to the preinstalled target host to complete the deployment. - -[id="ibi-installation-deployment-components"] -== Image-based installation and deployment components - -The following content describes the components in an image-based installation and deployment. - -Seed image:: OCI container image generated from a dedicated cluster with the target {product-title} version. - -Seed cluster:: Dedicated {sno} cluster that you use to create a seed image and is deployed with the target {product-title} version. - -{lcao}:: Generates the seed image, embeds the seed image URL in the live installation ISO, and reconfigures the host during remote site deployment. - -`openshift-install` program:: Use the `openshift-install` program to manually create a configuration ISO. Attach the configuration ISO to a preinstalled host to complete the deployment. - -include::modules/ibi-image-based-install-cluster-guide.adoc[leveloffset=+1] - -include::modules/ibi-validated-software-versions.adoc[leveloffset=+1] diff --git a/edge_computing/image-base-install/_attributes b/edge_computing/image_base_install/_attributes similarity index 100% rename from edge_computing/image-base-install/_attributes rename to edge_computing/image_base_install/_attributes diff --git a/edge_computing/image-base-install/ibi-factory-image-based-install.adoc b/edge_computing/image_base_install/ibi-factory-image-based-install.adoc similarity index 70% rename from edge_computing/image-base-install/ibi-factory-image-based-install.adoc rename to edge_computing/image_base_install/ibi-factory-image-based-install.adoc index 8921d5a1c7..49210b5f75 100644 --- a/edge_computing/image-base-install/ibi-factory-image-based-install.adoc +++ b/edge_computing/image_base_install/ibi-factory-image-based-install.adoc @@ -1,6 +1,6 @@ :_mod-docs-content-type: ASSEMBLY -[id="ibi-image-based-install_{context}"] -= About image-based installations for {sno} clusters +[id="ibi-factory-image-based-install"] += About image-based installation for {sno} include::_attributes/common-attributes.adoc[] :context: ibi-factory-image-based-install @@ -13,8 +13,8 @@ The installation program takes a seed image URL and other inputs, such as the re The following are the high-level steps to preinstall a {sno} cluster using an image-based installation: * Generate a seed image. -* Create a live installation ISO using the installation program. -* Start the host using the live installation ISO to preinstall the host. +* Create a live installation ISO using the `openshift-install` installation program. +* Boot the host using the live installation ISO to preinstall the host. [role="_additional-resources"] .Additional resources @@ -23,7 +23,11 @@ The following are the high-level steps to preinstall a {sno} cluster using an im include::modules/ibi-create-iso-for-bmh.adoc[leveloffset=+1] +[role="_additional-resources"] +.Additional resources + +* xref:../../edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install-standalone.adoc#ibi-installer-configuration-config_ibi-edge-image-based-install[Reference specifications for the `image-based-installation-config.yaml` manifest] + include::modules/ibi-provision-install-iso-to-bmh.adoc[leveloffset=+1] include::modules/ibi-installer-installation-config.adoc[leveloffset=+1] - diff --git a/edge_computing/image-base-install/ibi-preparing-for-image-based-install.adoc b/edge_computing/image_base_install/ibi-preparing-for-image-based-install.adoc similarity index 71% rename from edge_computing/image-base-install/ibi-preparing-for-image-based-install.adoc rename to edge_computing/image_base_install/ibi-preparing-for-image-based-install.adoc index 579880f594..7680d63352 100644 --- a/edge_computing/image-base-install/ibi-preparing-for-image-based-install.adoc +++ b/edge_computing/image_base_install/ibi-preparing-for-image-based-install.adoc @@ -1,6 +1,6 @@ :_mod-docs-content-type: ASSEMBLY -[id="ibi-preparing-for-image-based-install_{context}"] -= Preparing for an image-based installation for {sno} clusters +[id="ibi-preparing-for-image-based-install"] += Preparing for image-based installation for {sno} clusters include::_attributes/common-attributes.adoc[] :context: ibi-preparing-image-based-install @@ -10,6 +10,11 @@ To prepare for an image-based installation for {sno} clusters, you must complete * Create a seed image by using the {lcao}. * Verify that all software components meet the required versions. For further information, see "Software prerequisites for an image-based installation and deployment". +[role="_additional-resources"] +.Additional resources + +* xref:../../edge_computing/image_base_install/ibi-understanding-image-based-install.adoc#ztp-image-based-upgrade-prereqs_ibi-understanding-image-based-install[Software prerequisites for an image-based installation and deployment] + == Installing the {lcao} Use the {lcao} to generate a seed image from a seed cluster. You can install the {lcao} using the {oc-first} or the web console. @@ -22,4 +27,4 @@ include::modules/cnf-image-based-upgrade-shared-container-partition.adoc[levelof include::modules/cnf-image-based-upgrade-seed-image-config.adoc[leveloffset=+1] -include::modules/cnf-image-based-upgrade-generate-seed-image.adoc[leveloffset=+1] +include::modules/cnf-image-based-upgrade-generate-seed-image.adoc[leveloffset=+1] \ No newline at end of file diff --git a/edge_computing/image_base_install/ibi-understanding-image-based-install.adoc b/edge_computing/image_base_install/ibi-understanding-image-based-install.adoc new file mode 100644 index 0000000000..8793433166 --- /dev/null +++ b/edge_computing/image_base_install/ibi-understanding-image-based-install.adoc @@ -0,0 +1,131 @@ +:_mod-docs-content-type: ASSEMBLY +[id="ibi-understanding-image-based-install"] += Understanding image-based installation and deployment for {sno} +include::_attributes/common-attributes.adoc[] +:context: ibi-understanding-image-based-install + +toc::[] + +Image-based installations significantly reduce the deployment time of {sno} clusters by streamlining the installation process. + +This approach enables the preinstallation of configured and validated instances of {sno} on target hosts. These preinstalled hosts can be rapidly reconfigured and deployed at the far edge of the network, including in disconnected environments, with minimal intervention. + +[NOTE] +==== +To deploy a managed cluster using an imaged-based approach in combination with {ztp-first}, you can use the SiteConfig operator. For more information, see link:https://docs.redhat.com/en/documentation/red_hat_advanced_cluster_management_for_kubernetes/2.12/html-single/multicluster_engine_operator_with_red_hat_advanced_cluster_management/index#siteconfig-intro[SiteConfig operator]. +==== + +[id="ibi-installation-deployment-overview_{context}"] +== Overview of image-based installation and deployment for {sno} clusters + +Deploying infrastructure at the far edge of the network presents challenges for service providers with low bandwidth, high latency, and disconnected environments. +It is also costly and time-consuming to install and deploy {sno} clusters. + +An image-based approach to installing and deploying {sno} clusters at the far edge of the network overcomes these challenges by separating the installation and deployment stages. + +.Overview of an image-based installation and deployment for managed {sno} clusters +image::../images/711_OpenShift_IBI_Installation_high-level_0624.png[Overview of an image-based installation and deployment] + +Imaged-based installation:: +Preinstall multiple hosts with {sno} at a central site, such as a service depot or a factory. +Then, validate the base configuration for these hosts and leverage the image-based approach to perform reproducible factory installs at scale by using a single live installation ISO. + +Image-based deployment:: +Ship the preinstalled and validated hosts to a remote site and rapidly reconfigure and deploy the clusters in a matter of minutes by using a configuration ISO. + +You can choose from two methods to preinstall and configure your SNO clusters. + +Using the `openshift-install` program:: +For a {sno} cluster, use the `openshift-install` program only to manually create the live installation ISO that is common to all hosts. Then, use the program again to create the configuration ISO which ensures that the host is unique. For more information, see “Deploying managed {sno} using the openshift-install program”. + +Using the IBI Operator:: +For managed {sno} clusters, you can use the `openshift-install` with the Image Based Install (IBI) Operator to scale up the operations. The program creates the live installation ISO and then the IBI Operator creates one configuration ISO for each host. For more information, see “Deploying {sno} using the IBI Operator”. + +[id="ibi-installation-overview_{context}"] +=== Image-based installation for {sno} clusters + +Using the {lcao}, you can generate an OCI container image that encapsulates an instance of a {sno} cluster. This image is derived from a dedicated cluster that you can configure with the target {product-title} version. + +You can reference this image in a live installation ISO to consistently preinstall configured and validated instances of {sno} to multiple hosts. This approach enables the preparation of hosts at a central location, for example in a factory or service depot, before shipping the preinstalled hosts to a remote site for rapid reconfiguration and deployment. The instructions for preinstalling a host are the same whether you deploy the host by using only the `openshift-install` program or using the program with the IBI Operator. + +The following is a high-level overview of the image-based installation process: + +. Generate an image from a {sno} cluster. +. Use the `openshift-install` program to embed the seed image URL, and other installation artifacts, in a live installation ISO. +. Start the host using the live installation ISO to preinstall the host. ++ +During this process, the `openshift-install` program installs {op-system-first} to the disk, pulls the image you generated, and precaches release container images to the disk. + +. When the installation completes, the host is ready to ship to the remote site for rapid reconfiguration and deployment. + +[id="ibi-deployment-overview_{context}"] +=== Image-based deployment for {sno} clusters + +You can use the `openshift-install` program or the IBI Operator to configure and deploy a host that you preinstalled with an image-based installation. + +{sno-caps} cluster deployment:: + +To configure the target host with site-specific details by using the `openshift-install` program, you must create the following resources: ++ +-- +* The `install-config.yaml` installation manifest + +* The `image-based-config.yaml` manifest +-- ++ +The `openshift-install` program uses these resources to generate a configuration ISO that you attach to the preinstalled target host to complete the deployment. + +Managed {sno} cluster deployment:: + +{rh-rhacm-first} and the {mce} (MCE) use a hub-and-spoke architecture to manage and deploy {sno} clusters across multiple sites. Using this approach, the hub cluster serves as a central control plane that manages the spoke clusters, which are often remote {sno} clusters deployed at the far edge of the network. ++ +You can define the site-specific configuration resources for an image-based deployment in the hub cluster. The IBI Operator uses these configuration resources to reconfigure the preinstalled host at the remote site and deploy the host as a managed {sno} cluster. This approach is especially beneficial for telecommunications providers and other service providers with extensive, distributed infrastructures, where an end-to-end installation at the remote site would be time-consuming and costly. ++ +The following is a high-level overview of the image-based deployment process for hosts preinstalled with an imaged-based installation: ++ +-- +* Define the site-specific configuration resources for the preinstalled host in the hub cluster. +* Apply these resources in the hub cluster. This initiates the deployment process. +* The IBI Operator creates a configuration ISO. +* The IBI Operator boots the target preinstalled host with the configuration ISO attached. +* The host mounts the configuration ISO and begins the reconfiguration process. +* When the reconfiguration completes, the {sno} cluster is ready. +-- ++ +As the host is already preinstalled using an image-based installation, a technician can reconfigure and deploy the host in a matter of minutes. + +[id="ibi-installation-deployment-components_{context}"] +== Image-based installation and deployment components + +The following content describes the components in an image-based installation and deployment. + +Seed image:: OCI container image generated from a dedicated cluster with the target {product-title} version. + +Seed cluster:: Dedicated {sno} cluster that you use to create a seed image and is deployed with the target {product-title} version. + +{lcao}:: Generates the seed image. + +Image Based Install (IBI) Operator:: When you deploy managed clusters, the IBI Operator creates a configuration ISO from the site-specific resources you define in the hub cluster, and attaches the configuration ISO to the preinstalled host by using a bare-metal provisioning service. + +`openshift-install` program:: Creates the installation and configuration ISO, and embeds the seed image URL in the live installation ISO. If the IBI Operator is not used, you must manually attach the configuration ISO to a preinstalled host to complete the deployment. + +[role="_additional-resources"] +.Additional resources + +* xref:../../edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install-standalone.adoc#create-standalone-config-iso_ibi-edge-image-based-install[Deploying a {sno} cluster using the `openshift-install` program] + +include::modules/ibi-image-based-install-cluster-guide.adoc[leveloffset=+1] + +[role="_additional-resources"] +.Additional resources + +* xref:../../edge_computing/image_base_install/ibi-preparing-for-image-based-install.adoc#cnf-image-based-upgrade-shared-container-partition_ibi-preparing-image-based-install[Configuring a shared container partition between ostree stateroots] + +include::modules/ibi-validated-software-versions.adoc[leveloffset=+1] + +[role="_additional-resources"] +.Additional resources + +* link:https://access.redhat.com/documentation/en-us/red_hat_advanced_cluster_management_for_kubernetes/2.12/html/about/welcome-to-red-hat-advanced-cluster-management-for-kubernetes#multicluster-architecture[Multicluster architecture] + +* xref:../../edge_computing/image_based_upgrade/cnf-understanding-image-based-upgrade.adoc#cnf-understanding-image-based-upgrade[Understanding the image-based upgrade for {sno} clusters] diff --git a/edge_computing/image_base_install/ibi_deploying_sno_clusters/_attributes b/edge_computing/image_base_install/ibi_deploying_sno_clusters/_attributes new file mode 120000 index 0000000000..bf7c2529fd --- /dev/null +++ b/edge_computing/image_base_install/ibi_deploying_sno_clusters/_attributes @@ -0,0 +1 @@ +../../../_attributes/ \ No newline at end of file diff --git a/edge_computing/image-base-install/ibi-edge-image-based-install-standalone.adoc b/edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install-standalone.adoc similarity index 63% rename from edge_computing/image-base-install/ibi-edge-image-based-install-standalone.adoc rename to edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install-standalone.adoc index 9aae199fb3..3983d1425d 100644 --- a/edge_computing/image-base-install/ibi-edge-image-based-install-standalone.adoc +++ b/edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install-standalone.adoc @@ -13,9 +13,10 @@ include::modules/ibi-create-standalone-config-iso.adoc[leveloffset=+1] [role="_additional-resources"] .Additional resources -* xref:../../openshift_images/managing_images/using-image-pull-secrets.adoc#using-image-pull-secrets[Using image pull secrets] +* xref:../../../openshift_images/managing_images/using-image-pull-secrets.adoc[Using image pull secrets] + +* xref:../../../edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install-standalone.adoc#ibi-installer-configuration-config_ibi-edge-image-based-install[Reference specifications for the `image-based-installation-config.yaml` manifest] include::modules/ibi-installer-configuration-config.adoc[leveloffset=+2] -include::modules/ibi-extra-manifests-standalone.adoc[leveloffset=+1] - +include::modules/ibi-extra-manifests-standalone.adoc[leveloffset=+1] \ No newline at end of file diff --git a/edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install.adoc b/edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install.adoc new file mode 100644 index 0000000000..d6cb7bc82f --- /dev/null +++ b/edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install.adoc @@ -0,0 +1,61 @@ +:_mod-docs-content-type: ASSEMBLY +[id="ibi-edge-image-based-install"] += About image-based deployments for managed {sno} +include::_attributes/common-attributes.adoc[] +:context: ibi-edge-image-based-install + +toc::[] + +When a host preinstalled with {sno} using an image-based installation arrives at a remote site, a technician can easily reconfigure and deploy the host in a matter of minutes. + +For clusters with a hub-and-spoke architecture, to complete the deployment of a preinstalled host, you must first define site-specific configuration resources on the hub cluster for each host. These resources contain configuration information such as the properties of the bare-metal host, authentication details, and other deployment and networking information. + +The Image Based Install (IBI) Operator creates a configuration ISO from these resources, and then boots the host with the configuration ISO attached. The host mounts the configuration ISO and runs the reconfiguration process. When the reconfiguration completes, the {sno} cluster is ready. + +[NOTE] +==== +You must create distinct configuration resources for each bare-metal host. +==== + +See the following high-level steps to deploy a preinstalled host in a cluster with a hub-and-spoke architecture: + +. Install the IBI Operator on the hub cluster. +. Create site-specific configuration resources in the hub cluster for each host. +. The IBI Operator creates a configuration ISO from these resources and boots the target host with the configuration ISO attached. +. The host mounts the configuration ISO and runs the reconfiguration process. When the reconfiguration completes, the {sno} cluster is ready. + +[NOTE] +==== +Alternatively, you can manually deploy a preinstalled host for a cluster without using a hub cluster. You must define an `ImageBasedConfig` resource and an installation manifest, and provide these as inputs to the `openshift-install` installation program. For more information, see "Deploying a {sno} cluster using the `openshift-install` program". +==== + +[role="_additional-resources"] +.Additional resources + +* xref:../../../edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install-standalone.adoc#create-standalone-config-iso_ibi-edge-image-based-install[Deploying a {sno} cluster using the `openshift-install` program] + +include::modules/ibi-install-ibi-operator.adoc[leveloffset=+1] + +include::modules/ibi-create-config-iso.adoc[leveloffset=+1] + +[role="_additional-resources"] +.Additional resources + +* xref:../../../openshift_images/managing_images/using-image-pull-secrets.adoc[Using image pull secrets] + +* xref:../../../edge_computing/image_base_install/ibi_deploying_sno_clusters/ibi-edge-image-based-install.adoc#ibi-managed-cluster-config-resources_ibi-edge-image-based-install[Cluster configuration resources for deploying a preinstalled host] + +include::modules/ibi-managed-cluster-config-resources.adoc[leveloffset=+2] + +include::modules/ibi-image-cluster-install-api-spec.adoc[leveloffset=+2] + +include::modules/ibi-extra-manifests-configmap.adoc[leveloffset=+1] + +[role="_additional-resources"] +.Additional resources + +* xref:../../../installing/installing_bare_metal_ipi/ipi-install-post-installation-configuration.adoc#bmo-about-the-baremetalhost-resource_ipi-install-post-installation-configuration[About the BareMetalHost resource] + +* xref:../../../openshift_images/managing_images/using-image-pull-secrets.adoc[Using image pull secrets] + +* xref:../../../edge_computing/image_base_install/ibi-factory-image-based-install.adoc#ibi-installer-installation-config_ibi-factory-image-based-install[Reference specifications for the image-based-config.yaml manifest] \ No newline at end of file diff --git a/edge_computing/image_base_install/ibi_deploying_sno_clusters/images b/edge_computing/image_base_install/ibi_deploying_sno_clusters/images new file mode 120000 index 0000000000..4399cbb3c0 --- /dev/null +++ b/edge_computing/image_base_install/ibi_deploying_sno_clusters/images @@ -0,0 +1 @@ +../../../images/ \ No newline at end of file diff --git a/edge_computing/image_base_install/ibi_deploying_sno_clusters/modules b/edge_computing/image_base_install/ibi_deploying_sno_clusters/modules new file mode 120000 index 0000000000..7e8b50bee7 --- /dev/null +++ b/edge_computing/image_base_install/ibi_deploying_sno_clusters/modules @@ -0,0 +1 @@ +../../../modules/ \ No newline at end of file diff --git a/edge_computing/image_base_install/ibi_deploying_sno_clusters/snippets b/edge_computing/image_base_install/ibi_deploying_sno_clusters/snippets new file mode 120000 index 0000000000..ce62fd7c41 --- /dev/null +++ b/edge_computing/image_base_install/ibi_deploying_sno_clusters/snippets @@ -0,0 +1 @@ +../../../snippets/ \ No newline at end of file diff --git a/edge_computing/image-base-install/images b/edge_computing/image_base_install/images similarity index 100% rename from edge_computing/image-base-install/images rename to edge_computing/image_base_install/images diff --git a/edge_computing/image-base-install/modules b/edge_computing/image_base_install/modules similarity index 100% rename from edge_computing/image-base-install/modules rename to edge_computing/image_base_install/modules diff --git a/edge_computing/image-base-install/snippets b/edge_computing/image_base_install/snippets similarity index 100% rename from edge_computing/image-base-install/snippets rename to edge_computing/image_base_install/snippets diff --git a/images/711_OpenShift_IBI_Installation_high-level_0624.png b/images/711_OpenShift_IBI_Installation_high-level_0624.png new file mode 100644 index 0000000000000000000000000000000000000000..5b373b548943f86ea8f85068bdccfa61166862f2 GIT binary patch literal 109731 zcmeFZcQn`k-#<=^kWoU4Lc_`~o064=ks{fmlB{HpmaHUMm1IPcB1x2;WL2_~?3HBi z&F}W;{l2cxb-w@p&iS41Ils&4sCbR%^D*xC+j_hLw2rH7pkb$>prF`rSY26%f@19` z1;y$$)a&q*(f&0`_-oB&rNg?^`0}Ja>rX+kgW|CAL0#8JgRL&E%ne-%qb?ptc5P7F zkk7*?6UZ!l>^XC&b1(mx`=#*oA3}k_Z9*#j<`k5C{5r}94z8g+c5?^g;j0vf)rFf~ zsz*Y$%W6j2sPAejT5#j!+$AgSVYU17gNd&XE}vDRrsV$5*Es)ppb!Pqf4+LlC}REp z`>UK*v}n)&c(fATXuyB}(m#)Jwda3+$u0cxf1mnyIL7~fHB6PUKFjYCstzdQOZVwE zdMZx09;Vs3xsy)Xl^@?-?zun@g*t_gk&xAIOLQGBIhd=VK0};#Ysi+LpPA=_K9veagyCg{?-7IcsMb ze$HMZ*E%`ss{d)YS6-G$yVQ)l&rEacmEbd1g>N3Pw-;HpdbPlFPx3hBU5<0(y?zPF zJ4TuU{Q2nz*txmiw-2XX>~Rt9u$QXLJ^J@iNz)>0_=WP$?csjT_Tr+y|8MWy+_VbT zj!oox{`t}_wYaMJ_rZU^_4u;=&)>Rnt(*PNFO`k`DHZL5MPN3D&Re5K>o-0m^w=zkt^vcAqV|lY(LH9_rqQw{%79i5F|AIk^L&bk`r*i*iH_wK&*<=xM9Q*;umkGwY` zrRlw*Tx(`k@652c?!7C4Rna31L(a11=H~XDAJ!V?I&VnUjQtdM@P>$EPkEpaJCk-& zhm%a`qepa^O>`7myv*oTSJTt&R9Ih@rqf3d>g71?I9&Q092&3?_7K5-B~&}BcBx;Z^>oJPp#{hBO;4Y{p%o}WxLuei61 znvQNV=eVb*oUvQ)W<0yR*YW<*-A;o)m@>~*3)Q`Ln^-b4FkpY|J%3?wX{KE(MYsIR zmr|Y(ITWXH|CuD^o?}9WIaiNG@9&H<@h*OOCfii(0R@Fd(#C@a4?a7QO#lAMz%2!@ z`8emHpPP+ZJbvc6WuB2gS?Ik)^^~eWva#6Zh^A&)L#m#`c+cVbbd&9^@2{l(=4PUd z;42CV4ldPHTv~IZ*uJ{=CZoMf%#YWWv{qjp`ewI#Z{4)}C~vkSOCtXN%pi+j=fsKl zn)9X->@^80wCS`XdTE9M8@BEz1C`^wB!ih2vF|8a7&oHvU1ji+MJ9$G|8URe6npTZ zJT}THH{!6{V+K4bp_Wmpqdw(?l-In(8-u+sP6^bj3XtVcMBiUjl{Rt6}VLb+|PA!{FuHgdkn3ym$1@ zht<`K!ud`xZrvJ`lOvUwoNO^Y*hDv4aZ&f7=;%rQ%}z2g&D(=jS7#aQU8*@R@oivg zbZqQedb%)1W^BAl*a9VcvymrmjS6q1lx5uzcPh0eS#$eh`^u7u3adbDU9x8P@0us& z<>gn6)BTPoPrRocD7o2p1Mr4_liupqDYevwwuv^C-C=HdWqU?S7Ie7BS*jxUmf*55 z@SOt#0>SmBSq5fV2Axha@j5A{B5WPq-8TjYZ3IuhUQ^=7pyuxGuEH9dr*-NS3;i~! zt4E@Q4l``Y8#9xU&*MMF;Hep|vFohZ1Bp3b##PeN(zfvhhC*cvBZVPloE~&vq9xP6 zjo)G4M}swT$l98pUD9?if^~JUDv$i;D^lAw8$I<fnF*(QS2G)W%TB9LHW7ERVHV z@evwpxz-4>&{}_g5n$c${2=wU`g+}+J9qAomEDTb#!y>lu^;lI?|o&`6KW{rXPizo z>?E{fe1F9LBFP6w^l&jZuO!n95XWMd+YUNjQZFJQB_Et%Hd5`HyR~w9aAgWB)OuLVomDTRE zVq36gutmQm9buguY}&-d#Z^15c4u30ZPF1G1pDC@>HaBkOj39_^X=`5oS5eQ(F75> zt}M;8wsFo5q!*4(R4aDlJ^e#MqIUDtSZAGYc)oev2KJl#FZ~SfvWdDg@ZqA^14a&x zU^FeRJ$tBd-y!nTY>$1G=akMl7rKsdI}iT2hPusx7DI70E^dcYf9+Zx)!X*6k6kWH zZTpdJw|#oJH3(H*Jwjbei_ze%O~7M$j|8J!=i2ck`R%0TG2BBLv_K#Dc3$FD^APoh z4W(H6BhDeqjV3;3^OOBL7R}}v9jL-;-JgPKThfY64_I42cWSr6wQ+LZAypQ=XBWL2 zidMnW^qIl-!tMA$#4X43_0O0ddyXHLoBm-@YTdGD=T1|+-Yb1U%whN{V~fW0@y&(0aiiFR<@t*?EjcwWy&qtwyw1$bxYWFVo1%B#k1IEtY(C-E z<-Sv{rlJ>Yxc|q&!C`i^gu!fobi5Yt-LSA5r(PPE{d{v_?t0rjLyw?8n8+V*FKs>k zNUAe3#0hQW1{H&lb8^G$=Y2uZ`9Ey-AB|Puz>DB^UNza&jzk_$E z-$m|vuF~gEJ)h^&RHM|DKg<}Q9!F`^0pDw@sS@nk3u^aIj8EoDUi>bIUHSQeI2Gnn z9&79AvFKaHH>g+#Tx(ZbFH8@8m^z1o*EK!V{9$YU{GU{%^v0mOcNv*BZseYH&!3&^ ziStOV zD-d&=|9U#ps&!(bG>A3mQuEsYTn--KTWrdRXDFpM(3qH*WSp-_@NCa?=vLKEKF&dY zZJZuec}|3lyzsgk2PJG<^z&xgJU&=w(Qw_=FZ9l**nxfmaKjiMA7AT0PfyR{o^Q;5 zqWSG5-zFOtC2EJ!j)S819S5{u8tl8UMQ_UlXIMvvsi?&#x=wqkmdf|0#jE-s%`Yqj zVKM`N@3?)8@8&jMY)p&s4+vnov2FwEt$~aX-usy@f6cqg=a^Vo`y9?3Pd@Sa;l3j` z{rvi5pQbHc{P`xu|IVH19B+&p@Xmd-v@usta%t<=GkMKVGL?mF7jBr_!OiXdgG1U; z*{11r>A=XvBMD-I(YVeKh52U~|A^rd!oWgfVvIUuuu>9KgV_@_BKT|Nmph7Yv_=L5 z2HqPE?s0sFsqrrGnB-Brqh6IW9Cl}$G`H7q|FVdTjDg&EIS)otW8mHJNUYnh2cGTP z%;%~fZ^lJbxY!N8XPv=3qk(LW5;lqae)#xtmX`)u_kIdt*aY=o9hhHSoSWd@vE#tA z2J4U^>ZrDSk0WIiSAVzWW;gfsHXXO;t9pAvyZNH>%o)oZ&L~~WAK7_LS`qvwm4|+2 zwWiIKiehbM&nLM}{4&Q1Ou#!SJ*i>NwUxU3>o%IUUzyAS%(ah?kEm^n6j0(_yVeim zA&H4Q$7Z`ja*bFoet*H|y)cyR+05Ucl`TRBI#$sH?W5H~A)&4x_2;JkJI5sKAeFZ4 z*U$Qn+{*_Xta*Fs4CMhfx^*euv>0(L1|6^N`GTo|#@vVsoBctOZLWvbP*LStI;Xie zV0F@M5mN?g-rJs$x8Rbl{Y16v`^z)tv!k6#@mkc1ii%uORr23wChf~TL3vnjF8QcBV(#`l+}a^;QWoqjWZ zy1nJbix+~k^Yb5UvrEh~4p4Iizl+7gfkU@gWo{8Jm`!*y+}h3;Rsol=d2p1}l;u=i zeoUNUf#;U~{{Gs6cgq4%Rjt36%RL4S(>Z$OpQ=7#@|YR+MR%TbmmhS_otzK9$l}`K zMl%m4!Yw8BW9WW3)jLD_u!@@joAz`8Mt-x-(&CS(J#i-AIAqhF zmP{{PmWdQHqRBUAz@P#Aqso<^6+5400DMkR3qL;%gaOx~tj3n_J`-OgGcNZX2di0& z=i*Y7sPSMt5|7sxWLZR2(g}Hb?=QUNw&TX=W*HE;y=L7ycf;KZ3dZjx`Tb9&q9*ti zn_e||d8^p8JUj2=2k9HdJG@*D=C=S{+P1#;O*xUwEh(w@@Okr>LxqN{Kqfd$*D$rxKOhr=O0%U=?Qp2?&vC^PD)An3$-(!V8|tE^)qNOqJDT z_t~Er7F0sUdH#SNxDT>X(i@MohlYpWtO(n~1CWbR0tdu*O}Vi(66_n$POqUHAH>5p z^*N(AwlgZKBx&)Ec84e?0P6m3%G`s&^Io1ihc(2v4Ip@SFta+5!UqMZyrSY7ZVbP7 zpZt9dzytG4SSg`^*sY|Vd(L+H>8LQXvj={Skp(#dE~CVft^JaNn*{-h)8z+GsCi{} zs6U}0+s3p|)i3D)oh*|dN(u&`4v^sixYZ8ivq+yyANRnoSjGD5(0 zajXnK-9V^4CN^Bj6RmEWoGT+CS3log5_p+w-M~+%2X=DpKqaPc1G~i4FII;P4Y%p? zZ^jGb4isiPR=>H_OnL>c{kb18fMi@dc2Gb&yLRoG>sTo(X_-5B@9rX`(0ftpURYR$ z=bYmkpa{M4$fUSVb$w?BPY8HSC2Kt7OaX*NM_`$7#9FDs0LOL zB_*X4D%h_t(S8gHvvJ=pJ$?GLtCZD5SxMIe`56 zrq{jl*#cn|Kv=7v)KEiyc=4XgjssEly=6hgA{}#FCAlu(;l7I+SF$S3I;Ljh zXLmsOO4{2^-lqe-tOeP-jc&G0)|pQ10Ua4Z6mqN2_pkLdz3nkdmA|i|scBS7t57AH%P4=1QA!QYn!xq+j5gH%M%8ul_3z-xM z9uwLXR`C}{)4m5L#yow?bGw|qUdDZ9I2ia~HO14T53WN1VaBdSJHn+Ffe8#{^o1(L z7p0~b1On>OZQW0I?4iU#S63;(RdWlAu{MtpGw5pQFW?biG-Vi|ngXwdjT~Y3?5C(7 zil3u5cI{k?DLQ-hENLVj(}SV>=1*$;3s;uU(2SnY(RqcUm!cL~YEEAE*XIW})V6yu zqk6P^PHcFp8A}iC3%l^qqiui?+hb&1BEPCRJMSlD4)RNZmq*^p@`7#e0$7zp*T?m8 z6Q9Lvt2Nveh)t4r>|lPWz{6HsHS}W93$;4|Ja&Ll$+`@G{NPJ#mfakW!XU!-%B*Ca z+{)sF@AN&xLT`COPS6QEj=Q#_OXn?3H$OX_xf{!rJWkL!k4-p#a-&uCV;rI&w_p*ta<~8%?yHtj-C5E!#gTLEQcF^weMv;_qPP=Rt7)Pnd^v3sg|9shy|*AUqaYa%puE!}XC+E)Jg z^T&(n`L~8!b6IotqJDIi_*r20*lLzQmAopu>51n|t4pnK+rDC(#x$d(WV6oB&e`8j zLPSi9D1c|qORz6aH`_rPI|P^;nD2un4qkBYg9inhh$+Q>n;%yJ9S)&CS!Oj4=?J?t z)+tetdR&w5;UaPII~_Df6<}-;6af$Kkyd&An~bjvUal2t$L~YR-l8+O5@h5uVw@5W zvbQKQ2+!c~HN9>iN~H6wpZ4FU*WYRsM3nQPMlwSpvx@usQX}<-V^fVB$%Z z%Twt-TzmI!7%5l~0%}239K*8a*}Z!m)RLt~(}>FN{o zB!s0*O-oyXEk%|R2$*`w?%Z2~mp8E9kZnu{V=T7WZ_$?L#+iM(_I>BDOp(q0Cug#4 z_1~Ni4L|tie9fv@&++xpfP4oU(~pGt*nwABTpfA76@B(L#BEFqq)yxi{%z4y9y<5^ zUF^FCtN_rsJ@Oq{xaf`>3@x|XQ% zg>3Bm8M}kYb%)E`Kipg|*)2`#`;aIw>{J7ttLZ=z!?l!u6MTTQ~q&)=tUt=W> z=o5w<+6CSn7=VcO7{5r~BA5Kvm$PxHtg|%7(v9<9LCr!FfvHB|1%#gDNoz+aR^Jj2 zZzAHAru>v{MwRZ}n>W`iE-#G0emDf3{Q0SuftdM&sSV(I6o93*t}&ZMTY^%lyo^si z*Cq0um}{l!rz|DY=Xt19@6O;tKd~>uNkPi zJ1pX&Y^V2|7@CU^AWP1Tb`<|^&K5onoPYm5o8ddhwa`IxoQK%K-AKE{NTv7{6c#E1 zU;E*P;w{SV%)Qn7XLWVjn*xK(i9LJuN@Q}VnH3cFhQZ6owx8KeHgg3hQgpci4{2Eh z?|w3qWDmZ-{}TJ|^7Syce^7xAD{i!nG>7DLR3KQyUm};!z z+_kMhAW%xqH^1F`i(&g6pjFlj9y5Qo*h;WNl1lQ41AYO~hwR~e=4(T4X_n#f zjv6_BqippaG*d>nRDZAyb5yz7vzlp-=ar~i^4vB-s`!z4jsc`w(i7Ws#`Bdn8~RF9 z<~fVr$_R+Lp_O}X-eq5v*6E!Wocd_(;Uh=FmfLN!dEf}S=PR^3LKC8L#Xa4PjvinUQd3rL z@zaSiBwbXmIVG>XXBYQKa?SZ~DJS+g{i#1Ze;VE1wk7A9__?p9Shi9w!;hHnpF4N1 z8!9m8YR~Xjw!FtV?z%|re{gj7F(+@At0R@0A01Dg#D7cBG!wbPN1PQer{>N1mvkP0 zM5dQdd9tnP$f;A2lPhTf;YK`iJxMw#i4*4}*kQF9cI-E@(`VeASi5d^ci4LH3}sCA z_}baD!#gVjRi9h~W34#5YS{1UuU_@IRb-WUnw=_BF6Wc^!s0~rSZ|a`*Uzkr z>c@}YYO;yE^#fCLt)%m>KS!)C7%+TeGhblEj1;aY(5+hy5>K}2*zgxC@vg3}%0B>naCL5*8U|&`Z7pY{?>Z{9S`}gi=oee^9mz?ax~f_JH@BmmVdz-FItk zJw`5SC~{5Q!PR7ILD^w9 z-^0h3QZy8qXbTL8Kekt{rrzjom0O$hIIS;@vxz@~2Ewo}#tvF(BjN|ZjdtG z*p?Tw1y%C(>({XIKo2~sr!=1Lobq(D5_SvmE9txn-5E9kt^8MX;Jr07f9(S$YUCRt zs_tu{$x|~hsKK5=jXk=16CsGwmw&a)j0g$E9QS+nj2BS26O%!pDKty60tW#hQc_YN zih}1#K~*f+I*}_Z<@m0pd#7+kMa7Rd7dAP`aG+eHXcN>;3NTPNRzu<9I4yV-RrHr% z5&5GdNhmzE7p)-j6Q+--#dvV^P^ZURSGVUltcJ=jeCo6>qitEyzJpz@ zavM&B>$zoZg1Cw-MKWZoRp|xu{CK>G+xXd=H*dNceuW~SkyJbMu)qI{d(^%94R~>C z8k&1)ZlFStEJ^@eTHm5tIsE>{m2x5uyUNuyr)=OE{&C>I)%sMqy?c*69C1LuKmYR$ zAC~N&w_lg?reSaB{*g-6NwM#(-24}ENZH3VJHo>Nkb*NT_h0+v zRYF}|oj1zS%@LRQ!XS$V_TDpK15S@YQG)XUJebJL_U{vJR2j2%^SCd-Oaq;xqpLKi zwi=u9nrwccn3x!m4KkY;Au9mG#KS*4U-xvwd#C>EW8Gzkl5{qwszqcIP{hQ}&i`c` zHGFJ-AiaCMx2jeQ?XL_(rf2`@V-vr=)V#Jla$!qqLm=>ZClr6k#44$$Ucw|kkT>=H z%#T-QtFPaVWzM z#|(YE7_gW`8!o)ogW1l1@_8J3$V|)QkPrs<>B03urQBJY?{LZo5>0L2zRfuk@0V_E z*!nH&qTUOm+_(A*BksH%38zvCm4|J1Wd1ZH3sj=vrkW>tKi5a33@Ix|Xxi8a0{l|q z4S+N|1NJ;Fg2?PJH*R?$hYfc&(O2CK*UmY5=4+=tvy_v@;emA^=aau{4$a%XJQW0$ zksZ6>E~idkPfrKhitzGmH$y+y)w=$VS1DK1v}gj=gY%2o#gZ7VjL=xB7WA{HP=7qkeSf)HLWU@B)lnG&_5)j2) ze@2ic#nyAOMh#O$6a8h~Kh_+8IA41-s~hLP z#tm_F27hF%hPi(epa@WM3~Z=7NVuTrwPjVM*RLTseR<3C15zH-f?!L*;J(~qVjH1d z!+I!2Ax^A>V(j7B`T}*kc5UT8z5&IRIZb6%RWcJ-{?r%abr2$fYD_#SAPLy3Sr;44 zKl(F4@K8T`^dl%4sIGv~hzG^9Guc8wW_3DkF8j0Zv)-|5*IHH~!>eeH zkh{2`PoU3p2aAvVX?+kHO87~ZL2%*nJT3eOlHP%Ym*Fvk$2hE(iTP^L_W(^Q?%tai z|7YW<+r?GFg|`8ap`RQAB34k~Tv;0Nff>b(q=(7FkCWKkq?5YaZVgr?l#cM`oT1wK z4WKV1>rq=*2eS&I0ExHQG{4<|?&6PB2nu^*M&D&e$8Yc_=s4wazAbU=vt}k*F7U;N z>S_jbfNZ<=Pe+9FZ(^DMyd*fkaAoKv3J#{u4#eqBQ0OzTJUr)A4^}3S5~!1;u^IPqWMbpW=&DQlQ}G5SU|g=<2X$HIf>${`%`q3(iC1M@l4U;sBsgxE&Rq5PJQjBOYn=) z@DP7EdS8UHT5jU@n`IQVQAkk52roe~l64*|LfC1S{5OFzsMX!ak0F?>M*GE!l0KMIH;{Ir?kRSh;P>cQ;PAtT52Fw~mDqM$K&$%m zXJrWNa(BcB568${5xM;9D3Aqo)_1{K9uV~ST=h~Lh<*ZMeGR*wMMjQ+0w5(GS}Iat zPnlms6#V${V+Z6+((X2FP=VTI+g=be5)X}7pwW3%ULGm4QEcm!6Te z+*c3haXf`Oiv`l^(r$*l(|t)hCEP# zx#?Xar8%#vX?4P<2=&O-{Wdl|F>%PrNdhd7_;An{q+*U=aAdW()xSK$ibzTLPa2gA zR7Wwj#M?p5B)oO(TFmi1i;Ih|P@G`zv%$5RyYr;MdT*oi^{OQsSy1{4tXvY`0%5Ot zc}5Z=aQ57}lCxsPSgi3{>Wz|ms`qf6=*OhH9zeOLZFvjj7Skze{*juR3pFZHS}jmV zQf_Ioj_BWvEG)M$mKW~XH}0#2;~_4-32pi#UI9UdGS7Ast)>2ffgsDONG=Hp-G>KG zVKSk|-QRaHvU#*N>D@Go^WYPN8FANq+cTPn;E?Lb;~Lfi&44)^jgiSxU$`aqtgnjO zBede|Y~jj+V*QKLCuD5XmM(K-=S@92m0Ai6mc;cNnUkb!DhQ@PXP>RaL2kc6nMSYp zu~(S?LYoRhx<=jVLZF-9^(kSKl}9gF<>6{vdqUL`Pv;-oy$Q-x(3{~fO@#pT25uP{ zcF2TkNFhw#Y(#0}kZ~$Pi>N_eG50#BT@^kf1(%GhUL|T&ND%LC{F=mmNKfkNIg3!` zg>@rD{TOcDx-#EbNMmywiV2DTLBuFV&cwd^(*|lT*rLSJLOao@dJ7p2;yi&P_CU?p z2?vFuo}eqCehSK5`E&Dd*zUs?Ut7Jt;$oA$GMa3#30*vrp8d1zL1MXic#CunkgCY&_C=QwnGR>?!`C&DAHIkA%t zk#SKZ(efs1j{yE3ID0lxLfXu1CT8Eo?;jsYUlzeCdT}P39zqhh-!r{*&UFl&x4918 z3jcj_2E#z`JyI?kh2#r`2gYQ)W~>5i8{Ld%m_U?-8nQr>gm1cohi5ffIvLKy z!(rdxK`z1!`~4$>heRVCB-rSB+m746Gr6>f+dXHgd;7`($b9ybzqJYdBt;RfY|@T1 z)RZ89KndLydt#L_7PK+?4g0qAlgqXFA@ahckTWAAqxAV!WJr7=h7oOl?$1?Vr#Ms% zHgT)lWdk;5(yG{4qAtURf(CEY|8Uu6H#>9`QPQ!AP+)6EMeZdLj5N=lX1l^KQ6Y#| zAT_lP5|U~NC_$DTucf>ROA{>x`6=;SFw!^Sjh=kI2TnYs!BAmw8aldY0Rzy3|)u%Q}g!bXg&-!ypeeY)4(nU^`(XxPLCPlJsz zn*=vRXq^I*C*#d!9Vo+MZw5#NUllU%iLUl*z>v&u?qp}h_y_(uSiq_G%PSX6f71CL zV}kn7kS{H3SBy*BHE5!cOVIi45kqJ?-CFy7BI%1U1z9FrwrnYi`5LX_#v?o;v+hQ*#UAa1gh~&2Rm(ruMuH7BwewGE zX=%lG=e8bknAS{fAkc2ta#|&l9628)kpO2Y7d0YoKA%Cjr1T!bn~fOgM))K z3%2O1_)4JSn228(IQTh;q61OSGR!*v;KE)O+HLe|zFvwaIg!h42S*1uy ztARus;6@^&l6^GlB^`1f#ONfUP%z>2yJC;z+%|H^I)8-C%-^%{@2M@$v!DHj3#s-B zueypY(+xOAj2{H3w1(S9oMgs+UQ8#55yegQosZ&4p$M@eleaco2#vtDj6(@V?wA{h zW41pzwlYgcJ4Kg*;$7b838P1r`6^~*Z(ylIfrGrTcjh%E)J|$>Cw_g8J?L=|AnmRg zDW~|7_vgQ;pvzJzZt?uK8xsY*YaSVypB4ww>-rhl*!+u%4)8Ju((su8|2Yi)5G9}s z1SIvYm{zaWyX9U=k}5IwnmS1a7n-43$*m0n@6}ZzA3wf>P+o`6$^s(Zz1JMlE%>9V zGVD8*h>=b#K>kEeK<^L00HS6e)*O8-x5dPBOvN{xq`vX>`=HK)iTKw=w^Qti_f2ja z;RMgvEW372KZfnZlhA?*=O`SFr1tDscLu!fkENw%V1&Tl{41G%xK9QIS$qbw$NNcXt^`ln{AnH#ops1M=TM0ab0>l?nagpOpW%ekY2n09wFB z@CtZ%d3oDq5O@X-hqJ<{gmV^fU_XFy;Rpco|1fgRGm8FZZvdc*&P#BkRzk%eotdf5 zZp9b?BOoh+P(;?ZZf%yEj3jFTHwrLKE;4loQWC(5B5ZWebdoCNqxRagYq%dhlBu~% zdIm8rqbgUGJ&$h`7?rw=G3P&QY-z=ygMs*!YE z^~u=%v2dqYjWAZqB7Y_xl4KAx%wa^b`2Z4g!|&weJ(1gAeDg-a=Ep0_6@b@o5K}#b zJOF0Mgp-pk0P;Vx?fypi;qX9nbuQ>dc8R2&&=t5K%>V)(iV`v+u>%--*_L&6bz}7> zG&@P~1ZKkv6%M}bp8 z!ru^}1;sJPo+e1(;r>g32>Pi1{EmL=3mqT<1o}Kusc(D;cE*W}R2|OV>+88*c`v!k zK@L0LUO-S(4Xlqm{1OSQdHF`Pd;y@$zPD}QR%AP7_XcL#mC8Sb!gVfXCS_-zLOM2v zIYh)C1zxg{2x#Sh{X1DbX}oh<+T)v<#Tnjv;;FrFJiU|BP|?p zrT&>V)GwRRkhy%<&GFSMSY1S4j49n(?R|=3E%S^*Bn= z;`W>cP8Fcu;(*D@DvG@6pBKTQ2#iJp_N|H%wty5^yXmdJKQ+mVVILwlqI}>01tK#W zK+jMnFEk@%_OH-4+H@{99@~ZttL`ZZeFT(9!a;7XC+v4)`gZvF_Dl0u2!6tXE<#}v z@m`!2lb^=xk~|5nDxkbvou~?6N`*_)TS*QLNdS5{tIx6>b~Tnl*U zVEV4hbA7Fq?g)_I=8$Cp^6QKy5Z_8t4+mBSS?qi_5N)F@Ul_fx? zRqt#I*nRBb4&-9M6-Y*Hzg^pH=)6(0hOQRIi8wF>q6n_t1)f_3O7|_zNET59kVYjm1MY&R}yk14hj@qs=tVuLu;wcc2=i>LXC8uOvLXd(?Dv z%-H|@_75Q4);vA76+n;&?>spD;EUBJNYsoco*rca=&Y^Ai0q~CM^s%CmtFleR#6y$kr(J>56W_{!&2@{?(1F^C2A6Zr96O0EqD7lh`I?V zfeD~GNo~om%Y$w*nj;_vFWOa5Sl)2lI0UMz5PvD7j1u)Dc@GxI=BkhjXbp!ms})L! zHdsux-4x5&HWpd9qmQJRAf1JM;>blKj1)Y59a?=CL@nQ=yTc-*D$cqhK~$4&q9}Og zEgjyv_S`NmGkk!+Kc5SLj5n%diFmbK*odsL$Iw2Ad!5Mh&sCn=AI){Me8x#w7^hjV zx8rczoQe!ksBm&+d?^p04TYNu(h;_ee#dl>0Adh;VIwnKZn zgX2aTikgQH7o*~R%W<%Hp`XFs?v`p&s6cucr@VW(b$g)W(JJd$t-#A88#ive4tuj3 zDGMYdRfPVY(*_zYNqaWONK>Jw@sNs==FP40J8Knsd!c}S9LmJ@Geu<} zDmTuc>|I(U0|%cp11BnQsHpT32Xs3U`6O8C`dZq%p`o4AZf0)fcu%J7+e4tO#6vT+ zjoo+YCo^i)A)M`0fWhXmt@OH^hw)9>{C=rJ(#`t|Ew|D+_F?vI8lHZWa==n&Qe@pI8o z6Q^!6+NSU9-3%${)vH&Yhu$)mJqb}T_$`L{B62%+eUd{HU>5|;L|Wa`vp$2Z=k7C~ zT%I1YJ9*_%|6#gA>Cnky_bI#MTr z9!P15@_X`a!(=Z@uxdc5c|+Q)(U}IXnljAHIJCNPoJ`Qs*Y|H8+P!O+@8z%3evl?C zvYS&|q?fZm2dHvKtiSJ+mydzak>R!Ae7$(b@nmrawK?Pt)2GfYo$`|Xrck={^K$IH zdrB8B@a@{Q%kONj%ReAJwEfA?oI@`fc}T2Te%2cz<;8 zfgM+?dY?~?X&XDKk8?x1t?NGvOhDB_HRmP6y=rmk-KHGHBwh0iHq=Uiw4CcG;=^Mh z@+?7Sr&*p}sD){^WIYkDrLT`X(jomEdoIaVr%iA}$|R0Kl%4}Hn){QQZk^Zc64zx> zm@WL_yo81Xd#T9nj|*K3Lqk@|mW7t>^lvn&jw~KoXl&{E=YE;yo=D$)(6x`FPpkLf zLKs*5Q^m1I7k$KU9@udJ>8zZE;oOUh+p1nq>(9P@8_vqHn8!ODCF!Gl$G?z?9ORJW z%rmwN9;qlVkArsq!Z`mSi0pT37H=4${>t2_@chC`rt0s{lB+r?q5zqM)7u?&sGNy1uSkT%!u4LE|CQC&Tk<<%T3D*sJ^gRbU$ zIC^^5nCtYs|D%6y&0qIqwCA(^^m?4S4{#|CpSB>25C{a3{&R+zl{G9ZjG%3#6^;a# zr3_~w5)*>>v^ZY+Mw|1UxIF(>P4@avolqr^ow(UJkc3D()zS~gv$EW)Jg>sN4U3Mh z0w}-eS&d{ePIpN@Q4Q{D&@*{CE_K|^O&TFa!Ic@Gl_-4)Zj4GOkJ>oeokMr9m77wgkCaeWpi<~0&u&Ju5vH&e^5K0^;M`8T&{MXR;ZGlbY ze=Z}2C~jTPJ3l>C<;!Y(-&G#(kURW7XtTg65vSkZ_)}l3UPKzo(7t#r@!t!d+fj)< zC2N37Q85-HRg3Oxus4V2pK`~&aw6LEyovXK+_T-NoloFIwOp>2hhm*s`S$wtRkk^u z>&WR4+uWhI@{haP^*9|HPU_Vl!9aeZJgw8z7whvC-nM7arSt(erijYP`f00bGIrij ze?WVo-O2nei{xo$(pK_o4LXBTI*Ork_$*qcyYLuY2spQFvz}q`l}00?E#PDcgLh#p zoc2*Tsdc~w8X6iKO+2C7oWm6ox`x9ZH#5J=1Yrs?aTcIpwu=@=5-I_Z-hsWD&9El6 zkL+Qj)@{C(e@XMmkta~@fZa)4vF6Q%6WpQHE-emJ04zs5GwPlCpez=XFh~n9Gbr~x z*z6mFRZqV%rG%h#4i3IDcPM|>m+32?E3Mr}Hb}M=dk%lwG59@Xe zn1^KNU|VID-5w{6KQB*ic`U@ozAIpl+H4D8=$^W!ce2QfgQ zj?+!&u-WZgELslfG<2tSNXM1`*W9DF0 z&?`+a%S#F2A?htmn>uFt>-+!#9!j=*h5?P$=foW%=d2KMb^}j&px`9~SoT4L4&r_( zjHYr3g3zLm<+WR7j{UF*A>@*TKFGtr~E@8*o^_oq(a@19qvf?SrUNVkTQMWrQJ&s zs(=M(9R?*xeWwzH7gi%DCaldq+=F~a!O}xf`MU~B4=-<*gwO^vZ;Qlvt>BS=`$y=X zhTYqrA7go4==QDP&erNRIyySfUrL+Q6~G+-g}&aG6lF{tdUE8V>b2DT?%gHvHyPh+!%&^qJ3pK z3X6nehiGp8Q@TF;UKOBUtL4QxveL6;_KcUAqnk)O1o3a9zg)?e40yU!()^sA_0Q(UoBd~AvSh6#kqsOy#)lw)MYu2;80EwLV+<;VSzAompd>6T zd=3+jkFHqx)t4F^ZL1+*dKcy zyK*-gd+Y^|QP>#^qB*X%|J>JY=p47cSfx%hW-ScNv`8|A@>Gn>EzGL_Xp-*E@;9*Ip7Fv)bHJ``eKh)$4GU+6If&wNL?> ziv_*6ubroz8(;26OEvRI{B=OD@z^~spdMsmH_iV9V08hW()R0h+& zi#T*C1EM938b81CQP8|<*ykAr>Sn!WglD*6{4ka5TMSPY$QCaw~&#vS| z@BF9CJATwr*jdPmC~uFj&m8UQb#xtRxx+FoUqWU6_|uFw85Is7+|_|PeipdF6DNrM zau0LwtNik%7l~1#H^^ZvHVDc6SKC-no4dQM0vi=s2ARGX7f$TV9+Fv(*e9#PFWZGa z2}%>qptyJ!q`9)PlHTRAvUPZDY&FWg8;)F_ltBQQeD&m}1RVGAQfFypl-7r_ zM*O8i#aHz2tB}`9xxw5K^lw?lU-buRM*mBk#dH7cSUdZlr*dDpyUO$5U5~#)Wz;DP z{_|9Ij>P|c+kXd3hpLI*W%YDYLc(=>DbJi}F7CoZsN6qnt}I{F!jyci+n4MAv7h}6 zeZ+@Ak!Aa%;@T=bae=F*!Y)bKeCo8-2>!FU^8DI?s~`<#^{oe)LwPg>Sx^nO4_jfx z7lnR5G*bSy@9j48-fO)0^K?0tDf9*}`whD6we_vSQ8L>*w%!Vz{bx~J2}x^GQSQ+a z4_;YfVw&Tr2~+$3cuspHGa;%H39`CRw&fUEb`$@-?8@z)zIt^RTaA%!9fQjWvg+ji zd)19ciyqqqVsFOgm&=E%zVi70vK3e_jnAzyD-GN{>se6J%8Xr6qWa&vqF#FK+O^P9 zeN9DNbE0wijz4(+Yx9N5l)VLbN+lHTFPPgsPcMORiJn=1je8Pm*tKW1T_xGw;cP=XXJ%i^A@#JWjB98=JO+v z#3xXs(S@ae2h+FAIvn32ub2RN%h0Vi;*s}!|NW<@`zi<6ZXM)hHU}VCbK{`R{up<1 zr=jiQRj+Y~JYZv7v8l+|nNJeO=t`bVXfmy^NU&g3b)xu6TWRq=IK*9nlJDO*P->Nl zcr63$70UAJ>T?JnGBY!a*tN-#k9R@ODSesUX0Yen+pV{*Au=hE<(xqZS^2UU-Ri2> z8!u{5LK9IA`0}2cC8*OmcWlm6(4^oIh;5g>6!BHi?gQ4Vc^7UEDVy*!-dbgqc|j1P zn0WleRg=|q62PEHovg&actNsG!|w-#gbHTO4TV@KKT?u?w*+Y z^D!&CdB_S@q1&%(5!~tp+B1bxxmdU|vqEfyMnjyWGw~EHHXXH>T(}$1 z?h0Y!r1y=}kt$|po!hO+ee{$+p(sRVFBoYT@(Dv0Z0iUo0Pd3S?d=V?+9pB=>qi}) zr4(EdK0(1mNd2=*%kp>n9N)nR43CIlqVdH!p<=7dlYA8uM?3s%*B_V_#1OU#9DjiGHoGRNWA`w%cU()fzdks|R@7;)rK9r!hkKw;{1{M9 z=)-;d8V#h!!*Uu`egb;k5GDVperdFnb{-sS)LOv&0cLqG4C2y z>NV7BR)O=2XJ}eJz0l?Oj)eY4@@F_n0C{Al4qEi`WU`{euLtMug@^0zx*MW6ZeU=b z0k8$xX1A~~17t4IvTY?`x8?ZzMs;7a1xsOFeAK&S}?HzMR;|})Vd!eBRK@p%ZdV-}9lKIG~_ArSB3`qA2c7YWX>XV!)F@!Vi(Ih{4>d^fufU$kZIn#N_U^u6n z{@2%-GrL-#_`>6^=mZD&1wAWG=VE)WV}{#=6)c_#U?t2%zyluet}c+Joy;^BcK-z- zKs@A< zm5s)nL0(M#{Kg@-mCzGEPIrGucZhhA@Fgfc$=rg}JV3DcI?8M`%AB-lNgZUiT%pbOdU>EeU<9I{c%;UudnYSP6S(mDj_b3?OP7=i!Dl0 zxI|OQF%F~}Fq~|isjLXGqS?@l2bo;`?fC@SC8B_TDhaK<; zI{;L7NlUwh7|h->!zYDoO4{2U)P5?P0tJnH{0qkizY;USst=IkAMOrSzp2HmYx&f5 zk$h@fdSf*8b9qk9uGz6GIUhPjASL&LfIoflf)0Yft{-={S6gM8We&|(u>Eaj`jHW? zFUNQ8j{Xuk8>8LY^K^DvUr?2o`MHClbM>Qa!63YL?@R=)usS3ghcUlPvB1`is`70f zI^J?MAZlY^h}WgEgtvWZPZgSmrsY4q7TW76NKi%8s>OU%;TDvaHLEB|-WBMcd~zPh z<)_zz$m7ua-2lkHTzhzrsOPLb`4F_~KAe5eyim7$87Af?8ej6UBZN3Wi>B(hcSMMY z^>S17C&(@#qCEor%q1e^^H=mC!=MHdO^O@_&Db%NlKi+bc4hG#+Tb4Y*?7mLI@h3G zKrq1JAaR88pgAFUBg7y-$%v22c(rir|e3>_ODuWbh}L ze9%Y-&bsf$$}|I!M7kbVIrRAaVkDFV+$Cp0Hu`Ms`x;QHab-Hx-5@_xTw&+&NN*JDD#LyiNVxf&fFc&?r} z^RRFCGs1S!QGE(h4#zXTYp3H^&V(WhWHfoUg2mrSbOZRTi-e0ou?Hkp$Jn?L4oPy? zlGYRk&P)*bahU|5X$6~umr8CdkjXrPd^mN1e=`ASH$x_-7jTg?ZeJ~;qN2tD@-T#| z5a5u&{J&B>P%QlT@|cbMIDr(v%k<$CN(a0{ejMkiSpqjcNguG(ED)VR^s@L(1W|;F z>iEf%E^$ZnNTqjoG_QRG>v7+fle8@RuMrNC0OXb$wPqrv#zLqm&H+2bWzIK-%@1JO zpTGqq6X*NjAVZK6-WrHL2c#K@!d9eoV8lU+eAQUv%X{(t37Ve-RDfV?B$uLD3{U_m z9s@aj;vg&m1ciERFql8*=(SIFg=~I!6!ITx0LMEv$MXd924>5aubV1` zQ74=o?I^|}f-4-ch1WYxy)}CG=<>mhj;@k;F>CI3;B%mCPC6Z#eGrS=ZbayR}w0Tc%yD};He}a z(>PaB+hji-6&*e>wLi8e@BP0wxikf8c<@&dsi|6GtoN|85nZ%jr1C`p9w2Mzqvffuqbgmnpnfr~i`1qE`P*m+#6F zk@Nt=rle+m1t+jIm}?6Q3&I#d{UfnOb0x1lI$Xcg{bZqhS5scze*6`0)P)L-a#QN9 zON@DF^hVsA!9jh*y+m$0a>_#;2_5NRw7xL{PXqCK3H%-=Khw%*K7nsMfqwusYz0m} z0_J1qJ!cJBlD{;O$c+NVa2pCGsMm>K<|EQxaU^1^eFMRu)e%MNG3+f}?#n?p7LBXR zFPa}v*WwKNlz{T#i2w)%unR$(O6P2X=gd?o2s;kpALNBs&I-r15-#y5*H!BTQV^2b zT9Cevy7K6?NwBDB&HXMd!^OWG2v&z^D|fS2KR3|azyqHXIt<92W# zN|s%_N~)MVL#xd|z~cO#DR~zJKDpxRI`S5f&c(Sf!}%%(36-3BsNF!((!47HpoLn z3V@dp6&!E9;da!EASmV$Fofn0QZheWP@BVR5AUFRl_!Axqb$Wf021JJ-^5~__A+Os zFfWeWG2a#0!VV|E?vfuGkMmw@8qC05mgH1NNDWkjs1*tIB0E+Zi86ykQbDAoilYNv znaH*Y0wN%`Yz@BKhPA6bw}-5ezXV1@l^y5I?WCl4*UpJ?^fC|U&^{*(h>H{ne3O^Zaw(%8X-Si-A^&)GPRhuI4 z5c2m(SCkPZ!#8pC!s4#?=t>|ifY>X^y-Eyf0|zN}{6gRqC31BiK-g)GH)zB zP2k&i@4kOLCS(B~mVBFg$6`T1m+;jh@-rvzcs5=DS{4*}Fc3uC7v)s6L}~4mzY|!} z#(55*Cp|G%Qtd@*%IuvuIVtpY#EpWe z*$j3_h>Au+A%{~JA08_b#UOgT&tb}o&%HyducVYfk$zGdk_h$1u8_i}zKQoRxf4yR z($_s2dGxoIESM?X0@svuzRKIdx~|gCfco`LD$2u38LqomfDqQ_&7J$R@NV&(%$|UN zv#*q6O)6Ehk`Icl4%z0_5TjAd-o0{e|FG4PssF{qhMcDn7to?zX&)ItlY9;(jzLT{ zjD7#-tf?2XdVBt<>Q-uGZ|!Dv-NeG`4Z-~EF! z6LDI1k6D4wgC)ry?%^cT)=^Wcs;Qa%c%KG`Y$A$X(A{p!kgk(bRlWHxIylm;0=Zhp zbS9!`&ZYPaq*T{H6BE?pzIKLt&z1E=NseP2f17v${!&Mo&4T0vIFSst4$u~X4X~Qb zaUR2y6oxu_^b$)l{sO9D_-K1k!?u~P;Aine468`b4#d- zbw`m1POHw{N5iYl0$mOrmtxOx(<{ZH0&tTYSrCL0X)HcAsrpgUA?KmWrqN%VV|`yo zb!tbB0Bb0>aWlimT~0gLHF+p0`D2#eq^~o{_vz$YH0F$HP;tv2_$`yeS?e+!B>Og? zX*jof3+Yx(lAMoXVakfQXtEwuZn6;7qL|FxYwZIv%q0U9tQ+0 z;iyi7P}swuuBocJ0mefv=mxM~p=2uRk2#H^67nWAT&NYyP(u^Q7A2_&QY^@Ya`50P zLNWqsA&fiDwossYIF)fr%3uYE=a$W|l2SiCL@*r|FLcs4sosKEJp%d7*sL@9F@SXF z)JSEFNL{}T4BSKq;EY1o36g<`sHiH)Se1;8IdIVHS`PgMe%`E99ZO{gs}EW<6+IX_ z|9Z6S!W#KCoF68#E_y4N?7HSAll&Jk%?4=HAE4Ej|Bg1+-E+;AS3cd3q)wu1gr=P^ zsYI89E5U&PRMFAZ5E+o;aO>8s>%DJ(yyZ5k^gX;H`TMR*m6R%qOH`tY$p@`fMJf*X zofk`pi%yM-QZF?2X7*{e{VhLq&g*55=|jme7ioj#=GmLx^U^jk%4IbgKYS;5P&ePz zSO`bgC;Hj$eE6|cG_1CvI}>8 zrV2Pjwk;}49Kj?3imX1YLL3w)H@IjtbD>rxN*353u=iqGx22{f$Hvy8%Cm-GA=+>R z+Z*S~o-b7wnll^hyISfXc;0*fjW9gDchSFiJ}b<;BjeM&Yq{j^r2XdlJQ}I9h@T>1 zg82M!AK4hg`JyQ^bXRF89`)mX*!>{N7%bzk^0g}Ad{g|;&d~$}(Vo3;t2=UEet+4% z@;Wng_>#p5iI8oNPxYy)Ru4{{cp@4eJh^|MY56K=`RO+rmpbY#^l7yomCv0P)$ot5 zk2zti7i^tCT|VTtJeHX_zOa*h;|XKdfhrx%zT5mO?`XUCeHSWR^1mEEyooC3spfGc?o#6{R^VbTN45Dpzf`3#&s=&Rf} z2j=>`qT!qpso_WYbAZ{2h7#2T!EexDH-i`W<+i{fE(A9>Su7A%ntpp7fLoiO8z@B& zAbkQT3;6>?rZrUkt)(BR2s7Wsi>2mNz_5nPRDQmTeVkF?!r$(Rh5bK;3LBD>bTx1X zm;-PiH!NxwhQP{-4LnH)AV&i3&Z6r z+fe#I)JLjCpoYdi^Amp`pY90+_&N}GePV1kgr}T4D#i5-lMWFjA2T<*1L?N zi=heZ^ZUcQD^F6eFyx-1S5v3t3grwelmAl3?pG z&2u%MR2jDphkyBIE0GmfI#mCHD7Wo`~`Qf9Y`#UC2JR2}6iH8G#K*tosKKBw02{+BwrU8Ix7y#^^N^h#(WMWEN<3u$c|al;p? zIQyi=_bz%b+^<9+g#P{*7rpAcE?P=|_p+`Fijwp}MBIc_)P$l}&jk3N`q{d!^5UZ3 ziB1(sjHGZSm2X4U)j}p?chlahy7~Xe@$A8=`6AFdBw~}m4XmL~09%Q+5AR9}Xe=sH zFZ>B9m#{=YpFnk$1z5ABQxmetBCG*-C)yZT34XfvFIoQ;6g)& z-U!t97WIV@mX1^@=+*U0Ol;X*KWQ^xuK+$pngFS>(kXPfSZAmi2waAO@$+aRTsGSVRe7e#HRZox91{%Q50NYy-SOwzBh(^JHD^0eIVPrgT+?iU_06boz)sx-&G*WR*=bpu1l71_6;&BYHV)fZh`UEdi9#I$k*9Z>d&Fc3J^KYgB& zukLW`cDM9fyvFv@npylGXzTObq8ptLyyC1rt-b2{LAC7ll@#Sd2G(VfE1?0+{au}s z{^ztdKCq^vDw;7Tn4-3As++uq6^gkqiv;%*kyMl!*Jzs8u70q6-Q07=ASL>Pp8dXZ z&y%Y;%C{W%SZR}c$@rIPT6nG{*ORMRx|#j^x?BRR*590MCSZX^<5 zA~K4x*kjoipNanOJ2b$9=*YQHZNpz7u&oaXmG`g$5Jg0I0^-I7Ib7tqvmA&5kwFp! z6O|0mZ6N8w%v=x{vi%sl=!t!@sQJK7&sbw&{pwZAGlk{1aAScGAWR5B{=w)WTm0kQ z4UpH!p*qTOk}L0SinmI63l%wdDoUWF?RF)Y*F?mlI5+#@!9RzZ*;CzXV_+p{Y*rqn zfI~Y8F-p36QZYeJ^cImP2LaQfQq6$I=0mCp9nqHImNduPqCk^IT=&V`R8{H&e%Wru-KVJx$-{ zKoO0|o%&}g;|EQYobs~jE@hZ97jvJ5)?WXZ~RtmNis_g?I( zO?@-ZWTGit^swQ&HRv>hVz0fa>WQzjQ)A8IxVOu=n!f3;G{~Q{%G7wf^K0bmCtD<& zi&RC`88X$`n_kc7KP=^-33Ln3^54r)JJrx(D0cqSHPhX8+b76%sDLih5LRj&!pLjf^CuxX zS{V$Ys+N{kN9lb5#*HMRjc8K|(~_uNRP@4i$)%sm1VXmF%%*5GUHvK@td)t-=yC_Y(#6m$BrP1l1ah5mSJgmQA zj6bCNj9c;T?9F35FGa2oa(eoeZg1ZZ_xX)LWX)(WIpzUh-sms6WyyMB!zh=sh>-{wU)O~%bKTCA{ za+%U4-+m;+*VZ5Q<2;eZoRO?yV}DBpe*Wve6wkK86lRIBw;f9rocVtFe0T1(g^~D$emA4(;3`ScaH5_1U zGeqLxzuq=9?D>m(pxEXH*`Qr887tabSz>kA*s*#mqFUn6N^74vqmDUG=)ggK_RKCk z{B*${5HQH+fX*w&`oDHAw2h*UK*C7z_uI#4&ace9I0d7t1?(LJ4@5|kyByFxl6lg) zT}huN!bRY+i}8O9sVuqXib$aW-yBml{Q2=J zfWkzwLfp5|ir$6R3I{6*SOEV3MZ<(~r7->UxcO6Nl*r&HqtGcO6G$LPiNuTUi#bZLL>^zadl$MbV;S(Tc&9!^w;tc=8> zVm+p{#86WC*2JE39kbX)55|fE*FHTvdFt5({|39k-_DfH#hyYxt;EkQB}9A4d2bAm zor+V~6Ub3J-T!k~SwrD#m<9@P51SK7K| z?xxRxNs`Vz5rAo! z!k-^iw95`srA;Szae868lPNyqmz%irxxSQUvoq`KNjuyhZS`#DFgae3={;NED|fu$ zs|_eNoT(VQH*u~4)>tY8h*b``jB3;Hu+zYKc`NQ42i017i|ZHul(t1}3KcrUrsyWd zsu8uft=#}^28su8C}8%uS1-@Kuv}oRUn6~K;ir!6g1|1^SqiDK2VN2G!N*_aQ~e_? zcSREW7s)ygj2o0t34;{Zqbd{l*`v*yWH37 zpE%KrAM}&hE;HH7HumwZb)}JLl@OcSWfgh!miE}2xVDtXUM?L~n{gPKE{ynog(=lN zrr5-r=2bwfu|~PhpPs2hyv*O2qMMdmj7viIB^Hc-Yz_xh^yX1&b=k@v$*dF)!5C}5 zRcv2Ezb~UXPG9Hj_@cAiEb3vNdStR}LGz=2ZMo&w!(!HL*UqoKS|MD~lan~BZ#1i~ zDQhLXy~L%~uJDO~um-ck&-f0vrD$NJmfkZvV@*U$>kJsb4^DL!ZbAX;H2=J%`GK?N z>MPzit5>DSHfOWXv(9-LkNWgD=5UCZT~bWz_R}f;mc8j~fd#`cV&F`aZ00KY%JKYn z|G4PI2@XQffuP&|qvm4f`qfwX4vxRXOF)u-de@(>nUE%j+#z|-_LsTdvojp%JPDUW z%pCwOUIEF%waNoPXaE%PARtOE^gm#lAgX?Tq|?Jq@i`Qj4{vH{r0ORY==s<$ww4Q= z&d)VJsbF8uzR(udV(&Prq(rkWv9d_bd?QosiVpQ~>AeC?Lri8fneqF=->s>od z^cTzD9uFp0ly*EB7Ef(S<+awa^&F9S89%ir(Ya-fNX}w;xx;A06xBNaIWHeCV?|rp zX9RfQVSg|$wSE_C$Tt`1`Qh!ew>uwg*xK*orQq8;lmmRva*6Wy&*n|B^{?&LSGMZ9 zz8rMqiRgT^?&Ur0I1 zOJ#A-Cpcuu<=4ks=2}0rxLDKD({Fyfoi3kZ5b@%m==f|!p1>JF{phd%QDB!#qL>Eu zN_<^}yG9r#;<0xF6<=H=LX04l3^7m!Q0|x&wofcP?@7M#CJodi8uFSU7t;jFb@LuT zJa6OlJ1QO$H`XwDPmwNE`GI~e#yX^e;~Z0yJe2W%<$LoRkG`#5T^sds7vmL{!XLU^ zGtv^)U2Z+kNZtHu)PZidp2hatCKszGQ*W%Y9%4z78g~I;sMxp?v|Uzto&rgN zl6xOmpG>~-ayWlq;^unGr{^nnZS#^3X(%rFVqx8$#*qBNr8|0H%%|<=S?LJpmaJ!pmr~@m8oOs$ih1&(z6Zs67AI7a)MUdS9MDF#|T8@$<8ppm?Bb*Tep5gDa zD`So4TzkXY^A@yQ>n@oa2{Of4j5yDzgJYNxtua_g`FJx;24)rVh345p_}OisCtH?-vc zc>h4Y;y}X!%k?W3hPwM71y4Gmm9u7s0+<$AVqC$$)(V`G7W zt7_#QQ9H$Y>y3TvSXJuWpFPcDLCU-2rsfWpiq9xA{^|&7?&sROH~y@!pS2;^9#03U zc)K6E;~y-PNp3S|6;^(DQ#YUc zI480=^l0ksg;u(9`=&9o=4WW%aoPO*+_bC6b93yYN0f0f%068*lb1$!lvsST%s^oCz_0W9ZO5@SJ{0~=UTIV^}O1RmytK|VmZhG=G{lEdM1lc5- zE?=u%xpFH~(Cr+{T~?$taod^_C8id<(eT+>LHlsu&^&+kU{32nO&W!DbK*CIx{z+o zM*$(EA%K+_3&@^7OJg?yH4lUiY7I%1PLQxYW$QNv(FwX=LLX89vrmWo^jf7U?lBU6 zK`f?VX+M8q5J%tNtctYfBB&IlVeVqs>EpFRWOTqfrU(xl9ewYgY2j`R$P$2P0H_fF zPV~KRHTd}Xc1^Z#nme2%_JbPtagc|JcVmKXeerAooBQ{#`sZ7V6nuQ6ptxSuIJR>_1uzbu*)Hqc+8f2}GW3D1q~UtgV1HSXQhB zp74@G!$`RaA@-zJgFYg^*gX6)y!6(*Q zUl04Zn(M&j5(})OZq5k9)f>_uULEz24-a?G@)yku2yIE+Evn%3p3wBR>`k}& zhSx6oT)jde$aL*ct(ltLrRnx1I^`>$O$0#)e>`0AG5Rb!38t@jh6s^-fg8rOcl|3-lYDS+smdJ-n zh=le+WDFs_m6G4vmYR7QwcK-yr8`8m^BSGvhoH^ohtuBg)vykrJG3Yxz<;%NxW6kf z^^V?%%-Kr)72~=eY&pGUU!A4Ae(VVFDE{8h(f`m_s1Nw~8^sjwB-=#Ei9wOwZ{#ln zQ66e7V`8zDH8b4O6)&D#nA!A7tg@)X?&?8BomAf#Aw`ozRboS~-|mTND30A_9WUqD z&6s&HchmXiH2xTiiMQ*g;ub$KKvYjBqH*<#(?F9)_&WP0d^Px(A!Lx@@1E3hSMXO*^j} zcp67(cKUH+y_#kD?u-kyd|%i5U*T(6FMM-c>(3~4pMbYVFVjwzxhzPse{`2C#-4H7 z@FK^&ea8A?kG^`tQ`?fdLXYh1bl#0I7Ret%?W_NM9?5;-d|#?2eERU9FL(P&;jrG# zmJv5mvi&6OM;G5~>k_#S<|#EIzgi3U4pGfO&7e;qn9GkUSa$7?i&Zc43aL&xEPx#P5r*L*|#*Jp}5~^>X7g_$$sH){T%S`Dw zG0`zK9(j|^Ti)YH`1tqA+3{sr``af>#K|IR$pAy zjs+VO{5VWw#d%j*&e!72P-~KlGptz!~LQQg)6**r@CQjy^5FEO+M>3p4cl!AaC7<3) zJo0kBT3l;ZkOi&MEQX{F486$t?STvp#O~}66r|B;M!Sax2;e$9n|}NDk+qesMm(6- z(_SD#y(YD3P|Q*ORyr>T4~%#xDM5JxSpUK4n5ymh^K>=C`2-at#44oHDr=MfIyjYP z&5F23Yz}{Dx%f=j@dN7W)EtPqpg%p)Z55KvOQ?RBXhF)u7P=c6E|ANUK-G}byq;0n z6jumHjOk}BDr7VLeWSgF0zI@J`xZCFNemvQ>~`3+LG>-O%8jJM>*wqiw#|%nYV7E# zWnwry79!YJ-7@G{ANN!<{hTn}-S+uGQR|sQj*6IUHSbwYgy9T)Ssv)Rk<@dC5~SEHgA_VUj%h%|_HDKJxgeBAPM zs^NUg7G>?P3B|Xxn1s&F=8T;2t+%Bv@er#x-mgHR^5%}R%0&*ZMMJaR-VJLPy~=vK zOaFYF5-=%n@Y(=hbD3)hh*L<>XjXSmX0k|RTxKq~cPfR}!eq44L@z}YXx1Z)$cjfEZ zF3YdCwcf}l`Dd=YdOmlnyEFdgka~?kS$zEkmMv z99oPn5ttQVR0Uy=@jeNY2stKFS)CF0NrX&9ivT7H6#=xvR}n^}cj5KMh~(r3sQU;X zv7VL#npRAT8;qI&Af;%*7GCS$JvImk^&2e8cYp>XG=UIihzlU}6PO2hfBjb$%2%A1 zkL0*-(T1iDI(ssY5A&^gVT%Rbol`u(iu}%lU;y}aEWl~9(=aHci9qm#j4~pWLc!v1 z$_#BL8R}%RwD{jMfNH1DJ|EwR%hPNk--=_4zJ0N^F(?T(YL|p`FgsH__n>*3+mAzu zGszAmoog4P{o9u(cNlq2TmIGNC09vx^Da@<;3DKwu18ny|Ovh*ra?=c~?tdNv>4_OjQ@B)KHQUe8zgOIN3R zhS#$T&0&J_CHrmb6onu1e&VEFTRhp8CMKJ^m0!U`ZS+GWSJvH+eOE)Qn_q4ZWtGgb z7@n!BZrQ;tLBmg9L1lPG{+yJptXp;8G>#&>d+v<2^|lYQ>slumih4f!*cjyB?#MU- zo#~aC{V#)(RIZlrr zDBZrjxwTs}@-yhuJfx!km6;&XE)Sw9sjl;`5a|6^g-$fM)RYsK%ZS#PxP<_r>SaIA zwPuA7$rOsuMX1@cFjrcWu6uZzjJy~vn>8jPupM*`2?ZD^mxwXv#9i{lzFWbjornuG zDHQqmf&s}A7HkTFXFZvL+k1}1VO}5DvBB$Xc5u|J)ajRBNXSgf=0o`6^}hH&$l|eD zc=o@RiDT{lzO4xo_6I|5#>9Q=YtY{M-gOE!gedK*YB}2Tf-NwEmrh~_9hHn>o8mJ$_OSQa8tY|ThN%3?JGj^- zn%q4p_{}2Y;trJa=QybSi5qzOYofIDOjO^7Y#yEz%GC!^(`4!g}I2MSY|9F_x^&bIdmNhZy;1;N-r6FBtg-g=`Kvko)1r|GC! z&ddbzhi&I~68PcM>k&|CYS!0Vyd1teD6W>@_s7O9&D_k?OFhr$M7oWtrxiQne9jk3 zT{=oZE{2-nY5J{Ol`*WmndL?A)Q=zM@q7^zN<@{U{D%Nm7+wGz`=qx(!tfqEb~2RL zt;7RnBqA=yW=42n05mEM4-C68l+nc~3zQ9sD}e+bv?BOpq6I;NN;pE|;=*_i3Wyv! zpo>6K1ieNxnOTXK$t@uf1E&y4+=S8x*A+gVjG`3&LGX@HITJ-5a;SbRqm50=Efhp~Z%M3!{*YC8Q-wad=KJC-%==-x(OCh&8^jLZ)=nsc#N*H(PRl zcv~i9ij8bNloS~jeV)dYIogw&HBEFOeru4@ch$x@AdW&MFz3B4YqZ_O=g)SfUEIq~>J+IZIES4rP^p zS$s1#8d&q&9G8XQhMpBBn|5w?nkmq_A{RbAwPXlRk4Q+U!%QGec$n~NEMOUce+gTP z82X5ep(#Zk5qEi3O&kdl@_MP+5HXSLM*Iw@&bCXS?7>EX7ZQ;{y`YCs zH-Yw)L-d`C+S|9m)0;MJ`ijX#BPJ-M=N&k7=+HgG5*|Ap+;6CKNH!w{#9kSY zMI$It_i~Dq2Q`xDFr+%^_>rQ?$+fCxH#^5>^C9#^0_&y&&{kMOaE-zW4hgj@ z42A8X+1W_pj>WqFHoE|%Cj+r5xDr!Na6Ie1_Xg_zd7y1@>SaKGhNw{jzB4LI_ZzBF z?QGn$(ix(%@JKv+X=irkHzA?E_#w_Aq$kxfKYx4Zti zBeVWsCA&YcuCNLzWc z`T5^9G1q|7fK24X#Mql~1VLC?O{ALmcjnQT>69j{&B=os@dLnL=3vNp3oZv`wXQC1LTKV|<4$vc6$HwBja|2HFmSCPafbXu z@Jcx5ZA7sD5LB4NNrF?i(R((?oVZwUvGqVy;%xaVrF0QVIp4K>|1jJ-`u%3D9Wy27 z!2G>)lVzeo63J9tLSzU;K)Y3Ll0+6TnN~3_u!o{^ItM*2>>B3n5_qOqm`?4sg(NnD zrykx&QuYx?7+`!Q=nxBRGlpfLrATKw=>Z|1E_^wdX3+$I+GtXfQknzymx48$(DL(oe@YpfNo z$r_}Tr0%G!&8OiydASS#6qy$dg|oV;=}z?Bh^dYK`0<38hI8HrG$*pM?GM(GskWGo ze$3D?K3}muk1sm)!JT0l21XY^cHn(*c->}cEgjiNlcj7+EZ@Wl`E@yGR zDt4W&w8$%y&l*o`+s`Kuwl|sDtG$2_thiKK3mUqYXC!l8{N%&(eVFu-|8L1qRs3j| zyYZHuu6(O-(Tjz>9AAg0_q+Z)Ng^_lLxe{}EUssTk3!2uK%xIS0+0`iatd3X=7<{&+%qaO6u(Fk8pja~15H?M9~r`iPXzRqOphkQG8j?K zUiqzp%txQq-#X!QSGa!RqI&Ie4V(Snzow^mJ<}QqEojF;r6PdwDw3NfV45VOBB0U1 z*Cno1xWeH8xDO>SekI(xn8&O}l32-PvFp?`)O zQTT@;49CHnDCbPIvnp4BUE+T7saX9%uc|NaLT$S9f*yI7h}<+6Ds28KdG}cOrt_aO z~^7IV~q8CmRh_R|Vl9dG_p6 zF^%qHt9A*&*bvXr;y@(4!P*Sf9tpsL!<9v&*#I$5WWo=d_1~UzBJnOS$)bWhHVOwQ z84-OeCPoD=0Qe9Z<;P%CJqB|DEW?8&0|ph+UBt)0H8=Holh8Os-NZ^oB;4xF--*=- znz>_w#n*h7hE32J!>TWhq*$o-4!5{MYB=GK`nQQ;w*FkjMiB_<+sI z9WGhxuX%fL^F9{49!#I~IrM3Ee-@i3vOGVCg@Uw~9gGGF3+aC&&fVZlYuv^A@pn-& z!HTR&xlGJah>|*NX0{7w2_bqh#U}zmI;p5YBayG%JQVHAs zVJ>XHC$$=ji{}u0W3irqQrj;bN&4&4V}+_KD!F9Cmtl6Oxb*Zt-lqt+sWR$6_}k3 z%OjL${Yg4_z7IRItP_B(LfAPrD++lk6v(w0yB4qLs{qdX9xlx+d7*zWL!<6>Q^YoT z6HO~@1xJLLAAS1miZ6`MPf}mGwNlh^lENs2YoEjWw>DT6;(48iYn1@KxIuPeB8{%@ z1EUfN+*!_fJ#c6>9;TI7g871-Mt1fmanwOQs!3M@(Jx#tX}lW&GV{F1nL_O<)x-t- zer50Gi@u{zPsdafNfJs8>^9=8#)p=j9zFg1f-*h>Dl%BrY}-jmjjJJjScar#U0Kh8 zh6i3r;-mrEybGn-PUtzIoBsg54c;FmDRxp`!k2R|ciF}52SX8vxkOwyu%0QAHk7?D1AgRFfOvA$@&MI;+kPJNNIJ2TO zp`AemH@D;?rm-7k53Ja02*W8@)Uz7W?4*Uh+qda+N+;DU8I~GI*putfR`yKIlY!O10se@`Pq)c7#DAimI~tayZEFiN>0wp?YTzR8=E#PW7qWbxJBy| zs=!d4FODVhMQ83@ILmx|g8!{p1@)2aP?6-L&8{7G+l^|i*FNN}oiSzRzLok-`8k~; z&xW2sXo^UTh<3<8Q$y_%=r+FYo0)oDv<{h)dhKq-e5YpafiWHUKgy9J%(Y_=^?S6J0 zPAh4r?^HN7;J(A-A;x1JchP@!h4YjoG#}{Z6WMCVzXtq^*FV>38VqMuRWKO9Pns4P5nIoDx|!53~8O zTo3Gcg}VBw0C6^xvC>GS`zsv7+-_i~&DTc0idXf{Fv<-d{o14;>Pu6ojKd6IP6nJ&aQ~ecnVCx(`P}&aLP6w26|B z*W9tbd@P~xymFP?jOU>iqaT7$BS<{4{2a?(*LK9vdat$ur+B2!`42DlfonJ}`B?DV z6W#tMTV36t$>P0l_HcffTA-C5Kw0?4+(Y-f^XU{^Y!0zCkB zIB|XhCAjeEzN4C-EFBfGJQ2kx5ucJMdJ;wh`wYG|F)ris!^PoK-fjK+WHQVuxNGb1 zP>8}Au5g&2eZL{!fCo1V)I_)8yieza%R{i_*M9VX^BHyBC(nH|fpm(@$!Zhu($y8A z_D647*5<9eYYQ|cNKwf|-L!w7-oHhngI>19mAdi{)KsJv&g#h5i>eo+_DB7E0{f2S z#K3Pq2RAk060!Ob!V(Utd>$A^K&T-=L}%LVFNFc+ZazJHuE17y6}7JJ2eFZ;@3E;R z*A6Q0=qeZyZS={F^B8t2W|ngo2KJ^)Ibqw*4X{48o>&^2e3wO$6skbhKTHbjQVxDt zv*din{Xuf#-Qi3Hum8tTZ9T5(`w8tMW=jdWa&mTD6n!;{2UXhL*1n^9QLpS_y+KHG zk$;26yOe5cf69rh*|U^$uC*cKzEPp^J@v~*El;m_*f*GcdB!yF zGblm5`v!|bLD=X=N6%6*+pgPeN5V{d#1DT6kG;CB*Cvu;*_t=_&<;ABUQi)lwJ>bd zaMDfHe`1@6Ivyrq=zUM=eJ;SJ0@}pkGiQpLZ4M8{11Z_qI=I5glO*bSbXLi~T$Q!q zbN!Dp62K8|_T6}{IPcINf;8;_Y+Z_T1z}4kSx;AM%p&zk1u@Mvgboop9oKL4ek(@hw9?Yj zw&A)7fjew=MOUzm6JdYBMOux`PRg}>Zx4@o+L#(_byWXc^tTeM|4|o7$Q~dw9Wbi| zLs1wQ7%Fj&A^#$Jw4VR!*sV8DZ?C#;ddHd-g(aE%S1AlDHD2e-`2jX!B`2>Gs5m(_ zNr53Eatl{|J_bYJ5C*nXi<5_4&OHLV48;U`C6xTS^EP*^Pu*K_1Eo2nP-6BAf013< z=^AWBF({>VQnmxrVAtYWeICbdq?gNAi`a=k#l?!fs&x}qn~hqMSr^idQ~kC4WA<7i z9vT#ENGl-T5P*8b$ef34RU(}xll=~|qZABykR6=E`7lUl!c$pS_tA~FeY9cym9v&$ zR#nxrRWH|5%XRTm@2;wN7Uo#hRa`fWi~8Fw7LF-PxQmId3k$^&v%7^ zvU%2-i6R5D6Z?ILgU)#xf=9M8K3Py1F=$p7YgOC2*sDgTY(m z>?;aV`=GwT>;05tM4lYEt~=~zSuF1Bi~0S*jE*{(JO7%4Fn$P*A?#>$as;`;GHyIv z^R{IHUXC94*yZ|Pq!ei)r8ge&)j0Tf(FaLM_GVf;A*a;=xxu=8EGM_N7kqF{{`BdS zXm&XFzy370T1?}@=j>`YJ4uqYA;y!UVmb$}lV-6-VY>z{pTFc?h;;&(Ibr7SXaqN$ z=vVu%7Jv+u#S-Y!L2k7fs#tQ$LeaE??haZ|B3Z_b_7o>JLX+x2BPDtIVq20@6>V&G zwi7I=(yA)#xJv$_2}K)DH~vxv{kj zVwADpk>#)pRS|I^&o01WU;e64;2K>zAJ0mcgJ*}=Qw8PN zcYQLrDKKRvv6{1CFxjwq1Lf*>$J#6Zk)BT6JV_@6c`U!_7ixuBg>!LpJ0W*esur*HtniI=UN~S` z!(z)Hym_4~mDxU$i4_jB;D`9$Y~GEyU65Jy?rp20q4G8@^v&@8`7^xBc{8wq(qA#V zRK2?X2JT{1m17<3{K38II^xtBb-(8DIw9mqGEa54)ifT>`kN=EFQ`3Lv-$jm^3Y-Od5AcsQ}JRzBag32Go84Q8$@RgDq3yD=+ z;^JF%bqSP$H(Fa@3;B#1)&XMZ6765cLvs{?`rc&ak3Pn^96+J^)HV^_?=>_->nnvx zfH&Y-r~O@QfKLffDfB!70W&2@wE^;K4v&)@h7EWj)uY3uS>q#{6NS)j*B=e#Jz#Jd_GMSNk8jB-yrI z(c zt3hIOQq5x|x)Eg}J_lP^cWUAJ4_Aq8$gV>Q#cmZ*lA;W!u4M?cY0t!kPxt`baa*X? zQrrj$=|l1^8ODjC4za^cFa`aJx=)568NP7Y3*%!ny=CLMUr21g;ZAN-lFopG%6Z_O zDFVqfRZp}Rz$u@8=gzC4d~pQH({L)h!>vG0O)NNPwXu^?U%lXTD~4L0*xiYR8zWjP zg-P}hZd)J$KnJD0=7fXONq{yPo;4JYF3UUPUfwp@n~7Hf{{Y8Vd$=c}xq8@$h1wGP?ISgTHxG)yK<_ZO|wg3<(xMCdbRbI1ObxJHhPi6VOQ!svaXxG%jC$5y|^~cA*&4 z#E9D)T_GPjUSMF1%Gv~JBq`q{7;xXdh7Dc%NvCm~lilfoh_a+EeHn5<$!|$e1R?Fm@jWzG#-`>}UrnUd;abA}xf=h#V^z7gBZFzN{J- zMDpzn!nS}~KI6MIjip0$2BgbIs0e1&D6mP|5px1kUa(g2_|O)cYL0k%M=*43-$ytI=-k-e>ZtfQu&A+fdCRTNx4H*-{Maqq7Pisi8bfB2OsyLW2!=sa-ES`gCX-aXyKd7*!F^;|#8^@FGg=FxE`u}<<()@TjPE)X{yLaf+v zQ=-5`I|L9KO0|{;o+ev%AhN#?I6gtg2r_}>aiD@gG?ANVX82`q(^`xN0LD+?%0Y0I zgslO}E25EKH+Um>$1Uv;)lEQ9-kh!L`2EB z28GS^&T`i0=${ODoGAHCNKtPn-FeoSi|g~9(no(<rxWm>ai@H4=a3VD^Qq7b=7C5mwyW4Tm5M(%Wq&VE?;N^4t?f$n7(KMCr;A4xuaZ8 zZ4|P#sYhIlF4eiF6d^<|+v%pF#V<5?Sd|qMJ!-Dz02dIUnrSU&{c)|X?o-4qiD~UE zG@Mv{Cw+?pPNd|fho^v7ROL1y{QsFx4nX$}t-48=Qb?yRX2`jFn~G zRVp20AuY}=4glhF^Op{$zfH`c#XmkadY6MAFf@I_lU1nr<2)t z=xOR`l26XkCUgSRYu6kU+%6pPWkhzOKW~ps*YC}S3o{O9SBw`eEa2K^pqiWi8Itj6 z(TSxntT?cQ)16v*-a}2cz2IFHy;bbmabF(Ich96JL?3+S{kQB18|PEMdU=PccqGgI zMavu(HwMeryC~Z-qyt;0IyGa2PQNQxTw1%%eZ-`x`N2h@KQzCNo$=aiQ-4TX*C~%S zJzLRBKsO-c2+f+ar?*Xr-}aebwb7B)YP>~nG3KQDVfo0R`~SY@zb=2+#R$V~>gxTk zZC=w}a8xZvd6*`-c;-5ryH8tUhkHFUjEI&}@9O$fS4DJXi`&^VW@kV3X;9lZ8Ip9u zPM4$ho=${G6%@PL;+qR4gF)Fx&?QPGa{2vdAOEAAd8}V(syd1o=e7*lLWQ`cnF|7U zJyxa9J?Zr;ezvFYXR9GJM1`uc{`@iMl#n6TSyC`Hu~;~vJRHquaPm0gx>PNzijH`% za&tEHFPYvv3D3_5Z29A8F?4NCT9x7-u=V#VQ8_kFxXY78zr}xHqM{_<(X&HI+2e!D zc3oX<-K|C~jwPnGG4|iwbKgKoV6d&KMn%-7%Jyvg{e;F4hSYOIua&E6JjUJ2e!SRZ zbm`l~<)Dz+@rkRn9v*f1KLnW!Bq~)pRBX;r$L#SwQT27V_&9{G|9&xc%pjwNfBMx! zDPHFV5+!r`o-QD|iz!v)cjgB%yOb~?8A?CD@}xbRV)u^(lxN)Ma};@crfr4q(TxDp zxHBK^ceEHQUM&{QGCjSGw#%D8@k@7|-^1M9B70f^R_!~ScHq^k=Kwsih3>Y<8ojeVFb@i&xHJtobWf6LuorW-+6|7ylrMYU+Y{d?<^A} z9=?8j$_cjB1KNzcVyd54+6`RU&_uDZVBgo--e0%>BQE&&D0&}hGg7fpTJ-x+;9rVa zCs>%MC_hd$Xwn+XvT`{^oIh5_Afh(Y)g<4v;iq|fcF(lRhazhk-%@XOeOeYxVP>Zp z+XQaAON`+wOMBYfe$~CRUitp&CD>Aqor+^r?7oI51xpM>Q4V^{j)Fe%VX2-lriMu zoo&YvN+hZ;e*e%=8)001g^nEY<<{3B#vNXfx_#`AQN;^!{;z*VC^t?`Q5-#*t@^NF z`;WE^N%4!HxtN8y+=Uuh=wJQk9Qn7u#J@RQ%WOCu@u6TVMOuUgFY_Vouzg5J0Ay7E zWyHEUO+Ir&jK!7BFLKhe>8Ru9mMSiUBkTzZJ#qR-W{1x^{+NhRH9zw+UpRh}YF*`A z{lo4+IxGMG_xDUcAZ0^Gqrd!1slb+DmE#xFhr%okAecaN^goEKl&aoLVGyk)lK1WdaY(+7QwuHWvsh7#J zedcM-#Q*v4hi>Q`r6^~mKlzXB_|JcElu!-S`(L{OL;yS2|Fu8~ zF}Kxa!TnNp6FNWe<0LE!>IPMHbx3ga+5Beby%;gF4%w`E$gf7qBsMry zMXZu`>i_KGJTfw@<=wt*OgsO--w0vd#3qgjute2epO;O2?qY%pJ}4UTUZ|a_2B#1k zJ>f1#$Vag0>;2%7A(=UgJ}Y|{-n%9PpLFi_p1lPgSDDGE3gD%tp(JP>Few<|wCGP7 zebk|Vaw4ycxs?QkhTcO7PilUQO--ejYH{7Jto=766?g)PoJ>3ZCVo4jMu7Q~XG=m` z@n6!jv!~2@tDFsAdPx%)0?z{+udEO|qcT+JTNoG)69W#hC;vzf>6yE^?*Cf+Sx_!< z-r?N{2({lhaG*|lwuD1cILOl|sZu(eh;zG=`Ls91;R zSQ$xL!GFunMvYE>9n{efIiqhP^Rp0x!>s5dhwmKFcV#NrNfyL)57gIKrD&^AGvc)o z$I)IvK^VCs$$5ZI!(ybF1?t}*in?XHGkO>fKVj4uHrRek6Egd_%eN95ucglrxNisX^fbR-7y21`oXiMaA`f=(6eR6Lf}j-&}~B*hxG|3 z4T(@9;v9(l@Lh=X4dMmCRIkYmXhw*7kAyPfID=6fs6L@%OcBL_kAwyXkH!Kd5QH$y ze&{{PaK-&_@xh0HxWOaMVjRAUj#iWq<&~n3#B!#GBmtrx76}_>h18}8mF1YMjn0L% zc>xxNpJUcSjD%NQZi_j*h}p^aX6=>i!EiKixsi~KegIgR?=92Ibo|yU0+rrK4O~0k z6k*#=csqofAO$hGX{&M?I9EW(046~dkz^?3IgMJ?A2^{KjpheJih~Gd0L}^Cf2y#2 zDHK}|S~h4I&~Xw1no#K^)CTLL_WRpN)uTsuK%!=qhgiI_zIlMHzq$PUXWE$!Iw9+EX8p(TF_kQSIO z92EV}LOuRgT~+pxwSCgw;IW5B$NT>o&#}1qt``;aYCjz(vvWadKVh4o52ZWILsnT#8 z!AFsu4ON4P_aB$6n3YsS8s@zGa{&Me|NleXpU35#w{hI?X*Z@}7)(rM-;(S^lo@-H zEJ>(DArzsaD8|?+Ax)8N6k#B~0B;#gO@&3R3(m3jp zZuQx|iL={YC_z|lV;77f?DtKI=~lyu_e*#=jrGpX3GZW=9P$d~r(M{y?IHnVew z4vq$K3$X5}2vr6oPuI0zTmrto_0CR%7dLf${~W_Q=f)))GiY#(827*60y9sviy@1AwA&j*vd``wz`jjP<)wCYE|Ylu3A`N{ zWGk3EvWGN^8>Pi2=Dy*)qfcxQ=nTDpvKKONm@86K)DUZ1{G^u_ZhkKFW=IIMpV0$5 zA?#rU-~r?9yi*tC%8wm0qy#244wx⪙QjFGqa(&H0;zF0Y>0ARI_x2!o)El@x1%l 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 <1> +type: kubernetes.io/dockerconfigjson +---- +<1> You must provide base64-encoded credential details. See the "Additional resources" section for more information about using image pull secrets. + +.. Create the `Secret` resource for your image registry by running the following command: ++ +[source,terminal] +---- +$ oc create -f secret-image-registry.yaml +---- + +. Optional: Configure static networking for the host: + +.. Create a `Secret` resource containing the static network configuration in `nmstate` format: ++ +.Example `host-network-config-secret.yaml` file +[source,yaml] +---- +apiVersion: v1 +kind: Secret +metadata: + name: host-network-config-secret <1> + namespace: ibi-ns +type: Opaque +stringData: + nmstate: | <2> + interfaces: + - name: ens1f0 <3> + type: ethernet + state: up + ipv4: + enabled: true + address: + - ip: 10.6.85.8 + prefix-length: 24 + dhcp: false <4> + ipv6: + enabled: false + dns-resolver: + config: + server: + - 10.6.73.2 <5> + - 10.6.73.4 + routes: + config: <6> + - destination: 0.0.0.0/0 + metric: 150 + next-hop-address: 10.6.85.254 + next-hop-interface: ens1f0 + table-id: 254 +---- +<1> Specify the name for the `Secret` resource. +<2> Define the static network configuration in `nmstate` format. +<3> Specify the name of the interface on the host. The name of the interface must match the actual NIC name as shown in the operating system. To use your MAC address for NIC matching, set the `identifier` field to `mac-address`. +<4> You must specify `dhcp: false` to ensure `nmstate` assigns the static IP address to the interface. +<5> Specify one or more DNS servers that the system will use to resolve domain names. +<6> In this example, the default route is configured through the `ens1f0` interface to the next hop IP address `10.6.85.254`. + +. Create the `BareMetalHost` and `Secret` resources: + +.. Create a YAML file that defines the `BareMetalHost` and `Secret` resources: ++ +.Example `ibi-bmh.yaml` file +[source,yaml] +---- +apiVersion: metal3.io/v1alpha1 +kind: BareMetalHost +metadata: + name: ibi-bmh <1> + namespace: ibi-ns +spec: + online: false <2> + bootMACAddress: 00:a5:12:55:62:64 <3> + bmc: + address: redfish-virtualmedia+http://192.168.111.1:8000/redfish/v1/Systems/8a5babac-94d0-4c20-b282-50dc3a0a32b5 <4> + credentialsName: ibi-bmh-bmc-secret <5> + preprovisioningNetworkDataName: host-network-config-secret <6> + automatedCleaningMode: disabled <7> + externallyProvisioned: true <8> +--- +apiVersion: v1 +kind: Secret +metadata: + name: ibi-bmh-secret <9> + namespace: ibi-ns +type: Opaque +data: + username: <10> + password: <11> +---- +<1> Specify the name for the `BareMetalHost` resource. +<2> Specify if the host should be online. +<3> Specify the host boot MAC address. +<4> Specify the BMC address. You can only use bare-metal host drivers that support virtual media networking booting, for example redfish-virtualmedia and idrac-virtualmedia. +<5> Specify the name of the bare-metal host `Secret` resource. +<6> Optional: If you require static network configuration for the host, specify the name of the `Secret` resource containing the configuration. +<7> You must specify `automatedCleaningMode:disabled` to prevent the provisioning service from deleting all preinstallation artifacts, such as the seed image, during disk inspection. +<8> You must specify `externallyProvisioned: true` to enable the host to boot from the preinstalled disk, instead of the configuration ISO. +<9> Specify the name for the `Secret` resource. +<10> Specify the username. +<11> Specify the password. + +.. Create the `BareMetalHost` and `Secret` resources by running the following command: ++ +[source,terminal] +---- +$ oc create -f ibi-bmh.yaml +---- + +. Create the `ClusterImageSet` resource: + +.. Create a YAML file that defines the `ClusterImageSet` resource: ++ +.Example `ibi-cluster-image-set.yaml` file +[source,yaml] +---- +apiVersion: hive.openshift.io/v1 +kind: ClusterImageSet +metadata: + name: ibi-img-version-arch <1> +spec: + releaseImage: ibi.example.com:path/to/release/images:version-arch <2> +---- +<1> Specify the name for the `ClusterImageSet` resource. +<2> Specify the address for the release image to use for the deployment. If you use a different image registry compared to the image registry used during seed image generation, ensure that the {product-title} version for the release image remains the same. + +.. Create the `ClusterImageSet` resource by running the following command: ++ +[source,terminal] +---- +$ oc apply -f ibi-cluster-image-set.yaml +---- + +. Create the `ImageClusterInstall` resource: + +.. Create a YAML file that defines the `ImageClusterInstall` resource: ++ +.Example `ibi-image-cluster-install.yaml` file +[source,yaml] +---- +apiVersion: extensions.hive.openshift.io/v1alpha1 +kind: ImageClusterInstall +metadata: + name: ibi-image-install <1> + namespace: ibi-ns +spec: + bareMetalHostRef: + name: ibi-bmh <2> + namespace: ibi-ns + clusterDeploymentRef: + name: ibi-cluster-deployment <3> + hostname: ibi-host <4> + imageSetRef: + name: ibi-img-version-arch <5> + machineNetwork: 10.0.0.0/24 <6> + proxy: <7> + httpProxy: "http://proxy.example.com:8080" + #httpsProxy: "http://proxy.example.com:8080" + #noProxy: "no_proxy.example.com" +---- +<1> Specify the name for the `ImageClusterInstall` resource. +<2> Specify the `BareMetalHost` resource that you want to target for the image-based installation. +<3> Specify the name of the `ClusterDeployment` resource that you want to use for the image-based installation of the target host. +<4> Specify the hostname for the cluster. +<5> Specify the name of the `ClusterImageSet` resource you used to define the container release images to use for deployment. +<6> Specify the public CIDR (Classless Inter-Domain Routing) of the external network. +<7> Optional: Specify a proxy to use for the cluster deployment. ++ +[IMPORTANT] +==== +If your cluster deployment requires a proxy configuration, you must do the following: + +* Create a seed image from a seed cluster featuring a proxy configuration. The proxy configurations do not have to match. +* Configure the `machineNetwork` field in your installation manifest. +==== + +.. Create the `ImageClusterInstall` resource by running the following command: ++ +[source,terminal] +---- +$ oc create -f ibi-image-cluster-install.yaml +---- + +. Create the `ClusterDeployment` resource: + +.. Create a YAML file that defines the `ClusterDeployment` resource: ++ +.Example `ibi-cluster-deployment.yaml` file +[source,yaml] +---- +apiVersion: hive.openshift.io/v1 +kind: ClusterDeployment +metadata: + name: ibi-cluster-deployment <1> + namespace: ibi-ns <2> +spec: + baseDomain: example.com <3> + clusterInstallRef: + group: extensions.hive.openshift.io + kind: ImageClusterInstall + name: ibi-image-install <4> + version: v1alpha1 + clusterName: ibi-cluster <5> + platform: + none: {} + pullSecretRef: + name: ibi-image-pull-secret <6> +---- +<1> Specify the name for the `ClusterDeployment` resource. +<2> Specify the namespace for the `ClusterDeployment` resource. +<3> Specify the base domain that the cluster should belong to. +<4> Specify the name of the `ImageClusterInstall` in which you defined the container images to use for the image-based installation of the target host. +<5> Specify a name for the cluster. +<6> Specify the secret to use for pulling images from your image registry. + +.. Create the `ClusterDeployment` resource by running the following command: ++ +[source,terminal] +---- +$ oc apply -f ibi-cluster-deployment.yaml +---- + +. Create the `ManagedCluster` resource: + +.. Create a YAML file that defines the `ManagedCluster` resource: ++ +.Example `ibi-managed.yaml` file +[source,yaml] +---- +apiVersion: cluster.open-cluster-management.io/v1 +kind: ManagedCluster +metadata: + name: sno-ibi <1> +spec: + hubAcceptsClient: true <2> +---- +<1> Specify the name for the `ManagedCluster` resource. +<2> Specify `true` to enable {rh-rhacm} to mange the cluster. + +.. Create the `ManagedCluster` resource by running the following command: ++ +[source,terminal] +---- +$ oc apply -f ibi-managed.yaml +---- + +.Verification + +* Check the status of the `ImageClusterInstall` in the hub cluster to monitor the progress of the target host installation by running the following command: ++ +[source,terminal] +---- +$ oc get imageclusterinstall +---- ++ +.Example output +[source,terminal] +---- +NAME REQUIREMENTSMET COMPLETED BAREMETALHOSTREF +target-0 HostValidationSucceeded ClusterInstallationSucceeded ibi-bmh +---- ++ +[WARNING] +==== +If the `ImageClusterInstall` resource is deleted, the IBI Operator reattaches the `BareMetalHost` resource and reboots the machine. +==== \ No newline at end of file diff --git a/modules/ibi-create-iso-for-bmh.adoc b/modules/ibi-create-iso-for-bmh.adoc index ce5af5815b..e60fe1a6ad 100644 --- a/modules/ibi-create-iso-for-bmh.adoc +++ b/modules/ibi-create-iso-for-bmh.adoc @@ -10,7 +10,7 @@ You can embed your {sno} seed image URL, and other installation artifacts, in a [NOTE] ==== -For more information about the specification for the `image-based-installation-config.yaml` manifest, see the section _Reference specifications for the `image-based-installation-config.yaml` manifest_. +For more information about the specification for the `image-based-installation-config.yaml` manifest, see the section "Reference specifications for the `image-based-installation-config.yaml` manifest". ==== .Prerequisites diff --git a/modules/ibi-create-standalone-config-iso.adoc b/modules/ibi-create-standalone-config-iso.adoc index efd807109c..9165324e22 100644 --- a/modules/ibi-create-standalone-config-iso.adoc +++ b/modules/ibi-create-standalone-config-iso.adoc @@ -22,7 +22,7 @@ For more information about the specifications for the `image-based-config.yaml` * You preinstalled a host with {sno} using an image-based installation. * You downloaded the latest version of the `openshift-install` program. -* You created a pull secret to authenticate pull requests. +* You created a pull secret to authenticate pull requests. For more information, see "Using image pull secrets". .Procedure @@ -122,7 +122,6 @@ networkConfig: - name: eth0 type: ethernet state: up - #mtu: 9000 <1> mac-address: 00:00:00:00:00:00 ipv4: enabled: true @@ -131,7 +130,6 @@ networkConfig: prefix-length: 23 dhcp: false ---- -<1> If you configure a maximum transmission unit (MTU) in the seed cluster, you must apply the same MTU value in the static network configuration for the configuration ISO. . Edit your configuration file: + @@ -233,6 +231,4 @@ $ oc get nodes ---- NAME STATUS ROLES AGE VERSION node/sno-cluster-name.host.example.com Ready control-plane,master 5h15m v1.30.3 ----- - - +---- \ No newline at end of file diff --git a/modules/ibi-extra-manifests-configmap.adoc b/modules/ibi-extra-manifests-configmap.adoc new file mode 100644 index 0000000000..953b3ba0dc --- /dev/null +++ b/modules/ibi-extra-manifests-configmap.adoc @@ -0,0 +1,144 @@ +// Module included in the following assemblies: +// +// * edge_computing/ibi-edge-image-based-install.adoc + +:_mod-docs-content-type: CONCEPT +[id="ibi-extra-manifests-configmap_{context}"] += ConfigMap resources for extra manifests + +You can optionally create a `ConfigMap` resource to define additional manifests in an image-based deployment for managed {sno} clusters. + +After you create the `ConfigMap` resource, reference it in the `ImageClusterInstall` resource. During deployment, the IBI Operator includes the extra manifests in the deployment. + +[id="ibi-create-extra-manifest-configmap_{context}"] +== Creating a ConfigMap resource to add extra manifests in an image-based deployment + +You can use a `ConfigMap` resource to add extra manifests to the image-based deployment for {sno} clusters. + +The following example adds an single-root I/O virtualization (SR-IOV) network to the deployment. + +.Prerequisites + +* You preinstalled a host with {sno} using an image-based installation. +* You logged in as a user with `cluster-admin` privileges. + +.Procedure + +. Create the `SriovNetworkNodePolicy` and `SriovNetwork` resources: + +.. Create a YAML file that defines the resources: ++ +.Example `sriov-extra-manifest.yaml` file ++ +[source,yaml] +---- +apiVersion: sriovnetwork.openshift.io/v1 +kind: SriovNetworkNodePolicy +metadata: + name: "example-sriov-node-policy" + namespace: openshift-sriov-network-operator +spec: + deviceType: vfio-pci + isRdma: false + nicSelector: + pfNames: [ens1f0] + nodeSelector: + node-role.kubernetes.io/master: "" + mtu: 1500 + numVfs: 8 + priority: 99 + resourceName: example-sriov-node-policy +--- +apiVersion: sriovnetwork.openshift.io/v1 +kind: SriovNetwork +metadata: + name: "example-sriov-network" + namespace: openshift-sriov-network-operator +spec: + ipam: |- + { + } + linkState: auto + networkNamespace: sriov-namespace + resourceName: example-sriov-node-policy + spoofChk: "on" + trust: "off" +---- + +.. Create the `ConfigMap` resource by running the following command: ++ +[source,terminal] +---- +$ oc create configmap sr-iov-extra-manifest --from-file=sriov-extra-manifest.yaml -n ibi-ns <1> +---- +<1> Specify the namespace that has the `ImageClusterInstall` resource. ++ +.Example output +[source,terminal] +---- +configmap/sr-iov-extra-manifest created +---- + +. Reference the `ConfigMap` resource in the `spec.extraManifestsRefs` field of the `ImageClusterInstall` resource: ++ +[source,yaml] +---- +#... + spec: + extraManifestsRefs: + - name: sr-iov-extra-manifest +#... +---- + +[id="ibi-create-ca-extra-manifest-configmap_{context}"] +== Creating a ConfigMap resource to add a CA bundle in an image-based deployment + +You can use a `ConfigMap` resource to add a certificate authority (CA) bundle to the host to ensure trusted communications for cluster services. + +After you create the `ConfigMap` resource, reference it in the `spec.caBundleRef` field of the `ImageClusterInstall` resource. + +.Prerequisites + +* You preinstalled a host with {sno} using an image-based installation. +* You logged in as a user with `cluster-admin` privileges. + +.Procedure + +. Create a CA bundle file such as the following file: ++ +.Example `example-ca.crt` +[source,text] +---- +-----BEGIN CERTIFICATE----- +MIIDXTCCAkWgAwIBAgIJAKmjYKJbIyz3MA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV +...Custom CA certificate bundle... +4WPl0Qb27Sb1xZyAsy1ww6MYb98EovazUSfjYr2EVF6ThcAPu4/sMxUV7He2J6Jd +cA8SMRwpUbz3LXY= +-----END CERTIFICATE----- +---- + +. Create the ConfigMap object by running the following command: ++ +[source,terminal] +---- +$ oc create configmap custom-ca --from-file=example-ca.crt -n ibi-ns <1> +---- +<1> Specify the namespace that has the `ImageClusterInstall` resource. ++ +.Example output +[source,terminal] +---- +configmap/custom-ca created +---- + +. Reference the `ConfigMap` resource in the `spec.caBundleRef` field of the `ImageClusterInstall` resource: ++ +[source,yaml] +---- +#... + spec: + caBundleRef: + name: custom-ca +#... +---- + diff --git a/modules/ibi-image-based-install-cluster-guide.adoc b/modules/ibi-image-based-install-cluster-guide.adoc index 64759ba19d..593fe4a0e3 100644 --- a/modules/ibi-image-based-install-cluster-guide.adoc +++ b/modules/ibi-image-based-install-cluster-guide.adoc @@ -2,8 +2,8 @@ // * edge_computing/image-based-install/ibi-understanding-image-based-install.adoc :_mod-docs-content-type: CONCEPT -[id="ztp-image-based-install-hub-cluster-guide_{context}"] -= Cluster guidelines for an image-based installation and deployment +[id="ibi-image-based-install-cluster-guide_{context}"] += Cluster guidelines for image-based installation and deployment For a successful image-based installation and deployment, see the following guidelines. @@ -17,11 +17,12 @@ For a successful image-based installation and deployment, see the following guid * If you set a maximum transmission unit (MTU) in the seed cluster, you must set the same MTU value in the static network configuration for the image-based configuration ISO. -* Your {sno} seed cluster must have a shared `var/lib/containers` directory for precaching images during an image-based installation. For more information see the section _Configuring a shared container directory between ostree stateroots_. +* Your {sno} seed cluster must have a shared `/var/lib/containers` directory for precaching images during an image-based installation. For more information see "Configuring a shared container partition between ostree stateroots". * Create a seed image from a {sno} cluster that uses the same hardware as your target bare-metal host. The seed cluster must reflect your target cluster configuration for the following items: ** CPU topology +*** CPU architecture *** Number of CPU cores *** Tuned performance configuration, such as number of reserved CPUs @@ -36,7 +37,7 @@ Dual-stack networking is not supported in this release. + [NOTE] ==== -If the target cluster uses a disconnected registry, your seed cluster must use a disconnected registry. The registries do not have to be the same. " +If the target cluster uses a disconnected registry, your seed cluster must use a disconnected registry. The registries do not have to be the same. ==== ** FIPS configuration \ No newline at end of file diff --git a/modules/ibi-image-cluster-install-api-spec.adoc b/modules/ibi-image-cluster-install-api-spec.adoc new file mode 100644 index 0000000000..3af508cecc --- /dev/null +++ b/modules/ibi-image-cluster-install-api-spec.adoc @@ -0,0 +1,62 @@ +// Module included in the following assemblies: +// +// * edge_computing/ibi-edge-image-based-install.adoc + +:_mod-docs-content-type: REFERENCE +[id="ibi-image-cluster-install-api-spec_{context}"] += ImageClusterInstall resource API specifications + +The following content describes the API specifications for the `ImageClusterInstall` resource. This resource is the endpoint for the Image Based Install Operator. + +.Required specifications +[options="header"] +[cols="2a,1a,4a"] +|==== +|Specification|Type|Description + +|`imageSetRef`|`string`| Specify the name of the `ClusterImageSet` resource that defines the release images for the deployment. + +|`hostname`|`string`| Specify the hostname for the cluster. + +|`sshKey`|`string`| Specify your SSH key to provide SSH access to the target host. + +|==== + +.Optional specifications +[options="header"] +[cols="2a,1a,4a"] +|==== +|Specification|Type|Description + +|`clusterDeploymentRef`|`string`| Specify the name of the `ClusterDeployment` resource that you want to use for the image-based installation of the target host. + +|`clusterMetadata`|`string`| After the deployment completes, this specification is automatically populated with metadata information about the cluster, including the `cluster-admin` kubeconfig credentials for logging in to the cluster. + +|`imageDigestSources`|`string`|Specifies the sources or repositories for the release-image content, for example: +[source,yaml] +---- +imageDigestSources: + - mirrors: + - "registry.example.com:5000/ocp4/openshift4" + source: "quay.io/openshift-release-dev/ocp-release" +---- + +|`extraManifestsRefs`|`string`| Specify a `ConfigMap` resource containing additional manifests to be applied to the target cluster. + +|`bareMetalHostRef`|`string`| Specify the `bareMetalHost` resource to use for the cluster deployment + +|`machineNetwork`|`string`| Specify the public CIDR (Classless Inter-Domain Routing) of the external network. + +|`proxy`|`string`|Specifies proxy settings for the cluster, for example: +[source,yaml] + +---- +proxy: + httpProxy: "http://proxy.example.com:8080" + httpsProxy: "http://proxy.example.com:8080" + noProxy: "no_proxy.example.com" +---- + +|`caBundleRef`|`string`| Specify a `ConfigMap` resource containing the new bundle of trusted certificates for the host. + +|==== diff --git a/modules/ibi-install-ibi-operator.adoc b/modules/ibi-install-ibi-operator.adoc new file mode 100644 index 0000000000..0cf9f14b7b --- /dev/null +++ b/modules/ibi-install-ibi-operator.adoc @@ -0,0 +1,45 @@ +// Module included in the following assemblies: +// +// * edge_computing/ibi-edge-image-based-install.adoc + +:_mod-docs-content-type: PROCEDURE +[id="ibi-install-ibi-operator_{context}"] += Installing the Image Based Install Operator + +The Image Based Install (IBI) Operator is part of the image-based deployment workflow for preinstalled {sno} on bare-metal hosts. + +[NOTE] +==== +The IBI Operator is part of the {mce} from MCE version 2.7. +==== + +.Prerequisites + +* You logged in as a user with `cluster-admin` privileges. +* You deployed a {rh-rhacm-first} hub cluster or you deployed the {mce}. +* You reviewed the required versions of software components in the section "Software prerequisites for an image-based installation". + +.Procedure + +* Set the `enabled` specification to `true` for the `image-based-install-operator` component in the `MultiClusterEngine` resource by running the following command: ++ +[source,terminal] +---- +$ oc patch multiclusterengines.multicluster.openshift.io multiclusterengine --type json \ +--patch '[{"op": "add", "path":"/spec/overrides/components/-", "value": {"name":"image-based-install-operator","enabled": true}}]' +---- + +.Verification + +* Check that the Image Based Install Operator pod is running by running the following command: ++ +[source,terminal] +---- +$ oc get pods -A | grep image-based +---- ++ +.Example output +[source,terminal] +---- +multicluster-engine image-based-install-operator-57fb8sc423-bxdj8 2/2 Running 0 5m +---- diff --git a/modules/ibi-managed-cluster-config-resources.adoc b/modules/ibi-managed-cluster-config-resources.adoc new file mode 100644 index 0000000000..c84b0b5fd9 --- /dev/null +++ b/modules/ibi-managed-cluster-config-resources.adoc @@ -0,0 +1,47 @@ +// Module included in the following assemblies: +// +// * edge_computing/ibi-edge-image-based-install.adoc + +:_mod-docs-content-typetent-type: REFERENCE +[id="ibi-managed-cluster-config-resources_{context}"] += Cluster configuration resources for deploying a preinstalled host + +To complete a deployment for a preinstalled host at a remote site, you must configure the following site-specifc cluster configuration resources in the hub cluster for each bare-metal host. + +.Cluster configuration resources reference +[cols="1,3", options="header"] +|=== + +| Resource | Description + +|`Namespace` +|Namespace for the managed {sno} cluster. + +|`BareMetalHost` +|Describes the physical host and its properties, such as the provisioning and hardware configuration. + +|`Secret` for the bare-metal host +|Credentials for the host BMC. + +|`Secret` for the bare-metal host static network configuration +|Optional: Describes static network configuration for the target host. + +|`Secret` for the image registry +|Credentials for the image registry. The secret for the image registry must be of type `kubernetes.io/dockerconfigjson`. + +|`ImageClusterInstall` +|References the bare-metal host, deployment, and image set resources. + +|`ClusterImageSet` +|Describes the release images to use for the cluster. + +|`ClusterDeployment` +|Describes networking, authentication, and platform-specific settings. + +|`ManagedCluster` +|Describes cluster details to enable {rh-rhacm-first} to register and manage. + +|`ConfigMap` +|Optional: Describes additional configurations for the cluster deployment, such as adding a bundle of trusted certificates for the host to ensure trusted communications for cluster services. + +|=== \ No newline at end of file diff --git a/modules/ibi-validated-software-versions.adoc b/modules/ibi-validated-software-versions.adoc index cb479e03f4..2c0845088f 100644 --- a/modules/ibi-validated-software-versions.adoc +++ b/modules/ibi-validated-software-versions.adoc @@ -25,6 +25,9 @@ An image-based installation and deployment requires the following minimum softwa |{lcao} |4.16 or later +|Image Based Install Operator +|4.17 + |`openshift-install` program |4.17 diff --git a/release_notes/ocp-4-17-release-notes.adoc b/release_notes/ocp-4-17-release-notes.adoc index 19df8a71b5..1e5ca1fa4b 100644 --- a/release_notes/ocp-4-17-release-notes.adoc +++ b/release_notes/ocp-4-17-release-notes.adoc @@ -154,7 +154,7 @@ Image-based installations streamline the installation and deployment process for Using an image-based workflow, you can preinstall instances of {sno} on target hosts. These preinstalled hosts can be rapidly reconfigured and deployed at the far edge of the network, including in disconnected environments, with minimal intervention. -For more information, see xref:../edge_computing/image-base-install/ibi-understanding-image-based-install.adoc[Understanding an image-based installation and deployment for {sno} clusters]. +For more information, see xref:../edge_computing/image_base_install/ibi-understanding-image-based-install.adoc[Understanding an image-based installation and deployment for {sno} clusters]. [id="ocp-4-17-ibm-z_{context}"] === {ibm-z-title} and {ibm-linuxone-title}